Fixes to IDE disk to fix serialization. Now passes simple CPU serialize
authorAndrew Schultz <alschult@umich.edu>
Thu, 17 Jun 2004 15:24:14 +0000 (11:24 -0400)
committerAndrew Schultz <alschult@umich.edu>
Thu, 17 Jun 2004 15:24:14 +0000 (11:24 -0400)
tests

dev/ide_ctrl.cc:
    Formatting
dev/ide_disk.cc:
    Remove some junk, add an assert to serialize, and add missing serialize
    for command register.

--HG--
extra : convert_revision : 8f99857e32f278dd4e6f23deffc8047c6411d5b2

dev/ide_ctrl.cc
dev/ide_disk.cc

index 7ef5fe8e44987de1c3aecb27bc76e97b0d35c91f..46a0e817933c9917b1c83bbab4a173ea1188a841 100644 (file)
@@ -656,6 +656,7 @@ IdeController::unserialize(Checkpoint *cp, const std::string &section)
     UNSERIALIZE_SCALAR(io_enabled);
     UNSERIALIZE_SCALAR(bm_enabled);
     UNSERIALIZE_ARRAY(cmd_in_progress, 4);
+
     if (pioInterface) {
         pioInterface->addAddrRange(pri_cmd_addr, pri_cmd_addr +
                                    pri_cmd_size - 1);
index df365bab99540928d09b1cd6ebed43a87001feeb..0f5c02660b1212f7bdfc2b1b04d4e5471b788dbc 100644 (file)
@@ -435,29 +435,8 @@ IdeDisk::dmaReadDone()
         writeDisk(curSector++, (uint8_t *)(dataBuffer + bytesWritten));
     }
 
-#if 0
-    // actually copy the data from memory to data buffer
-    Addr dmaAddr =
-        ctrl->tsunami->pchip->translatePciToDma(curPrd.getBaseAddr());
-    memcpy((void *)dataBuffer,
-           physmem->dma_addr(dmaAddr, curPrd.getByteCount()),
-           curPrd.getByteCount());
-
-    uint32_t bytesWritten = 0;
-
-    while (bytesWritten < curPrd.getByteCount()) {
-        if (cmdBytesLeft <= 0)
-            panic("DMA data is larger than # sectors specified\n");
-
-        writeDisk(curSector++, (uint8_t *)(dataBuffer + bytesWritten));
-
-        bytesWritten += SectorSize;
-        cmdBytesLeft -= SectorSize;
-    }
-#endif
-
     // check for the EOT
-    if (curPrd.getEOT()){
+    if (curPrd.getEOT()) {
         assert(cmdBytesLeft == 0);
         dmaState = Dma_Idle;
         updateState(ACT_DMA_DONE);
@@ -564,14 +543,6 @@ IdeDisk::dmaWriteDone()
                bytesInPage);
     }
 
-#if 0
-    Addr dmaAddr = ctrl->tsunami->pchip->
-        translatePciToDma(curPrd.getBaseAddr());
-
-    memcpy(physmem->dma_addr(dmaAddr, curPrd.getByteCount()),
-           (void *)dataBuffer, curPrd.getByteCount());
-#endif
-
     // check for the EOT
     if (curPrd.getEOT()) {
         assert(cmdBytesLeft == 0);
@@ -1067,26 +1038,41 @@ IdeDisk::serialize(ostream &os)
     Tick reschedule = 0;
     Events_t event = None;
 
+    int eventCount = 0;
+
     if (dmaTransferEvent.scheduled()) {
         reschedule = dmaTransferEvent.when();
         event = Transfer;
-    } else if (dmaReadWaitEvent.scheduled()) {
+        eventCount++;
+    }
+    if (dmaReadWaitEvent.scheduled()) {
         reschedule = dmaReadWaitEvent.when();
         event = ReadWait;
-    } else if (dmaWriteWaitEvent.scheduled()) {
+        eventCount++;
+    }
+    if (dmaWriteWaitEvent.scheduled()) {
         reschedule = dmaWriteWaitEvent.when();
         event = WriteWait;
-    } else if (dmaPrdReadEvent.scheduled()) {
+        eventCount++;
+    }
+    if (dmaPrdReadEvent.scheduled()) {
         reschedule = dmaPrdReadEvent.when();
         event = PrdRead;
-    } else if (dmaReadEvent.scheduled()) {
+        eventCount++;
+    }
+    if (dmaReadEvent.scheduled()) {
         reschedule = dmaReadEvent.when();
         event = DmaRead;
-    } else if (dmaWriteEvent.scheduled()) {
+        eventCount++;
+    }
+    if (dmaWriteEvent.scheduled()) {
         reschedule = dmaWriteEvent.when();
         event = DmaWrite;
+        eventCount++;
     }
 
+    assert(eventCount <= 1);
+
     SERIALIZE_SCALAR(reschedule);
     SERIALIZE_ENUM(event);
 
@@ -1098,6 +1084,7 @@ IdeDisk::serialize(ostream &os)
     SERIALIZE_SCALAR(cmdReg.cyl_low);
     SERIALIZE_SCALAR(cmdReg.cyl_high);
     SERIALIZE_SCALAR(cmdReg.drive);
+    SERIALIZE_SCALAR(cmdReg.command);
     SERIALIZE_SCALAR(status);
     SERIALIZE_SCALAR(nIENBit);
     SERIALIZE_SCALAR(devID);
@@ -1150,6 +1137,7 @@ IdeDisk::unserialize(Checkpoint *cp, const string &section)
     UNSERIALIZE_SCALAR(cmdReg.cyl_low);
     UNSERIALIZE_SCALAR(cmdReg.cyl_high);
     UNSERIALIZE_SCALAR(cmdReg.drive);
+    UNSERIALIZE_SCALAR(cmdReg.command);
     UNSERIALIZE_SCALAR(status);
     UNSERIALIZE_SCALAR(nIENBit);
     UNSERIALIZE_SCALAR(devID);