diff options
author | Gabe Black <gblack@eecs.umich.edu> | 2007-02-28 16:39:42 +0000 |
---|---|---|
committer | Gabe Black <gblack@eecs.umich.edu> | 2007-02-28 16:39:42 +0000 |
commit | eb57b4f2141a19aff0a27db27cbb0892eef79960 (patch) | |
tree | 271cfcd78e514f4b242ccc98c37911cd135354c0 /src/arch/sparc/faults.cc | |
parent | a86ad3a512205f05f84d7011f442fb5dc41210d7 (diff) | |
parent | 29e5df890d9512a6a2c726dcb4ee46b92ac4cb22 (diff) | |
download | gem5-eb57b4f2141a19aff0a27db27cbb0892eef79960.tar.xz |
Merge zizzer.eecs.umich.edu:/bk/newmem
into ahchoo.blinky.homelinux.org:/home/gblack/m5/newmem-sparc32
--HG--
extra : convert_revision : 88d1401f6e6b7c82344abef2c81b3c22bf6a0499
Diffstat (limited to 'src/arch/sparc/faults.cc')
-rw-r--r-- | src/arch/sparc/faults.cc | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/src/arch/sparc/faults.cc b/src/arch/sparc/faults.cc index a6f4343ae..391dd7134 100644 --- a/src/arch/sparc/faults.cc +++ b/src/arch/sparc/faults.cc @@ -656,6 +656,26 @@ void FillNNormal::invoke(ThreadContext *tc) tc->setNextNPC(fillStart + 2*sizeof(MachInst)); } +void TrapInstruction::invoke(ThreadContext *tc) +{ + //In SE, this mechanism is how the process requests a service from the + //operating system. We'll get the process object from the thread context + //and let it service the request. + + Process *p = tc->getProcessPtr(); + + SparcLiveProcess *lp = dynamic_cast<SparcLiveProcess *>(p); + assert(lp); + + lp->handleTrap(_n, tc); + + //We need to explicitly advance the pc, since that's not done for us + //on a faulting instruction + tc->setPC(tc->readNextPC()); + tc->setNextPC(tc->readNextNPC()); + tc->setNextNPC(tc->readNextNPC() + sizeof(MachInst)); +} + void PageTableFault::invoke(ThreadContext *tc) { Process *p = tc->getProcessPtr(); |