win-pvdrivers

view xenpci/xenpci.h @ 332:52533409dbbd

get things compiling again under DDK
author Andy Grover <andy.grover@oracle.com>
date Thu Jun 19 17:20:16 2008 -0700 (2008-06-19)
parents c563a0f32b2f
children 72acaf6e4668
line source
1 /*
2 PV Drivers for Windows Xen HVM Domains
3 Copyright (C) 2007 James Harper
5 This program is free software; you can redistribute it and/or
6 modify it under the terms of the GNU General Public License
7 as published by the Free Software Foundation; either version 2
8 of the License, or (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18 */
20 #if !defined(_XENPCI_H_)
21 #define _XENPCI_H_
23 #define __attribute__(arg) /* empty */
24 #define EISCONN 127
26 #include <ntddk.h>
28 #ifdef __MINGW32__
29 #define KeMemoryBarrier() asm("mfence;")
30 #else
31 #define DDKAPI
32 #include <wdm.h>
33 //#include <wdf.h>
34 #include <initguid.h>
35 #include <wdmguid.h>
36 #include <errno.h>
37 #define NTSTRSAFE_LIB
38 #include <ntstrsafe.h>
39 #endif
41 #define __DRIVER_NAME "XenPCI"
43 #include <xen_windows.h>
44 #include <memory.h>
45 #include <grant_table.h>
46 #include <event_channel.h>
47 #include <hvm/params.h>
48 #include <hvm/hvm_op.h>
49 #include <sched.h>
50 #include <io/xenbus.h>
52 #include <xen_public.h>
54 //{C828ABE9-14CA-4445-BAA6-82C2376C6518}
55 DEFINE_GUID( GUID_XENPCI_DEVCLASS, 0xC828ABE9, 0x14CA, 0x4445, 0xBA, 0xA6, 0x82, 0xC2, 0x37, 0x6C, 0x65, 0x18);
57 #define XENPCI_POOL_TAG (ULONG) 'XenP'
59 #define NR_RESERVED_ENTRIES 8
60 #define NR_GRANT_FRAMES 4
61 #define NR_GRANT_ENTRIES (NR_GRANT_FRAMES * PAGE_SIZE / sizeof(grant_entry_t))
63 #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
65 #define EVT_ACTION_TYPE_EMPTY 0
66 #define EVT_ACTION_TYPE_NORMAL 1
67 #define EVT_ACTION_TYPE_DPC 2
68 #define EVT_ACTION_TYPE_IRQ 3
70 typedef struct _ev_action_t {
71 PKSERVICE_ROUTINE ServiceRoutine;
72 PVOID ServiceContext;
73 ULONG type; /* EVT_ACTION_TYPE_* */
74 KDPC Dpc;
75 ULONG vector;
76 ULONG Count;
77 } ev_action_t;
79 typedef struct _XENBUS_WATCH_RING
80 {
81 char Path[128];
82 char Token[10];
83 } XENBUS_WATCH_RING;
85 typedef struct _XENBUS_REQ_INFO
86 {
87 int In_Use:1;
88 KEVENT WaitEvent;
89 void *Reply;
90 } XENBUS_REQ_INFO;
92 typedef struct _XENBUS_WATCH_ENTRY {
93 char Path[128];
94 PXENBUS_WATCH_CALLBACK ServiceRoutine;
95 PVOID ServiceContext;
96 int Count;
97 int Active;
98 int RemovePending;
99 int Running;
100 KEVENT CompleteEvent;
101 } XENBUS_WATCH_ENTRY, *PXENBUS_WATCH_ENTRY;
103 #define NR_EVENTS 1024
104 #define WATCH_RING_SIZE 128
105 #define NR_XB_REQS 32
106 #define MAX_WATCH_ENTRIES 128
108 #define CHILD_STATE_EMPTY 0
109 #define CHILD_STATE_DELETED 1
110 #define CHILD_STATE_ADDED 2
112 // TODO: tidy up & organize this struct
114 typedef enum {
115 Unknown = 0,
116 NotStarted,
117 Started,
118 StopPending,
119 Stopped,
120 RemovePending,
121 SurpriseRemovePending,
122 Removed
123 } DEVICE_PNP_STATE;
125 typedef struct
126 {
127 PDEVICE_OBJECT fdo;
128 PDEVICE_OBJECT pdo;
129 PDEVICE_OBJECT lower_do;
131 DEVICE_PNP_STATE current_pnp_state;
132 DEVICE_PNP_STATE previous_pnp_state;
133 DEVICE_POWER_STATE device_power_state;
134 SYSTEM_POWER_STATE system_power_state;
136 ULONG device_usage_paging;
137 ULONG device_usage_dump;
138 ULONG device_usage_hibernation;
139 } XENPCI_COMMON, *PXENPCI_COMMON;
141 static __inline void INIT_PNP_STATE(PXENPCI_COMMON common)
142 {
143 common->current_pnp_state = NotStarted;
144 common->previous_pnp_state = NotStarted;
145 }
147 static __inline void SET_PNP_STATE(PXENPCI_COMMON common, DEVICE_PNP_STATE state)
148 {
149 common->previous_pnp_state = common->current_pnp_state;
150 common->current_pnp_state = state;
151 }
153 static __inline void REVERT_PNP_STATE(PXENPCI_COMMON common)
154 {
155 common->current_pnp_state = common->previous_pnp_state;
156 }
158 #define SHUTDOWN_RING_SIZE 128
160 typedef struct {
161 XENPCI_COMMON common;
163 BOOLEAN XenBus_ShuttingDown;
165 PKINTERRUPT interrupt;
166 ULONG irq_number;
167 ULONG irq_vector;
168 KIRQL irq_level;
169 KAFFINITY irq_affinity;
171 shared_info_t *shared_info_area;
173 PHYSICAL_ADDRESS platform_mmio_addr;
174 ULONG platform_mmio_orig_len;
175 ULONG platform_mmio_len;
176 ULONG platform_mmio_alloc;
177 USHORT platform_mmio_flags;
179 char *hypercall_stubs;
181 evtchn_port_t xen_store_evtchn;
183 grant_entry_t *gnttab_table;
184 PHYSICAL_ADDRESS gnttab_table_physical;
185 grant_ref_t gnttab_list[NR_GRANT_ENTRIES];
187 ev_action_t ev_actions[NR_EVENTS];
188 // unsigned long bound_ports[NR_EVENTS/(8*sizeof(unsigned long))];
190 HANDLE XenBus_ReadThreadHandle;
191 KEVENT XenBus_ReadThreadEvent;
192 HANDLE XenBus_WatchThreadHandle;
193 KEVENT XenBus_WatchThreadEvent;
195 XENBUS_WATCH_RING XenBus_WatchRing[WATCH_RING_SIZE];
196 int XenBus_WatchRingReadIndex;
197 int XenBus_WatchRingWriteIndex;
199 struct xenstore_domain_interface *xen_store_interface;
201 XENBUS_REQ_INFO req_info[NR_XB_REQS];
202 int nr_live_reqs;
203 XENBUS_WATCH_ENTRY XenBus_WatchEntries[MAX_WATCH_ENTRIES];
205 KSPIN_LOCK WatchLock;
206 KSPIN_LOCK grant_lock;
208 //KGUARDED_MUTEX WatchHandlerMutex;
210 LIST_ENTRY child_list;
212 int suspending;
214 UNICODE_STRING interface_name;
215 BOOLEAN interface_open;
217 KSPIN_LOCK shutdown_ring_lock;
218 CHAR shutdown_ring[SHUTDOWN_RING_SIZE];
219 ULONG shutdown_prod;
220 ULONG shutdown_cons;
221 ULONG shutdown_start; /* the start of the most recent message on the ring */
222 PIRP shutdown_irp;
223 } XENPCI_DEVICE_DATA, *PXENPCI_DEVICE_DATA;
225 typedef struct {
226 XENPCI_COMMON common;
227 PDEVICE_OBJECT bus_pdo;
228 PDEVICE_OBJECT bus_fdo;
229 BOOLEAN eject_requested;
230 BOOLEAN reported_missing;
231 char path[128];
232 char device[128];
233 ULONG index;
234 ULONG irq_vector;
235 KIRQL irq_level;
236 char backend_path[128];
237 //PVOID xenbus_request;
238 KEVENT backend_state_event;
239 ULONG backend_state;
240 PHYSICAL_ADDRESS config_page_phys;
241 ULONG config_page_length;
242 PUCHAR assigned_resources_start;
243 PUCHAR assigned_resources_ptr;
244 } XENPCI_PDO_DEVICE_DATA, *PXENPCI_PDO_DEVICE_DATA;
246 typedef struct
247 {
248 LIST_ENTRY entry;
249 int state;
250 PXENPCI_PDO_DEVICE_DATA context;
251 } XEN_CHILD, *PXEN_CHILD;
253 #ifdef __GNUC__
254 #define SWINT(x) case x: asm ("int x"); break;
255 #else
256 #define SWINT(x) case x: __asm { int x } break;
257 #endif
259 #if defined(_X86_)
260 static __inline VOID
261 sw_interrupt(UCHAR intno)
262 {
263 //KdPrint((__DRIVER_NAME " Calling interrupt %02X\n", intno));
264 switch (intno)
265 {
266 SWINT(0x10) SWINT(0x11) SWINT(0x12) SWINT(0x13) SWINT(0x14) SWINT(0x15) SWINT(0x16) SWINT(0x17)
267 SWINT(0x18) SWINT(0x19) SWINT(0x1A) SWINT(0x1B) SWINT(0x1C) SWINT(0x1D) SWINT(0x1E) SWINT(0x1F)
268 SWINT(0x20) SWINT(0x21) SWINT(0x22) SWINT(0x23) SWINT(0x24) SWINT(0x25) SWINT(0x26) SWINT(0x27)
269 SWINT(0x28) SWINT(0x29) SWINT(0x2A) SWINT(0x2B) SWINT(0x2C) SWINT(0x2D) SWINT(0x2E) SWINT(0x2F)
270 SWINT(0x30) SWINT(0x31) SWINT(0x32) SWINT(0x33) SWINT(0x34) SWINT(0x35) SWINT(0x36) SWINT(0x37)
271 SWINT(0x38) SWINT(0x39) SWINT(0x3A) SWINT(0x3B) SWINT(0x3C) SWINT(0x3D) SWINT(0x3E) SWINT(0x3F)
272 SWINT(0x40) SWINT(0x41) SWINT(0x42) SWINT(0x43) SWINT(0x44) SWINT(0x45) SWINT(0x46) SWINT(0x47)
273 SWINT(0x48) SWINT(0x49) SWINT(0x4A) SWINT(0x4B) SWINT(0x4C) SWINT(0x4D) SWINT(0x4E) SWINT(0x4F)
274 SWINT(0x50) SWINT(0x51) SWINT(0x52) SWINT(0x53) SWINT(0x54) SWINT(0x55) SWINT(0x56) SWINT(0x57)
275 SWINT(0x58) SWINT(0x59) SWINT(0x5A) SWINT(0x5B) SWINT(0x5C) SWINT(0x5D) SWINT(0x5E) SWINT(0x5F)
276 SWINT(0x60) SWINT(0x61) SWINT(0x62) SWINT(0x63) SWINT(0x64) SWINT(0x65) SWINT(0x66) SWINT(0x67)
277 SWINT(0x68) SWINT(0x69) SWINT(0x6A) SWINT(0x6B) SWINT(0x6C) SWINT(0x6D) SWINT(0x6E) SWINT(0x6F)
278 SWINT(0x70) SWINT(0x71) SWINT(0x72) SWINT(0x73) SWINT(0x74) SWINT(0x75) SWINT(0x76) SWINT(0x77)
279 SWINT(0x78) SWINT(0x79) SWINT(0x7A) SWINT(0x7B) SWINT(0x7C) SWINT(0x7D) SWINT(0x7E) SWINT(0x7F)
280 SWINT(0x80) SWINT(0x81) SWINT(0x82) SWINT(0x83) SWINT(0x84) SWINT(0x85) SWINT(0x86) SWINT(0x87)
281 SWINT(0x88) SWINT(0x89) SWINT(0x8A) SWINT(0x8B) SWINT(0x8C) SWINT(0x8D) SWINT(0x8E) SWINT(0x8F)
282 SWINT(0x90) SWINT(0x91) SWINT(0x92) SWINT(0x93) SWINT(0x94) SWINT(0x95) SWINT(0x96) SWINT(0x97)
283 SWINT(0x98) SWINT(0x99) SWINT(0x9A) SWINT(0x9B) SWINT(0x9C) SWINT(0x9D) SWINT(0x9E) SWINT(0x9F)
284 SWINT(0xA0) SWINT(0xA1) SWINT(0xA2) SWINT(0xA3) SWINT(0xA4) SWINT(0xA5) SWINT(0xA6) SWINT(0xA7)
285 SWINT(0xA8) SWINT(0xA9) SWINT(0xAA) SWINT(0xAB) SWINT(0xAC) SWINT(0xAD) SWINT(0xAE) SWINT(0xAF)
286 SWINT(0xB0) SWINT(0xB1) SWINT(0xB2) SWINT(0xB3) SWINT(0xB4) SWINT(0xB5) SWINT(0xB6) SWINT(0xB7)
287 SWINT(0xB8) SWINT(0xB9) SWINT(0xBA) SWINT(0xBB) SWINT(0xBC) SWINT(0xBD) SWINT(0xBE) SWINT(0xBF)
288 SWINT(0xC0) SWINT(0xC1) SWINT(0xC2) SWINT(0xC3) SWINT(0xC4) SWINT(0xC5) SWINT(0xC6) SWINT(0xC7)
289 SWINT(0xC8) SWINT(0xC9) SWINT(0xCA) SWINT(0xCB) SWINT(0xCC) SWINT(0xCD) SWINT(0xCE) SWINT(0xCF)
290 SWINT(0xD0) SWINT(0xD1) SWINT(0xD2) SWINT(0xD3) SWINT(0xD4) SWINT(0xD5) SWINT(0xD6) SWINT(0xD7)
291 SWINT(0xD8) SWINT(0xD9) SWINT(0xDA) SWINT(0xDB) SWINT(0xDC) SWINT(0xDD) SWINT(0xDE) SWINT(0xDF)
292 SWINT(0xE0) SWINT(0xE1) SWINT(0xE2) SWINT(0xE3) SWINT(0xE4) SWINT(0xE5) SWINT(0xE6) SWINT(0xE7)
293 SWINT(0xE8) SWINT(0xE9) SWINT(0xEA) SWINT(0xEB) SWINT(0xEC) SWINT(0xED) SWINT(0xEE) SWINT(0xEF)
294 SWINT(0xF0) SWINT(0xF1) SWINT(0xF2) SWINT(0xF3) SWINT(0xF4) SWINT(0xF5) SWINT(0xF6) SWINT(0xF7)
295 SWINT(0xF8) SWINT(0xF9) SWINT(0xFA) SWINT(0xFB) SWINT(0xFC) SWINT(0xFD) SWINT(0xFE) SWINT(0xFF)
297 default:
298 KdPrint((__DRIVER_NAME " interrupt %02X not set up. Blame James.\n", intno));
299 KeBugCheckEx(('X' << 16)|('E' << 8)|('N'), 0x00000002, (ULONG)intno, 0x00000000, 0x00000000);
300 break;
301 }
302 }
303 #else
304 VOID _sw_interrupt(UCHAR);
306 static __inline VOID
307 sw_interrupt(UCHAR intno)
308 {
309 _sw_interrupt(intno);
310 }
311 #endif
314 #include "hypercall.h"
316 #define XBT_NIL ((xenbus_transaction_t)0)
318 static __inline VOID
319 XenPci_FreeMem(PVOID Ptr)
320 {
321 ExFreePoolWithTag(Ptr, XENPCI_POOL_TAG);
322 }
324 NTSTATUS
325 hvm_get_stubs(PXENPCI_DEVICE_DATA xpdd);
326 NTSTATUS
327 hvm_free_stubs(PXENPCI_DEVICE_DATA xpdd);
329 NTSTATUS
330 XenPci_Power_Fdo(PDEVICE_OBJECT device_object, PIRP irp);
331 NTSTATUS
332 XenPci_Dummy_Fdo(PDEVICE_OBJECT device_object, PIRP irp);
333 NTSTATUS
334 XenPci_Pnp_Fdo(PDEVICE_OBJECT device_object, PIRP irp);
335 NTSTATUS
336 XenPci_Irp_Create_Fdo(PDEVICE_OBJECT device_object, PIRP irp);
337 NTSTATUS
338 XenPci_Irp_Close_Fdo(PDEVICE_OBJECT device_object, PIRP irp);
339 NTSTATUS
340 XenPci_Irp_Read_Fdo(PDEVICE_OBJECT device_object, PIRP irp);
341 NTSTATUS
342 XenPci_Irp_Cleanup_Fdo(PDEVICE_OBJECT device_object, PIRP irp);
344 NTSTATUS
345 XenPci_Power_Pdo(PDEVICE_OBJECT device_object, PIRP irp);
346 //NTSTATUS
347 //XenPci_Dummy_Pdo(PDEVICE_OBJECT device_object, PIRP irp);
348 NTSTATUS
349 XenPci_Pnp_Pdo(PDEVICE_OBJECT device_object, PIRP irp);
350 NTSTATUS
351 XenPci_Irp_Create_Pdo(PDEVICE_OBJECT device_object, PIRP irp);
352 NTSTATUS
353 XenPci_Irp_Close_Pdo(PDEVICE_OBJECT device_object, PIRP irp);
354 NTSTATUS
355 XenPci_Irp_Read_Pdo(PDEVICE_OBJECT device_object, PIRP irp);
356 NTSTATUS
357 XenPci_Irp_Cleanup_Pdo(PDEVICE_OBJECT device_object, PIRP irp);
361 char *
362 XenBus_Read(PVOID Context, xenbus_transaction_t xbt, const char *path, char **value);
363 char *
364 XenBus_Write(PVOID Context, xenbus_transaction_t xbt, const char *path, const char *value);
365 char *
366 XenBus_Printf(PVOID Context, xenbus_transaction_t xbt, const char *path, const char *fmt, ...);
367 char *
368 XenBus_StartTransaction(PVOID Context, xenbus_transaction_t *xbt);
369 char *
370 XenBus_EndTransaction(PVOID Context, xenbus_transaction_t t, int abort, int *retry);
371 char *
372 XenBus_List(PVOID Context, xenbus_transaction_t xbt, const char *prefix, char ***contents);
373 char *
374 XenBus_AddWatch(PVOID Context, xenbus_transaction_t xbt, const char *Path, PXENBUS_WATCH_CALLBACK ServiceRoutine, PVOID ServiceContext);
375 char *
376 XenBus_RemWatch(PVOID Context, xenbus_transaction_t xbt, const char *Path, PXENBUS_WATCH_CALLBACK ServiceRoutine, PVOID ServiceContext);
377 //VOID
378 //XenBus_ThreadProc(PVOID StartContext);
379 NTSTATUS
380 XenBus_Init(PXENPCI_DEVICE_DATA xpdd);
381 NTSTATUS
382 XenBus_Close(PXENPCI_DEVICE_DATA xpdd);
383 NTSTATUS
384 XenBus_Start(PXENPCI_DEVICE_DATA xpdd);
385 NTSTATUS
386 XenBus_Stop(PXENPCI_DEVICE_DATA xpdd);
387 VOID
388 XenBus_Resume(PXENPCI_DEVICE_DATA xpdd);
390 PHYSICAL_ADDRESS
391 XenPci_AllocMMIO(PXENPCI_DEVICE_DATA xpdd, ULONG len);
393 NTSTATUS
394 EvtChn_Init(PXENPCI_DEVICE_DATA xpdd);
395 NTSTATUS
396 EvtChn_Shutdown(PXENPCI_DEVICE_DATA xpdd);
398 NTSTATUS
399 EvtChn_Mask(PVOID Context, evtchn_port_t Port);
400 NTSTATUS
401 EvtChn_Unmask(PVOID Context, evtchn_port_t Port);
402 NTSTATUS
403 EvtChn_Bind(PVOID Context, evtchn_port_t Port, PKSERVICE_ROUTINE ServiceRoutine, PVOID ServiceContext);
404 NTSTATUS
405 EvtChn_BindDpc(PVOID Context, evtchn_port_t Port, PKSERVICE_ROUTINE ServiceRoutine, PVOID ServiceContext);
406 NTSTATUS
407 EvtChn_BindIrq(PVOID Context, evtchn_port_t Port, ULONG vector);
408 NTSTATUS
409 EvtChn_Unbind(PVOID Context, evtchn_port_t Port);
410 NTSTATUS
411 EvtChn_Notify(PVOID Context, evtchn_port_t Port);
412 evtchn_port_t
413 EvtChn_AllocUnbound(PVOID Context, domid_t Domain);
415 VOID
416 GntTbl_Init(PXENPCI_DEVICE_DATA xpdd);
418 grant_ref_t
419 GntTbl_GrantAccess(PVOID Context, domid_t domid, uint32_t, int readonly, grant_ref_t ref);
420 BOOLEAN
421 GntTbl_EndAccess(PVOID Context, grant_ref_t ref, BOOLEAN keepref);
422 VOID
423 GntTbl_PutRef(PVOID Context, grant_ref_t ref);
424 grant_ref_t
425 GntTbl_GetRef(PVOID Context);
426 int
427 GntTbl_Map(PVOID Context, unsigned int start_idx, unsigned int end_idx);
428 #endif