1 #ifndef HW_XEN_HVM_COMMON_H
2 #define HW_XEN_HVM_COMMON_H
4 #include "qemu/osdep.h"
5 #include "qemu/units.h"
8 #include "hw/pci/pci.h"
10 #include "hw/xen/xen_native.h"
11 #include "hw/xen/xen-legacy-backend.h"
12 #include "sysemu/runstate.h"
13 #include "sysemu/sysemu.h"
14 #include "sysemu/xen.h"
15 #include "sysemu/xen-mapcache.h"
16 #include "qemu/error-report.h"
17 #include <xen/hvm/ioreq.h>
19 extern MemoryRegion ram_memory
;
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 static inline uint32_t xen_vcpu_eport(shared_iopage_t
*shared_page
, int i
)
35 return shared_page
->vcpu_ioreq
[i
].vp_eport
;
37 static inline ioreq_t
*xen_vcpu_ioreq(shared_iopage_t
*shared_page
, int vcpu
)
39 return &shared_page
->vcpu_ioreq
[vcpu
];
42 #define BUFFER_IO_MAX_DELAY 100
44 typedef struct XenPhysmap
{
50 QLIST_ENTRY(XenPhysmap
) list
;
53 typedef struct XenPciDevice
{
56 QLIST_ENTRY(XenPciDevice
) entry
;
59 typedef struct XenIOState
{
61 shared_iopage_t
*shared_page
;
62 buffered_iopage_t
*buffered_io_page
;
63 xenforeignmemory_resource_handle
*fres
;
64 QEMUTimer
*buffered_io_timer
;
65 CPUState
**cpu_by_vcpu_id
;
66 /* the evtchn port for polling the notification, */
67 evtchn_port_t
*ioreq_local_port
;
68 /* evtchn remote and local ports for buffered io */
69 evtchn_port_t bufioreq_remote_port
;
70 evtchn_port_t bufioreq_local_port
;
71 /* the evtchn fd for polling */
72 xenevtchn_handle
*xce_handle
;
73 /* which vcpu we are serving */
76 struct xs_handle
*xenstore
;
77 MemoryListener memory_listener
;
78 MemoryListener io_listener
;
79 QLIST_HEAD(, XenPciDevice
) dev_list
;
80 DeviceListener device_listener
;
85 void xen_exit_notifier(Notifier
*n
, void *data
);
87 void xen_region_add(MemoryListener
*listener
, MemoryRegionSection
*section
);
88 void xen_region_del(MemoryListener
*listener
, MemoryRegionSection
*section
);
89 void xen_io_add(MemoryListener
*listener
, MemoryRegionSection
*section
);
90 void xen_io_del(MemoryListener
*listener
, MemoryRegionSection
*section
);
91 void xen_device_realize(DeviceListener
*listener
, DeviceState
*dev
);
92 void xen_device_unrealize(DeviceListener
*listener
, DeviceState
*dev
);
94 void xen_hvm_change_state_handler(void *opaque
, bool running
, RunState rstate
);
95 void xen_register_ioreq(XenIOState
*state
, unsigned int max_cpus
,
96 const MemoryListener
*xen_memory_listener
);
98 void cpu_ioreq_pio(ioreq_t
*req
);
99 #endif /* HW_XEN_HVM_COMMON_H */