Merge zizzer.eecs.umich.edu:/m5/Bitkeeper/m5
[gem5.git] / dev / tsunami_pchip.cc
index aced6f940a332cf61c40c71b3998c6bff5336c01..b0a4c4d95eff84519adc3c9700ef3e26d956e524 100644 (file)
 
 using namespace std;
 
-TsunamiPChip::TsunamiPChip(const string &name, /*Tsunami *t,*/
-                       Addr addr, Addr mask, MemoryController *mmu)
-    : MmapDevice(name, addr, mask, mmu)/*, tsunami(t) */
+TsunamiPChip::TsunamiPChip(const string &name, Tsunami *t, Addr a,
+                           MemoryController *mmu)
+    : FunctionalMemory(name), addr(a), tsunami(t)
 {
+    mmu->add_child(this, Range<Addr>(addr, addr + size));
+
     wsba0 = 0;
     wsba1 = 0;
     wsba2 = 0;
@@ -40,15 +42,17 @@ TsunamiPChip::TsunamiPChip(const string &name, /*Tsunami *t,*/
     tba2 = 0;
     tba3 = 0;
 
+    //Set back pointer in tsunami
+    tsunami->pchip = this;
 }
 
 Fault
-TsunamiPChip::read(MemReqPtr req, uint8_t *data)
+TsunamiPChip::read(MemReqPtr &req, uint8_t *data)
 {
     DPRINTF(Tsunami, "read  va=%#x size=%d\n",
             req->vaddr, req->size);
 
-    Addr daddr = (req->paddr & addr_mask) >> 6;
+    Addr daddr = (req->paddr - (addr & PA_IMPL_MASK)) >> 6;
 //    ExecContext *xc = req->xc;
 //    int cpuid = xc->cpu_id;
 
@@ -133,12 +137,12 @@ TsunamiPChip::read(MemReqPtr req, uint8_t *data)
 }
 
 Fault
-TsunamiPChip::write(MemReqPtr req, const uint8_t *data)
+TsunamiPChip::write(MemReqPtr &req, const uint8_t *data)
 {
     DPRINTF(Tsunami, "write - va=%#x size=%d \n",
             req->vaddr, req->size);
 
-    Addr daddr = (req->paddr & addr_mask) >> 6;
+    Addr daddr = (req->paddr - (addr & PA_IMPL_MASK)) >> 6;
 
     switch (req->size) {
 
@@ -223,36 +227,58 @@ TsunamiPChip::write(MemReqPtr req, const uint8_t *data)
 void
 TsunamiPChip::serialize(std::ostream &os)
 {
-    // code should be written
+    SERIALIZE_SCALAR(wsba0);
+    SERIALIZE_SCALAR(wsba1);
+    SERIALIZE_SCALAR(wsba2);
+    SERIALIZE_SCALAR(wsba3);
+    SERIALIZE_SCALAR(wsm0);
+    SERIALIZE_SCALAR(wsm1);
+    SERIALIZE_SCALAR(wsm2);
+    SERIALIZE_SCALAR(wsm3);
+    SERIALIZE_SCALAR(tba0);
+    SERIALIZE_SCALAR(tba1);
+    SERIALIZE_SCALAR(tba2);
+    SERIALIZE_SCALAR(tba3);
+
 }
 
 void
 TsunamiPChip::unserialize(Checkpoint *cp, const std::string &section)
 {
-    //code should be written
+    UNSERIALIZE_SCALAR(wsba0);
+    UNSERIALIZE_SCALAR(wsba1);
+    UNSERIALIZE_SCALAR(wsba2);
+    UNSERIALIZE_SCALAR(wsba3);
+    UNSERIALIZE_SCALAR(wsm0);
+    UNSERIALIZE_SCALAR(wsm1);
+    UNSERIALIZE_SCALAR(wsm2);
+    UNSERIALIZE_SCALAR(wsm3);
+    UNSERIALIZE_SCALAR(tba0);
+    UNSERIALIZE_SCALAR(tba1);
+    UNSERIALIZE_SCALAR(tba2);
+    UNSERIALIZE_SCALAR(tba3);
+
 }
 
 BEGIN_DECLARE_SIM_OBJECT_PARAMS(TsunamiPChip)
 
-/*    SimObjectParam<Tsunami *> tsunami;*/
+    SimObjectParam<Tsunami *> tsunami;
     SimObjectParam<MemoryController *> mmu;
     Param<Addr> addr;
-    Param<Addr> mask;
 
 END_DECLARE_SIM_OBJECT_PARAMS(TsunamiPChip)
 
 BEGIN_INIT_SIM_OBJECT_PARAMS(TsunamiPChip)
 
-    /*INIT_PARAM(tsunami, "Tsunami"),*/
+    INIT_PARAM(tsunami, "Tsunami"),
     INIT_PARAM(mmu, "Memory Controller"),
-    INIT_PARAM(addr, "Device Address"),
-    INIT_PARAM(mask, "Address Mask")
+    INIT_PARAM(addr, "Device Address")
 
 END_INIT_SIM_OBJECT_PARAMS(TsunamiPChip)
 
 CREATE_SIM_OBJECT(TsunamiPChip)
 {
-    return new TsunamiPChip(getInstanceName(), /*tsunami,*/ addr, mask, mmu);
+    return new TsunamiPChip(getInstanceName(), tsunami, addr, mmu);
 }
 
 REGISTER_SIM_OBJECT("TsunamiPChip", TsunamiPChip)