Files
xen/tools/libxc/include/xenctrl_compat.h
T
Paul Durrant 6902cb00e0 tools/libxendevicemodel: extract functions and add a compat layer
This patch extracts all functions resulting in a dm_op hypercall from
libxenctrl and moves them into libxendevicemodel. It also adds a compat
layer into libxenctrl, which can be selected by defining
XC_WANT_COMPAT_DEVICEMODEL_API to 1 before including xenctrl.h.

With this patch the core of libxendevicemodel still uses libxencall to
issue the dm_op hypercalls, but this is done by calling through code that
can be modified on a per-OS basis. A subsequent patch will add a Linux-
specific variant.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
Acked-by: Ian Jackson <ian.jackson@eu.citrix.com>
Cc: Wei Liu <wei.liu2@citrix.com>
2017-02-23 11:57:40 +00:00

181 lines
6.9 KiB
C

/*
* Compat shims for use of 3rd party consumers of libxenctrl
* functionality which has been split into separate libraries.
*
* New code should use the separate libraries.
*
* Each interface must be opted-into separately by defining:
*
* XC_WANT_COMPAT_EVTCHN_API
* - Functions relating to /dev/xen/evtchn
*/
#ifndef XENCTRL_COMPAT_H
#define XENCTRL_COMPAT_H
#ifdef XC_WANT_COMPAT_MAP_FOREIGN_API
/**
* Memory maps a range within one domain to a local address range. Mappings
* should be unmapped with munmap and should follow the same rules as mmap
* regarding page alignment. Returns NULL on failure.
*
* @parm xch a handle on an open hypervisor interface
* @parm dom the domain to map memory from
* @parm size the amount of memory to map (in multiples of page size)
* @parm prot same flag as in mmap().
* @parm mfn the frame address to map.
*/
void *xc_map_foreign_range(xc_interface *xch, uint32_t dom,
int size, int prot,
unsigned long mfn );
void *xc_map_foreign_pages(xc_interface *xch, uint32_t dom, int prot,
const xen_pfn_t *arr, int num );
/* Nothing within the library itself other than the compat wrapper
* itself should be using this, everything inside has access to
* xenforeignmemory_map().
*/
#if !defined(XC_INTERNAL_COMPAT_MAP_FOREIGN_API) || \
defined(XC_BUILDING_COMPAT_MAP_FOREIGN_API)
/**
* Like xc_map_foreign_pages(), except it can succeed partially.
* When a page cannot be mapped, its respective field in @err is
* set to the corresponding errno value.
*/
void *xc_map_foreign_bulk(xc_interface *xch, uint32_t dom, int prot,
const xen_pfn_t *arr, int *err, unsigned int num);
#endif
#endif
#ifdef XC_WANT_COMPAT_EVTCHN_API
typedef struct xenevtchn_handle xc_evtchn;
typedef xc_evtchn_port_or_error_t evtchn_port_or_error_t;
xc_evtchn *xc_evtchn_open(xentoollog_logger *logger,
unsigned open_flags);
int xc_evtchn_close(xc_evtchn *xce);
int xc_evtchn_fd(xc_evtchn *xce);
int xc_evtchn_notify(xc_evtchn *xce, evtchn_port_t port);
xc_evtchn_port_or_error_t
xc_evtchn_bind_unbound_port(xc_evtchn *xce, int domid);
xc_evtchn_port_or_error_t
xc_evtchn_bind_interdomain(xc_evtchn *xce, int domid,
evtchn_port_t remote_port);
xc_evtchn_port_or_error_t
xc_evtchn_bind_virq(xc_evtchn *xce, unsigned int virq);
int xc_evtchn_unbind(xc_evtchn *xce, evtchn_port_t port);
xc_evtchn_port_or_error_t
xc_evtchn_pending(xc_evtchn *xce);
int xc_evtchn_unmask(xc_evtchn *xce, evtchn_port_t port);
#endif /* XC_WANT_COMPAT_EVTCHN_API */
#ifdef XC_WANT_COMPAT_GNTTAB_API
typedef struct xengntdev_handle xc_gnttab;
xc_gnttab *xc_gnttab_open(xentoollog_logger *logger,
unsigned open_flags);
int xc_gnttab_close(xc_gnttab *xcg);
void *xc_gnttab_map_grant_ref(xc_gnttab *xcg,
uint32_t domid,
uint32_t ref,
int prot);
void *xc_gnttab_map_grant_refs(xc_gnttab *xcg,
uint32_t count,
uint32_t *domids,
uint32_t *refs,
int prot);
void *xc_gnttab_map_domain_grant_refs(xc_gnttab *xcg,
uint32_t count,
uint32_t domid,
uint32_t *refs,
int prot);
void *xc_gnttab_map_grant_ref_notify(xc_gnttab *xcg,
uint32_t domid,
uint32_t ref,
int prot,
uint32_t notify_offset,
evtchn_port_t notify_port);
int xc_gnttab_munmap(xc_gnttab *xcg,
void *start_address,
uint32_t count);
int xc_gnttab_set_max_grants(xc_gnttab *xcg,
uint32_t count);
typedef struct xengntdev_handle xc_gntshr;
xc_gntshr *xc_gntshr_open(xentoollog_logger *logger,
unsigned open_flags);
int xc_gntshr_close(xc_gntshr *xcg);
void *xc_gntshr_share_pages(xc_gntshr *xcg, uint32_t domid,
int count, uint32_t *refs, int writable);
void *xc_gntshr_share_page_notify(xc_gntshr *xcg, uint32_t domid,
uint32_t *ref, int writable,
uint32_t notify_offset,
evtchn_port_t notify_port);
int xc_gntshr_munmap(xc_gntshr *xcg, void *start_address, uint32_t count);
#endif /* XC_WANT_COMPAT_GNTTAB_API */
#ifdef XC_WANT_COMPAT_DEVICEMODEL_API
int xc_hvm_create_ioreq_server(
xc_interface *xch, domid_t domid, int handle_bufioreq,
ioservid_t *id);
int xc_hvm_get_ioreq_server_info(
xc_interface *xch, domid_t domid, ioservid_t id, xen_pfn_t *ioreq_pfn,
xen_pfn_t *bufioreq_pfn, evtchn_port_t *bufioreq_port);
int xc_hvm_map_io_range_to_ioreq_server(
xc_interface *xch, domid_t domid, ioservid_t id, int is_mmio,
uint64_t start, uint64_t end);
int xc_hvm_unmap_io_range_from_ioreq_server(
xc_interface *xch, domid_t domid, ioservid_t id, int is_mmio,
uint64_t start, uint64_t end);
int xc_hvm_map_pcidev_to_ioreq_server(
xc_interface *xch, domid_t domid, ioservid_t id, uint16_t segment,
uint8_t bus, uint8_t device, uint8_t function);
int xc_hvm_unmap_pcidev_from_ioreq_server(
xc_interface *xch, domid_t domid, ioservid_t id, uint16_t segment,
uint8_t bus, uint8_t device, uint8_t function);
int xc_hvm_destroy_ioreq_server(
xc_interface *xch, domid_t domid, ioservid_t id);
int xc_hvm_set_ioreq_server_state(
xc_interface *xch, domid_t domid, ioservid_t id, int enabled);
int xc_hvm_set_pci_intx_level(
xc_interface *xch, domid_t domid, uint16_t segment, uint8_t bus,
uint8_t device, uint8_t intx, unsigned int level);
int xc_hvm_set_isa_irq_level(
xc_interface *xch, domid_t domid, uint8_t irq, unsigned int level);
int xc_hvm_set_pci_link_route(
xc_interface *xch, domid_t domid, uint8_t link, uint8_t irq);
int xc_hvm_inject_msi(
xc_interface *xch, domid_t domid, uint64_t msi_addr, uint32_t msi_data);
int xc_hvm_track_dirty_vram(
xc_interface *xch, domid_t domid, uint64_t first_pfn, uint32_t nr,
unsigned long *dirty_bitmap);
int xc_hvm_modified_memory(
xc_interface *xch, domid_t domid, uint64_t first_pfn, uint32_t nr);
int xc_hvm_set_mem_type(
xc_interface *xch, domid_t domid, hvmmem_type_t type,
uint64_t first_pfn, uint32_t nr);
int xc_hvm_inject_trap(
xc_interface *xch, domid_t domid, int vcpu, uint8_t vector,
uint8_t type, uint32_t error_code, uint8_t insn_len, uint64_t cr2);
#endif /* XC_WANT_COMPAT_DEVICEMODEL_API */
#endif
/*
* Local variables:
* mode: C
* c-file-style: "BSD"
* c-basic-offset: 4
* tab-width: 4
* indent-tabs-mode: nil
* End:
*/