aboutsummaryrefslogtreecommitdiffstats
path: root/tools/libxc/xc_misc.c
diff options
context:
space:
mode:
authorIan Campbell <ian.campbell@citrix.com>2010-10-22 15:14:51 +0100
committerIan Campbell <ian.campbell@citrix.com>2010-10-22 15:14:51 +0100
commit2ac2a1c5d5f7238b454d0bb952e78e2220b23375 (patch)
tree4953e0d5595cd22dd9f15a213eb5d8a18d26dc02 /tools/libxc/xc_misc.c
parent6209471c3cd925fd33eeb15e7df70bf031a61229 (diff)
downloadxen-2ac2a1c5d5f7238b454d0bb952e78e2220b23375.tar.gz
xen-2ac2a1c5d5f7238b454d0bb952e78e2220b23375.tar.bz2
xen-2ac2a1c5d5f7238b454d0bb952e78e2220b23375.zip
libxc: convert hvmop interfaces over to hypercall buffers
Signed-off-by: Ian Campbell <ian.campbell@citrix.com> Signed-off-by: Ian Jackson <ian.jackson.citrix.com>
Diffstat (limited to 'tools/libxc/xc_misc.c')
-rw-r--r--tools/libxc/xc_misc.c137
1 files changed, 73 insertions, 64 deletions
diff --git a/tools/libxc/xc_misc.c b/tools/libxc/xc_misc.c
index 0b9c947964..e205dc0804 100644
--- a/tools/libxc/xc_misc.c
+++ b/tools/libxc/xc_misc.c
@@ -313,18 +313,19 @@ int xc_hvm_set_pci_intx_level(
unsigned int level)
{
DECLARE_HYPERCALL;
- struct xen_hvm_set_pci_intx_level _arg, *arg = &_arg;
+ DECLARE_HYPERCALL_BUFFER(struct xen_hvm_set_pci_intx_level, arg);
int rc;
- if ( (rc = hcall_buf_prep(xch, (void **)&arg, sizeof(*arg))) != 0 )
+ arg = xc_hypercall_buffer_alloc(xch, arg, sizeof(*arg));
+ if ( arg == NULL )
{
- PERROR("Could not lock memory");
- return rc;
+ PERROR("Could not allocate memory for xc_hvm_set_pci_intx_level hypercall");
+ return -1;
}
hypercall.op = __HYPERVISOR_hvm_op;
hypercall.arg[0] = HVMOP_set_pci_intx_level;
- hypercall.arg[1] = (unsigned long)arg;
+ hypercall.arg[1] = HYPERCALL_BUFFER_AS_ARG(arg);
arg->domid = dom;
arg->domain = domain;
@@ -335,7 +336,7 @@ int xc_hvm_set_pci_intx_level(
rc = do_xen_hypercall(xch, &hypercall);
- hcall_buf_release(xch, (void **)&arg, sizeof(*arg));
+ xc_hypercall_buffer_free(xch, arg);
return rc;
}
@@ -346,18 +347,19 @@ int xc_hvm_set_isa_irq_level(
unsigned int level)
{
DECLARE_HYPERCALL;
- struct xen_hvm_set_isa_irq_level _arg, *arg = &_arg;
+ DECLARE_HYPERCALL_BUFFER(struct xen_hvm_set_isa_irq_level, arg);
int rc;
- if ( (rc = hcall_buf_prep(xch, (void **)&arg, sizeof(*arg))) != 0 )
+ arg = xc_hypercall_buffer_alloc(xch, arg, sizeof(*arg));
+ if ( arg == NULL )
{
- PERROR("Could not lock memory");
- return rc;
+ PERROR("Could not allocate memory for xc_hvm_set_isa_irq_level hypercall");
+ return -1;
}
hypercall.op = __HYPERVISOR_hvm_op;
hypercall.arg[0] = HVMOP_set_isa_irq_level;
- hypercall.arg[1] = (unsigned long)arg;
+ hypercall.arg[1] = HYPERCALL_BUFFER_AS_ARG(arg);
arg->domid = dom;
arg->isa_irq = isa_irq;
@@ -365,7 +367,7 @@ int xc_hvm_set_isa_irq_level(
rc = do_xen_hypercall(xch, &hypercall);
- hcall_buf_release(xch, (void **)&arg, sizeof(*arg));
+ xc_hypercall_buffer_free(xch, arg);
return rc;
}
@@ -374,26 +376,27 @@ int xc_hvm_set_pci_link_route(
xc_interface *xch, domid_t dom, uint8_t link, uint8_t isa_irq)
{
DECLARE_HYPERCALL;
- struct xen_hvm_set_pci_link_route arg;
+ DECLARE_HYPERCALL_BUFFER(struct xen_hvm_set_pci_link_route, arg);
int rc;
+ arg = xc_hypercall_buffer_alloc(xch, arg, sizeof(*arg));
+ if ( arg == NULL )
+ {
+ PERROR("Could not allocate memory for xc_hvm_set_pci_link_route hypercall");
+ return -1;
+ }
+
hypercall.op = __HYPERVISOR_hvm_op;
hypercall.arg[0] = HVMOP_set_pci_link_route;
- hypercall.arg[1] = (unsigned long)&arg;
-
- arg.domid = dom;
- arg.link = link;
- arg.isa_irq = isa_irq;
+ hypercall.arg[1] = HYPERCALL_BUFFER_AS_ARG(arg);
- if ( (rc = lock_pages(xch, &arg, sizeof(arg))) != 0 )
- {
- PERROR("Could not lock memory");
- return rc;
- }
+ arg->domid = dom;
+ arg->link = link;
+ arg->isa_irq = isa_irq;
rc = do_xen_hypercall(xch, &hypercall);
- unlock_pages(xch, &arg, sizeof(arg));
+ xc_hypercall_buffer_free(xch, arg);
return rc;
}
@@ -404,28 +407,32 @@ int xc_hvm_track_dirty_vram(
unsigned long *dirty_bitmap)
{
DECLARE_HYPERCALL;
- struct xen_hvm_track_dirty_vram arg;
+ DECLARE_HYPERCALL_BOUNCE(dirty_bitmap, (nr+31) / 32, XC_HYPERCALL_BUFFER_BOUNCE_BOTH);
+ DECLARE_HYPERCALL_BUFFER(struct xen_hvm_track_dirty_vram, arg);
int rc;
+ arg = xc_hypercall_buffer_alloc(xch, arg, sizeof(*arg));
+ if ( arg == NULL || xc_hypercall_bounce_pre(xch, dirty_bitmap) )
+ {
+ PERROR("Could not bounce memory for xc_hvm_track_dirty_vram hypercall");
+ rc = -1;
+ goto out;
+ }
+
hypercall.op = __HYPERVISOR_hvm_op;
hypercall.arg[0] = HVMOP_track_dirty_vram;
- hypercall.arg[1] = (unsigned long)&arg;
-
- arg.domid = dom;
- arg.first_pfn = first_pfn;
- arg.nr = nr;
- set_xen_guest_handle(arg.dirty_bitmap, (uint8_t *)dirty_bitmap);
+ hypercall.arg[1] = HYPERCALL_BUFFER_AS_ARG(arg);
- if ( (rc = lock_pages(xch, &arg, sizeof(arg))) != 0 )
- {
- PERROR("Could not lock memory");
- return rc;
- }
+ arg->domid = dom;
+ arg->first_pfn = first_pfn;
+ arg->nr = nr;
+ xc_set_xen_guest_handle(arg->dirty_bitmap, dirty_bitmap);
rc = do_xen_hypercall(xch, &hypercall);
- unlock_pages(xch, &arg, sizeof(arg));
-
+out:
+ xc_hypercall_buffer_free(xch, arg);
+ xc_hypercall_bounce_post(xch, dirty_bitmap);
return rc;
}
@@ -433,26 +440,27 @@ int xc_hvm_modified_memory(
xc_interface *xch, domid_t dom, uint64_t first_pfn, uint64_t nr)
{
DECLARE_HYPERCALL;
- struct xen_hvm_modified_memory arg;
+ DECLARE_HYPERCALL_BUFFER(struct xen_hvm_modified_memory, arg);
int rc;
+ arg = xc_hypercall_buffer_alloc(xch, arg, sizeof(*arg));
+ if ( arg == NULL )
+ {
+ PERROR("Could not allocate memory for xc_hvm_modified_memory hypercall");
+ return -1;
+ }
+
hypercall.op = __HYPERVISOR_hvm_op;
hypercall.arg[0] = HVMOP_modified_memory;
- hypercall.arg[1] = (unsigned long)&arg;
+ hypercall.arg[1] = HYPERCALL_BUFFER_AS_ARG(arg);
- arg.domid = dom;
- arg.first_pfn = first_pfn;
- arg.nr = nr;
-
- if ( (rc = lock_pages(xch, &arg, sizeof(arg))) != 0 )
- {
- PERROR("Could not lock memory");
- return rc;
- }
+ arg->domid = dom;
+ arg->first_pfn = first_pfn;
+ arg->nr = nr;
rc = do_xen_hypercall(xch, &hypercall);
- unlock_pages(xch, &arg, sizeof(arg));
+ xc_hypercall_buffer_free(xch, arg);
return rc;
}
@@ -461,27 +469,28 @@ int xc_hvm_set_mem_type(
xc_interface *xch, domid_t dom, hvmmem_type_t mem_type, uint64_t first_pfn, uint64_t nr)
{
DECLARE_HYPERCALL;
- struct xen_hvm_set_mem_type arg;
+ DECLARE_HYPERCALL_BUFFER(struct xen_hvm_set_mem_type, arg);
int rc;
- hypercall.op = __HYPERVISOR_hvm_op;
- hypercall.arg[0] = HVMOP_set_mem_type;
- hypercall.arg[1] = (unsigned long)&arg;
-
- arg.domid = dom;
- arg.hvmmem_type = mem_type;
- arg.first_pfn = first_pfn;
- arg.nr = nr;
-
- if ( (rc = lock_pages(xch, &arg, sizeof(arg))) != 0 )
+ arg = xc_hypercall_buffer_alloc(xch, arg, sizeof(*arg));
+ if ( arg == NULL )
{
- PERROR("Could not lock memory");
- return rc;
+ PERROR("Could not allocate memory for xc_hvm_set_mem_type hypercall");
+ return -1;
}
+ arg->domid = dom;
+ arg->hvmmem_type = mem_type;
+ arg->first_pfn = first_pfn;
+ arg->nr = nr;
+
+ hypercall.op = __HYPERVISOR_hvm_op;
+ hypercall.arg[0] = HVMOP_set_mem_type;
+ hypercall.arg[1] = HYPERCALL_BUFFER_AS_ARG(arg);
+
rc = do_xen_hypercall(xch, &hypercall);
- unlock_pages(xch, &arg, sizeof(arg));
+ xc_hypercall_buffer_free(xch, arg);
return rc;
}