From: George Dunlap <george.dunlap@eu.citrix.com>
To: Razvan Cojocaru <rcojocaru@bitdefender.com>, xen-devel@lists.xen.org
Cc: kevin.tian@intel.com, keir@xen.org, eddie.dong@intel.com,
stefano.stabellini@eu.citrix.com, jun.nakajima@intel.com,
andrew.cooper3@citrix.com, ian.jackson@eu.citrix.com,
Aravind.Gopalakrishnan@amd.com, jbeulich@suse.com,
tlengyel@novetta.com, wei.liu2@citrix.com,
boris.ostrovsky@oracle.com, suravee.suthikulpanit@amd.com,
ian.campbell@citrix.com
Subject: Re: [PATCH V4 2/3] xen/vm_event: Support for guest-requested events
Date: Wed, 8 Jul 2015 13:41:36 +0100 [thread overview]
Message-ID: <559D1A80.2020104@eu.citrix.com> (raw)
In-Reply-To: <1436350970-4987-3-git-send-email-rcojocaru@bitdefender.com>
On 07/08/2015 11:22 AM, Razvan Cojocaru wrote:
> Added support for a new class of vm_events: VM_EVENT_REASON_REQUEST,
> sent via HVMOP_request_vm_event. The guest can request that a
> generic vm_event (containing only the vm_event-filled guest registers
> as information) be sent to userspace by setting up the correct
> registers and doing a VMCALL. For example, for a 32-bit guest, this
> means: EAX = 34 (hvmop), EBX = 24 (HVMOP_guest_request_vm_event),
> ECX = 0 (NULL required for the hypercall parameter, reserved).
>
> Signed-off-by: Razvan Cojocaru <rcojocaru@bitdefender.com>
> Acked-by: Tamas K Lengyel <tlengyel@novetta.com>
> Acked-by: Wei Liu <wei.liu2@citrix.com>
> Acked-by: Jan Beulich <jbeulich@suse.com>
>
> ---
> Changes since V3:
> - None, just addded acks.
And Razvan answered my question, so FWIW:
Acked-by: George Dunlap <george.dunlap@eu.citrix.com>
> ---
> tools/libxc/include/xenctrl.h | 2 ++
> tools/libxc/xc_monitor.c | 15 +++++++++++++++
> xen/arch/x86/hvm/event.c | 16 ++++++++++++++++
> xen/arch/x86/hvm/hvm.c | 8 +++++++-
> xen/arch/x86/monitor.c | 16 ++++++++++++++++
> xen/include/asm-x86/domain.h | 16 +++++++++-------
> xen/include/asm-x86/hvm/event.h | 1 +
> xen/include/public/domctl.h | 6 ++++++
> xen/include/public/hvm/hvm_op.h | 2 ++
> xen/include/public/vm_event.h | 2 ++
> 10 files changed, 76 insertions(+), 8 deletions(-)
>
> diff --git a/tools/libxc/include/xenctrl.h b/tools/libxc/include/xenctrl.h
> index d1d2ab3..4ce519a 100644
> --- a/tools/libxc/include/xenctrl.h
> +++ b/tools/libxc/include/xenctrl.h
> @@ -2384,6 +2384,8 @@ int xc_monitor_mov_to_msr(xc_interface *xch, domid_t domain_id, bool enable,
> int xc_monitor_singlestep(xc_interface *xch, domid_t domain_id, bool enable);
> int xc_monitor_software_breakpoint(xc_interface *xch, domid_t domain_id,
> bool enable);
> +int xc_monitor_guest_request(xc_interface *xch, domid_t domain_id,
> + bool enable, bool sync);
>
> /***
> * Memory sharing operations.
> diff --git a/tools/libxc/xc_monitor.c b/tools/libxc/xc_monitor.c
> index 63013de..d979122 100644
> --- a/tools/libxc/xc_monitor.c
> +++ b/tools/libxc/xc_monitor.c
> @@ -105,3 +105,18 @@ int xc_monitor_singlestep(xc_interface *xch, domid_t domain_id,
>
> return do_domctl(xch, &domctl);
> }
> +
> +int xc_monitor_guest_request(xc_interface *xch, domid_t domain_id, bool enable,
> + bool sync)
> +{
> + DECLARE_DOMCTL;
> +
> + domctl.cmd = XEN_DOMCTL_monitor_op;
> + domctl.domain = domain_id;
> + domctl.u.monitor_op.op = enable ? XEN_DOMCTL_MONITOR_OP_ENABLE
> + : XEN_DOMCTL_MONITOR_OP_DISABLE;
> + domctl.u.monitor_op.event = XEN_DOMCTL_MONITOR_EVENT_GUEST_REQUEST;
> + domctl.u.monitor_op.u.guest_request.sync = sync;
> +
> + return do_domctl(xch, &domctl);
> +}
> diff --git a/xen/arch/x86/hvm/event.c b/xen/arch/x86/hvm/event.c
> index 5341937..17638ea 100644
> --- a/xen/arch/x86/hvm/event.c
> +++ b/xen/arch/x86/hvm/event.c
> @@ -126,6 +126,22 @@ void hvm_event_msr(unsigned int msr, uint64_t value)
> hvm_event_traps(1, &req);
> }
>
> +void hvm_event_guest_request(void)
> +{
> + struct vcpu *curr = current;
> + struct arch_domain *currad = &curr->domain->arch;
> +
> + if ( currad->monitor.guest_request_enabled )
> + {
> + vm_event_request_t req = {
> + .reason = VM_EVENT_REASON_GUEST_REQUEST,
> + .vcpu_id = curr->vcpu_id,
> + };
> +
> + hvm_event_traps(currad->monitor.guest_request_sync, &req);
> + }
> +}
> +
> int hvm_event_int3(unsigned long gla)
> {
> int rc = 0;
> diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c
> index 535d622..536d1c8 100644
> --- a/xen/arch/x86/hvm/hvm.c
> +++ b/xen/arch/x86/hvm/hvm.c
> @@ -5974,7 +5974,6 @@ static int hvmop_get_param(
> #define HVMOP_op_mask 0xff
>
> long do_hvm_op(unsigned long op, XEN_GUEST_HANDLE_PARAM(void) arg)
> -
> {
> unsigned long start_iter, mask;
> long rc = 0;
> @@ -6388,6 +6387,13 @@ long do_hvm_op(unsigned long op, XEN_GUEST_HANDLE_PARAM(void) arg)
> break;
> }
>
> + case HVMOP_guest_request_vm_event:
> + if ( guest_handle_is_null(arg) )
> + hvm_event_guest_request();
> + else
> + rc = -EINVAL;
> + break;
> +
> default:
> {
> gdprintk(XENLOG_DEBUG, "Bad HVM op %ld.\n", op);
> diff --git a/xen/arch/x86/monitor.c b/xen/arch/x86/monitor.c
> index 896acf7..f8df7d2 100644
> --- a/xen/arch/x86/monitor.c
> +++ b/xen/arch/x86/monitor.c
> @@ -161,6 +161,22 @@ int monitor_domctl(struct domain *d, struct xen_domctl_monitor_op *mop)
> break;
> }
>
> + case XEN_DOMCTL_MONITOR_EVENT_GUEST_REQUEST:
> + {
> + bool_t status = ad->monitor.guest_request_enabled;
> +
> + rc = status_check(mop, status);
> + if ( rc )
> + return rc;
> +
> + ad->monitor.guest_request_sync = mop->u.guest_request.sync;
> +
> + domain_pause(d);
> + ad->monitor.guest_request_enabled = !status;
> + domain_unpause(d);
> + break;
> + }
> +
> default:
> return -EOPNOTSUPP;
>
> diff --git a/xen/include/asm-x86/domain.h b/xen/include/asm-x86/domain.h
> index 7908844..f712caa 100644
> --- a/xen/include/asm-x86/domain.h
> +++ b/xen/include/asm-x86/domain.h
> @@ -346,13 +346,15 @@ struct arch_domain
>
> /* Monitor options */
> struct {
> - uint16_t write_ctrlreg_enabled : 4;
> - uint16_t write_ctrlreg_sync : 4;
> - uint16_t write_ctrlreg_onchangeonly : 4;
> - uint16_t mov_to_msr_enabled : 1;
> - uint16_t mov_to_msr_extended : 1;
> - uint16_t singlestep_enabled : 1;
> - uint16_t software_breakpoint_enabled : 1;
> + unsigned int write_ctrlreg_enabled : 4;
> + unsigned int write_ctrlreg_sync : 4;
> + unsigned int write_ctrlreg_onchangeonly : 4;
> + unsigned int mov_to_msr_enabled : 1;
> + unsigned int mov_to_msr_extended : 1;
> + unsigned int singlestep_enabled : 1;
> + unsigned int software_breakpoint_enabled : 1;
> + unsigned int guest_request_enabled : 1;
> + unsigned int guest_request_sync : 1;
> } monitor;
>
> /* Mem_access emulation control */
> diff --git a/xen/include/asm-x86/hvm/event.h b/xen/include/asm-x86/hvm/event.h
> index 819ef96..ab5abd0 100644
> --- a/xen/include/asm-x86/hvm/event.h
> +++ b/xen/include/asm-x86/hvm/event.h
> @@ -26,6 +26,7 @@ void hvm_event_msr(unsigned int msr, uint64_t value);
> /* Called for current VCPU: returns -1 if no listener */
> int hvm_event_int3(unsigned long gla);
> int hvm_event_single_step(unsigned long gla);
> +void hvm_event_guest_request(void);
>
> #endif /* __ASM_X86_HVM_EVENT_H__ */
>
> diff --git a/xen/include/public/domctl.h b/xen/include/public/domctl.h
> index bc45ea5..6812016 100644
> --- a/xen/include/public/domctl.h
> +++ b/xen/include/public/domctl.h
> @@ -1012,6 +1012,7 @@ DEFINE_XEN_GUEST_HANDLE(xen_domctl_psr_cmt_op_t);
> #define XEN_DOMCTL_MONITOR_EVENT_MOV_TO_MSR 1
> #define XEN_DOMCTL_MONITOR_EVENT_SINGLESTEP 2
> #define XEN_DOMCTL_MONITOR_EVENT_SOFTWARE_BREAKPOINT 3
> +#define XEN_DOMCTL_MONITOR_EVENT_GUEST_REQUEST 4
>
> struct xen_domctl_monitor_op {
> uint32_t op; /* XEN_DOMCTL_MONITOR_OP_* */
> @@ -1034,6 +1035,11 @@ struct xen_domctl_monitor_op {
> /* Enable the capture of an extended set of MSRs */
> uint8_t extended_capture;
> } mov_to_msr;
> +
> + struct {
> + /* Pause vCPU until response */
> + uint8_t sync;
> + } guest_request;
> } u;
> };
> typedef struct xen_domctl_monitor_op xen_domctl_monitor_op_t;
> diff --git a/xen/include/public/hvm/hvm_op.h b/xen/include/public/hvm/hvm_op.h
> index 9b84e84..d053db9 100644
> --- a/xen/include/public/hvm/hvm_op.h
> +++ b/xen/include/public/hvm/hvm_op.h
> @@ -396,6 +396,8 @@ DEFINE_XEN_GUEST_HANDLE(xen_hvm_evtchn_upcall_vector_t);
>
> #endif /* defined(__i386__) || defined(__x86_64__) */
>
> +#define HVMOP_guest_request_vm_event 24
> +
> #endif /* __XEN_PUBLIC_HVM_HVM_OP_H__ */
>
> /*
> diff --git a/xen/include/public/vm_event.h b/xen/include/public/vm_event.h
> index c6f69af..11e65c4 100644
> --- a/xen/include/public/vm_event.h
> +++ b/xen/include/public/vm_event.h
> @@ -90,6 +90,8 @@
> #define VM_EVENT_REASON_SOFTWARE_BREAKPOINT 6
> /* Single-step (e.g. MTF) */
> #define VM_EVENT_REASON_SINGLESTEP 7
> +/* An event has been requested via HVMOP_guest_request_vm_event. */
> +#define VM_EVENT_REASON_GUEST_REQUEST 8
>
> /* Supported values for the vm_event_write_ctrlreg index. */
> #define VM_EVENT_X86_CR0 0
>
next prev parent reply other threads:[~2015-07-08 12:41 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-07-08 10:22 [PATCH V4 0/3] Vm_event memory introspection helpers Razvan Cojocaru
2015-07-08 10:22 ` [PATCH V4 1/3] xen/mem_access: Support for memory-content hiding Razvan Cojocaru
2015-07-08 12:24 ` Lengyel, Tamas
2015-07-10 12:41 ` Jan Beulich
2015-07-10 14:00 ` Razvan Cojocaru
2015-07-08 10:22 ` [PATCH V4 2/3] xen/vm_event: Support for guest-requested events Razvan Cojocaru
2015-07-08 12:41 ` George Dunlap [this message]
2015-07-08 10:22 ` [PATCH V4 3/3] xen/vm_event: Deny register writes if refused by vm_event reply Razvan Cojocaru
2015-07-08 12:18 ` Lengyel, Tamas
2015-07-08 12:26 ` Razvan Cojocaru
2015-07-08 12:39 ` Lengyel, Tamas
2015-07-08 12:52 ` Razvan Cojocaru
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=559D1A80.2020104@eu.citrix.com \
--to=george.dunlap@eu.citrix.com \
--cc=Aravind.Gopalakrishnan@amd.com \
--cc=andrew.cooper3@citrix.com \
--cc=boris.ostrovsky@oracle.com \
--cc=eddie.dong@intel.com \
--cc=ian.campbell@citrix.com \
--cc=ian.jackson@eu.citrix.com \
--cc=jbeulich@suse.com \
--cc=jun.nakajima@intel.com \
--cc=keir@xen.org \
--cc=kevin.tian@intel.com \
--cc=rcojocaru@bitdefender.com \
--cc=stefano.stabellini@eu.citrix.com \
--cc=suravee.suthikulpanit@amd.com \
--cc=tlengyel@novetta.com \
--cc=wei.liu2@citrix.com \
--cc=xen-devel@lists.xen.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.