|
[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 |