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 | c89c726db972722d1e1ef3fd4913a05234c9cc47 (patch) | |
tree | 96e46313dfb8b746fbaafc28ac851ebc002c6538 /tools/libxc/xenctrl_osdep_ENOSYS.c | |
parent | 0ccceacd058c82f9cd747dff5efa92eebaded2fc (diff) | |
download | xen-c89c726db972722d1e1ef3fd4913a05234c9cc47.tar.gz xen-c89c726db972722d1e1ef3fd4913a05234c9cc47.tar.bz2 xen-c89c726db972722d1e1ef3fd4913a05234c9cc47.zip |
libxc: add abitility to dynamically load osdep.
Add a dummy backend which always returns ENOSYS. Mainly as a compile
time testbed rather than because it is a useful backend.
Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
Signed-off-by: Ian Jackson <ian.jackson.citrix.com>
Diffstat (limited to 'tools/libxc/xenctrl_osdep_ENOSYS.c')
-rw-r--r-- | tools/libxc/xenctrl_osdep_ENOSYS.c | 206 |
1 files changed, 206 insertions, 0 deletions
diff --git a/tools/libxc/xenctrl_osdep_ENOSYS.c b/tools/libxc/xenctrl_osdep_ENOSYS.c new file mode 100644 index 0000000000..90ae348a58 --- /dev/null +++ b/tools/libxc/xenctrl_osdep_ENOSYS.c @@ -0,0 +1,206 @@ +/* Dummy backend which just logs and returns ENOSYS. */ + +#include <errno.h> +#include <inttypes.h> +#include <stdlib.h> + +#include "xenctrl.h" +#include "xenctrlosdep.h" + +#define IPRINTF(_x, _f, _a...) xc_osdep_log(_x,XTL_INFO,0, _f , ## _a) + +#define ERROR(_x, _m, _a...) xc_osdep_log(_x,XTL_ERROR,XC_INTERNAL_ERROR,_m , ## _a ) +#define PERROR(_x, _m, _a...) xc_osdep_log(_x,XTL_ERROR,XC_INTERNAL_ERROR,_m \ + " (%d = %s)", ## _a , errno, xc_strerror(xch, errno)) + +static xc_osdep_handle ENOSYS_privcmd_open(xc_interface *xch) +{ + IPRINTF(xch, "ENOSYS_privcmd: opening handle %p\n", (void *)1); + return (xc_osdep_handle)1; /*dummy*/ +} + +static int ENOSYS_privcmd_close(xc_interface *xch, xc_osdep_handle h) +{ + IPRINTF(xch, "ENOSYS_privcmd: closing handle %p\n", h); + return 0; +} + +static int ENOSYS_privcmd_hypercall(xc_interface *xch, xc_osdep_handle h, privcmd_hypercall_t *hypercall) +{ + IPRINTF(xch, "ENOSYS_privcmd %p: hypercall: %02lld(%#llx,%#llx,%#llx,%#llx,%#llx,%#llx)\n", + h, hypercall->op, + hypercall->arg[0], hypercall->arg[1], hypercall->arg[2], + hypercall->arg[3], hypercall->arg[4], hypercall->arg[5]); + return -ENOSYS; +} + +static void *ENOSYS_privcmd_map_foreign_batch(xc_interface *xch, xc_osdep_handle h, uint32_t dom, int prot, + xen_pfn_t *arr, int num) +{ + IPRINTF(xch, "ENOSYS_privcmd %p: map_foreign_batch: dom%d prot %#x arr %p num %d\n", h, dom, prot, arr, num); + return MAP_FAILED; +} + +static void *ENOSYS_privcmd_map_foreign_bulk(xc_interface *xch, xc_osdep_handle h, uint32_t dom, int prot, + const xen_pfn_t *arr, int *err, unsigned int num) +{ + IPRINTF(xch, "ENOSYS_privcmd %p: map_foreign_buld: dom%d prot %#x arr %p err %p num %d\n", h, dom, prot, arr, err, num); + return MAP_FAILED; +} + +static void *ENOSYS_privcmd_map_foreign_range(xc_interface *xch, xc_osdep_handle h, uint32_t dom, int size, int prot, + unsigned long mfn) +{ + IPRINTF(xch, "ENOSYS_privcmd %p: map_foreign_range: dom%d size %#x prot %#x mfn %ld\n", h, dom, size, prot, mfn); + return MAP_FAILED; +} + +static void *ENOSYS_privcmd_map_foreign_ranges(xc_interface *xch, xc_osdep_handle h, uint32_t dom, size_t size, int prot, + size_t chunksize, privcmd_mmap_entry_t entries[], + int nentries) +{ + IPRINTF(xch, "ENOSYS_privcmd %p: map_foreign_ranges: dom%d size %zd prot %#x chunksize %zd entries %p num %d\n", h, dom, size, prot, chunksize, entries, nentries); + return MAP_FAILED; +} + +static struct xc_osdep_ops ENOSYS_privcmd_ops = +{ + .open = &ENOSYS_privcmd_open, + .close = &ENOSYS_privcmd_close, + .u.privcmd = { + .hypercall = &ENOSYS_privcmd_hypercall, + + .map_foreign_batch = &ENOSYS_privcmd_map_foreign_batch, + .map_foreign_bulk = &ENOSYS_privcmd_map_foreign_bulk, + .map_foreign_range = &ENOSYS_privcmd_map_foreign_range, + .map_foreign_ranges = &ENOSYS_privcmd_map_foreign_ranges, + } +}; + +static xc_osdep_handle ENOSYS_evtchn_open(xc_interface *xce) +{ + IPRINTF(xce, "ENOSYS_evtchn: opening handle %p\n", (void *)1); + return (xc_osdep_handle)2; /*dummy*/ +} + +static int ENOSYS_evtchn_close(xc_interface *xce, xc_osdep_handle h) +{ + IPRINTF(xce, "ENOSYS_evtchn: closing handle %p\n", h); + return 0; +} + +static int ENOSYS_evtchn_fd(xc_interface *xce, xc_osdep_handle h) +{ + IPRINTF(xce, "ENOSYS_fd %p: fd\n", h); + return (int)h; +} + +static int ENOSYS_evtchn_notify(xc_interface *xce, xc_osdep_handle h, evtchn_port_t port) +{ + IPRINTF(xce, "ENOSYS_evtchn %p: notify: %d\n", h, port); + return -ENOSYS; +} + +static int ENOSYS_evtchn_bind_unbound_port(xc_interface *xce, xc_osdep_handle h, int domid) +{ + IPRINTF(xce, "ENOSYS_evtchn %p: bind_unbound_port: dom%d\n", h, domid); + return -ENOSYS; +} + + +static int ENOSYS_evtchn_bind_interdomain(xc_interface *xce, xc_osdep_handle h, int domid, evtchn_port_t remote_port) +{ + IPRINTF(xce, "ENOSYS_evtchn %p: bind_interdomain: dmo%d %d\n", h, domid, remote_port); + return -ENOSYS; +} + + +static int ENOSYS_evtchn_bind_virq(xc_interface *xce, xc_osdep_handle h, unsigned int virq) +{ + IPRINTF(xce, "ENOSYS_evtchn %p: bind_virq: %d\n", h, virq); + return -ENOSYS; +} + + +static int ENOSYS_evtchn_unbind(xc_interface *xce, xc_osdep_handle h, evtchn_port_t port) +{ + IPRINTF(xce, "ENOSYS_evtchn %p: unbind: %d\n", h, port); + return -ENOSYS; +} + + +static evtchn_port_or_error_t ENOSYS_evtchn_pending(xc_interface *xce, xc_osdep_handle h) +{ + IPRINTF(xce, "ENOSYS_evtchn %p: pending\n", h); + return -ENOSYS; +} + +static int ENOSYS_evtchn_unmask(xc_interface *xce, xc_osdep_handle h, evtchn_port_t port) +{ + IPRINTF(xce, "ENOSYS_evtchn %p: unmask: %d\n", h, port); + return -ENOSYS; +} + +static struct xc_osdep_ops ENOSYS_evtchn_ops = { + .open = &ENOSYS_evtchn_open, + .close = &ENOSYS_evtchn_close, + + .u.evtchn = { + .fd = &ENOSYS_evtchn_fd, + + .notify = &ENOSYS_evtchn_notify, + + .bind_unbound_port = &ENOSYS_evtchn_bind_unbound_port, + .bind_interdomain = &ENOSYS_evtchn_bind_interdomain, + .bind_virq = &ENOSYS_evtchn_bind_virq, + + .unbind = &ENOSYS_evtchn_unbind, + + .pending = &ENOSYS_evtchn_pending, + .unmask = &ENOSYS_evtchn_unmask, + }, +}; + +static struct xc_osdep_ops * ENOSYS_osdep_init(xc_interface *xch, enum xc_osdep_type type) +{ + struct xc_osdep_ops *ops; + + if (getenv("ENOSYS") == NULL) + { + PERROR(xch, "ENOSYS: not configured\n"); + return NULL; + } + + switch ( type ) + { + case XC_OSDEP_PRIVCMD: + ops = &ENOSYS_privcmd_ops; + break; + case XC_OSDEP_EVTCHN: + ops = &ENOSYS_evtchn_ops; + break; + default: + ops = NULL; + break; + } + + IPRINTF(xch, "ENOSYS_osdep_init: initialising handle ops at %p\n", ops); + + return ops; +} + +xc_osdep_info_t xc_osdep_info = { + .name = "Pessimistic ENOSYS OS interface", + .init = &ENOSYS_osdep_init, + .fake = 1, +}; + +/* + * Local variables: + * mode: C + * c-set-style: "BSD" + * c-basic-offset: 4 + * tab-width: 4 + * indent-tabs-mode: nil + * End: + */ |