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:
Author Name
2008-12-14 23:29:49 -08:00
parent dae531c049
commit 13f7fdcf67
2 changed files with 37 additions and 30 deletions

View File

@@ -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 &section)
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 &section)
// Unserialize internal state
UNSERIALIZE_SCALAR(ioEnabled);
UNSERIALIZE_SCALAR(bmEnabled);
UNSERIALIZE_SCALAR(bmiAddr);
UNSERIALIZE_SCALAR(bmiSize);
}
void
IdeController::Channel::unserialize(
Checkpoint *cp, const std::string &section)
IdeController::Channel::unserialize(const std::string &base, Checkpoint *cp,
const std::string &section)
{
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);
}

View File

@@ -111,10 +111,13 @@ class IdeController : public PciDev
Channel(std::string newName, Addr _cmdSize, Addr _ctrlSize);
~Channel();
void serialize(std::ostream &os);
void unserialize(Checkpoint *cp, const std::string &section);
void serialize(const std::string &base, std::ostream &os);
void unserialize(const std::string &base, Checkpoint *cp,
const std::string &section);
};
} primary, secondary;
Channel primary;
Channel secondary;
/** Bus master interface (BMI) registers */
Addr bmiAddr, bmiSize;