cpu: Use new InstRecord faulting flag in cpu models
This patch sets the faulting flag in atomic, timing, minor and o3 CPU models. It also fixes the minor/timing CPU models which were not respecting the ExecFaulting flag. This is now checked before calling dump() on the tracing object, to bring it in line with the other CPU models. Change-Id: I9c7b64cc5605596eb7fcf25fdecaeac5c4b5e3d7 Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/30135 Reviewed-by: Jason Lowe-Power <power.jg@gmail.com> Maintainer: Jason Lowe-Power <power.jg@gmail.com> Tested-by: kokoro <noreply+kokoro@google.com>
This commit is contained in:
committed by
Giacomo Travaglini
parent
3853d78594
commit
3fb1d091f5
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2013-2014,2018-2019 ARM Limited
|
||||
* Copyright (c) 2013-2014,2018-2020 ARM Limited
|
||||
* All rights reserved
|
||||
*
|
||||
* The license below extends only to copyright in the software and shall
|
||||
@@ -48,6 +48,7 @@
|
||||
#include "debug/Activity.hh"
|
||||
#include "debug/Branch.hh"
|
||||
#include "debug/Drain.hh"
|
||||
#include "debug/ExecFaulting.hh"
|
||||
#include "debug/MinorExecute.hh"
|
||||
#include "debug/MinorInterrupt.hh"
|
||||
#include "debug/MinorMem.hh"
|
||||
@@ -978,6 +979,15 @@ Execute::commitInst(MinorDynInstPtr inst, bool early_memory_issue,
|
||||
committed = true;
|
||||
|
||||
if (fault != NoFault) {
|
||||
if (inst->traceData) {
|
||||
if (DTRACE(ExecFaulting)) {
|
||||
inst->traceData->setFaulting(true);
|
||||
} else {
|
||||
delete inst->traceData;
|
||||
inst->traceData = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
DPRINTF(MinorExecute, "Fault in execute of inst: %s fault: %s\n",
|
||||
*inst, fault->name());
|
||||
fault->invoke(thread, inst->staticInst);
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* Copyright 2014 Google, Inc.
|
||||
* Copyright (c) 2010-2014, 2017 ARM Limited
|
||||
* Copyright (c) 2010-2014, 2017, 2020 ARM Limited
|
||||
* All rights reserved
|
||||
*
|
||||
* The license below extends only to copyright in the software and shall
|
||||
@@ -1260,6 +1260,7 @@ DefaultCommit<Impl>::commitHead(const DynInstPtr &head_inst, unsigned inst_num)
|
||||
tid, head_inst->seqNum);
|
||||
if (head_inst->traceData) {
|
||||
if (DTRACE(ExecFaulting)) {
|
||||
head_inst->traceData->setFaulting(true);
|
||||
head_inst->traceData->setFetchSeq(head_inst->seqNum);
|
||||
head_inst->traceData->setCPSeq(thread[tid]->numOp);
|
||||
head_inst->traceData->dump();
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* Copyright 2014 Google, Inc.
|
||||
* Copyright (c) 2012-2013,2015,2017-2019 ARM Limited
|
||||
* Copyright (c) 2012-2013,2015,2017-2020 ARM Limited
|
||||
* All rights reserved.
|
||||
*
|
||||
* The license below extends only to copyright in the software and shall
|
||||
@@ -713,10 +713,8 @@ AtomicSimpleCPU::tick()
|
||||
if (fault == NoFault) {
|
||||
countInst();
|
||||
ppCommit->notify(std::make_pair(thread, curStaticInst));
|
||||
}
|
||||
else if (traceData && !DTRACE(ExecFaulting)) {
|
||||
delete traceData;
|
||||
traceData = NULL;
|
||||
} else if (traceData) {
|
||||
traceFault();
|
||||
}
|
||||
|
||||
if (fault != NoFault &&
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2010-2012, 2015, 2017, 2018 ARM Limited
|
||||
* Copyright (c) 2010-2012, 2015, 2017, 2018, 2020 ARM Limited
|
||||
* Copyright (c) 2013 Advanced Micro Devices, Inc.
|
||||
* All rights reserved
|
||||
*
|
||||
@@ -64,6 +64,7 @@
|
||||
#include "cpu/static_inst.hh"
|
||||
#include "cpu/thread_context.hh"
|
||||
#include "debug/Decode.hh"
|
||||
#include "debug/ExecFaulting.hh"
|
||||
#include "debug/Fetch.hh"
|
||||
#include "debug/Quiesce.hh"
|
||||
#include "mem/packet.hh"
|
||||
@@ -432,6 +433,17 @@ BaseSimpleCPU::wakeup(ThreadID tid)
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
BaseSimpleCPU::traceFault()
|
||||
{
|
||||
if (DTRACE(ExecFaulting)) {
|
||||
traceData->setFaulting(true);
|
||||
} else {
|
||||
delete traceData;
|
||||
traceData = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
BaseSimpleCPU::checkForInterrupts()
|
||||
{
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2011-2012,2015,2018 ARM Limited
|
||||
* Copyright (c) 2011-2012,2015,2018,2020 ARM Limited
|
||||
* Copyright (c) 2013 Advanced Micro Devices, Inc.
|
||||
* All rights reserved
|
||||
*
|
||||
@@ -120,6 +120,14 @@ class BaseSimpleCPU : public BaseCPU
|
||||
|
||||
Status _status;
|
||||
|
||||
/**
|
||||
* Handler used when encountering a fault; its purpose is to
|
||||
* tear down the InstRecord. If a fault is meant to be traced,
|
||||
* the handler won't delete the record and it will annotate
|
||||
* the record as coming from a faulting instruction.
|
||||
*/
|
||||
void traceFault();
|
||||
|
||||
public:
|
||||
void checkForInterrupts();
|
||||
void setupFetchRequest(const RequestPtr &req);
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* Copyright 2014 Google, Inc.
|
||||
* Copyright (c) 2010-2013,2015,2017-2018 ARM Limited
|
||||
* Copyright (c) 2010-2013,2015,2017-2018, 2020 ARM Limited
|
||||
* All rights reserved
|
||||
*
|
||||
* The license below extends only to copyright in the software and shall
|
||||
@@ -363,10 +363,8 @@ TimingSimpleCPU::translationFault(const Fault &fault)
|
||||
updateCycleCounts();
|
||||
updateCycleCounters(BaseCPU::CPU_STATE_ON);
|
||||
|
||||
if (traceData) {
|
||||
// Since there was a fault, we shouldn't trace this instruction.
|
||||
delete traceData;
|
||||
traceData = NULL;
|
||||
if ((fault != NoFault) && traceData) {
|
||||
traceFault();
|
||||
}
|
||||
|
||||
postExecute();
|
||||
@@ -794,9 +792,7 @@ TimingSimpleCPU::completeIfetch(PacketPtr pkt)
|
||||
// ifetch
|
||||
if (_status == BaseSimpleCPU::Running) {
|
||||
if (fault != NoFault && traceData) {
|
||||
// If there was a fault, we shouldn't trace this instruction.
|
||||
delete traceData;
|
||||
traceData = NULL;
|
||||
traceFault();
|
||||
}
|
||||
|
||||
postExecute();
|
||||
@@ -813,9 +809,8 @@ TimingSimpleCPU::completeIfetch(PacketPtr pkt)
|
||||
// keep an instruction count
|
||||
if (fault == NoFault)
|
||||
countInst();
|
||||
else if (traceData && !DTRACE(ExecFaulting)) {
|
||||
delete traceData;
|
||||
traceData = NULL;
|
||||
else if (traceData) {
|
||||
traceFault();
|
||||
}
|
||||
|
||||
postExecute();
|
||||
@@ -913,9 +908,7 @@ TimingSimpleCPU::completeDataAccess(PacketPtr pkt)
|
||||
if (fault == NoFault)
|
||||
countInst();
|
||||
else if (traceData) {
|
||||
// If there was a fault, we shouldn't trace this instruction.
|
||||
delete traceData;
|
||||
traceData = NULL;
|
||||
traceFault();
|
||||
}
|
||||
|
||||
delete pkt;
|
||||
|
||||
Reference in New Issue
Block a user