1 #ifndef HW_XEN_HVM_COMMON_H
2 #define HW_XEN_HVM_COMMON_H
4 #include "qemu/units.h"
7 #include "hw/pci/pci.h"
9 #include "hw/xen/xen_native.h"
10 #include "hw/xen/xen-legacy-backend.h"
11 #include "sysemu/runstate.h"
12 #include "sysemu/sysemu.h"
13 #include "sysemu/xen.h"
14 #include "sysemu/xen-mapcache.h"
15 #include "qemu/error-report.h"
16 #include <xen/hvm/ioreq.h>
18 extern MemoryRegion xen_memory
;
19 extern MemoryRegion xen_grants
;
20 extern MemoryListener xen_io_listener
;
21 extern DeviceListener xen_device_listener
;
23 //#define DEBUG_XEN_HVM
26 #define DPRINTF(fmt, ...) \
27 do { fprintf(stderr, "xen: " fmt, ## __VA_ARGS__); } while (0)
29 #define DPRINTF(fmt, ...) \
33 #define XEN_GRANT_ADDR_OFF (1ULL << 63)
35 static inline uint32_t xen_vcpu_eport(shared_iopage_t
*shared_page
, int i
)
37 return shared_page
->vcpu_ioreq
[i
].vp_eport
;
39 static inline ioreq_t
*xen_vcpu_ioreq(shared_iopage_t
*shared_page
, int vcpu
)
41 return &shared_page
->vcpu_ioreq
[vcpu
];
44 #define BUFFER_IO_MAX_DELAY 100
46 typedef struct XenPhysmap
{
52 QLIST_ENTRY(XenPhysmap
) list
;
55 typedef struct XenPciDevice
{
58 QLIST_ENTRY(XenPciDevice
) entry
;
61 typedef struct XenIOState
{
63 shared_iopage_t
*shared_page
;
64 buffered_iopage_t
*buffered_io_page
;
65 xenforeignmemory_resource_handle
*fres
;
66 QEMUTimer
*buffered_io_timer
;
67 CPUState
**cpu_by_vcpu_id
;
68 /* the evtchn port for polling the notification, */
69 evtchn_port_t
*ioreq_local_port
;
70 /* evtchn remote and local ports for buffered io */
71 evtchn_port_t bufioreq_remote_port
;
72 evtchn_port_t bufioreq_local_port
;
73 /* the evtchn fd for polling */
74 xenevtchn_handle
*xce_handle
;
75 /* which vcpu we are serving */
78 struct xs_handle
*xenstore
;
79 MemoryListener memory_listener
;
80 MemoryListener io_listener
;
81 QLIST_HEAD(, XenPciDevice
) dev_list
;
82 DeviceListener device_listener
;
89 void xen_exit_notifier(Notifier
*n
, void *data
);
91 void xen_region_add(MemoryListener
*listener
, MemoryRegionSection
*section
);
92 void xen_region_del(MemoryListener
*listener
, MemoryRegionSection
*section
);
93 void xen_io_add(MemoryListener
*listener
, MemoryRegionSection
*section
);
94 void xen_io_del(MemoryListener
*listener
, MemoryRegionSection
*section
);
95 void xen_device_realize(DeviceListener
*listener
, DeviceState
*dev
);
96 void xen_device_unrealize(DeviceListener
*listener
, DeviceState
*dev
);
98 void xen_hvm_change_state_handler(void *opaque
, bool running
, RunState rstate
);
99 void xen_register_ioreq(XenIOState
*state
, unsigned int max_cpus
,
100 uint8_t handle_bufioreq
,
101 const MemoryListener
*xen_memory_listener
);
103 void cpu_ioreq_pio(ioreq_t
*req
);
104 #endif /* HW_XEN_HVM_COMMON_H */