win-pvdrivers

annotate xenpci/xenpci.h @ 15:7f0f866dced6

wean xenbus.c off of global variables

rename some variables from deviceData to xpdd for brevity
some whitespace fixes
author Andy Grover <andy@groveronline.com>
date Wed Nov 28 16:49:26 2007 -0800 (2007-11-28)
parents be8c09632f31
children f56c47274c37
rev   line source
james@0 1 /*
james@0 2 PV Drivers for Windows Xen HVM Domains
james@0 3 Copyright (C) 2007 James Harper
james@0 4
james@0 5 This program is free software; you can redistribute it and/or
james@0 6 modify it under the terms of the GNU General Public License
james@0 7 as published by the Free Software Foundation; either version 2
james@0 8 of the License, or (at your option) any later version.
james@0 9
james@0 10 This program is distributed in the hope that it will be useful,
james@0 11 but WITHOUT ANY WARRANTY; without even the implied warranty of
james@0 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
james@0 13 GNU General Public License for more details.
james@0 14
james@0 15 You should have received a copy of the GNU General Public License
james@0 16 along with this program; if not, write to the Free Software
james@0 17 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
james@0 18 */
james@0 19
james@0 20 #if !defined(_XENPCI_H_)
james@0 21 #define _XENPCI_H_
james@0 22
james@0 23 #define __attribute__(arg) /* empty */
james@0 24 #define EISCONN 127
james@0 25
james@0 26 #include <ntddk.h>
james@0 27 #include <wdm.h>
james@0 28 #include <wdf.h>
james@0 29 #include <initguid.h>
james@0 30 #include <wdmguid.h>
james@0 31 #include <errno.h>
james@0 32
james@0 33 #define NTSTRSAFE_LIB
james@0 34 #include <ntstrsafe.h>
james@0 35
james@0 36 #include <xen_windows.h>
james@0 37 #include <memory.h>
james@0 38 #include <grant_table.h>
james@0 39 #include <event_channel.h>
james@0 40 #include <hvm/params.h>
james@0 41 #include <hvm/hvm_op.h>
james@0 42
andy@15 43 #include <evtchn_public.h>
andy@15 44 #include <xenbus_public.h>
andy@15 45 #include <xen_public.h>
andy@15 46 #include <gnttbl_public.h>
andy@15 47
james@0 48 //{C828ABE9-14CA-4445-BAA6-82C2376C6518}
james@0 49 DEFINE_GUID( GUID_XENPCI_DEVCLASS, 0xC828ABE9, 0x14CA, 0x4445, 0xBA, 0xA6, 0x82, 0xC2, 0x37, 0x6C, 0x65, 0x18);
james@0 50
james@0 51 #define __DRIVER_NAME "XenPCI"
james@0 52 #define XENPCI_POOL_TAG (ULONG) 'XenP'
james@0 53 //#define XENPCI_FDO_INSTANCE_SIGNATURE (ULONG) 'XENP'
james@0 54
james@0 55 #define NR_RESERVED_ENTRIES 8
james@0 56 #define NR_GRANT_FRAMES 4
james@0 57 #define NR_GRANT_ENTRIES (NR_GRANT_FRAMES * PAGE_SIZE / sizeof(grant_entry_t))
james@0 58
james@0 59 #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
james@0 60
james@0 61 typedef struct _XENPCI_IDENTIFICATION_DESCRIPTION
james@0 62 {
james@0 63 WDF_CHILD_IDENTIFICATION_DESCRIPTION_HEADER Header;
james@0 64 UNICODE_STRING DeviceType;
james@0 65 // ULONG DeviceIndex;
james@0 66 char Path[128];
james@0 67 } XENPCI_IDENTIFICATION_DESCRIPTION, *PXENPCI_IDENTIFICATION_DESCRIPTION;
james@0 68
andy@13 69 typedef struct _ev_action_t {
andy@13 70 PKSERVICE_ROUTINE ServiceRoutine;
andy@13 71 PVOID ServiceContext;
andy@13 72 ULONG Count;
andy@13 73 } ev_action_t;
andy@13 74
andy@15 75 typedef struct _XENBUS_WATCH_RING
andy@15 76 {
andy@15 77 char Path[128];
andy@15 78 char Token[10];
andy@15 79 } XENBUS_WATCH_RING;
andy@15 80
andy@15 81 typedef struct _XENBUS_REQ_INFO
andy@15 82 {
andy@15 83 int In_Use:1;
andy@15 84 KEVENT WaitEvent;
andy@15 85 void *Reply;
andy@15 86 } XENBUS_REQ_INFO;
andy@15 87
andy@15 88 typedef struct _XENBUS_WATCH_ENTRY {
andy@15 89 char Path[128];
andy@15 90 PXENBUS_WATCH_CALLBACK ServiceRoutine;
andy@15 91 PVOID ServiceContext;
andy@15 92 int Count;
andy@15 93 int Active;
andy@15 94 } XENBUS_WATCH_ENTRY, *PXENBUS_WATCH_ENTRY;
andy@15 95
andy@13 96 #define NR_EVENTS 1024
andy@15 97 #define WATCH_RING_SIZE 128
andy@15 98 #define NR_XB_REQS 32
andy@15 99 #define MAX_WATCH_ENTRIES 128
james@0 100
andy@15 101 // TODO: tidy up & organize this struct
james@0 102 typedef struct {
james@0 103
andy@13 104 WDFDEVICE Device;
james@0 105
andy@13 106 WDFINTERRUPT XenInterrupt;
andy@13 107 ULONG irqNumber;
james@0 108
andy@13 109 shared_info_t *shared_info_area;
james@0 110
andy@13 111 PHYSICAL_ADDRESS platform_mmio_addr;
andy@13 112 ULONG platform_mmio_orig_len;
andy@13 113 ULONG platform_mmio_len;
andy@13 114 ULONG platform_mmio_alloc;
andy@13 115
andy@13 116 char *hypercall_stubs;
andy@13 117
andy@13 118 evtchn_port_t xen_store_evtchn;
andy@13 119
andy@13 120 grant_entry_t *gnttab_table;
andy@13 121 PHYSICAL_ADDRESS gnttab_table_physical;
andy@13 122 grant_ref_t gnttab_list[NR_GRANT_ENTRIES];
andy@13 123
andy@13 124 ev_action_t ev_actions[NR_EVENTS];
andy@13 125 unsigned long bound_ports[NR_EVENTS/(8*sizeof(unsigned long))];
james@0 126
andy@15 127 HANDLE XenBus_ReadThreadHandle;
andy@15 128 KEVENT XenBus_ReadThreadEvent;
andy@15 129 HANDLE XenBus_WatchThreadHandle;
andy@15 130 KEVENT XenBus_WatchThreadEvent;
andy@15 131
andy@15 132 XENBUS_WATCH_RING XenBus_WatchRing[WATCH_RING_SIZE];
andy@15 133 int XenBus_WatchRingReadIndex;
andy@15 134 int XenBus_WatchRingWriteIndex;
andy@15 135
andy@15 136 struct xenstore_domain_interface *xen_store_interface;
andy@15 137
andy@15 138 XENBUS_REQ_INFO req_info[NR_XB_REQS];
andy@15 139 int nr_live_reqs;
andy@15 140 XENBUS_WATCH_ENTRY XenBus_WatchEntries[MAX_WATCH_ENTRIES];
andy@15 141
james@0 142 } XENPCI_DEVICE_DATA, *PXENPCI_DEVICE_DATA;
james@0 143
james@0 144 WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(XENPCI_DEVICE_DATA, GetDeviceData);
james@0 145
james@0 146 typedef unsigned long xenbus_transaction_t;
james@0 147 typedef uint32_t XENSTORE_RING_IDX;
james@0 148
james@0 149 #define XBT_NIL ((xenbus_transaction_t)0)
james@0 150
james@0 151 char *
andy@13 152 XenBus_Read(PVOID Context, xenbus_transaction_t xbt, const char *path, char **value);
james@0 153 char *
andy@13 154 XenBus_Write(PVOID Context, xenbus_transaction_t xbt, const char *path, const char *value);
james@0 155 char *
andy@13 156 XenBus_Printf(PVOID Context, xenbus_transaction_t xbt, const char *path, const char *fmt, ...);
james@0 157 char *
andy@13 158 XenBus_StartTransaction(PVOID Context, xenbus_transaction_t *xbt);
james@0 159 char *
andy@13 160 XenBus_EndTransaction(PVOID Context, xenbus_transaction_t t, int abort, int *retry);
andy@13 161 char *
andy@13 162 XenBus_List(PVOID Context, xenbus_transaction_t xbt, const char *prefix, char ***contents);
james@0 163 NTSTATUS
andy@15 164 XenBus_Init(WDFDEVICE Device);
james@0 165 NTSTATUS
andy@15 166 XenBus_Start(WDFDEVICE Device);
andy@15 167 NTSTATUS
andy@15 168 XenBus_Stop(WDFDEVICE Device);
james@0 169 char *
andy@13 170 XenBus_AddWatch(PVOID Context, xenbus_transaction_t xbt, const char *Path, PXENBUS_WATCH_CALLBACK ServiceRoutine, PVOID ServiceContext);
james@0 171 char *
andy@13 172 XenBus_RemWatch(PVOID Context, xenbus_transaction_t xbt, const char *Path, PXENBUS_WATCH_CALLBACK ServiceRoutine, PVOID ServiceContext);
james@0 173 VOID
james@0 174 XenBus_ThreadProc(PVOID StartContext);
james@0 175
james@0 176 PHYSICAL_ADDRESS
andy@13 177 XenPCI_AllocMMIO(WDFDEVICE Device, ULONG len);
james@0 178
andy@15 179 NTSTATUS
andy@15 180 EvtChn_Init(WDFDEVICE Device);
james@0 181 BOOLEAN
james@0 182 EvtChn_Interrupt(WDFINTERRUPT Interrupt, ULONG MessageID);
james@0 183 BOOLEAN
james@0 184 EvtChn_InterruptDpc(WDFINTERRUPT Interrupt, WDFOBJECT AssociatedObject);
james@0 185 NTSTATUS
andy@13 186 EvtChn_Mask(PVOID Context, evtchn_port_t Port);
james@0 187 NTSTATUS
andy@13 188 EvtChn_Unmask(PVOID Context, evtchn_port_t Port);
james@0 189 NTSTATUS
andy@13 190 EvtChn_Bind(PVOID Context, evtchn_port_t Port, PKSERVICE_ROUTINE ServiceRoutine, PVOID ServiceContext);
andy@13 191 NTSTATUS
andy@13 192 EvtChn_Unbind(PVOID Context, evtchn_port_t Port);
andy@13 193 NTSTATUS
andy@13 194 EvtChn_Notify(PVOID Context, evtchn_port_t Port);
james@0 195 evtchn_port_t
andy@13 196 EvtChn_AllocUnbound(PVOID Context, domid_t Domain);
andy@15 197 evtchn_port_t
andy@15 198 EvtChn_GetXenStorePort(WDFDEVICE Device);
andy@15 199 PVOID
andy@15 200 EvtChn_GetXenStoreRingAddr(WDFDEVICE Device);
james@0 201
andy@15 202 VOID
andy@15 203 GntTbl_Init(WDFDEVICE Device);
james@0 204 grant_ref_t
andy@13 205 GntTbl_GrantAccess(WDFDEVICE Device, domid_t domid, unsigned long frame, int readonly);
james@0 206 BOOLEAN
andy@13 207 GntTbl_EndAccess(WDFDEVICE Device, grant_ref_t ref);
james@0 208
james@0 209 #endif