xref: /qemu/include/hw/xen/xen-hvm-common.h (revision f17068c1c784d9732982e8977d6f18dce08f1fe1)
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