Fix to properly shadow the DEV bit in the Drive/Head register so other
authorAndrew Schultz <alschult@umich.edu>
Wed, 23 Jun 2004 19:37:05 +0000 (15:37 -0400)
committerAndrew Schultz <alschult@umich.edu>
Wed, 23 Jun 2004 19:37:05 +0000 (15:37 -0400)
disks are properly detected and handled

--HG--
extra : convert_revision : ffc3046deb68458ee2ef6fa5263dc471488abc45

dev/ide_ctrl.cc
dev/ide_ctrl.hh
dev/ide_disk.cc
dev/ide_disk.hh

index 46a0e817933c9917b1c83bbab4a173ea1188a841..4805570d20bbb861545776214cb4ea56318a7e9d 100644 (file)
@@ -192,6 +192,22 @@ IdeController::getDisk(IdeDisk *diskPtr)
     return -1;
 }
 
+bool
+IdeController::isDiskSelected(IdeDisk *diskPtr)
+{
+    for (int i = 0; i < 4; i++) {
+        if ((long)diskPtr == (long)disks[i]) {
+            // is disk is on primary or secondary channel
+            int channel = i/2;
+            // is disk the master or slave
+            int devID = i%2;
+
+            return (dev[channel] == devID);
+        }
+    }
+    panic("Unable to find disk by pointer!!\n");
+}
+
 ////
 // Command completion
 ////
index 679c7422b83b0e06d89bb27df794d328923ae2d4..39c64eb308ce68d9e0435387afe6dda964a55205 100644 (file)
@@ -144,6 +144,10 @@ class IdeController : public PciDev
     /** Select the disk based on a pointer */
     int getDisk(IdeDisk *diskPtr);
 
+  public:
+    /** See if a disk is selected based on its pointer */
+    bool isDiskSelected(IdeDisk *diskPtr);
+
   public:
     /**
      * Constructs and initializes this controller.
index 0f5c02660b1212f7bdfc2b1b04d4e5471b788dbc..ee21feaeae1853ebbcdc98b120824519459f5d25 100644 (file)
@@ -167,6 +167,12 @@ IdeDisk::reset(int id)
 // Utility functions
 ////
 
+bool
+IdeDisk::isDEVSelect()
+{
+    return ctrl->isDiskSelected(this);
+}
+
 Addr
 IdeDisk::pciToDma(Addr pciAddr)
 {
index 409aaef9a3134f9da6bed4fdf865db4a4ecc4163..9c6eea6231bde73bee4040aae246ca8d1ed278bf 100644 (file)
@@ -320,7 +320,7 @@ class IdeDisk : public SimObject
     // Utility functions
     bool isBSYSet() { return (status & STATUS_BSY_BIT); }
     bool isIENSet() { return nIENBit; }
-    bool isDEVSelect() { return ((cmdReg.drive & SELECT_DEV_BIT) == devID); }
+    bool isDEVSelect();
 
     void setComplete()
     {