[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH RFC V2 4/6] xen: Support for VMCALL mem_events
Added support for VMCALL events (the memory introspection library will have the guest trigger VMCALLs, which will then be sent along via the mem_event mechanism). Changes since V1: - Added a #define and an comment explaining a previous magic constant. - Had MEM_EVENT_REASON_VMCALL explicitly not honour HVMPME_onchangeonly. Signed-off-by: Razvan Cojocaru <rcojocaru@xxxxxxxxxxxxxxx> --- xen/arch/x86/hvm/hvm.c | 9 +++++++++ xen/arch/x86/hvm/vmx/vmx.c | 18 +++++++++++++++++- xen/include/asm-x86/hvm/hvm.h | 1 + xen/include/public/hvm/params.h | 4 +++- xen/include/public/mem_event.h | 5 +++++ 5 files changed, 35 insertions(+), 2 deletions(-) diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c index 89a0382..6e86d7c 100644 --- a/xen/arch/x86/hvm/hvm.c +++ b/xen/arch/x86/hvm/hvm.c @@ -5564,6 +5564,7 @@ long do_hvm_op(unsigned long op, XEN_GUEST_HANDLE_PARAM(void) arg) case HVM_PARAM_MEMORY_EVENT_INT3: case HVM_PARAM_MEMORY_EVENT_SINGLE_STEP: case HVM_PARAM_MEMORY_EVENT_MSR: + case HVM_PARAM_MEMORY_EVENT_VMCALL: if ( d == current->domain ) { rc = -EPERM; @@ -6199,6 +6200,14 @@ void hvm_memory_event_msr(unsigned long msr, unsigned long value) value, ~value, 1, msr); } +void hvm_memory_event_vmcall(unsigned long rip, unsigned long eax) +{ + hvm_memory_event_traps(current->domain->arch.hvm_domain + .params[HVM_PARAM_MEMORY_EVENT_VMCALL], + MEM_EVENT_REASON_VMCALL, + rip, ~rip, 1, eax); +} + int hvm_memory_event_int3(unsigned long gla) { uint32_t pfec = PFEC_page_present; diff --git a/xen/arch/x86/hvm/vmx/vmx.c b/xen/arch/x86/hvm/vmx/vmx.c index 2caa04a..6c63225 100644 --- a/xen/arch/x86/hvm/vmx/vmx.c +++ b/xen/arch/x86/hvm/vmx/vmx.c @@ -2879,8 +2879,24 @@ void vmx_vmexit_handler(struct cpu_user_regs *regs) case EXIT_REASON_VMCALL: { int rc; + unsigned long eax = regs->eax; + HVMTRACE_1D(VMMCALL, regs->eax); - rc = hvm_do_hypercall(regs); + + /* Don't send a VMCALL mem_event unless something + * caused the guests's eax register to contain the + * VMCALL_EVENT_REQUEST constant. */ + if ( regs->eax != VMCALL_EVENT_REQUEST ) + { + rc = hvm_do_hypercall(regs); + } + else + { + hvm_memory_event_vmcall(guest_cpu_user_regs()->eip, eax); + update_guest_eip(); + break; + } + if ( rc != HVM_HCALL_preempted ) { update_guest_eip(); /* Safe: VMCALL */ diff --git a/xen/include/asm-x86/hvm/hvm.h b/xen/include/asm-x86/hvm/hvm.h index 0ebd478..3c0af30 100644 --- a/xen/include/asm-x86/hvm/hvm.h +++ b/xen/include/asm-x86/hvm/hvm.h @@ -475,6 +475,7 @@ void hvm_memory_event_cr0(unsigned long value, unsigned long old); void hvm_memory_event_cr3(unsigned long value, unsigned long old); void hvm_memory_event_cr4(unsigned long value, unsigned long old); void hvm_memory_event_msr(unsigned long msr, unsigned long value); +void hvm_memory_event_vmcall(unsigned long rip, unsigned long eax); /* Called for current VCPU on int3: returns -1 if no listener */ int hvm_memory_event_int3(unsigned long gla); diff --git a/xen/include/public/hvm/params.h b/xen/include/public/hvm/params.h index 614ff5f..d8f89b5 100644 --- a/xen/include/public/hvm/params.h +++ b/xen/include/public/hvm/params.h @@ -151,6 +151,8 @@ /* Location of the VM Generation ID in guest physical address space. */ #define HVM_PARAM_VM_GENERATION_ID_ADDR 34 -#define HVM_NR_PARAMS 35 +#define HVM_PARAM_MEMORY_EVENT_VMCALL 35 + +#define HVM_NR_PARAMS 36 #endif /* __XEN_PUBLIC_HVM_PARAMS_H__ */ diff --git a/xen/include/public/mem_event.h b/xen/include/public/mem_event.h index b9af728..7a59083 100644 --- a/xen/include/public/mem_event.h +++ b/xen/include/public/mem_event.h @@ -47,6 +47,11 @@ #define MEM_EVENT_REASON_SINGLESTEP 6 /* single step was invoked: gla/gfn are RIP */ #define MEM_EVENT_REASON_MSR 7 /* MSR was hit: gfn is MSR value, gla is MSR address; does NOT honour HVMPME_onchangeonly */ +#define MEM_EVENT_REASON_VMCALL 8 /* VMCALL: gfn is RIP, gla is EAX; + does NOT honour HVMPME_onchangeonly */ + +/* VMCALL mem_events will only be sent when the guest's EAX holds this value. */ +#define VMCALL_EVENT_REQUEST 0x494E5452 /* 'INTR' */ /* Using a custom struct (not hvm_hw_cpu) so as to not fill * the mem_event ring buffer too quickly. */ -- 1.7.9.5 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |