nativetrace.cc revision 6410:362e27c08d96
16313Sgblack@eecs.umich.edu/* 27093Sgblack@eecs.umich.edu * Copyright (c) 2006 The Regents of The University of Michigan 37093Sgblack@eecs.umich.edu * All rights reserved. 47093Sgblack@eecs.umich.edu * 57093Sgblack@eecs.umich.edu * Redistribution and use in source and binary forms, with or without 67093Sgblack@eecs.umich.edu * modification, are permitted provided that the following conditions are 77093Sgblack@eecs.umich.edu * met: redistributions of source code must retain the above copyright 87093Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer; 97093Sgblack@eecs.umich.edu * redistributions in binary form must reproduce the above copyright 107093Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the 117093Sgblack@eecs.umich.edu * documentation and/or other materials provided with the distribution; 127093Sgblack@eecs.umich.edu * neither the name of the copyright holders nor the names of its 137093Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from 146313Sgblack@eecs.umich.edu * this software without specific prior written permission. 156313Sgblack@eecs.umich.edu * 166313Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 176313Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 186313Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 196313Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 206313Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 216313Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 226313Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 236313Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 246313Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 256313Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 266313Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 276313Sgblack@eecs.umich.edu * 286313Sgblack@eecs.umich.edu * Authors: Gabe Black 296313Sgblack@eecs.umich.edu */ 306313Sgblack@eecs.umich.edu 316313Sgblack@eecs.umich.edu#include "arch/arm/isa_traits.hh" 326313Sgblack@eecs.umich.edu#include "arch/arm/miscregs.hh" 336313Sgblack@eecs.umich.edu#include "arch/arm/nativetrace.hh" 346313Sgblack@eecs.umich.edu#include "cpu/thread_context.hh" 356313Sgblack@eecs.umich.edu#include "params/ArmNativeTrace.hh" 366313Sgblack@eecs.umich.edu 376313Sgblack@eecs.umich.edunamespace Trace { 386313Sgblack@eecs.umich.edu 396313Sgblack@eecs.umich.edu#if TRACING_ON 406313Sgblack@eecs.umich.edustatic const char *regNames[] = { 416313Sgblack@eecs.umich.edu "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", 426313Sgblack@eecs.umich.edu "r8", "r9", "r10", "fp", "r12", "sp", "lr", "pc", 436313Sgblack@eecs.umich.edu "cpsr" 446313Sgblack@eecs.umich.edu}; 456313Sgblack@eecs.umich.edu#endif 466333Sgblack@eecs.umich.edu 476313Sgblack@eecs.umich.eduvoid 486313Sgblack@eecs.umich.eduTrace::ArmNativeTrace::ThreadState::update(NativeTrace *parent) 496333Sgblack@eecs.umich.edu{ 506313Sgblack@eecs.umich.edu oldState = state[current]; 516313Sgblack@eecs.umich.edu current = (current + 1) % 2; 526313Sgblack@eecs.umich.edu newState = state[current]; 536313Sgblack@eecs.umich.edu 546313Sgblack@eecs.umich.edu parent->read(newState, sizeof(newState[0]) * STATE_NUMVALS); 556313Sgblack@eecs.umich.edu for (int i = 0; i < STATE_NUMVALS; i++) { 566313Sgblack@eecs.umich.edu newState[i] = ArmISA::gtoh(newState[i]); 576313Sgblack@eecs.umich.edu changed[i] = (oldState[i] != newState[i]); 586333Sgblack@eecs.umich.edu } 596718Sgblack@eecs.umich.edu} 606718Sgblack@eecs.umich.edu 616718Sgblack@eecs.umich.eduvoid 626718Sgblack@eecs.umich.eduTrace::ArmNativeTrace::ThreadState::update(ThreadContext *tc) 636718Sgblack@eecs.umich.edu{ 646718Sgblack@eecs.umich.edu oldState = state[current]; 656718Sgblack@eecs.umich.edu current = (current + 1) % 2; 666718Sgblack@eecs.umich.edu newState = state[current]; 676718Sgblack@eecs.umich.edu 686718Sgblack@eecs.umich.edu // Regular int regs 696718Sgblack@eecs.umich.edu for (int i = 0; i < 15; i++) { 706718Sgblack@eecs.umich.edu newState[i] = tc->readIntReg(i); 716718Sgblack@eecs.umich.edu changed[i] = (oldState[i] != newState[i]); 726718Sgblack@eecs.umich.edu } 736718Sgblack@eecs.umich.edu 746718Sgblack@eecs.umich.edu //R15, aliased with the PC 756718Sgblack@eecs.umich.edu newState[STATE_PC] = tc->readNextPC(); 766718Sgblack@eecs.umich.edu changed[STATE_PC] = (newState[STATE_PC] != oldState[STATE_PC]); 776718Sgblack@eecs.umich.edu 786723Sgblack@eecs.umich.edu //CPSR 796723Sgblack@eecs.umich.edu newState[STATE_CPSR] = tc->readMiscReg(MISCREG_CPSR); 806723Sgblack@eecs.umich.edu changed[STATE_CPSR] = (newState[STATE_CPSR] != oldState[STATE_CPSR]); 816718Sgblack@eecs.umich.edu} 826718Sgblack@eecs.umich.edu 836718Sgblack@eecs.umich.eduvoid 846718Sgblack@eecs.umich.eduTrace::ArmNativeTrace::check(NativeTraceRecord *record) 856718Sgblack@eecs.umich.edu{ 866718Sgblack@eecs.umich.edu nState.update(this); 876718Sgblack@eecs.umich.edu mState.update(record->getThread()); 886718Sgblack@eecs.umich.edu 896718Sgblack@eecs.umich.edu bool errorFound = false; 906718Sgblack@eecs.umich.edu // Regular int regs 916313Sgblack@eecs.umich.edu for (int i = 0; i < STATE_NUMVALS; i++) { 926313Sgblack@eecs.umich.edu if (nState.changed[i] || mState.changed[i]) { 936333Sgblack@eecs.umich.edu const char *vergence = " "; 946333Sgblack@eecs.umich.edu bool oldMatch = (mState.oldState[i] == nState.oldState[i]); 956401Sgblack@eecs.umich.edu bool newMatch = (mState.newState[i] == nState.newState[i]); 966401Sgblack@eecs.umich.edu if (oldMatch && newMatch) { 976719Sgblack@eecs.umich.edu // The more things change, the more they stay the same. 986401Sgblack@eecs.umich.edu continue; 996718Sgblack@eecs.umich.edu } else if (oldMatch && !newMatch) { 1006735Sgblack@eecs.umich.edu vergence = "<>"; 1016735Sgblack@eecs.umich.edu } else if (!oldMatch && newMatch) { 1026735Sgblack@eecs.umich.edu vergence = "><"; 1036735Sgblack@eecs.umich.edu } 1046735Sgblack@eecs.umich.edu errorFound = true; 1056735Sgblack@eecs.umich.edu if (!nState.changed[i]) { 1066735Sgblack@eecs.umich.edu DPRINTF(ExecRegDelta, "%s [%5s] "\ 1077270Sgblack@eecs.umich.edu "Native: %#010x "\ 1086735Sgblack@eecs.umich.edu "M5: %#010x => %#010x\n", 1097271Sgblack@eecs.umich.edu vergence, regNames[i], 1107271Sgblack@eecs.umich.edu nState.newState[i], 1117271Sgblack@eecs.umich.edu mState.oldState[i], mState.newState[i]); 1127271Sgblack@eecs.umich.edu } else if (!mState.changed[i]) { 1137271Sgblack@eecs.umich.edu DPRINTF(ExecRegDelta, "%s [%5s] "\ 1147271Sgblack@eecs.umich.edu "Native: %#010x => %#010x "\ 1156401Sgblack@eecs.umich.edu "M5: %#010x \n", 1166333Sgblack@eecs.umich.edu vergence, regNames[i], 1176313Sgblack@eecs.umich.edu nState.oldState[i], nState.newState[i], 1186333Sgblack@eecs.umich.edu mState.newState[i]); 1196333Sgblack@eecs.umich.edu } else { 1206333Sgblack@eecs.umich.edu DPRINTF(ExecRegDelta, "%s [%5s] "\ 1216333Sgblack@eecs.umich.edu "Native: %#010x => %#010x "\ 1226745Sgblack@eecs.umich.edu "M5: %#010x => %#010x\n", 1236745Sgblack@eecs.umich.edu vergence, regNames[i], 1246745Sgblack@eecs.umich.edu nState.oldState[i], nState.newState[i], 1256745Sgblack@eecs.umich.edu mState.oldState[i], mState.newState[i]); 1266745Sgblack@eecs.umich.edu } 1276745Sgblack@eecs.umich.edu } 1286745Sgblack@eecs.umich.edu } 1296745Sgblack@eecs.umich.edu if (errorFound) { 1306745Sgblack@eecs.umich.edu StaticInstPtr inst = record->getStaticInst(); 1316745Sgblack@eecs.umich.edu assert(inst); 1326745Sgblack@eecs.umich.edu bool ran = true; 1336745Sgblack@eecs.umich.edu if (inst->isMicroop()) { 1346745Sgblack@eecs.umich.edu ran = false; 1356745Sgblack@eecs.umich.edu inst = record->getMacroStaticInst(); 1366745Sgblack@eecs.umich.edu } 1376745Sgblack@eecs.umich.edu assert(inst); 1386745Sgblack@eecs.umich.edu record->traceInst(inst, ran); 1396745Sgblack@eecs.umich.edu } 1406745Sgblack@eecs.umich.edu} 1416745Sgblack@eecs.umich.edu 1426745Sgblack@eecs.umich.edu} /* namespace Trace */ 1436333Sgblack@eecs.umich.edu 1446333Sgblack@eecs.umich.edu//////////////////////////////////////////////////////////////////////// 1456313Sgblack@eecs.umich.edu// 1466333Sgblack@eecs.umich.edu// ExeTracer Simulation Object 1476333Sgblack@eecs.umich.edu// 1486333Sgblack@eecs.umich.eduTrace::ArmNativeTrace * 1497093Sgblack@eecs.umich.eduArmNativeTraceParams::create() 1507093Sgblack@eecs.umich.edu{ 1517093Sgblack@eecs.umich.edu return new Trace::ArmNativeTrace(this); 1527093Sgblack@eecs.umich.edu}; 1537093Sgblack@eecs.umich.edu