ARM: Move PC mode bits around so they can be used for exectrace

This commit is contained in:
Ali Saidi 2010-06-02 12:58:13 -05:00
parent aec73ba6af
commit 5e6d28996a
3 changed files with 17 additions and 12 deletions

View file

@ -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;

View file

@ -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

View file

@ -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 << " : ";