The ide_ctrl serialize and unserialize were broken.
Multiple channels were saving their state under the same name. This patch separates the saved state of the primary and secondary channel.
This commit is contained in:
@@ -501,8 +501,8 @@ IdeController::serialize(std::ostream &os)
|
||||
PciDev::serialize(os);
|
||||
|
||||
// Serialize channels
|
||||
primary.serialize(os);
|
||||
secondary.serialize(os);
|
||||
primary.serialize("primary", os);
|
||||
secondary.serialize("secondary", os);
|
||||
|
||||
// Serialize config registers
|
||||
SERIALIZE_SCALAR(primaryTiming);
|
||||
@@ -515,23 +515,25 @@ IdeController::serialize(std::ostream &os)
|
||||
// Serialize internal state
|
||||
SERIALIZE_SCALAR(ioEnabled);
|
||||
SERIALIZE_SCALAR(bmEnabled);
|
||||
SERIALIZE_SCALAR(bmiAddr);
|
||||
SERIALIZE_SCALAR(bmiSize);
|
||||
}
|
||||
|
||||
void
|
||||
IdeController::Channel::serialize(std::ostream &os)
|
||||
IdeController::Channel::serialize(const std::string &base, std::ostream &os)
|
||||
{
|
||||
SERIALIZE_SCALAR(cmdAddr);
|
||||
SERIALIZE_SCALAR(cmdSize);
|
||||
SERIALIZE_SCALAR(ctrlAddr);
|
||||
SERIALIZE_SCALAR(ctrlSize);
|
||||
paramOut(os, base + ".cmdAddr", cmdAddr);
|
||||
paramOut(os, base + ".cmdSize", cmdSize);
|
||||
paramOut(os, base + ".ctrlAddr", ctrlAddr);
|
||||
paramOut(os, base + ".ctrlSize", ctrlSize);
|
||||
uint8_t command = bmiRegs.command;
|
||||
SERIALIZE_SCALAR(command);
|
||||
SERIALIZE_SCALAR(bmiRegs.reserved0);
|
||||
paramOut(os, base + ".bmiRegs.command", command);
|
||||
paramOut(os, base + ".bmiRegs.reserved0", bmiRegs.reserved0);
|
||||
uint8_t status = bmiRegs.status;
|
||||
SERIALIZE_SCALAR(status);
|
||||
SERIALIZE_SCALAR(bmiRegs.reserved1);
|
||||
SERIALIZE_SCALAR(bmiRegs.bmidtp);
|
||||
SERIALIZE_SCALAR(selectBit);
|
||||
paramOut(os, base + ".bmiRegs.status", status);
|
||||
paramOut(os, base + ".bmiRegs.reserved1", bmiRegs.reserved1);
|
||||
paramOut(os, base + ".bmiRegs.bmidtp", bmiRegs.bmidtp);
|
||||
paramOut(os, base + ".selectBit", selectBit);
|
||||
}
|
||||
|
||||
void
|
||||
@@ -541,8 +543,8 @@ IdeController::unserialize(Checkpoint *cp, const std::string §ion)
|
||||
PciDev::unserialize(cp, section);
|
||||
|
||||
// Unserialize channels
|
||||
primary.unserialize(cp, section);
|
||||
secondary.unserialize(cp, section);
|
||||
primary.unserialize("primary", cp, section);
|
||||
secondary.unserialize("secondary", cp, section);
|
||||
|
||||
// Unserialize config registers
|
||||
UNSERIALIZE_SCALAR(primaryTiming);
|
||||
@@ -555,26 +557,28 @@ IdeController::unserialize(Checkpoint *cp, const std::string §ion)
|
||||
// Unserialize internal state
|
||||
UNSERIALIZE_SCALAR(ioEnabled);
|
||||
UNSERIALIZE_SCALAR(bmEnabled);
|
||||
UNSERIALIZE_SCALAR(bmiAddr);
|
||||
UNSERIALIZE_SCALAR(bmiSize);
|
||||
}
|
||||
|
||||
void
|
||||
IdeController::Channel::unserialize(
|
||||
Checkpoint *cp, const std::string §ion)
|
||||
IdeController::Channel::unserialize(const std::string &base, Checkpoint *cp,
|
||||
const std::string §ion)
|
||||
{
|
||||
UNSERIALIZE_SCALAR(cmdAddr);
|
||||
UNSERIALIZE_SCALAR(cmdSize);
|
||||
UNSERIALIZE_SCALAR(ctrlAddr);
|
||||
UNSERIALIZE_SCALAR(ctrlSize);
|
||||
paramIn(cp, section, base + ".cmdAddr", cmdAddr);
|
||||
paramIn(cp, section, base + ".cmdSize", cmdSize);
|
||||
paramIn(cp, section, base + ".ctrlAddr", ctrlAddr);
|
||||
paramIn(cp, section, base + ".ctrlSize", ctrlSize);
|
||||
uint8_t command;
|
||||
UNSERIALIZE_SCALAR(command);
|
||||
paramIn(cp, section, base +".bmiRegs.command", command);
|
||||
bmiRegs.command = command;
|
||||
UNSERIALIZE_SCALAR(bmiRegs.reserved0);
|
||||
paramIn(cp, section, base + ".bmiRegs.reserved0", bmiRegs.reserved0);
|
||||
uint8_t status;
|
||||
UNSERIALIZE_SCALAR(status);
|
||||
paramIn(cp, section, base + ".bmiRegs.status", status);
|
||||
bmiRegs.status = status;
|
||||
UNSERIALIZE_SCALAR(bmiRegs.reserved1);
|
||||
UNSERIALIZE_SCALAR(bmiRegs.bmidtp);
|
||||
UNSERIALIZE_SCALAR(selectBit);
|
||||
paramIn(cp, section, base + ".bmiRegs.reserved1", bmiRegs.reserved1);
|
||||
paramIn(cp, section, base + ".bmiRegs.bmidtp", bmiRegs.bmidtp);
|
||||
paramIn(cp, section, base + ".selectBit", selectBit);
|
||||
select(selectBit);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user