CLCD: Fix some serialization bugs with the clcd controller.
authorAli Saidi <Ali.Saidi@ARM.com>
Wed, 23 Feb 2011 21:10:48 +0000 (15:10 -0600)
committerAli Saidi <Ali.Saidi@ARM.com>
Wed, 23 Feb 2011 21:10:48 +0000 (15:10 -0600)
src/dev/arm/pl111.cc

index e884d9b58f494a5001791a35628a3a95b5b85217..98d231f3bf5d3232d12f5c0397fbac6c52b47814 100644 (file)
@@ -586,6 +586,29 @@ Pl111::serialize(std::ostream &os)
     SERIALIZE_SCALAR(curAddr);
     SERIALIZE_SCALAR(waterMark);
     SERIALIZE_SCALAR(dmaPendingNum);
+
+    Tick int_event_time = 0;
+    Tick read_event_time = 0;
+    Tick fill_fifo_event_time = 0;
+
+    if (readEvent.scheduled())
+        read_event_time = readEvent.when();
+    if (fillFifoEvent.scheduled())
+        fill_fifo_event_time = fillFifoEvent.when();
+    if (intEvent.scheduled())
+        int_event_time = intEvent.when();
+
+    SERIALIZE_SCALAR(read_event_time);
+    SERIALIZE_SCALAR(fill_fifo_event_time);
+    SERIALIZE_SCALAR(int_event_time);
+
+    vector<Tick> dma_done_event_tick;
+    dma_done_event_tick.resize(maxOutstandingDma);
+    for (int x = 0; x < maxOutstandingDma; x++) {
+        dma_done_event_tick[x] = dmaDoneEvent[x].scheduled() ?
+            dmaDoneEvent[x].when() : 0;
+    }
+    arrayParamOut(os, "dma_done_event_tick", dma_done_event_tick);
 }
 
 void
@@ -667,6 +690,29 @@ Pl111::unserialize(Checkpoint *cp, const std::string &section)
     UNSERIALIZE_SCALAR(waterMark);
     UNSERIALIZE_SCALAR(dmaPendingNum);
 
+    Tick int_event_time = 0;
+    Tick read_event_time = 0;
+    Tick fill_fifo_event_time = 0;
+
+    UNSERIALIZE_SCALAR(read_event_time);
+    UNSERIALIZE_SCALAR(fill_fifo_event_time);
+    UNSERIALIZE_SCALAR(int_event_time);
+
+    if (int_event_time)
+        schedule(intEvent, int_event_time);
+    if (read_event_time)
+        schedule(readEvent, read_event_time);
+    if (fill_fifo_event_time)
+        schedule(fillFifoEvent, fill_fifo_event_time);
+
+    vector<Tick> dma_done_event_tick;
+    dma_done_event_tick.resize(maxOutstandingDma);
+    arrayParamIn(cp, section, "dma_done_event_tick", dma_done_event_tick);
+    for (int x = 0; x < maxOutstandingDma; x++) {
+        if (dma_done_event_tick[x])
+            schedule(dmaDoneEvent[x], dma_done_event_tick[x]);
+    }
+
     updateVideoParams();
     if (vncserver)
         vncserver->setDirty();