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:
parent
d1256a2f2c
commit
f3a7930fa6
2 changed files with 24 additions and 35 deletions
|
@ -656,6 +656,7 @@ IdeController::unserialize(Checkpoint *cp, const std::string §ion)
|
||||||
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);
|
||||||
|
|
|
@ -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 §ion)
|
||||||
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);
|
||||||
|
|
Loading…
Reference in a new issue