[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH V3] mem_event: Allow emulating an instruction that caused a page fault
This patch makes it possible to emulate an instruction that triggered a page fault (received via the mem_event API). This is done by setting the MEM_EVENT_FLAG_EMULATE in mem_event_response_t.flags. The purpose of this is to be able to receive several distinct page fault mem_events for the same address, and choose which ones are allowed to go through from dom0 userspace. Signed-off-by: Razvan Cojocaru <rzvncj@xxxxxxxxx> diff -r b6195e277da5 -r 8c614906bb81 xen/arch/x86/mm/p2m.c --- a/xen/arch/x86/mm/p2m.c Wed Jan 16 14:15:44 2013 +0000 +++ b/xen/arch/x86/mm/p2m.c Thu Jan 17 18:26:24 2013 +0200 @@ -1309,6 +1309,17 @@ bool_t p2m_mem_access_check(paddr_t gpa, } } + if ( v->arch.mem_event_emulate ) + { + struct hvm_emulate_ctxt ctx[1] = {}; + + v->arch.mem_event_emulate = 0; + hvm_emulate_prepare(ctx, guest_cpu_user_regs()); + hvm_emulate_one(ctx); + + return 1; + } + *req_ptr = NULL; req = xzalloc(mem_event_request_t); if ( req ) @@ -1347,8 +1358,15 @@ void p2m_mem_access_resume(struct domain /* Pull all responses off the ring */ while( mem_event_get_response(d, &d->mem_event->access, &rsp) ) { + d->vcpu[rsp.vcpu_id]->arch.mem_event_emulate = 0; + if ( rsp.flags & MEM_EVENT_FLAG_DUMMY ) continue; + + /* Mark vcpu for skipping one instruction upon rescheduling */ + if ( rsp.flags & MEM_EVENT_FLAG_EMULATE ) + d->vcpu[rsp.vcpu_id]->arch.mem_event_emulate = 1; + /* Unpause domain */ if ( rsp.flags & MEM_EVENT_FLAG_VCPU_PAUSED ) vcpu_unpause(d->vcpu[rsp.vcpu_id]); diff -r b6195e277da5 -r 8c614906bb81 xen/include/asm-x86/domain.h --- a/xen/include/asm-x86/domain.h Wed Jan 16 14:15:44 2013 +0000 +++ b/xen/include/asm-x86/domain.h Thu Jan 17 18:26:24 2013 +0200 @@ -446,6 +446,8 @@ struct arch_vcpu void *compat_arg_xlat; + /* Should we emulate the first instruction on VCPU resume after a mem_event? */ + uint8_t mem_event_emulate; } __cacheline_aligned; /* Shorthands to improve code legibility. */ diff -r b6195e277da5 -r 8c614906bb81 xen/include/public/mem_event.h --- a/xen/include/public/mem_event.h Wed Jan 16 14:15:44 2013 +0000 +++ b/xen/include/public/mem_event.h Thu Jan 17 18:26:24 2013 +0200 @@ -36,6 +36,8 @@ #define MEM_EVENT_FLAG_EVICT_FAIL (1 << 2) #define MEM_EVENT_FLAG_FOREIGN (1 << 3) #define MEM_EVENT_FLAG_DUMMY (1 << 4) +/* Emulate the instruction that caused the current mem_event */ +#define MEM_EVENT_FLAG_EMULATE (1 << 5) /* Reasons for the memory event request */ #define MEM_EVENT_REASON_UNKNOWN 0 /* typical reason */ _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |