فهرست منبع

Add error messages for access beyond image size (#20)

Petteri Aimonen 3 سال پیش
والد
کامیت
7d2917b99a
1فایلهای تغییر یافته به همراه16 افزوده شده و 0 حذف شده
  1. 16 0
      src/AzulSCSI_disk.cpp

+ 16 - 0
src/AzulSCSI_disk.cpp

@@ -59,6 +59,15 @@ 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 (tolower(filename[0]) == 'c' && tolower(filename[1]) == 'd')
         {
             azlog("---- Configuring as CD-ROM drive based on image name");
@@ -462,6 +471,7 @@ static void doWrite(uint32_t lba, uint32_t blocks)
         unlikely(scsiDev.target->cfg->deviceType == S2S_CFG_OPTICAL))
 
     {
+        azlog("WARNING: Host attempted write to CD-ROM");
         scsiDev.status = CHECK_CONDITION;
         scsiDev.target->sense.code = ILLEGAL_REQUEST;
         scsiDev.target->sense.asc = WRITE_PROTECTED;
@@ -469,6 +479,9 @@ static void doWrite(uint32_t lba, uint32_t blocks)
     }
     else if (unlikely(((uint64_t) lba) + blocks > capacity))
     {
+        azlog("WARNING: Host attempted write at sector ", (int)lba, "+", (int)blocks,
+              ", exceeding image size ", (int)capacity, " sectors (",
+              (int)bytesPerSector, "B/sector)");
         scsiDev.status = CHECK_CONDITION;
         scsiDev.target->sense.code = ILLEGAL_REQUEST;
         scsiDev.target->sense.asc = LOGICAL_BLOCK_ADDRESS_OUT_OF_RANGE;
@@ -590,6 +603,9 @@ static void doRead(uint32_t lba, uint32_t blocks)
 
     if (unlikely(((uint64_t) lba) + blocks > capacity))
     {
+        azlog("WARNING: Host attempted write at sector ", (int)lba, "+", (int)blocks,
+              ", exceeding image size ", (int)capacity, " sectors (",
+              (int)bytesPerSector, "B/sector)");
         scsiDev.status = CHECK_CONDITION;
         scsiDev.target->sense.code = ILLEGAL_REQUEST;
         scsiDev.target->sense.asc = LOGICAL_BLOCK_ADDRESS_OUT_OF_RANGE;