[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 2/4] tools/libxc: Define VM_EVENT type
Define the type for each of the supported vm_event rings (paging, monitor and sharing) and replace the ring param field with this type. Signed-off-by: Petre Pircalabu <ppircalabu@xxxxxxxxxxxxxxx> --- tools/libxc/xc_monitor.c | 2 +- tools/libxc/xc_private.h | 6 +-- tools/libxc/xc_vm_event.c | 90 +++++++++++++++++++++++++++++---------------- xen/include/public/domctl.h | 21 +++++++---- 4 files changed, 77 insertions(+), 42 deletions(-) diff --git a/tools/libxc/xc_monitor.c b/tools/libxc/xc_monitor.c index 4ac823e..15e6a0e 100644 --- a/tools/libxc/xc_monitor.c +++ b/tools/libxc/xc_monitor.c @@ -24,7 +24,7 @@ void *xc_monitor_enable(xc_interface *xch, uint32_t domain_id, uint32_t *port) { - return xc_vm_event_enable(xch, domain_id, HVM_PARAM_MONITOR_RING_PFN, + return xc_vm_event_enable(xch, domain_id, XEN_VM_EVENT_TYPE_MONITOR, port); } diff --git a/tools/libxc/xc_private.h b/tools/libxc/xc_private.h index 705eaa9..be22986 100644 --- a/tools/libxc/xc_private.h +++ b/tools/libxc/xc_private.h @@ -430,10 +430,10 @@ int xc_ffs64(uint64_t x); int xc_vm_event_control(xc_interface *xch, uint32_t domain_id, unsigned int op, unsigned int mode, uint32_t *port); /* - * Enables vm_event and returns the mapped ring page indicated by param. - * param can be HVM_PARAM_PAGING/ACCESS/SHARING_RING_PFN + * Enables vm_event and returns the mapped ring page indicated by type. + * type can be XEN_VM_EVENT_TYPE_(PAGING/MONITOR/SHARING) */ -void *xc_vm_event_enable(xc_interface *xch, uint32_t domain_id, int param, +void *xc_vm_event_enable(xc_interface *xch, uint32_t domain_id, int type, uint32_t *port); int do_dm_op(xc_interface *xch, uint32_t domid, unsigned int nr_bufs, ...); diff --git a/tools/libxc/xc_vm_event.c b/tools/libxc/xc_vm_event.c index 8674607..dd34cec 100644 --- a/tools/libxc/xc_vm_event.c +++ b/tools/libxc/xc_vm_event.c @@ -39,16 +39,71 @@ int xc_vm_event_control(xc_interface *xch, uint32_t domain_id, unsigned int op, return rc; } -void *xc_vm_event_enable(xc_interface *xch, uint32_t domain_id, int param, +static int xc_vm_event_ring_pfn_param(int type, int *param) +{ + if ( !param ) + return -EINVAL; + + switch ( type ) + { + case XEN_VM_EVENT_TYPE_PAGING: + *param = HVM_PARAM_PAGING_RING_PFN; + break; + + case XEN_VM_EVENT_TYPE_MONITOR: + *param = HVM_PARAM_MONITOR_RING_PFN; + break; + + case XEN_VM_EVENT_TYPE_SHARING: + *param = HVM_PARAM_SHARING_RING_PFN; + break; + + default: + return -EINVAL; + } + + return 0; +} + +static int xc_vm_event_domctl(int type, unsigned int *param) +{ + if ( !param ) + return -EINVAL; + + switch ( type ) + { + case XEN_VM_EVENT_TYPE_PAGING: + *param = XEN_DOMCTL_VM_EVENT_OP_PAGING; + break; + + case XEN_VM_EVENT_TYPE_MONITOR: + *param = XEN_DOMCTL_VM_EVENT_OP_MONITOR; + break; + + case XEN_VM_EVENT_TYPE_SHARING: + *param = XEN_DOMCTL_VM_EVENT_OP_SHARING; + break; + + default: + return -EINVAL; + } + + return 0; +} + +void *xc_vm_event_enable(xc_interface *xch, uint32_t domain_id, int type, uint32_t *port) { void *ring_page = NULL; uint64_t pfn; xen_pfn_t ring_pfn, mmap_pfn; - unsigned int op, mode; + unsigned int mode; int rc1, rc2, saved_errno; + int param; - if ( !port ) + if ( !port || + xc_vm_event_ring_pfn_param(type, ¶m) != 0 || + xc_vm_event_domctl(type, &mode) ) { errno = EINVAL; return NULL; @@ -94,34 +149,7 @@ void *xc_vm_event_enable(xc_interface *xch, uint32_t domain_id, int param, goto out; } - switch ( param ) - { - case HVM_PARAM_PAGING_RING_PFN: - op = XEN_VM_EVENT_ENABLE; - mode = XEN_DOMCTL_VM_EVENT_OP_PAGING; - break; - - case HVM_PARAM_MONITOR_RING_PFN: - op = XEN_VM_EVENT_ENABLE; - mode = XEN_DOMCTL_VM_EVENT_OP_MONITOR; - break; - - case HVM_PARAM_SHARING_RING_PFN: - op = XEN_VM_EVENT_ENABLE; - mode = XEN_DOMCTL_VM_EVENT_OP_SHARING; - break; - - /* - * This is for the outside chance that the HVM_PARAM is valid but is invalid - * as far as vm_event goes. - */ - default: - errno = EINVAL; - rc1 = -1; - goto out; - } - - rc1 = xc_vm_event_control(xch, domain_id, op, mode, port); + rc1 = xc_vm_event_control(xch, domain_id, XEN_VM_EVENT_ENABLE, mode, port); if ( rc1 != 0 ) { PERROR("Failed to enable vm_event\n"); diff --git a/xen/include/public/domctl.h b/xen/include/public/domctl.h index 82b6967..ac4ced2 100644 --- a/xen/include/public/domctl.h +++ b/xen/include/public/domctl.h @@ -757,10 +757,17 @@ struct xen_domctl_gdbsx_domstatus { /* * There are currently three rings available for VM events: - * sharing, monitor and paging. This hypercall allows one to - * control these rings (enable/disable), as well as to signal - * to the hypervisor to pull responses (resume) from the given - * ring. + * sharing, monitor and paging + */ + +#define XEN_VM_EVENT_TYPE_PAGING 1 +#define XEN_VM_EVENT_TYPE_MONITOR 2 +#define XEN_VM_EVENT_TYPE_SHARING 3 + +/* + * This hypercall allows one to control the vm_event rings (enable/disable), + * as well as to signal to the hypervisor to pull responses (resume) from + * the given ring. */ #define XEN_VM_EVENT_ENABLE 0 #define XEN_VM_EVENT_DISABLE 1 @@ -780,7 +787,7 @@ struct xen_domctl_gdbsx_domstatus { * EXDEV - guest has PoD enabled * EBUSY - guest has or had paging enabled, ring buffer still active */ -#define XEN_DOMCTL_VM_EVENT_OP_PAGING 1 +#define XEN_DOMCTL_VM_EVENT_OP_PAGING XEN_VM_EVENT_TYPE_PAGING /* * Monitor helper. @@ -804,7 +811,7 @@ struct xen_domctl_gdbsx_domstatus { * EBUSY - guest has or had access enabled, ring buffer still active * */ -#define XEN_DOMCTL_VM_EVENT_OP_MONITOR 2 +#define XEN_DOMCTL_VM_EVENT_OP_MONITOR XEN_VM_EVENT_TYPE_MONITOR /* * Sharing ENOMEM helper. @@ -819,7 +826,7 @@ struct xen_domctl_gdbsx_domstatus { * Note that shring can be turned on (as per the domctl below) * *without* this ring being setup. */ -#define XEN_DOMCTL_VM_EVENT_OP_SHARING 3 +#define XEN_DOMCTL_VM_EVENT_OP_SHARING XEN_VM_EVENT_TYPE_SHARING /* Use for teardown/setup of helper<->hypervisor interface for paging, * access and sharing.*/ -- 2.7.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |