1f17068c1SStefano Stabellini #ifndef HW_XEN_HVM_COMMON_H 2f17068c1SStefano Stabellini #define HW_XEN_HVM_COMMON_H 3f17068c1SStefano Stabellini 4f17068c1SStefano Stabellini #include "qemu/units.h" 5f17068c1SStefano Stabellini 6f17068c1SStefano Stabellini #include "cpu.h" 7f17068c1SStefano Stabellini #include "hw/pci/pci.h" 8f17068c1SStefano Stabellini #include "hw/hw.h" 9f17068c1SStefano Stabellini #include "hw/xen/xen_native.h" 10f17068c1SStefano Stabellini #include "hw/xen/xen-legacy-backend.h" 11f17068c1SStefano Stabellini #include "sysemu/runstate.h" 12f17068c1SStefano Stabellini #include "sysemu/sysemu.h" 13f17068c1SStefano Stabellini #include "sysemu/xen.h" 14f17068c1SStefano Stabellini #include "sysemu/xen-mapcache.h" 15f17068c1SStefano Stabellini #include "qemu/error-report.h" 16f17068c1SStefano Stabellini #include <xen/hvm/ioreq.h> 17f17068c1SStefano Stabellini 18*b934c3faSPhilippe Mathieu-Daudé extern MemoryRegion xen_memory; 19f17068c1SStefano Stabellini extern MemoryListener xen_io_listener; 20f17068c1SStefano Stabellini extern DeviceListener xen_device_listener; 21f17068c1SStefano Stabellini 22f17068c1SStefano Stabellini //#define DEBUG_XEN_HVM 23f17068c1SStefano Stabellini 24f17068c1SStefano Stabellini #ifdef DEBUG_XEN_HVM 25f17068c1SStefano Stabellini #define DPRINTF(fmt, ...) \ 26f17068c1SStefano Stabellini do { fprintf(stderr, "xen: " fmt, ## __VA_ARGS__); } while (0) 27f17068c1SStefano Stabellini #else 28f17068c1SStefano Stabellini #define DPRINTF(fmt, ...) \ 29f17068c1SStefano Stabellini do { } while (0) 30f17068c1SStefano Stabellini #endif 31f17068c1SStefano Stabellini 32f17068c1SStefano Stabellini static inline uint32_t xen_vcpu_eport(shared_iopage_t *shared_page, int i) 33f17068c1SStefano Stabellini { 34f17068c1SStefano Stabellini return shared_page->vcpu_ioreq[i].vp_eport; 35f17068c1SStefano Stabellini } 36f17068c1SStefano Stabellini static inline ioreq_t *xen_vcpu_ioreq(shared_iopage_t *shared_page, int vcpu) 37f17068c1SStefano Stabellini { 38f17068c1SStefano Stabellini return &shared_page->vcpu_ioreq[vcpu]; 39f17068c1SStefano Stabellini } 40f17068c1SStefano Stabellini 41f17068c1SStefano Stabellini #define BUFFER_IO_MAX_DELAY 100 42f17068c1SStefano Stabellini 43f17068c1SStefano Stabellini typedef struct XenPhysmap { 44f17068c1SStefano Stabellini hwaddr start_addr; 45f17068c1SStefano Stabellini ram_addr_t size; 46f17068c1SStefano Stabellini const char *name; 47f17068c1SStefano Stabellini hwaddr phys_offset; 48f17068c1SStefano Stabellini 49f17068c1SStefano Stabellini QLIST_ENTRY(XenPhysmap) list; 50f17068c1SStefano Stabellini } XenPhysmap; 51f17068c1SStefano Stabellini 52f17068c1SStefano Stabellini typedef struct XenPciDevice { 53f17068c1SStefano Stabellini PCIDevice *pci_dev; 54f17068c1SStefano Stabellini uint32_t sbdf; 55f17068c1SStefano Stabellini QLIST_ENTRY(XenPciDevice) entry; 56f17068c1SStefano Stabellini } XenPciDevice; 57f17068c1SStefano Stabellini 58f17068c1SStefano Stabellini typedef struct XenIOState { 59f17068c1SStefano Stabellini ioservid_t ioservid; 60f17068c1SStefano Stabellini shared_iopage_t *shared_page; 61f17068c1SStefano Stabellini buffered_iopage_t *buffered_io_page; 62f17068c1SStefano Stabellini xenforeignmemory_resource_handle *fres; 63f17068c1SStefano Stabellini QEMUTimer *buffered_io_timer; 64f17068c1SStefano Stabellini CPUState **cpu_by_vcpu_id; 65f17068c1SStefano Stabellini /* the evtchn port for polling the notification, */ 66f17068c1SStefano Stabellini evtchn_port_t *ioreq_local_port; 67f17068c1SStefano Stabellini /* evtchn remote and local ports for buffered io */ 68f17068c1SStefano Stabellini evtchn_port_t bufioreq_remote_port; 69f17068c1SStefano Stabellini evtchn_port_t bufioreq_local_port; 70f17068c1SStefano Stabellini /* the evtchn fd for polling */ 71f17068c1SStefano Stabellini xenevtchn_handle *xce_handle; 72f17068c1SStefano Stabellini /* which vcpu we are serving */ 73f17068c1SStefano Stabellini int send_vcpu; 74f17068c1SStefano Stabellini 75f17068c1SStefano Stabellini struct xs_handle *xenstore; 76f17068c1SStefano Stabellini MemoryListener memory_listener; 77f17068c1SStefano Stabellini MemoryListener io_listener; 78f17068c1SStefano Stabellini QLIST_HEAD(, XenPciDevice) dev_list; 79f17068c1SStefano Stabellini DeviceListener device_listener; 80f17068c1SStefano Stabellini 81f17068c1SStefano Stabellini Notifier exit; 82f17068c1SStefano Stabellini } XenIOState; 83f17068c1SStefano Stabellini 84f17068c1SStefano Stabellini void xen_exit_notifier(Notifier *n, void *data); 85f17068c1SStefano Stabellini 86f17068c1SStefano Stabellini void xen_region_add(MemoryListener *listener, MemoryRegionSection *section); 87f17068c1SStefano Stabellini void xen_region_del(MemoryListener *listener, MemoryRegionSection *section); 88f17068c1SStefano Stabellini void xen_io_add(MemoryListener *listener, MemoryRegionSection *section); 89f17068c1SStefano Stabellini void xen_io_del(MemoryListener *listener, MemoryRegionSection *section); 90f17068c1SStefano Stabellini void xen_device_realize(DeviceListener *listener, DeviceState *dev); 91f17068c1SStefano Stabellini void xen_device_unrealize(DeviceListener *listener, DeviceState *dev); 92f17068c1SStefano Stabellini 93f17068c1SStefano Stabellini void xen_hvm_change_state_handler(void *opaque, bool running, RunState rstate); 94f17068c1SStefano Stabellini void xen_register_ioreq(XenIOState *state, unsigned int max_cpus, 95bcb40db0SPeter Maydell const MemoryListener *xen_memory_listener); 96f17068c1SStefano Stabellini 97f17068c1SStefano Stabellini void cpu_ioreq_pio(ioreq_t *req); 98f17068c1SStefano Stabellini #endif /* HW_XEN_HVM_COMMON_H */ 99