From: Chander Sudanthi Date: Fri, 13 May 2011 22:27:00 +0000 (-0500) Subject: Trace: Allow printing ASIDs and selectively tracing based on user/kernel code. X-Git-Tag: stable_2012_02_02~324 X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=4bf48a11efd7253bdb7a61da42d2bc754033757b;p=gem5.git Trace: Allow printing ASIDs and selectively tracing based on user/kernel code. Debug flags are ExecUser, ExecKernel, and ExecAsid. ExecUser and ExecKernel are set by default when Exec is specified. Use minus sign with ExecUser or ExecKernel to remove user or kernel tracing respectively. --- diff --git a/src/arch/alpha/utility.cc b/src/arch/alpha/utility.cc index 2d56ca9b8..5d40f85d7 100644 --- a/src/arch/alpha/utility.cc +++ b/src/arch/alpha/utility.cc @@ -29,7 +29,6 @@ * Ali Saidi */ -#include "arch/alpha/ev5.hh" #include "arch/alpha/utility.hh" #if FULL_SYSTEM diff --git a/src/arch/alpha/utility.hh b/src/arch/alpha/utility.hh index 8759b49ce..c0c985c34 100644 --- a/src/arch/alpha/utility.hh +++ b/src/arch/alpha/utility.hh @@ -39,6 +39,7 @@ #include "config/full_system.hh" #include "cpu/static_inst.hh" #include "cpu/thread_context.hh" +#include "arch/alpha/ev5.hh" namespace AlphaISA { @@ -111,6 +112,12 @@ advancePC(PCState &pc, const StaticInstPtr inst) pc.advance(); } +inline uint64_t +getExecutingAsid(ThreadContext *tc) +{ + return DTB_ASN_ASN(tc->readMiscRegNoEffect(IPR_DTB_ASN)); +} + } // namespace AlphaISA #endif // __ARCH_ALPHA_UTILITY_HH__ diff --git a/src/arch/arm/utility.hh b/src/arch/arm/utility.hh index 20cb9b426..8ad3de66a 100644 --- a/src/arch/arm/utility.hh +++ b/src/arch/arm/utility.hh @@ -173,7 +173,12 @@ advancePC(PCState &pc, const StaticInstPtr inst) Addr truncPage(Addr addr); Addr roundPage(Addr addr); -}; +inline uint64_t +getExecutingAsid(ThreadContext *tc) +{ + return tc->readMiscReg(MISCREG_CONTEXTIDR); +} +}; #endif diff --git a/src/arch/mips/utility.hh b/src/arch/mips/utility.hh index 61c43a158..a2995b098 100644 --- a/src/arch/mips/utility.hh +++ b/src/arch/mips/utility.hh @@ -120,6 +120,12 @@ advancePC(PCState &pc, const StaticInstPtr inst) pc.advance(); } +inline uint64_t +getExecutingAsid(ThreadContext *tc) +{ + return 0; +} + }; diff --git a/src/arch/power/utility.hh b/src/arch/power/utility.hh index cbb9bb646..349054774 100644 --- a/src/arch/power/utility.hh +++ b/src/arch/power/utility.hh @@ -78,6 +78,19 @@ advancePC(PCState &pc, const StaticInstPtr inst) pc.advance(); } +static inline bool +inUserMode(ThreadContext *tc) +{ + return 0; +} + +inline uint64_t +getExecutingAsid(ThreadContext *tc) +{ + return 0; +} + } // namespace PowerISA + #endif // __ARCH_POWER_UTILITY_HH__ diff --git a/src/arch/sparc/utility.hh b/src/arch/sparc/utility.hh index b702e6838..76b551ac8 100644 --- a/src/arch/sparc/utility.hh +++ b/src/arch/sparc/utility.hh @@ -94,6 +94,12 @@ advancePC(PCState &pc, const StaticInstPtr inst) inst->advancePC(pc); } +inline uint64_t +getExecutingAsid(ThreadContext *tc) +{ + return tc->readMiscRegNoEffect(MISCREG_MMU_P_CONTEXT); +} + } // namespace SparcISA #endif diff --git a/src/arch/x86/utility.hh b/src/arch/x86/utility.hh index 143fde00c..4cfbe77db 100644 --- a/src/arch/x86/utility.hh +++ b/src/arch/x86/utility.hh @@ -102,6 +102,13 @@ namespace X86ISA { inst->advancePC(pc); } + + inline uint64_t + getExecutingAsid(ThreadContext *tc) + { + return 0; + } + }; #endif // __ARCH_X86_UTILITY_HH__ diff --git a/src/cpu/SConscript b/src/cpu/SConscript index fb7c86845..f6ed80680 100644 --- a/src/cpu/SConscript +++ b/src/cpu/SConscript @@ -168,6 +168,9 @@ TraceFlag('ExecThread') TraceFlag('ExecTicks') TraceFlag('ExecMicro') TraceFlag('ExecMacro') +TraceFlag('ExecUser') +TraceFlag('ExecKernel') +TraceFlag('ExecAsid') TraceFlag('Fetch') TraceFlag('IntrControl') TraceFlag('PCEvent') @@ -176,8 +179,11 @@ TraceFlag('Quiesce') CompoundFlag('ExecAll', [ 'ExecEnable', 'ExecCPSeq', 'ExecEffAddr', 'ExecFaulting', 'ExecFetchSeq', 'ExecOpClass', 'ExecRegDelta', 'ExecResult', 'ExecSpeculative', 'ExecSymbol', 'ExecThread', - 'ExecTicks', 'ExecMicro', 'ExecMacro' ]) + 'ExecTicks', 'ExecMicro', 'ExecMacro', 'ExecUser', 'ExecKernel', + 'ExecAsid' ]) CompoundFlag('Exec', [ 'ExecEnable', 'ExecTicks', 'ExecOpClass', 'ExecThread', - 'ExecEffAddr', 'ExecResult', 'ExecSymbol', 'ExecMicro', 'ExecFaulting' ]) + 'ExecEffAddr', 'ExecResult', 'ExecSymbol', 'ExecMicro', 'ExecFaulting', + 'ExecUser', 'ExecKernel' ]) CompoundFlag('ExecNoTicks', [ 'ExecEnable', 'ExecOpClass', 'ExecThread', - 'ExecEffAddr', 'ExecResult', 'ExecMicro', 'ExecFaulting' ]) + 'ExecEffAddr', 'ExecResult', 'ExecMicro', 'ExecFaulting', + 'ExecUser', 'ExecKernel' ]) diff --git a/src/cpu/exetrace.cc b/src/cpu/exetrace.cc index a6450ffe3..40991652d 100644 --- a/src/cpu/exetrace.cc +++ b/src/cpu/exetrace.cc @@ -60,6 +60,12 @@ Trace::ExeTracerRecord::traceInst(StaticInstPtr inst, bool ran) { ostream &outs = Trace::output(); + if (!Debug::ExecUser || !Debug::ExecKernel) { + bool in_user_mode = TheISA::inUserMode(thread); + if (in_user_mode && !Debug::ExecUser) return; + if (!in_user_mode && !Debug::ExecKernel) return; + } + if (Debug::ExecTicks) dumpTicks(outs); @@ -68,6 +74,9 @@ Trace::ExeTracerRecord::traceInst(StaticInstPtr inst, bool ran) if (Debug::ExecSpeculative) outs << (misspeculating ? "-" : "+") << " "; + if (Debug::ExecAsid) + outs << "A" << dec << TheISA::getExecutingAsid(thread) << " "; + if (Debug::ExecThread) outs << "T" << thread->threadId() << " : ";