158ea30f5SMarkus Armbruster #ifndef HW_XEN_LEGACY_BACKEND_H 258ea30f5SMarkus Armbruster #define HW_XEN_LEGACY_BACKEND_H 3d94f9486Saliguori 40d09e41aSPaolo Bonzini #include "hw/xen/xen_common.h" 5f0021dbaSEmil Condrea #include "hw/xen/xen_pvdev.h" 61422e32dSPaolo Bonzini #include "net/net.h" 7d94f9486Saliguori 8873d57abSJuergen Gross #define TYPE_XENSYSDEV "xen-sysdev" 9873d57abSJuergen Gross #define TYPE_XENSYSBUS "xen-sysbus" 103a6c9172SJuergen Gross #define TYPE_XENBACKEND "xen-backend" 113a6c9172SJuergen Gross 12*694b3d28SEduardo Habkost typedef struct XenLegacyDevice XenLegacyDevice; 133a6c9172SJuergen Gross #define XENBACKEND_DEVICE(obj) \ 142d0ed5e6SPaul Durrant OBJECT_CHECK(XenLegacyDevice, (obj), TYPE_XENBACKEND) 15873d57abSJuergen Gross 16d94f9486Saliguori /* variables */ 17d94f9486Saliguori extern struct xs_handle *xenstore; 182c8b24a3Saliguori extern const char *xen_protocol; 199432e53aSJuergen Gross extern DeviceState *xen_sysdev; 20873d57abSJuergen Gross extern BusState *xen_sysbus; 21d94f9486Saliguori 22637c53ffSJuergen Gross int xenstore_mkdir(char *path, int p); 232d0ed5e6SPaul Durrant int xenstore_write_be_str(struct XenLegacyDevice *xendev, const char *node, 242d0ed5e6SPaul Durrant const char *val); 252d0ed5e6SPaul Durrant int xenstore_write_be_int(struct XenLegacyDevice *xendev, const char *node, 262d0ed5e6SPaul Durrant int ival); 272d0ed5e6SPaul Durrant int xenstore_write_be_int64(struct XenLegacyDevice *xendev, const char *node, 282d0ed5e6SPaul Durrant int64_t ival); 292d0ed5e6SPaul Durrant char *xenstore_read_be_str(struct XenLegacyDevice *xendev, const char *node); 302d0ed5e6SPaul Durrant int xenstore_read_be_int(struct XenLegacyDevice *xendev, const char *node, 312d0ed5e6SPaul Durrant int *ival); 322d0ed5e6SPaul Durrant void xenstore_update_fe(char *watch, struct XenLegacyDevice *xendev); 33046db9beSEmil Condrea void xenstore_update_be(char *watch, char *type, int dom, 34046db9beSEmil Condrea struct XenDevOps *ops); 352d0ed5e6SPaul Durrant char *xenstore_read_fe_str(struct XenLegacyDevice *xendev, const char *node); 362d0ed5e6SPaul Durrant int xenstore_read_fe_int(struct XenLegacyDevice *xendev, const char *node, 372d0ed5e6SPaul Durrant int *ival); 382d0ed5e6SPaul Durrant int xenstore_read_fe_uint64(struct XenLegacyDevice *xendev, const char *node, 39b9730c5bSEmil Condrea uint64_t *uval); 40d94f9486Saliguori 412d0ed5e6SPaul Durrant void xen_be_check_state(struct XenLegacyDevice *xendev); 42d94f9486Saliguori 43d94f9486Saliguori /* xen backend driver bits */ 44d94f9486Saliguori int xen_be_init(void); 450e39bb02SJuergen Gross void xen_be_register_common(void); 46d94f9486Saliguori int xen_be_register(const char *type, struct XenDevOps *ops); 472d0ed5e6SPaul Durrant int xen_be_set_state(struct XenLegacyDevice *xendev, enum xenbus_state state); 482d0ed5e6SPaul Durrant int xen_be_bind_evtchn(struct XenLegacyDevice *xendev); 492d0ed5e6SPaul Durrant void xen_be_set_max_grant_refs(struct XenLegacyDevice *xendev, 509838824aSPaul Durrant unsigned int nr_refs); 512d0ed5e6SPaul Durrant void *xen_be_map_grant_refs(struct XenLegacyDevice *xendev, uint32_t *refs, 529838824aSPaul Durrant unsigned int nr_refs, int prot); 532d0ed5e6SPaul Durrant void xen_be_unmap_grant_refs(struct XenLegacyDevice *xendev, void *ptr, 549838824aSPaul Durrant unsigned int nr_refs); 559838824aSPaul Durrant 569838824aSPaul Durrant typedef struct XenGrantCopySegment { 579838824aSPaul Durrant union { 589838824aSPaul Durrant void *virt; 599838824aSPaul Durrant struct { 609838824aSPaul Durrant uint32_t ref; 619838824aSPaul Durrant off_t offset; 629838824aSPaul Durrant } foreign; 639838824aSPaul Durrant } source, dest; 649838824aSPaul Durrant size_t len; 659838824aSPaul Durrant } XenGrantCopySegment; 669838824aSPaul Durrant 672d0ed5e6SPaul Durrant int xen_be_copy_grant_refs(struct XenLegacyDevice *xendev, 689838824aSPaul Durrant bool to_domain, XenGrantCopySegment segs[], 699838824aSPaul Durrant unsigned int nr_segs); 709838824aSPaul Durrant 712d0ed5e6SPaul Durrant static inline void *xen_be_map_grant_ref(struct XenLegacyDevice *xendev, 729838824aSPaul Durrant uint32_t ref, int prot) 739838824aSPaul Durrant { 749838824aSPaul Durrant return xen_be_map_grant_refs(xendev, &ref, 1, prot); 759838824aSPaul Durrant } 769838824aSPaul Durrant 772d0ed5e6SPaul Durrant static inline void xen_be_unmap_grant_ref(struct XenLegacyDevice *xendev, 789838824aSPaul Durrant void *ptr) 799838824aSPaul Durrant { 809838824aSPaul Durrant return xen_be_unmap_grant_refs(xendev, ptr, 1); 819838824aSPaul Durrant } 82d94f9486Saliguori 83e57dd20bSaliguori /* actual backend drivers */ 84e57dd20bSaliguori extern struct XenDevOps xen_console_ops; /* xen_console.c */ 85e7151f83Saliguori extern struct XenDevOps xen_kbdmouse_ops; /* xen_framebuffer.c */ 86e7151f83Saliguori extern struct XenDevOps xen_framebuffer_ops; /* xen_framebuffer.c */ 8762d23efaSaliguori extern struct XenDevOps xen_blkdev_ops; /* xen_disk.c */ 88e737b6d5SStefano Stabellini #ifdef CONFIG_VIRTFS 89e737b6d5SStefano Stabellini extern struct XenDevOps xen_9pfs_ops; /* xen-9p-backend.c */ 90e737b6d5SStefano Stabellini #endif 91e613b064Saliguori extern struct XenDevOps xen_netdev_ops; /* xen_nic.c */ 92816ac92eSJuergen Gross #ifdef CONFIG_USB_LIBUSB 93816ac92eSJuergen Gross extern struct XenDevOps xen_usb_ops; /* xen-usb.c */ 94816ac92eSJuergen Gross #endif 95e7151f83Saliguori 962c8b24a3Saliguori /* configuration (aka xenbus setup) */ 9728695489SAnthony Liguori void xen_config_cleanup(void); 982c8b24a3Saliguori int xen_config_dev_blk(DriveInfo *disk); 992c8b24a3Saliguori int xen_config_dev_nic(NICInfo *nic); 1009306acb5Saliguori int xen_config_dev_vfb(int vdev, const char *type); 1019306acb5Saliguori int xen_config_dev_vkbd(int vdev); 1029306acb5Saliguori int xen_config_dev_console(int vdev); 1032c8b24a3Saliguori 10458ea30f5SMarkus Armbruster #endif /* HW_XEN_LEGACY_BACKEND_H */ 105