win-pvdrivers

annotate xenvbd/xenvbd.h @ 790:467005e7f509

Big messy changes. Add grant ref tagging to better track when things go wrong (debug build only).
Fix a race in xennet that causes crashes under heavy traffic conditions on driver shutdown.
author James Harper <james.harper@bendigoit.com.au>
date Fri Mar 12 09:38:42 2010 +1100 (2010-03-12)
parents 2b2bf47e8672
children bbc6c94b9621
rev   line source
james@267 1 /*
james@267 2 PV Drivers for Windows Xen HVM Domains
james@267 3 Copyright (C) 2007 James Harper
james@267 4
james@267 5 This program is free software; you can redistribute it and/or
james@267 6 modify it under the terms of the GNU General Public License
james@267 7 as published by the Free Software Foundation; either version 2
james@267 8 of the License, or (at your option) any later version.
james@267 9
james@267 10 This program is distributed in the hope that it will be useful,
james@267 11 but WITHOUT ANY WARRANTY; without even the implied warranty of
james@267 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
james@267 13 GNU General Public License for more details.
james@267 14
james@267 15 You should have received a copy of the GNU General Public License
james@267 16 along with this program; if not, write to the Free Software
james@267 17 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
james@267 18 */
james@267 19
james@48 20 #if !defined(_XENVBD_H_)
james@48 21 #define _XENVBD_H_
andy@378 22
andy@378 23 #define DDKAPI
james@0 24
james@716 25 //#include <ntifs.h>
james@0 26 #include <ntddk.h>
james@0 27 #include <wdm.h>
james@0 28 #include <initguid.h>
andy@378 29 #define NTSTRSAFE_LIB
andy@378 30 #include <ntstrsafe.h>
andy@378 31
james@0 32 #include <ntdddisk.h>
james@48 33 #include <srb.h>
james@0 34
james@74 35 #define __DRIVER_NAME "XenVbd"
james@74 36
james@0 37 #include <xen_windows.h>
james@0 38 #include <memory.h>
james@534 39 //#include <grant_table.h>
james@0 40 #include <event_channel.h>
james@0 41 #include <hvm/params.h>
james@0 42 #include <hvm/hvm_op.h>
james@48 43 #include <xen_public.h>
james@0 44 #include <io/ring.h>
james@0 45 #include <io/blkif.h>
james@74 46
james@48 47 #define XENVBD_POOL_TAG (ULONG) 'XVBD'
james@0 48
james@0 49 #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
james@0 50 #define BLK_RING_SIZE __RING_SIZE((blkif_sring_t *)0, PAGE_SIZE)
james@162 51 #define BLK_OTHER_RING_SIZE __RING_SIZE((blkif_other_sring_t *)0, PAGE_SIZE)
james@162 52
james@162 53 #if defined(__x86_64__)
james@162 54 #pragma pack(push, 4)
james@162 55 #endif
james@162 56 struct blkif_other_request {
james@162 57 uint8_t operation;
james@162 58 uint8_t nr_segments;
james@162 59 blkif_vdev_t handle;
james@162 60 uint64_t id;
james@162 61 blkif_sector_t sector_number;
james@162 62 struct blkif_request_segment seg[BLKIF_MAX_SEGMENTS_PER_REQUEST];
james@162 63 };
james@162 64 struct blkif_other_response {
james@162 65 uint64_t id;
james@162 66 uint8_t operation;
james@162 67 int16_t status;
james@162 68 };
james@162 69 #if defined(__x86_64__)
james@162 70 #pragma pack(pop)
james@162 71 #endif
james@162 72
james@162 73 typedef struct blkif_other_request blkif_other_request_t;
james@162 74 typedef struct blkif_other_response blkif_other_response_t;
james@162 75 DEFINE_RING_TYPES(blkif_other, struct blkif_other_request, struct blkif_other_response);
james@0 76
james@0 77 typedef struct {
james@781 78 LIST_ENTRY list_entry;
james@781 79 PSCSI_REQUEST_BLOCK srb;
james@781 80 } srb_list_entry_t;
james@781 81
james@781 82 typedef struct {
james@0 83 blkif_request_t req;
james@280 84 PSCSI_REQUEST_BLOCK srb;
james@766 85 BOOLEAN aligned_buffer_in_use;
james@0 86 } blkif_shadow_t;
james@0 87
james@425 88 #define MAX_SHADOW_ENTRIES 64
james@425 89 #define SHADOW_ENTRIES min(MAX_SHADOW_ENTRIES, min(BLK_RING_SIZE, BLK_OTHER_RING_SIZE))
james@0 90
james@9 91 typedef enum {
james@9 92 XENVBD_DEVICETYPE_UNKNOWN,
james@9 93 XENVBD_DEVICETYPE_DISK,
james@48 94 XENVBD_DEVICETYPE_CDROM,
james@48 95 XENVBD_DEVICETYPE_CONTROLLER // Not yet used
james@9 96 } XENVBD_DEVICETYPE;
james@9 97
wayne@363 98 typedef enum {
wayne@363 99 XENVBD_DEVICEMODE_UNKNOWN,
wayne@363 100 XENVBD_DEVICEMODE_READ,
wayne@363 101 XENVBD_DEVICEMODE_WRITE
wayne@363 102 } XENVBD_DEVICEMODE;
wayne@363 103
james@577 104 #define RING_DETECT_STATE_NOT_STARTED 0
james@577 105 #define RING_DETECT_STATE_DETECT1 1
james@577 106 #define RING_DETECT_STATE_DETECT2 2
james@577 107 #define RING_DETECT_STATE_COMPLETE 3
james@577 108
james@48 109 struct
james@48 110 {
james@425 111 BOOLEAN inactive;
james@425 112
james@425 113 blkif_shadow_t shadows[MAX_SHADOW_ENTRIES];
james@425 114 USHORT shadow_free_list[MAX_SHADOW_ENTRIES];
james@267 115 USHORT shadow_free;
james@284 116 USHORT shadow_min_free;
james@267 117
james@342 118 PUCHAR device_base;
james@267 119
james@342 120 blkif_sring_t *sring;
james@267 121 evtchn_port_t event_channel;
james@435 122 ULONG *event_channel_ptr;
james@162 123 union {
james@267 124 blkif_front_ring_t ring;
james@267 125 blkif_other_front_ring_t other_ring;
james@162 126 };
james@162 127 int ring_detect_state;
james@162 128 BOOLEAN use_other;
james@435 129 BOOLEAN cached_use_other;
james@284 130 UCHAR last_sense_key;
james@291 131 UCHAR last_additional_sense_code;
james@162 132 blkif_response_t tmp_rep;
james@267 133 XENVBD_DEVICETYPE device_type;
wayne@363 134 XENVBD_DEVICEMODE device_mode;
james@267 135 ULONG bytes_per_sector;
james@267 136 ULONGLONG total_sectors;
james@267 137 XENPCI_VECTORS vectors;
james@342 138 PXENPCI_DEVICE_STATE device_state;
james@781 139 LIST_ENTRY srb_list;
james@790 140 grant_ref_t dump_grant_refs[BLKIF_MAX_SEGMENTS_PER_REQUEST];
james@766 141 BOOLEAN aligned_buffer_in_use;
james@766 142 PVOID aligned_buffer;
james@766 143 UCHAR aligned_buffer_data[(BLKIF_MAX_SEGMENTS_PER_REQUEST + 1) * PAGE_SIZE - 1];
james@425 144 /*
james@293 145 ULONGLONG interrupts;
james@293 146 ULONGLONG aligned_requests;
james@293 147 ULONGLONG aligned_bytes;
james@293 148 ULONGLONG unaligned_requests;
james@293 149 ULONGLONG unaligned_bytes;
james@425 150 */
james@48 151 } typedef XENVBD_DEVICE_DATA, *PXENVBD_DEVICE_DATA;
james@0 152
andy@378 153 #endif
andy@378 154