[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH for-4.5 v5 09/16] tools: Add limited support of VMware's hyper-call rpc
This guestinfo support is provided via libxc. libxl support has not be written. Note: VMware RPC support is only available on HVM domU. This interface is an extension of __HYPERVISOR_HVM_op. It was picked because xc_get_hvm_param() also uses it and VMware guest info is a lot like a hvm param. The HVMOP_get_vmport_guest_info is used by two libxc functions, xc_get_vmport_guest_info and xc_fetch_all_vmport_guest_info. xc_fetch_all_vmport_guest_info is designed to be used to fetch all currently set guestinfo values. Signed-off-by: Don Slutz <dslutz@xxxxxxxxxxx> --- tools/libxc/xc_domain.c | 115 ++++++++++++++++++++++++++++++++++++++++++++++++ tools/libxc/xenctrl.h | 24 ++++++++++ 2 files changed, 139 insertions(+) diff --git a/tools/libxc/xc_domain.c b/tools/libxc/xc_domain.c index 1a6f90a..ce24dad 100644 --- a/tools/libxc/xc_domain.c +++ b/tools/libxc/xc_domain.c @@ -1577,6 +1577,121 @@ int xc_hvm_set_ioreq_server_state(xc_interface *xch, return rc; } +int xc_set_vmport_guest_info(xc_interface *handle, + domid_t dom, + unsigned int key_len, + char *key, + unsigned int val_len, + char *val) +{ + DECLARE_HYPERCALL; + DECLARE_HYPERCALL_BUFFER(xen_hvm_vmport_guest_info_t, arg); + int rc; + + if ( (key_len < 1) || + (key_len > VMPORT_GUEST_INFO_KEY_MAX) || + (val_len > VMPORT_GUEST_INFO_VAL_MAX) ) + return -1; + + arg = xc_hypercall_buffer_alloc(handle, arg, sizeof(*arg)); + if ( arg == NULL ) + return -1; + + hypercall.op = __HYPERVISOR_hvm_op; + hypercall.arg[0] = HVMOP_set_vmport_guest_info; + hypercall.arg[1] = HYPERCALL_BUFFER_AS_ARG(arg); + arg->domid = dom; + arg->key_length = key_len; + arg->value_length = val_len; + memcpy(arg->data, key, key_len); + memcpy(&arg->data[key_len], val, val_len); + rc = do_xen_hypercall(handle, &hypercall); + xc_hypercall_buffer_free(handle, arg); + return rc; +} + +int xc_get_vmport_guest_info(xc_interface *handle, + domid_t dom, + unsigned int key_len, + char *key, + unsigned int val_max, + unsigned int *val_len, + char *val) +{ + DECLARE_HYPERCALL; + DECLARE_HYPERCALL_BUFFER(xen_hvm_vmport_guest_info_t, arg); + int rc; + + if ( (key_len < 1) || + (key_len > VMPORT_GUEST_INFO_KEY_MAX) ) + return -1; + + arg = xc_hypercall_buffer_alloc(handle, arg, sizeof(*arg)); + + hypercall.op = __HYPERVISOR_hvm_op; + hypercall.arg[0] = HVMOP_get_vmport_guest_info; + hypercall.arg[1] = HYPERCALL_BUFFER_AS_ARG(arg); + arg->domid = dom; + arg->key_length = key_len; + arg->value_length = 0; + *val_len = 0; + memcpy(arg->data, key, key_len); + rc = do_xen_hypercall(handle, &hypercall); + if ( rc == 0 ) + { + *val_len = arg->value_length; + if ( arg->value_length > val_max ) + arg->value_length = val_max; + memcpy(val, &arg->data[key_len], arg->value_length); + } + xc_hypercall_buffer_free(handle, arg); + return rc; +} + +int xc_fetch_all_vmport_guest_info(xc_interface *handle, + domid_t dom, + unsigned int idx, + unsigned int key_max, + unsigned int *key_len, + char *key, + unsigned int val_max, + unsigned int *val_len, + char *val) +{ + DECLARE_HYPERCALL; + DECLARE_HYPERCALL_BUFFER(xen_hvm_vmport_guest_info_t, arg); + int rc; + + arg = xc_hypercall_buffer_alloc(handle, arg, sizeof(*arg)); + + hypercall.op = __HYPERVISOR_hvm_op; + hypercall.arg[0] = HVMOP_get_vmport_guest_info; + hypercall.arg[1] = HYPERCALL_BUFFER_AS_ARG(arg); + arg->domid = dom; + arg->key_length = 0; + arg->value_length = idx; + *key_len = 0; + *val_len = 0; + rc = do_xen_hypercall(handle, &hypercall); + if ( rc == 0 ) + { + uint16_t val_off = arg->key_length; + + *key_len = arg->key_length; + if ( arg->key_length > key_max ) + arg->key_length = key_max; + memcpy(key, arg->data, arg->key_length); + *val_len = arg->value_length; + if ( arg->value_length > val_max ) + arg->value_length = val_max; + memcpy(val, + &arg->data[val_off], + arg->value_length); + } + xc_hypercall_buffer_free(handle, arg); + return rc; +} + int xc_domain_setdebugging(xc_interface *xch, uint32_t domid, unsigned int enable) diff --git a/tools/libxc/xenctrl.h b/tools/libxc/xenctrl.h index 1c8aa42..49d8d1e 100644 --- a/tools/libxc/xenctrl.h +++ b/tools/libxc/xenctrl.h @@ -2019,6 +2019,30 @@ int xc_hvm_destroy_ioreq_server(xc_interface *xch, domid_t domid, ioservid_t id); +int xc_set_vmport_guest_info(xc_interface *handle, + domid_t dom, + unsigned int key_len, + char *key, + unsigned int val_len, + char *val); +int xc_get_vmport_guest_info(xc_interface *handle, + domid_t dom, + unsigned int key_len, + char *key, + unsigned int val_max, + unsigned int *val_len, + char *val); +int xc_fetch_all_vmport_guest_info(xc_interface *handle, + domid_t dom, + unsigned int idx, + unsigned int key_max, + unsigned int *key_len, + char *key, + unsigned int val_max, + unsigned int *val_len, + char *val); + + /* HVM guest pass-through */ int xc_assign_device(xc_interface *xch, uint32_t domid, -- 1.8.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |