Prechádzať zdrojové kódy

Show warning about undivisible image size only when host queries disk geometry (#35)

Petteri Aimonen 3 rokov pred
rodič
commit
2a0f42a2d9
1 zmenil súbory, kde vykonal 36 pridanie a 9 odobranie
  1. 36 9
      src/ZuluSCSI_disk.cpp

+ 36 - 9
src/ZuluSCSI_disk.cpp

@@ -230,6 +230,9 @@ struct image_config_t: public S2S_TargetCfg
 
     // Maximum amount of bytes to prefetch
     int prefetchbytes;
+
+    // Warning about geometry settings
+    bool geometrywarningprinted;
 };
 
 static image_config_t g_DiskImages[S2S_MAX_TARGETS];
@@ -393,15 +396,6 @@ bool scsiDiskOpenHDDImage(int target_idx, const char *filename, int scsi_id, int
             azlog("---- WARNING: file ", filename, " is not contiguous. This will increase read latency.");
         }
 
-        uint32_t sectorsPerHeadTrack = img.sectorsPerTrack * img.headsPerCylinder;
-        if (img.scsiSectors % sectorsPerHeadTrack != 0)
-        {
-            azlog("---- NOTE: Drive geometry is ",
-                (int)img.sectorsPerTrack, "x", (int)img.headsPerCylinder, "=",
-                (int)sectorsPerHeadTrack, " but image size of ", (int)img.scsiSectors,
-                " is not divisible.");
-        }
-
         if (is_cd)
         {
             azlog("---- Configuring as CD-ROM drive based on image name");
@@ -434,6 +428,23 @@ bool scsiDiskOpenHDDImage(int target_idx, const char *filename, int scsi_id, int
     return false;
 }
 
+static void checkDiskGeometryDivisible(image_config_t &img)
+{
+    if (!img.geometrywarningprinted)
+    {
+        uint32_t sectorsPerHeadTrack = img.sectorsPerTrack * img.headsPerCylinder;
+        if (img.scsiSectors % sectorsPerHeadTrack != 0)
+        {
+            azlog("WARNING: Host used command ", scsiDev.cdb[0],
+                " which is affected by drive geometry. Current settings are ",
+                (int)img.sectorsPerTrack, " sectors x ", (int)img.headsPerCylinder, " heads = ",
+                (int)sectorsPerHeadTrack, " but image size of ", (int)img.scsiSectors,
+                " sectors is not divisible. This can cause error messages in diagnostics tools.");
+            img.geometrywarningprinted = true;
+        }
+    }
+}
+
 // Set target configuration to default values
 static void scsiDiskConfigDefaults(int target_idx)
 {
@@ -1603,6 +1614,22 @@ void scsiDiskPoll()
     {
         diskDataOut();
     }
+
+    if (scsiDev.phase == STATUS && scsiDev.target)
+    {
+        // Check if the command is affected by drive geometry.
+        // Affected commands are:
+        // 0x1A MODE SENSE command of pages 0x03 (device format), 0x04 (disk geometry) or 0x3F (all pages)
+        // 0x1C RECEIVE DIAGNOSTICS RESULTS
+        uint8_t command = scsiDev.cdb[0];
+        uint8_t pageCode = scsiDev.cdb[2] & 0x3F;
+        if ((command == 0x1A && (pageCode == 0x03 || pageCode == 0x04 || pageCode == 0x3F)) ||
+            command == 0x1C)
+        {
+            image_config_t &img = *(image_config_t*)scsiDev.target->cfg;
+            checkDiskGeometryDivisible(img);
+        }
+    }
 }
 
 extern "C"