summaryrefslogtreecommitdiff
path: root/src/cpu/inorder/cpu.cc
diff options
context:
space:
mode:
authorKorey Sewell <ksewell@umich.edu>2011-06-19 21:43:38 -0400
committerKorey Sewell <ksewell@umich.edu>2011-06-19 21:43:38 -0400
commitdb8b1e4b78b7f51b673f80d4f2a1e5f5c86d4446 (patch)
treeca55fe420ad974c39432eab352147f52c23e7f48 /src/cpu/inorder/cpu.cc
parentc95fe261abab85bee247737a3d171378689891e0 (diff)
downloadgem5-db8b1e4b78b7f51b673f80d4f2a1e5f5c86d4446.tar.xz
inorder: treat SE mode syscalls as a trapping instruction
define a syscallContext to schedule the syscall and then use syscall() to actually perform the action
Diffstat (limited to 'src/cpu/inorder/cpu.cc')
-rw-r--r--src/cpu/inorder/cpu.cc21
1 files changed, 12 insertions, 9 deletions
diff --git a/src/cpu/inorder/cpu.cc b/src/cpu/inorder/cpu.cc
index 7ef48608a..a634535bc 100644
--- a/src/cpu/inorder/cpu.cc
+++ b/src/cpu/inorder/cpu.cc
@@ -105,7 +105,7 @@ std::string InOrderCPU::eventNames[NumCPUEvents] =
"HaltThread",
"SuspendThread",
"Trap",
- "InstGraduated",
+ "Syscall",
"SquashFromMemStall",
"UpdatePCs"
};
@@ -151,6 +151,11 @@ InOrderCPU::CPUEvent::process()
cpu->resPool->trap(fault, tid, inst);
break;
+ case Syscall:
+ cpu->syscall(inst->syscallNum, tid);
+ cpu->resPool->trap(fault, tid, inst);
+ break;
+
default:
fatal("Unrecognized Event Type %s", eventNames[cpuEventType]);
}
@@ -1068,9 +1073,6 @@ InOrderCPU::activateNextReadyContext(int delay)
{
DPRINTF(InOrderCPU,"Activating next ready thread\n");
- // NOTE: Add 5 to the event priority so that we always activate
- // threads after we've finished deactivating, squashing,etc.
- // other threads
scheduleCpuEvent(ActivateNextReadyThread, NoFault, 0/*tid*/, dummyInst[0],
delay, ActivateNextReadyThread_Pri);
@@ -1382,11 +1384,6 @@ InOrderCPU::instDone(DynInstPtr inst, ThreadID tid)
// Check for instruction-count-based events.
comInstEventQueue[tid]->serviceEvents(thread[tid]->numInst);
- // Broadcast to other resources an instruction
- // has been completed
- resPool->scheduleEvent((CPUEventType)ResourcePool::InstGraduated, inst,
- 0, 0, tid);
-
// Finally, remove instruction from CPU
removeInst(inst);
}
@@ -1601,6 +1598,12 @@ InOrderCPU::wakeup()
#if !FULL_SYSTEM
void
+InOrderCPU::syscallContext(Fault fault, ThreadID tid, DynInstPtr inst, int delay)
+{
+ scheduleCpuEvent(Syscall, fault, tid, inst, delay, Syscall_Pri);
+}
+
+void
InOrderCPU::syscall(int64_t callnum, ThreadID tid)
{
DPRINTF(InOrderCPU, "[tid:%i] Executing syscall().\n\n", tid);