diff options
author | Ian Campbell <ian.campbell@citrix.com> | 2010-12-03 09:36:47 +0000 |
---|---|---|
committer | Ian Campbell <ian.campbell@citrix.com> | 2010-12-03 09:36:47 +0000 |
commit | fd81c3683ab201bef87a7e9f52e61be161993752 (patch) | |
tree | e576ba6d05ab8b92268258c53a5a23cd5cb29755 /tools/libxc/xc_foreign_memory.c | |
parent | c89c726db972722d1e1ef3fd4913a05234c9cc47 (diff) | |
download | xen-fd81c3683ab201bef87a7e9f52e61be161993752.tar.gz xen-fd81c3683ab201bef87a7e9f52e61be161993752.tar.bz2 xen-fd81c3683ab201bef87a7e9f52e61be161993752.zip |
libxc: move foreign memory functions to xc_foreign_memory.c
Now that this file exists it is a better home for these than xc_misc.c
Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
Signed-off-by: Ian Jackson <ian.jackson.citrix.com>
Diffstat (limited to 'tools/libxc/xc_foreign_memory.c')
-rw-r--r-- | tools/libxc/xc_foreign_memory.c | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/tools/libxc/xc_foreign_memory.c b/tools/libxc/xc_foreign_memory.c index 907c02bd7e..2c6d8d3952 100644 --- a/tools/libxc/xc_foreign_memory.c +++ b/tools/libxc/xc_foreign_memory.c @@ -20,6 +20,37 @@ #include "xc_private.h" +void *xc_map_foreign_pages(xc_interface *xch, uint32_t dom, int prot, + const xen_pfn_t *arr, int num) +{ + void *res; + int i, *err; + + if (num < 0) { + errno = -EINVAL; + return NULL; + } + + err = malloc(num * sizeof(*err)); + if (!err) + return NULL; + + res = xc_map_foreign_bulk(xch, dom, prot, arr, err, num); + if (res) { + for (i = 0; i < num; i++) { + if (err[i]) { + errno = -err[i]; + munmap(res, num * PAGE_SIZE); + res = NULL; + break; + } + } + } + + free(err); + return res; +} + void *xc_map_foreign_range(xc_interface *xch, uint32_t dom, int size, int prot, unsigned long mfn) { @@ -49,6 +80,47 @@ void *xc_map_foreign_bulk(xc_interface *xch, uint32_t dom, int prot, dom, prot, arr, err, num); } +/* stub for all not yet converted OSes */ +void *xc_map_foreign_bulk_compat(xc_interface *xch, xc_osdep_handle h, + uint32_t dom, int prot, + const xen_pfn_t *arr, int *err, unsigned int num) +{ + xen_pfn_t *pfn; + unsigned int i; + void *ret; + + if ((int)num <= 0) { + errno = EINVAL; + return NULL; + } + + pfn = malloc(num * sizeof(*pfn)); + if (!pfn) { + errno = ENOMEM; + return NULL; + } + + memcpy(pfn, arr, num * sizeof(*arr)); + ret = xc_map_foreign_batch(xch, dom, prot, pfn, num); + + if (ret) { + for (i = 0; i < num; ++i) + switch (pfn[i] ^ arr[i]) { + case 0: + err[i] = 0; + break; + default: + err[i] = -EINVAL; + break; + } + } else + memset(err, 0, num * sizeof(*err)); + + free(pfn); + + return ret; +} + /* * Local variables: * mode: C |