|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH RFC V2 4/6] xen: Support for VMCALL mem_events
On 07/11/2014 08:23 PM, Andrew Cooper wrote:
> On 11/07/14 16:43, Razvan Cojocaru wrote:
>> 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;
>> + }
>
> Thinking more about this, it is really a hypercall pretending not to
> be. It would be better to introduce a real HVMOP_send_mem_event.
>
> From the point of view of your in-guest agent, it would be a vmcall with
> rax = 34 (hvmop) rdi = $N (send_mem_event subop) rsi = data or pointer
> to struct containing data, depending on how exactly you implement the
> hypercall.
>
> You would have the bonus of being able to detect errors, e.g. -ENOENT
> for "mem_event not active", get SVM support for free, and not need magic
> numbers, or vendor specific terms like "vmcall" finding their way into
> the Xen public API.
Actually, this only seems to be the case where mode == 8 in
hvm_do_hypercall() (xen/arch/x86/hvm/hvm.c):
4987 : hvm_hypercall64_table)[eax](rdi, rsi, rdx,
r10, r8, r9);
Otherwise (and this seems to be the case with my Xen build), ebx seems
to be used for the subop:
5033 regs->_eax = hvm_hypercall32_table[eax](ebx, ecx, edx, esi,
edi, ebp);
So, ebx needs to be $N (send_mem_event subop), not rdi. Is this intended
(rdi in one case and ebx in the other)?
Thanks,
Razvan
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |