WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

[Xen-devel] fix some bugs of WinPv driver WDM version

To: James Harper <james.harper@xxxxxxxxxxxxxxxx>, Andy Grover <andy.grover@xxxxxxxxxx>, Yansu Li <annie.li@xxxxxxxxxx>, "xen-devel@xxxxxxxxxxxxxxxxxxx" <xen-devel@xxxxxxxxxxxxxxxxxxx>
Subject: [Xen-devel] fix some bugs of WinPv driver WDM version
From: Wayne Gong <wayne.gong@xxxxxxxxxx>
Date: Mon, 07 Jul 2008 14:27:00 +0800
Cc: Kurt Hackel <kurt.hackel@xxxxxxxxxx>
Delivery-date: Sun, 06 Jul 2008 23:28:43 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
User-agent: Thunderbird 2.0.0.14 (Windows/20080421)
Hello james,

Since I don't have privilege to push WinPv driver code to Xen main upstream, I will send to a patch when push some change to our own repository every time.
In this patch, fix the following bugs:

1. [XenHide] If we destroy a running vm and reboot it, the boot up information may larger than 200 bytes. So change the buffer length to 300.
2. [XenHide] Hide a qeme scsi device.
3. [XenPci] From xen 3.1.3 on, each vm can get 32 grant table frames. In x86 platform, call an hypercall to query the max grant table frames. Set NR_GRANT_FRAMES to in AMD64 platform since HYPERVISOR_grant_table_op is not supported in AMD64 platform.
4. [XenVbd] Store each block device mode (read only or writable?) and set MODE_DSP_WRITE_PROTECT in ModeSense header parameter. This can protect write operation to a read only block device. (*Note* : This approach will be ineffective to a NTFS volume in Win2k.)

Best regards,
Wayne
# HG changeset patch
# User Wayne Gong <wayne.gong@xxxxxxxxxx>
# Date 1215410619 -28800
# Node ID d5e48a07a2134cd6274392079b7c1bcad89417f4
# Parent  ab5d87da78e3948530a22d77a94c15e8a747fe38
Merge bug fixer from WDF to WDM.

diff -r ab5d87da78e3 -r d5e48a07a213 xenhide/xenhide.c
--- a/xenhide/xenhide.c Mon Jul 07 09:39:15 2008 +0800
+++ b/xenhide/xenhide.c Mon Jul 07 14:03:39 2008 +0800
@@ -60,8 +60,8 @@
   UNICODE_STRING RegValueName;
   HANDLE RegHandle;
   OBJECT_ATTRIBUTES RegObjectAttributes;
-  char Buf[200];
-  ULONG BufLen = 200;
+  char Buf[300];// Sometimes bigger then 200 if system reboot from crash
+  ULONG BufLen = 300;
   PKEY_VALUE_PARTIAL_INFORMATION KeyPartialValue;
   int State = 0;
   size_t StartPos = 0;
@@ -249,8 +249,9 @@
   if (gplpv)
   {
     /* hide only specific devices */
-    if (XenHide_IdSuffixMatches(PhysicalDeviceObject, L"VEN_8086&DEV_7010")
-      || XenHide_IdSuffixMatches(PhysicalDeviceObject, L"VEN_10EC&DEV_8139"))
+    if (XenHide_IdSuffixMatches(PhysicalDeviceObject, L"VEN_8086&DEV_7010") // 
Qemu IDE
+      || XenHide_IdSuffixMatches(PhysicalDeviceObject, L"VEN_10EC&DEV_8139") 
// Qemu Network
+      || XenHide_IdSuffixMatches(PhysicalDeviceObject, 
L"VEN_1000&DEV_0012"))// Qemu SCSI
     {
       hide_type = XENHIDE_TYPE_DEVICE;
     }
diff -r ab5d87da78e3 -r d5e48a07a213 xenpci/gnttbl.c
--- a/xenpci/gnttbl.c   Mon Jul 07 09:39:15 2008 +0800
+++ b/xenpci/gnttbl.c   Mon Jul 07 14:03:39 2008 +0800
@@ -149,28 +149,59 @@
   return TRUE;
 }
 
+#if defined(_X86_)
+static unsigned int 
+GntTbl_QueryMaxFrames(PXENPCI_DEVICE_DATA xpdd)
+{
+  struct gnttab_query_size query;
+  int rc;
+
+  query.dom = DOMID_SELF;
+
+  rc = HYPERVISOR_grant_table_op(xpdd,GNTTABOP_query_size, &query, 1);
+  if ((rc < 0) || (query.status != GNTST_okay))
+  {
+    KdPrint((__DRIVER_NAME "     ***CANNOT QUERY MAX GRANT FRAME***\n"));
+    return 4; /* Legacy max supported number of frames */
+  }
+  return query.max_nr_frames;
+}
+#endif
+
 VOID
 GntTbl_Init(PXENPCI_DEVICE_DATA xpdd)
 {
   int i;
-
+  int max_grant_frames = NR_GRANT_FRAMES;
+  int max_grant_entries = NR_GRANT_ENTRIES;
   //KdPrint((__DRIVER_NAME " --> GntTbl_Init\n"));
   
   KeInitializeSpinLock(&xpdd->grant_lock);
 
-  for (i = NR_RESERVED_ENTRIES; i < NR_GRANT_ENTRIES; i++)
+#if defined(_X86_)
+  max_grant_frames = GntTbl_QueryMaxFrames(xpdd);
+  max_grant_entries = min(NR_GRANT_ENTRIES,(max_grant_frames * PAGE_SIZE / 
sizeof(grant_entry_t)));
+  KdPrint((__DRIVER_NAME "     max_grant_entries : %d\n",max_grant_entries));
+#else
+  #if defined(_AMD64_)
+    KdPrint((__DRIVER_NAME "     AMD64 cannot support 
HYPERVISOR_grant_table_op now\n"));
+  #endif
+#endif
+
+  xpdd->gnttab_list = ExAllocatePoolWithTag(NonPagedPool, sizeof(grant_ref_t) 
* max_grant_entries, XENPCI_POOL_TAG);// Where to free?
+  for (i = NR_RESERVED_ENTRIES; i < max_grant_entries; i++)
     GntTbl_PutRef(xpdd, i);
 
   xpdd->gnttab_table_physical = XenPci_AllocMMIO(xpdd,
-    PAGE_SIZE * NR_GRANT_FRAMES);
+    PAGE_SIZE * max_grant_frames);
   xpdd->gnttab_table = MmMapIoSpace(xpdd->gnttab_table_physical,
-    PAGE_SIZE * NR_GRANT_FRAMES, MmNonCached);
+    PAGE_SIZE * max_grant_frames, MmNonCached);
   if (!xpdd->gnttab_table)
   {
     KdPrint((__DRIVER_NAME "     Error Mapping Grant Table Shared Memory\n"));
     return;
   }
-  GntTbl_Map(xpdd, 0, NR_GRANT_FRAMES - 1);
+  GntTbl_Map(xpdd, 0, max_grant_frames - 1);
 
   //KdPrint((__DRIVER_NAME " <-- GntTbl_Init table mapped at %p\n", 
gnttab_table));
 }
diff -r ab5d87da78e3 -r d5e48a07a213 xenpci/xenpci.h
--- a/xenpci/xenpci.h   Mon Jul 07 09:39:15 2008 +0800
+++ b/xenpci/xenpci.h   Mon Jul 07 14:03:39 2008 +0800
@@ -57,7 +57,7 @@
 #define XENPCI_POOL_TAG (ULONG) 'XenP'
 
 #define NR_RESERVED_ENTRIES 8
-#define NR_GRANT_FRAMES 4
+#define NR_GRANT_FRAMES 32
 #define NR_GRANT_ENTRIES (NR_GRANT_FRAMES * PAGE_SIZE / sizeof(grant_entry_t))
 
 #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
@@ -184,7 +184,7 @@
 
   grant_entry_t *gnttab_table;
   PHYSICAL_ADDRESS gnttab_table_physical;
-  grant_ref_t gnttab_list[NR_GRANT_ENTRIES];
+  grant_ref_t *gnttab_list;
 
   ev_action_t ev_actions[NR_EVENTS];
 //  unsigned long bound_ports[NR_EVENTS/(8*sizeof(unsigned long))];
diff -r ab5d87da78e3 -r d5e48a07a213 xenvbd/scsiport.c
--- a/xenvbd/scsiport.c Mon Jul 07 09:39:15 2008 +0800
+++ b/xenvbd/scsiport.c Mon Jul 07 14:03:39 2008 +0800
@@ -170,6 +170,24 @@
         {
           KdPrint((__DRIVER_NAME "     device-type = %s (This probably won't 
work!)\n", value));
           xvdd->device_type = XENVBD_DEVICETYPE_UNKNOWN;
+        }
+      }
+      else if (strcmp(setting, "mode") == 0)
+      {
+        if (strncmp(value, "r", 1) == 0)
+        {
+          KdPrint((__DRIVER_NAME "     mode = r\n"));    
+          xvdd->device_mode = XENVBD_DEVICEMODE_READ;
+        }
+        else if (strncmp(value, "w", 1) == 0)
+        {
+          KdPrint((__DRIVER_NAME "     mode = w\n"));    
+          xvdd->device_mode = XENVBD_DEVICEMODE_WRITE;
+        }
+        else
+        {
+          KdPrint((__DRIVER_NAME "     mode = unknown\n"));
+          xvdd->device_mode = XENVBD_DEVICEMODE_UNKNOWN;
         }
       }
       break;
@@ -525,6 +543,12 @@
   parameter_header->DeviceSpecificParameter = 0;
   parameter_header->BlockDescriptorLength = 0;
   offset += sizeof(MODE_PARAMETER_HEADER);
+  
+  if (xvdd->device_mode == XENVBD_DEVICEMODE_READ)
+  {
+    KdPrint((__DRIVER_NAME " Mode sense to a read only disk.\n"));
+    parameter_header->DeviceSpecificParameter|=MODE_DSP_WRITE_PROTECT; 
+  }
   
   if (!cdb->MODE_SENSE.Dbd)
   {
diff -r ab5d87da78e3 -r d5e48a07a213 xenvbd/xenvbd.h
--- a/xenvbd/xenvbd.h   Mon Jul 07 09:39:15 2008 +0800
+++ b/xenvbd/xenvbd.h   Mon Jul 07 14:03:39 2008 +0800
@@ -90,6 +90,12 @@
   XENVBD_DEVICETYPE_CONTROLLER // Not yet used
 } XENVBD_DEVICETYPE;
 
+typedef enum {
+  XENVBD_DEVICEMODE_UNKNOWN,
+  XENVBD_DEVICEMODE_READ,
+  XENVBD_DEVICEMODE_WRITE
+} XENVBD_DEVICEMODE;
+
 struct
 {
   blkif_shadow_t shadows[SHADOW_ENTRIES];
@@ -115,6 +121,7 @@
   UCHAR last_additional_sense_code;
   blkif_response_t tmp_rep;
   XENVBD_DEVICETYPE device_type;
+  XENVBD_DEVICEMODE device_mode;
   DISK_GEOMETRY Geometry;
   ULONG bytes_per_sector;
   ULONGLONG total_sectors;
diff -r ab5d87da78e3 -r d5e48a07a213 xenvbd/xenvbd.inx
--- a/xenvbd/xenvbd.inx Mon Jul 07 09:39:15 2008 +0800
+++ b/xenvbd/xenvbd.inx Mon Jul 07 14:03:39 2008 +0800
@@ -62,6 +62,7 @@
 HKR,"XenConfig\ring-ref", "type", %FLG_ADDREG_TYPE_DWORD%, %XEN_INIT_TYPE_RING%
 HKR,"XenConfig\event-channel", "type", %FLG_ADDREG_TYPE_DWORD%, 
%XEN_INIT_TYPE_EVENT_CHANNEL_IRQ%
 HKR,"XenConfig\device-type", "type", %FLG_ADDREG_TYPE_DWORD%, 
%XEN_INIT_TYPE_READ_STRING_FRONT%
+HKR,"XenConfig\mode", "type", %FLG_ADDREG_TYPE_DWORD%, 
%XEN_INIT_TYPE_READ_STRING_BACK%
 HKR,"XenConfig\sectors", "type", %FLG_ADDREG_TYPE_DWORD%, 
%XEN_INIT_TYPE_READ_STRING_BACK%
 HKR,"XenConfig\sector-size", "type", %FLG_ADDREG_TYPE_DWORD%, 
%XEN_INIT_TYPE_READ_STRING_BACK%
 HKR,"XenConfig\vectors", "type", %FLG_ADDREG_TYPE_DWORD%, 
%XEN_INIT_TYPE_VECTORS%
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
<Prev in Thread] Current Thread [Next in Thread>