[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [XEN][RFC PATCH 09/15] xc: Add the hypercall for multiple servers
This patch add 5 hypercalls to register server, io range and PCI. Signed-off-by: Julien Grall <julien.grall@xxxxxxxxxx> --- tools/libxc/xc_domain.c | 140 +++++++++++++++++++++++++++++++++++++++++++++++ tools/libxc/xenctrl.h | 13 ++++ 2 files changed, 153 insertions(+), 0 deletions(-) diff --git a/tools/libxc/xc_domain.c b/tools/libxc/xc_domain.c index d98e68b..8067397 100644 --- a/tools/libxc/xc_domain.c +++ b/tools/libxc/xc_domain.c @@ -1514,6 +1514,146 @@ int xc_domain_set_virq_handler(xc_interface *xch, uint32_t domid, int virq) return do_domctl(xch, &domctl); } +int xc_hvm_register_ioreq_server(xc_interface *xch, domid_t dom, servid_t *id) +{ + DECLARE_HYPERCALL; + DECLARE_HYPERCALL_BUFFER(xen_hvm_register_ioreq_server_t, arg); + int rc = -1; + + arg = xc_hypercall_buffer_alloc(xch, arg, sizeof (*arg)); + if (!arg) { + PERROR("Could not allocate memory for xc_hvm_register_ioreq_server hypercall"); + goto out; + } + + hypercall.op = __HYPERVISOR_hvm_op; + hypercall.arg[0] = HVMOP_register_ioreq_server; + hypercall.arg[1] = HYPERCALL_BUFFER_AS_ARG(arg); + + arg->domid = dom; + rc = do_xen_hypercall(xch, &hypercall); + *id = arg->id; + + xc_hypercall_buffer_free(xch, arg); +out: + return rc; +} + +int xc_hvm_get_ioreq_server_buf_channel(xc_interface *xch, domid_t dom, servid_t id, + unsigned int *channel) +{ + DECLARE_HYPERCALL; + DECLARE_HYPERCALL_BUFFER(xen_hvm_get_ioreq_server_buf_channel_t, arg); + int rc = -1; + + arg = xc_hypercall_buffer_alloc(xch, arg, sizeof (*arg)); + if (!arg) { + PERROR("Could not allocate memory for xc_hvm_get_ioreq_servr_buf_channel"); + goto out; + } + + hypercall.op = __HYPERVISOR_hvm_op; + hypercall.arg[0] = HVMOP_get_ioreq_server_buf_channel; + hypercall.arg[1] = HYPERCALL_BUFFER_AS_ARG(arg); + + arg->domid = dom; + arg->id = id; + rc = do_xen_hypercall(xch, &hypercall); + *channel = arg->channel; + + xc_hypercall_buffer_free(xch, arg); + +out: + return rc; +} + +int xc_hvm_map_io_range_to_ioreq_server(xc_interface *xch, domid_t dom, servid_t id, + char is_mmio, uint64_t start, uint64_t end) +{ + DECLARE_HYPERCALL; + DECLARE_HYPERCALL_BUFFER(xen_hvm_map_io_range_to_ioreq_server_t, arg); + int rc = -1; + + arg = xc_hypercall_buffer_alloc(xch, arg, sizeof (*arg)); + if (!arg) { + PERROR("Could not allocate memory for xc_hvm_map_io_range_to_ioreq_server hypercall"); + goto out; + } + + hypercall.op = __HYPERVISOR_hvm_op; + hypercall.arg[0] = HVMOP_map_io_range_to_ioreq_server; + hypercall.arg[1] = HYPERCALL_BUFFER_AS_ARG(arg); + + arg->domid = dom; + arg->id = id; + arg->is_mmio = is_mmio; + arg->s = start; + arg->e = end; + + rc = do_xen_hypercall(xch, &hypercall); + + xc_hypercall_buffer_free(xch, arg); +out: + return rc; +} + +int xc_hvm_unmap_io_range_from_ioreq_server(xc_interface *xch, domid_t dom, servid_t id, + char is_mmio, uint64_t addr) +{ + DECLARE_HYPERCALL; + DECLARE_HYPERCALL_BUFFER(xen_hvm_unmap_io_range_from_ioreq_server_t, arg); + int rc = -1; + + arg = xc_hypercall_buffer_alloc(xch, arg, sizeof (*arg)); + if (!arg) { + PERROR("Could not allocate memory for xc_hvm_unmap_io_range_from_ioreq_server hypercall"); + goto out; + } + + hypercall.op = __HYPERVISOR_hvm_op; + hypercall.arg[0] = HVMOP_unmap_io_range_from_ioreq_server; + hypercall.arg[1] = HYPERCALL_BUFFER_AS_ARG(arg); + + arg->domid = dom; + arg->id = id; + arg->is_mmio = is_mmio; + arg->addr = addr; + rc = do_xen_hypercall(xch, &hypercall); + + xc_hypercall_buffer_free(xch, arg); +out: + return rc; +} + +int xc_hvm_register_pcidev(xc_interface *xch, domid_t dom, servid_t id, + uint16_t bdf) +{ + DECLARE_HYPERCALL; + DECLARE_HYPERCALL_BUFFER(xen_hvm_register_pcidev_t, arg); + int rc = -1; + + arg = xc_hypercall_buffer_alloc(xch, arg, sizeof (*arg)); + if (!arg) + { + PERROR("Could not allocate memory for xc_hvm_create_pci hypercall"); + goto out; + } + + hypercall.op = __HYPERVISOR_hvm_op; + hypercall.arg[0] = HVMOP_register_pcidev; + hypercall.arg[1] = HYPERCALL_BUFFER_AS_ARG(arg); + + arg->domid = dom; + arg->id = id; + arg->bdf = bdf; + rc = do_xen_hypercall(xch, &hypercall); + + xc_hypercall_buffer_free(xch, arg); +out: + return rc; +} + + /* * Local variables: * mode: C diff --git a/tools/libxc/xenctrl.h b/tools/libxc/xenctrl.h index 812e723..bcbfee5 100644 --- a/tools/libxc/xenctrl.h +++ b/tools/libxc/xenctrl.h @@ -1648,6 +1648,19 @@ void xc_clear_last_error(xc_interface *xch); int xc_set_hvm_param(xc_interface *handle, domid_t dom, int param, unsigned long value); int xc_get_hvm_param(xc_interface *handle, domid_t dom, int param, unsigned long *value); +int xc_hvm_register_ioreq_server(xc_interface *xch, domid_t dom, unsigned int *id); +int xc_hvm_get_ioreq_server_buf_channel(xc_interface *xch, domid_t dom, servid_t id, + unsigned int *channel); +int xc_hvm_map_io_range_to_ioreq_server(xc_interface *xch, domid_t dom, unsigned int id, + char is_mmio, uint64_t start, uint64_t end); +int xc_hvm_unmap_io_range_from_ioreq_server(xc_interface *xch, domid_t dom, unsigned int id, + char is_mmio, uint64_t addr); +/* + * Register a PCI device + */ +int xc_hvm_register_pcidev(xc_interface *xch, domid_t dom, unsigned int id, + uint16_t bdf); + /* IA64 specific, nvram save */ int xc_ia64_save_to_nvram(xc_interface *xch, uint32_t dom); -- Julien Grall _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |