summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--dev/ide_ctrl.cc16
-rw-r--r--dev/ide_ctrl.hh4
-rw-r--r--dev/ide_disk.cc6
-rw-r--r--dev/ide_disk.hh2
4 files changed, 27 insertions, 1 deletions
diff --git a/dev/ide_ctrl.cc b/dev/ide_ctrl.cc
index 46a0e8179..4805570d2 100644
--- a/dev/ide_ctrl.cc
+++ b/dev/ide_ctrl.cc
@@ -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
////
diff --git a/dev/ide_ctrl.hh b/dev/ide_ctrl.hh
index 679c7422b..39c64eb30 100644
--- a/dev/ide_ctrl.hh
+++ b/dev/ide_ctrl.hh
@@ -145,6 +145,10 @@ class IdeController : public PciDev
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.
* @param name The name of this controller.
diff --git a/dev/ide_disk.cc b/dev/ide_disk.cc
index 0f5c02660..ee21feaea 100644
--- a/dev/ide_disk.cc
+++ b/dev/ide_disk.cc
@@ -167,6 +167,12 @@ IdeDisk::reset(int id)
// Utility functions
////
+bool
+IdeDisk::isDEVSelect()
+{
+ return ctrl->isDiskSelected(this);
+}
+
Addr
IdeDisk::pciToDma(Addr pciAddr)
{
diff --git a/dev/ide_disk.hh b/dev/ide_disk.hh
index 409aaef9a..9c6eea623 100644
--- a/dev/ide_disk.hh
+++ b/dev/ide_disk.hh
@@ -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()
{