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