[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen master] vm_event: Add a new opcode to get VM_EVENT_INTERFACE_VERSION
commit d48e1836074cec0d2b7dd11f7ffce716bdf7cbcb Author: Petre Pircalabu <ppircalabu@xxxxxxxxxxxxxxx> AuthorDate: Thu Feb 14 16:18:11 2019 +0200 Commit: Wei Liu <wei.liu2@xxxxxxxxxx> CommitDate: Tue Mar 12 12:57:13 2019 +0000 vm_event: Add a new opcode to get VM_EVENT_INTERFACE_VERSION Currently, the VM_EVENT_INTERFACE_VERSION is determined at runtime, by inspecting the corresponding field in a vm_event_request. This helper opcode will query the hypervisor supported version before the vm_event related structures and layout are set-up. Signed-off-by: Petre Pircalabu <ppircalabu@xxxxxxxxxxxxxxx> Acked-by: Jan Beulich <jbeulich@xxxxxxxx> Acked-by: Wei Liu <wei.liu2@xxxxxxxxxx> Acked-by: Tamas K Lengyel <tamas@xxxxxxxxxxxxx> --- tools/libxc/include/xenctrl.h | 5 +++++ tools/libxc/xc_vm_event.c | 18 +++++++++++++++++- xen/common/domctl.c | 1 + xen/common/vm_event.c | 11 ++++++++++- xen/include/public/domctl.h | 9 ++++++++- 5 files changed, 41 insertions(+), 3 deletions(-) diff --git a/tools/libxc/include/xenctrl.h b/tools/libxc/include/xenctrl.h index 31cdda76c6..a3628e56bb 100644 --- a/tools/libxc/include/xenctrl.h +++ b/tools/libxc/include/xenctrl.h @@ -2003,6 +2003,11 @@ int xc_set_mem_access_multi(xc_interface *xch, uint32_t domain_id, int xc_get_mem_access(xc_interface *xch, uint32_t domain_id, uint64_t pfn, xenmem_access_t *access); +/* + * Returns the VM_EVENT_INTERFACE version. + */ +int xc_vm_event_get_version(xc_interface *xch); + /*** * Monitor control operations. * diff --git a/tools/libxc/xc_vm_event.c b/tools/libxc/xc_vm_event.c index 8674607895..a97c615b18 100644 --- a/tools/libxc/xc_vm_event.c +++ b/tools/libxc/xc_vm_event.c @@ -35,7 +35,7 @@ int xc_vm_event_control(xc_interface *xch, uint32_t domain_id, unsigned int op, rc = do_domctl(xch, &domctl); if ( !rc && port ) - *port = domctl.u.vm_event_op.port; + *port = domctl.u.vm_event_op.u.enable.port; return rc; } @@ -156,6 +156,22 @@ void *xc_vm_event_enable(xc_interface *xch, uint32_t domain_id, int param, return ring_page; } +int xc_vm_event_get_version(xc_interface *xch) +{ + DECLARE_DOMCTL; + int rc; + + domctl.cmd = XEN_DOMCTL_vm_event_op; + domctl.domain = DOMID_INVALID; + domctl.u.vm_event_op.op = XEN_VM_EVENT_GET_VERSION; + domctl.u.vm_event_op.mode = XEN_DOMCTL_VM_EVENT_OP_MONITOR; + + rc = do_domctl(xch, &domctl); + if ( !rc ) + rc = domctl.u.vm_event_op.u.version; + return rc; +} + /* * Local variables: * mode: C diff --git a/xen/common/domctl.c b/xen/common/domctl.c index d08b6274e2..bade9a63b1 100644 --- a/xen/common/domctl.c +++ b/xen/common/domctl.c @@ -392,6 +392,7 @@ long do_domctl(XEN_GUEST_HANDLE_PARAM(xen_domctl_t) u_domctl) switch ( op->cmd ) { case XEN_DOMCTL_test_assign_device: + case XEN_DOMCTL_vm_event_op: if ( op->domain == DOMID_INVALID ) { case XEN_DOMCTL_createdomain: diff --git a/xen/common/vm_event.c b/xen/common/vm_event.c index 26cfa2c605..19c983c035 100644 --- a/xen/common/vm_event.c +++ b/xen/common/vm_event.c @@ -88,7 +88,7 @@ static int vm_event_enable( if ( rc < 0 ) goto err; - (*ved)->xen_port = vec->port = rc; + (*ved)->xen_port = vec->u.enable.port = rc; /* Prepare ring buffer */ FRONT_RING_INIT(&(*ved)->front_ring, @@ -592,6 +592,15 @@ int vm_event_domctl(struct domain *d, struct xen_domctl_vm_event_op *vec, { int rc; + if ( vec->op == XEN_VM_EVENT_GET_VERSION ) + { + vec->u.version = VM_EVENT_INTERFACE_VERSION; + return 0; + } + + if ( unlikely(d == NULL) ) + return -ESRCH; + rc = xsm_vm_event_control(XSM_PRIV, d, vec->mode, vec->op); if ( rc ) return rc; diff --git a/xen/include/public/domctl.h b/xen/include/public/domctl.h index 7e1cf21075..19486d5e32 100644 --- a/xen/include/public/domctl.h +++ b/xen/include/public/domctl.h @@ -781,6 +781,7 @@ struct xen_domctl_gdbsx_domstatus { #define XEN_VM_EVENT_ENABLE 0 #define XEN_VM_EVENT_DISABLE 1 #define XEN_VM_EVENT_RESUME 2 +#define XEN_VM_EVENT_GET_VERSION 3 /* * Domain memory paging @@ -843,7 +844,13 @@ struct xen_domctl_vm_event_op { uint32_t op; /* XEN_VM_EVENT_* */ uint32_t mode; /* XEN_DOMCTL_VM_EVENT_OP_* */ - uint32_t port; /* OUT: event channel for ring */ + union { + struct { + uint32_t port; /* OUT: event channel for ring */ + } enable; + + uint32_t version; + } u; }; /* -- generated by git-patchbot for /home/xen/git/xen.git#master _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |