inorder: se: squash after syscalls
authorKorey Sewell <ksewell@umich.edu>
Mon, 20 Jun 2011 01:43:42 +0000 (21:43 -0400)
committerKorey Sewell <ksewell@umich.edu>
Mon, 20 Jun 2011 01:43:42 +0000 (21:43 -0400)
src/cpu/inorder/cpu.cc
src/cpu/inorder/inorder_dyn_inst.hh

index fbd4a60689785d7e74bb828cfcf7a1f982c0e257..d8552d9d30d5bd887724a34b04f39badca3d1955 100644 (file)
@@ -1713,7 +1713,16 @@ InOrderCPU::wakeup()
 void
 InOrderCPU::syscallContext(Fault fault, ThreadID tid, DynInstPtr inst, int delay)
 {
-    //@todo: squash behind syscall
+    // Syscall must be non-speculative, so squash from last stage
+    unsigned squash_stage = NumStages - 1;
+    inst->setSquashInfo(squash_stage);
+
+    // Squash In Pipeline Stage
+    pipelineStage[squash_stage]->setupSquash(inst, tid);
+
+    // Schedule Squash Through-out Resource Pool
+    resPool->scheduleEvent(
+        (InOrderCPU::CPUEventType)ResourcePool::SquashAll, inst, 0);
     scheduleCpuEvent(Syscall, fault, tid, inst, delay, Syscall_Pri);
 }
 
index b655de380b2418da361ad13c8775c2fc3abfb021..c2d37d716feacdd1ab77c5ad3a3740fa1e947c61 100644 (file)
@@ -867,7 +867,7 @@ class InOrderDynInst : public FastAlloc, public RefCounted
     void setFloatSrc(int idx, FloatReg val);
     void setFloatRegBitsSrc(int idx, TheISA::FloatRegBits val);
 
-    uint64_t* getIntSrcPtr(int idx) { return &instSrc[idx].intVal; }
+    TheISA::IntReg* getIntSrcPtr(int idx) { return &instSrc[idx].intVal; }
     uint64_t readIntSrc(int idx) { return instSrc[idx].intVal; }
 
     /** These Instructions read a integer/float/misc. source register