|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [RFC PATCH 12/16]: PVH xen: return PVH features during creation, etc...
On Thu, 17 Jan 2013 15:36:17 -0800
Mukesh Rathor <mukesh.rathor@xxxxxxxxxx> wrote:
> On Mon, 14 Jan 2013 12:20:12 +0000
> "Jan Beulich" <JBeulich@xxxxxxxx> wrote:
> Agree, I need to make propgate_page_fault() inject PF into the PVH
> guest. Working on it now.
Done. No other callers of prop_page_fault for PVH. So are you OK with
something like this:
static noinline int vmxit_invalid_op(struct cpu_user_regs *regs)
{
ulong addr=0;
if ( guest_kernel_mode(current, regs) ||
(addr = emulate_forced_invalid_op(regs)) == 0 )
{
hvm_inject_hw_exception(TRAP_invalid_op,
HVM_DELIVER_NO_ERROR_CODE); return 0;
}
if (addr != EXCRET_fault_fixed)
hvm_inject_page_fault(0, addr);
return 0;
}
unsigned long emulate_forced_invalid_op(struct cpu_user_regs *regs)
{
char sig[5], instr[2];
unsigned long eip, rc, addr;
eip = regs->eip;
/* Check for forced emulation signature: ud2 ; .ascii "xen". */
if ( (rc = raw_copy_from_guest(sig, (char *)eip, sizeof(sig))) !=
0 ) {
addr = eip + sizeof(sig) - rc;
if ( is_pvh_vcpu(current) )
return addr;
propagate_page_fault(addr, 0);
return EXCRET_fault_fixed;
}
if ( memcmp(sig, "\xf\xbxen", sizeof(sig)) )
return 0;
eip += sizeof(sig);
/* We only emulate CPUID. */
if ( ( rc = raw_copy_from_guest(instr, (char *)eip,
sizeof(instr))) != 0 ) {
addr = eip + sizeof(instr) - rc;
if ( is_pvh_vcpu(current) )
return addr;
propagate_page_fault(addr, 0);
return EXCRET_fault_fixed;
}
if ( memcmp(instr, "\xf\xa2", sizeof(instr)) )
return 0;
eip += sizeof(instr);
pv_cpuid(regs);
if ( is_pvh_vcpu(current) )
regs->eip = eip;
else
instruction_done(regs, eip, 0);
trace_trap_one_addr(TRC_PV_FORCED_INVALID_OP, regs->eip);
return EXCRET_fault_fixed;
Thanks,
Mukesh
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |