ARM: Move PC mode bits around so they can be used for exectrace
This commit is contained in:
parent
aec73ba6af
commit
5e6d28996a
3 changed files with 17 additions and 12 deletions
|
@ -121,6 +121,13 @@ namespace ArmISA
|
||||||
|
|
||||||
// Memory accesses cannot be unaligned
|
// Memory accesses cannot be unaligned
|
||||||
const bool HasUnalignedMemAcc = false;
|
const bool HasUnalignedMemAcc = false;
|
||||||
|
|
||||||
|
// These otherwise unused bits of the PC are used to select a mode
|
||||||
|
// like the J and T bits of the CPSR.
|
||||||
|
static const Addr PcJBitShift = 33;
|
||||||
|
static const Addr PcTBitShift = 34;
|
||||||
|
static const Addr PcModeMask = (ULL(1) << PcJBitShift) |
|
||||||
|
(ULL(1) << PcTBitShift);
|
||||||
};
|
};
|
||||||
|
|
||||||
using namespace ArmISA;
|
using namespace ArmISA;
|
||||||
|
|
|
@ -201,13 +201,6 @@ namespace ArmISA
|
||||||
// integer register to allow renaming.
|
// integer register to allow renaming.
|
||||||
static const uint32_t CondCodesMask = 0xF80F0000;
|
static const uint32_t CondCodesMask = 0xF80F0000;
|
||||||
|
|
||||||
// These otherwise unused bits of the PC are used to select a mode
|
|
||||||
// like the J and T bits of the CPSR.
|
|
||||||
static const Addr PcJBitShift = 33;
|
|
||||||
static const Addr PcTBitShift = 34;
|
|
||||||
static const Addr PcModeMask = (ULL(1) << PcJBitShift) |
|
|
||||||
(ULL(1) << PcTBitShift);
|
|
||||||
|
|
||||||
BitUnion32(SCTLR)
|
BitUnion32(SCTLR)
|
||||||
Bitfield<30> te; // Thumb Exception Enable
|
Bitfield<30> te; // Thumb Exception Enable
|
||||||
Bitfield<29> afe; // Access flag enable
|
Bitfield<29> afe; // Access flag enable
|
||||||
|
|
|
@ -33,6 +33,7 @@
|
||||||
|
|
||||||
#include <iomanip>
|
#include <iomanip>
|
||||||
|
|
||||||
|
#include "arch/isa_traits.hh"
|
||||||
#include "base/loader/symtab.hh"
|
#include "base/loader/symtab.hh"
|
||||||
#include "cpu/base.hh"
|
#include "cpu/base.hh"
|
||||||
#include "cpu/exetrace.hh"
|
#include "cpu/exetrace.hh"
|
||||||
|
@ -70,18 +71,22 @@ Trace::ExeTracerRecord::traceInst(StaticInstPtr inst, bool ran)
|
||||||
|
|
||||||
std::string sym_str;
|
std::string sym_str;
|
||||||
Addr sym_addr;
|
Addr sym_addr;
|
||||||
|
Addr cur_pc = PC;
|
||||||
|
#if THE_ISA == ARM_ISA
|
||||||
|
cur_pc &= ~PcModeMask;
|
||||||
|
#endif
|
||||||
if (debugSymbolTable
|
if (debugSymbolTable
|
||||||
&& IsOn(ExecSymbol)
|
&& IsOn(ExecSymbol)
|
||||||
#if FULL_SYSTEM
|
#if FULL_SYSTEM
|
||||||
&& !inUserMode(thread)
|
&& !inUserMode(thread)
|
||||||
#endif
|
#endif
|
||||||
&& debugSymbolTable->findNearestSymbol(PC, sym_str, sym_addr)) {
|
&& debugSymbolTable->findNearestSymbol(cur_pc, sym_str, sym_addr)) {
|
||||||
if (PC != sym_addr)
|
if (cur_pc != sym_addr)
|
||||||
sym_str += csprintf("+%d", PC - sym_addr);
|
sym_str += csprintf("+%d",cur_pc - sym_addr);
|
||||||
outs << "@" << sym_str;
|
outs << "@" << sym_str;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
outs << "0x" << hex << PC;
|
outs << "0x" << hex << cur_pc;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (inst->isMicroop()) {
|
if (inst->isMicroop()) {
|
||||||
|
@ -97,7 +102,7 @@ Trace::ExeTracerRecord::traceInst(StaticInstPtr inst, bool ran)
|
||||||
//
|
//
|
||||||
|
|
||||||
outs << setw(26) << left;
|
outs << setw(26) << left;
|
||||||
outs << inst->disassemble(PC, debugSymbolTable);
|
outs << inst->disassemble(cur_pc, debugSymbolTable);
|
||||||
|
|
||||||
if (ran) {
|
if (ran) {
|
||||||
outs << " : ";
|
outs << " : ";
|
||||||
|
|
Loading…
Reference in a new issue