changeset 2e9141200f78 in /z/repo/gem5
details: http://repo.gem5.org/gem5?cmd=changeset;node=2e9141200f78
description:
inorder: explicit fault check
Before graduating an instruction, explicitly check fault
by making the fault check it's own separate command
that can be put on an instruction schedule.
diffstat:
src/cpu/inorder/cpu.cc | 4 +++-
src/cpu/inorder/resources/graduation_unit.cc | 28 ++++++++++++++++++----------
src/cpu/inorder/resources/graduation_unit.hh | 1 +
3 files changed, 22 insertions(+), 11 deletions(-)
diffs (77 lines):
diff -r 8d26dc2d92b2 -r 2e9141200f78 src/cpu/inorder/cpu.cc
--- a/src/cpu/inorder/cpu.cc Sun Jun 19 21:43:39 2011 -0400
+++ b/src/cpu/inorder/cpu.cc Sun Jun 19 21:43:40 2011 -0400
@@ -517,7 +517,7 @@
}
}
- W.needs(Grad, GraduationUnit::GraduateInst);
+ W.needs(Grad, GraduationUnit::CheckFault);
for (int idx=0; idx < inst->numDestRegs(); idx++) {
W.needs(RegManager, UseDefUnit::WriteDestReg, idx);
@@ -526,6 +526,8 @@
if (inst->isControl())
W.needs(BPred, BranchPredictor::UpdatePredictor);
+ W.needs(Grad, GraduationUnit::GraduateInst);
+
// Insert Back Schedule into our cache of
// resource schedules
addToSkedCache(inst, res_sked);
diff -r 8d26dc2d92b2 -r 2e9141200f78
src/cpu/inorder/resources/graduation_unit.cc
--- a/src/cpu/inorder/resources/graduation_unit.cc Sun Jun 19 21:43:39
2011 -0400
+++ b/src/cpu/inorder/resources/graduation_unit.cc Sun Jun 19 21:43:40
2011 -0400
@@ -56,6 +56,24 @@
switch (grad_req->cmd)
{
+ case CheckFault:
+ {
+ // Handle Any Faults Before Graduating Instruction
+ if (inst->fault != NoFault) {
+ DPRINTF(InOrderGraduation, "[tid:%i]: [sn:%i]: fault %s found
for %s\n",
+ tid, inst->seqNum, inst->fault->name(),
+ inst->instName());
+ squashThenTrap(stage_num, inst);
+ grad_req->done(false);
+ return;
+ }
+
+ DPRINTF(InOrderGraduation, "[tid:%i] [sn:%i]: No fault found for
%s\n",
+ tid, inst->seqNum, inst->instName());
+ grad_req->done();
+ }
+ break;
+
case GraduateInst:
{
if (lastNonSpecTick == curTick()) {
@@ -65,16 +83,6 @@
return;
}
- // Handle Any Faults Before Graduating Instruction
- if (inst->fault != NoFault) {
- DPRINTF(Fault, "[sn:%i]: fault %s found for %s\n",
- inst->seqNum, inst->fault->name(),
- inst->instName());
- squashThenTrap(stage_num, inst);
- grad_req->done(false);
- return;
- }
-
DPRINTF(InOrderGraduation,
"[tid:%i]:[sn:%i]: Graduating instruction %s.\n",
tid, inst->seqNum,
inst->staticInst->disassemble(inst->instAddr()));
diff -r 8d26dc2d92b2 -r 2e9141200f78
src/cpu/inorder/resources/graduation_unit.hh
--- a/src/cpu/inorder/resources/graduation_unit.hh Sun Jun 19 21:43:39
2011 -0400
+++ b/src/cpu/inorder/resources/graduation_unit.hh Sun Jun 19 21:43:40
2011 -0400
@@ -46,6 +46,7 @@
typedef ThePipeline::DynInstPtr DynInstPtr;
enum Command {
+ CheckFault,
GraduateInst
};
_______________________________________________
gem5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/gem5-dev