Fixes to IDE disk to fix serialization. Now passes simple CPU serialize

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
This commit is contained in:
Andrew Schultz 2004-06-17 11:24:14 -04:00
parent d1256a2f2c
commit f3a7930fa6
2 changed files with 24 additions and 35 deletions

View file

@ -656,6 +656,7 @@ IdeController::unserialize(Checkpoint *cp, const std::string &section)
UNSERIALIZE_SCALAR(io_enabled); UNSERIALIZE_SCALAR(io_enabled);
UNSERIALIZE_SCALAR(bm_enabled); UNSERIALIZE_SCALAR(bm_enabled);
UNSERIALIZE_ARRAY(cmd_in_progress, 4); UNSERIALIZE_ARRAY(cmd_in_progress, 4);
if (pioInterface) { if (pioInterface) {
pioInterface->addAddrRange(pri_cmd_addr, pri_cmd_addr + pioInterface->addAddrRange(pri_cmd_addr, pri_cmd_addr +
pri_cmd_size - 1); pri_cmd_size - 1);

View file

@ -435,29 +435,8 @@ IdeDisk::dmaReadDone()
writeDisk(curSector++, (uint8_t *)(dataBuffer + bytesWritten)); 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 // check for the EOT
if (curPrd.getEOT()){ if (curPrd.getEOT()) {
assert(cmdBytesLeft == 0); assert(cmdBytesLeft == 0);
dmaState = Dma_Idle; dmaState = Dma_Idle;
updateState(ACT_DMA_DONE); updateState(ACT_DMA_DONE);
@ -564,14 +543,6 @@ IdeDisk::dmaWriteDone()
bytesInPage); 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 // check for the EOT
if (curPrd.getEOT()) { if (curPrd.getEOT()) {
assert(cmdBytesLeft == 0); assert(cmdBytesLeft == 0);
@ -1067,26 +1038,41 @@ IdeDisk::serialize(ostream &os)
Tick reschedule = 0; Tick reschedule = 0;
Events_t event = None; Events_t event = None;
int eventCount = 0;
if (dmaTransferEvent.scheduled()) { if (dmaTransferEvent.scheduled()) {
reschedule = dmaTransferEvent.when(); reschedule = dmaTransferEvent.when();
event = Transfer; event = Transfer;
} else if (dmaReadWaitEvent.scheduled()) { eventCount++;
}
if (dmaReadWaitEvent.scheduled()) {
reschedule = dmaReadWaitEvent.when(); reschedule = dmaReadWaitEvent.when();
event = ReadWait; event = ReadWait;
} else if (dmaWriteWaitEvent.scheduled()) { eventCount++;
}
if (dmaWriteWaitEvent.scheduled()) {
reschedule = dmaWriteWaitEvent.when(); reschedule = dmaWriteWaitEvent.when();
event = WriteWait; event = WriteWait;
} else if (dmaPrdReadEvent.scheduled()) { eventCount++;
}
if (dmaPrdReadEvent.scheduled()) {
reschedule = dmaPrdReadEvent.when(); reschedule = dmaPrdReadEvent.when();
event = PrdRead; event = PrdRead;
} else if (dmaReadEvent.scheduled()) { eventCount++;
}
if (dmaReadEvent.scheduled()) {
reschedule = dmaReadEvent.when(); reschedule = dmaReadEvent.when();
event = DmaRead; event = DmaRead;
} else if (dmaWriteEvent.scheduled()) { eventCount++;
}
if (dmaWriteEvent.scheduled()) {
reschedule = dmaWriteEvent.when(); reschedule = dmaWriteEvent.when();
event = DmaWrite; event = DmaWrite;
eventCount++;
} }
assert(eventCount <= 1);
SERIALIZE_SCALAR(reschedule); SERIALIZE_SCALAR(reschedule);
SERIALIZE_ENUM(event); SERIALIZE_ENUM(event);
@ -1098,6 +1084,7 @@ IdeDisk::serialize(ostream &os)
SERIALIZE_SCALAR(cmdReg.cyl_low); SERIALIZE_SCALAR(cmdReg.cyl_low);
SERIALIZE_SCALAR(cmdReg.cyl_high); SERIALIZE_SCALAR(cmdReg.cyl_high);
SERIALIZE_SCALAR(cmdReg.drive); SERIALIZE_SCALAR(cmdReg.drive);
SERIALIZE_SCALAR(cmdReg.command);
SERIALIZE_SCALAR(status); SERIALIZE_SCALAR(status);
SERIALIZE_SCALAR(nIENBit); SERIALIZE_SCALAR(nIENBit);
SERIALIZE_SCALAR(devID); SERIALIZE_SCALAR(devID);
@ -1150,6 +1137,7 @@ IdeDisk::unserialize(Checkpoint *cp, const string &section)
UNSERIALIZE_SCALAR(cmdReg.cyl_low); UNSERIALIZE_SCALAR(cmdReg.cyl_low);
UNSERIALIZE_SCALAR(cmdReg.cyl_high); UNSERIALIZE_SCALAR(cmdReg.cyl_high);
UNSERIALIZE_SCALAR(cmdReg.drive); UNSERIALIZE_SCALAR(cmdReg.drive);
UNSERIALIZE_SCALAR(cmdReg.command);
UNSERIALIZE_SCALAR(status); UNSERIALIZE_SCALAR(status);
UNSERIALIZE_SCALAR(nIENBit); UNSERIALIZE_SCALAR(nIENBit);
UNSERIALIZE_SCALAR(devID); UNSERIALIZE_SCALAR(devID);