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.
*
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;
}
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
switch ( op->cmd )
{
case XEN_DOMCTL_test_assign_device:
+ case XEN_DOMCTL_vm_event_op:
if ( op->domain == DOMID_INVALID )
{
case XEN_DOMCTL_createdomain:
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,
{
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;
#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
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;
};
/*