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);
     // 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
     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);
     // 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);
 }