2 * Copyright (c) 2018 Citrix Systems Inc.
4 * This work is licensed under the terms of the GNU GPL, version 2 or later.
5 * See the COPYING file in the top-level directory.
11 #include "hw/xen/xen_common.h"
12 #include "hw/sysbus.h"
13 #include "qemu/notify.h"
14 #include "qom/object.h"
16 typedef void (*XenWatchHandler
)(void *opaque
);
18 typedef struct XenWatchList XenWatchList
;
19 typedef struct XenWatch XenWatch
;
20 typedef struct XenEventChannel XenEventChannel
;
26 struct xs_handle
*xsh
;
27 XenWatchList
*watch_list
;
28 char *backend_path
, *frontend_path
;
29 enum xenbus_state backend_state
, frontend_state
;
31 XenWatch
*backend_state_watch
, *frontend_state_watch
;
33 XenWatch
*backend_online_watch
;
34 xengnttab_handle
*xgth
;
35 bool feature_grant_copy
;
37 QLIST_HEAD(, XenEventChannel
) event_channels
;
38 QLIST_ENTRY(XenDevice
) list
;
40 typedef struct XenDevice XenDevice
;
42 typedef char *(*XenDeviceGetName
)(XenDevice
*xendev
, Error
**errp
);
43 typedef void (*XenDeviceRealize
)(XenDevice
*xendev
, Error
**errp
);
44 typedef void (*XenDeviceFrontendChanged
)(XenDevice
*xendev
,
45 enum xenbus_state frontend_state
,
47 typedef void (*XenDeviceUnrealize
)(XenDevice
*xendev
);
49 struct XenDeviceClass
{
51 DeviceClass parent_class
;
55 XenDeviceGetName get_name
;
56 XenDeviceRealize realize
;
57 XenDeviceFrontendChanged frontend_changed
;
58 XenDeviceUnrealize unrealize
;
61 #define TYPE_XEN_DEVICE "xen-device"
62 OBJECT_DECLARE_TYPE(XenDevice
, XenDeviceClass
, XEN_DEVICE
)
67 struct xs_handle
*xsh
;
68 XenWatchList
*watch_list
;
69 unsigned int backend_types
;
70 XenWatch
**backend_watch
;
71 QLIST_HEAD(, XenDevice
) inactive_devices
;
76 BusClass parent_class
;
79 #define TYPE_XEN_BUS "xen-bus"
80 OBJECT_DECLARE_TYPE(XenBus
, XenBusClass
,
83 void xen_bus_init(void);
85 void xen_device_backend_set_state(XenDevice
*xendev
,
86 enum xenbus_state state
);
87 enum xenbus_state
xen_device_backend_get_state(XenDevice
*xendev
);
89 void xen_device_backend_printf(XenDevice
*xendev
, const char *key
,
92 void xen_device_frontend_printf(XenDevice
*xendev
, const char *key
,
96 int xen_device_frontend_scanf(XenDevice
*xendev
, const char *key
,
100 void xen_device_set_max_grant_refs(XenDevice
*xendev
, unsigned int nr_refs
,
102 void *xen_device_map_grant_refs(XenDevice
*xendev
, uint32_t *refs
,
103 unsigned int nr_refs
, int prot
,
105 void xen_device_unmap_grant_refs(XenDevice
*xendev
, void *map
,
106 unsigned int nr_refs
, Error
**errp
);
108 typedef struct XenDeviceGrantCopySegment
{
117 } XenDeviceGrantCopySegment
;
119 void xen_device_copy_grant_refs(XenDevice
*xendev
, bool to_domain
,
120 XenDeviceGrantCopySegment segs
[],
121 unsigned int nr_segs
, Error
**errp
);
123 typedef bool (*XenEventHandler
)(void *opaque
);
125 XenEventChannel
*xen_device_bind_event_channel(XenDevice
*xendev
,
127 XenEventHandler handler
,
128 void *opaque
, Error
**errp
);
129 void xen_device_set_event_channel_context(XenDevice
*xendev
,
130 XenEventChannel
*channel
,
133 void xen_device_notify_event_channel(XenDevice
*xendev
,
134 XenEventChannel
*channel
,
136 void xen_device_unbind_event_channel(XenDevice
*xendev
,
137 XenEventChannel
*channel
,
140 #endif /* HW_XEN_BUS_H */