nativetrace.hh revision 6216
11376Sbinkertn@umich.edu/* 21376Sbinkertn@umich.edu * Copyright (c) 2001-2005 The Regents of The University of Michigan 31376Sbinkertn@umich.edu * All rights reserved. 41376Sbinkertn@umich.edu * 51376Sbinkertn@umich.edu * Redistribution and use in source and binary forms, with or without 61376Sbinkertn@umich.edu * modification, are permitted provided that the following conditions are 71376Sbinkertn@umich.edu * met: redistributions of source code must retain the above copyright 81376Sbinkertn@umich.edu * notice, this list of conditions and the following disclaimer; 91376Sbinkertn@umich.edu * redistributions in binary form must reproduce the above copyright 101376Sbinkertn@umich.edu * notice, this list of conditions and the following disclaimer in the 111376Sbinkertn@umich.edu * documentation and/or other materials provided with the distribution; 121376Sbinkertn@umich.edu * neither the name of the copyright holders nor the names of its 131376Sbinkertn@umich.edu * contributors may be used to endorse or promote products derived from 141376Sbinkertn@umich.edu * this software without specific prior written permission. 151376Sbinkertn@umich.edu * 161376Sbinkertn@umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 171376Sbinkertn@umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 181376Sbinkertn@umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 191376Sbinkertn@umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 201376Sbinkertn@umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 211376Sbinkertn@umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 221376Sbinkertn@umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 231376Sbinkertn@umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 241376Sbinkertn@umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 251376Sbinkertn@umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 261376Sbinkertn@umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 271376Sbinkertn@umich.edu * 281376Sbinkertn@umich.edu * Authors: Steve Reinhardt 291376Sbinkertn@umich.edu * Nathan Binkert 301376Sbinkertn@umich.edu */ 311376Sbinkertn@umich.edu 321376Sbinkertn@umich.edu#ifndef __CPU_NATIVETRACE_HH__ 331376Sbinkertn@umich.edu#define __CPU_NATIVETRACE_HH__ 341376Sbinkertn@umich.edu 351376Sbinkertn@umich.edu#include "arch/x86/floatregs.hh" 361376Sbinkertn@umich.edu#include "arch/x86/intregs.hh" 371376Sbinkertn@umich.edu#include "base/trace.hh" 381376Sbinkertn@umich.edu#include "base/types.hh" 391376Sbinkertn@umich.edu#include "cpu/static_inst.hh" 401376Sbinkertn@umich.edu#include "sim/insttracer.hh" 411376Sbinkertn@umich.edu 421376Sbinkertn@umich.educlass ThreadContext; 431376Sbinkertn@umich.edu 441376Sbinkertn@umich.edunamespace Trace { 451376Sbinkertn@umich.edu 461376Sbinkertn@umich.educlass NativeTrace; 471376Sbinkertn@umich.edu 481376Sbinkertn@umich.educlass NativeTraceRecord : public InstRecord 491376Sbinkertn@umich.edu{ 501376Sbinkertn@umich.edu protected: 511376Sbinkertn@umich.edu NativeTrace * parent; 521376Sbinkertn@umich.edu 531376Sbinkertn@umich.edu public: 541376Sbinkertn@umich.edu NativeTraceRecord(NativeTrace * _parent, 551376Sbinkertn@umich.edu Tick _when, ThreadContext *_thread, 561376Sbinkertn@umich.edu const StaticInstPtr _staticInst, Addr _pc, bool spec, 571381Sbinkertn@umich.edu const StaticInstPtr _macroStaticInst = NULL, MicroPC _upc = 0) 581376Sbinkertn@umich.edu : InstRecord(_when, _thread, _staticInst, _pc, spec, 591376Sbinkertn@umich.edu _macroStaticInst, _upc), 601376Sbinkertn@umich.edu parent(_parent) 611376Sbinkertn@umich.edu { 621376Sbinkertn@umich.edu } 631376Sbinkertn@umich.edu 641376Sbinkertn@umich.edu void dump(); 651376Sbinkertn@umich.edu}; 661376Sbinkertn@umich.edu 671376Sbinkertn@umich.educlass NativeTrace : public InstTracer 681381Sbinkertn@umich.edu{ 691381Sbinkertn@umich.edu protected: 701381Sbinkertn@umich.edu int fd; 711376Sbinkertn@umich.edu 721381Sbinkertn@umich.edu ListenSocket native_listener; 731381Sbinkertn@umich.edu 741381Sbinkertn@umich.edu bool checkRcx; 751376Sbinkertn@umich.edu bool checkR11; 761381Sbinkertn@umich.edu uint64_t oldRcxVal, oldR11Val; 771376Sbinkertn@umich.edu uint64_t oldRealRcxVal, oldRealR11Val; 781381Sbinkertn@umich.edu 791376Sbinkertn@umich.edu struct ThreadState { 801376Sbinkertn@umich.edu uint64_t rax; 811381Sbinkertn@umich.edu uint64_t rcx; 821376Sbinkertn@umich.edu uint64_t rdx; 831381Sbinkertn@umich.edu uint64_t rbx; 841381Sbinkertn@umich.edu uint64_t rsp; 851381Sbinkertn@umich.edu uint64_t rbp; 861376Sbinkertn@umich.edu uint64_t rsi; 871376Sbinkertn@umich.edu uint64_t rdi; 881381Sbinkertn@umich.edu uint64_t r8; 891381Sbinkertn@umich.edu uint64_t r9; 901381Sbinkertn@umich.edu uint64_t r10; 911376Sbinkertn@umich.edu uint64_t r11; 921376Sbinkertn@umich.edu uint64_t r12; 931376Sbinkertn@umich.edu uint64_t r13; 941381Sbinkertn@umich.edu uint64_t r14; 951376Sbinkertn@umich.edu uint64_t r15; 961381Sbinkertn@umich.edu uint64_t rip; 971376Sbinkertn@umich.edu //This should be expanded to 16 if x87 registers are considered 981381Sbinkertn@umich.edu uint64_t mmx[8]; 991381Sbinkertn@umich.edu uint64_t xmm[32]; 1001376Sbinkertn@umich.edu 1011376Sbinkertn@umich.edu void update(int fd) 1021381Sbinkertn@umich.edu { 1031376Sbinkertn@umich.edu int bytesLeft = sizeof(ThreadState); 1041381Sbinkertn@umich.edu int bytesRead = 0; 1051376Sbinkertn@umich.edu do 1061376Sbinkertn@umich.edu { 1071376Sbinkertn@umich.edu int res = read(fd, ((char *)this) + bytesRead, bytesLeft); 1081376Sbinkertn@umich.edu if(res < 0) 1091381Sbinkertn@umich.edu panic("Read call failed! %s\n", strerror(errno)); 1101376Sbinkertn@umich.edu bytesLeft -= res; 1111376Sbinkertn@umich.edu bytesRead += res; 1121376Sbinkertn@umich.edu } while(bytesLeft); 1131376Sbinkertn@umich.edu rax = TheISA::gtoh(rax); 1141376Sbinkertn@umich.edu rcx = TheISA::gtoh(rcx); 1151376Sbinkertn@umich.edu rdx = TheISA::gtoh(rdx); 1161376Sbinkertn@umich.edu rbx = TheISA::gtoh(rbx); 1171376Sbinkertn@umich.edu rsp = TheISA::gtoh(rsp); 1181376Sbinkertn@umich.edu rbp = TheISA::gtoh(rbp); 1191376Sbinkertn@umich.edu rsi = TheISA::gtoh(rsi); 1201376Sbinkertn@umich.edu rdi = TheISA::gtoh(rdi); 1211376Sbinkertn@umich.edu r8 = TheISA::gtoh(r8); 1221376Sbinkertn@umich.edu r9 = TheISA::gtoh(r9); 1231376Sbinkertn@umich.edu r10 = TheISA::gtoh(r10); 1241376Sbinkertn@umich.edu r11 = TheISA::gtoh(r11); 1251376Sbinkertn@umich.edu r12 = TheISA::gtoh(r12); 1261376Sbinkertn@umich.edu r13 = TheISA::gtoh(r13); 1271376Sbinkertn@umich.edu r14 = TheISA::gtoh(r14); 1281376Sbinkertn@umich.edu r15 = TheISA::gtoh(r15); 1291376Sbinkertn@umich.edu rip = TheISA::gtoh(rip); 1301376Sbinkertn@umich.edu //This should be expanded if x87 registers are considered 1311376Sbinkertn@umich.edu for (int i = 0; i < 8; i++) 1321376Sbinkertn@umich.edu mmx[i] = TheISA::gtoh(mmx[i]); 1331376Sbinkertn@umich.edu for (int i = 0; i < 32; i++) 1341376Sbinkertn@umich.edu xmm[i] = TheISA::gtoh(xmm[i]); 1351376Sbinkertn@umich.edu } 1361376Sbinkertn@umich.edu 1371376Sbinkertn@umich.edu void update(ThreadContext * tc) 1381376Sbinkertn@umich.edu { 1391376Sbinkertn@umich.edu rax = tc->readIntReg(X86ISA::INTREG_RAX); 1401376Sbinkertn@umich.edu rcx = tc->readIntReg(X86ISA::INTREG_RCX); 1411376Sbinkertn@umich.edu rdx = tc->readIntReg(X86ISA::INTREG_RDX); 1421376Sbinkertn@umich.edu rbx = tc->readIntReg(X86ISA::INTREG_RBX); 1431376Sbinkertn@umich.edu rsp = tc->readIntReg(X86ISA::INTREG_RSP); 1441376Sbinkertn@umich.edu rbp = tc->readIntReg(X86ISA::INTREG_RBP); 1451376Sbinkertn@umich.edu rsi = tc->readIntReg(X86ISA::INTREG_RSI); 1461376Sbinkertn@umich.edu rdi = tc->readIntReg(X86ISA::INTREG_RDI); 1471376Sbinkertn@umich.edu r8 = tc->readIntReg(X86ISA::INTREG_R8); 1481376Sbinkertn@umich.edu r9 = tc->readIntReg(X86ISA::INTREG_R9); 1491376Sbinkertn@umich.edu r10 = tc->readIntReg(X86ISA::INTREG_R10); 1501376Sbinkertn@umich.edu r11 = tc->readIntReg(X86ISA::INTREG_R11); 1511376Sbinkertn@umich.edu r12 = tc->readIntReg(X86ISA::INTREG_R12); 1521376Sbinkertn@umich.edu r13 = tc->readIntReg(X86ISA::INTREG_R13); 1531376Sbinkertn@umich.edu r14 = tc->readIntReg(X86ISA::INTREG_R14); 1541376Sbinkertn@umich.edu r15 = tc->readIntReg(X86ISA::INTREG_R15); 1551376Sbinkertn@umich.edu rip = tc->readNextPC(); 1561376Sbinkertn@umich.edu //This should be expanded if x87 registers are considered 1571376Sbinkertn@umich.edu for (int i = 0; i < 8; i++) 1581376Sbinkertn@umich.edu mmx[i] = tc->readFloatRegBits(X86ISA::FLOATREG_MMX(i)); 1591376Sbinkertn@umich.edu for (int i = 0; i < 32; i++) 1601376Sbinkertn@umich.edu xmm[i] = tc->readFloatRegBits(X86ISA::FLOATREG_XMM_BASE + i); 1611376Sbinkertn@umich.edu } 1621376Sbinkertn@umich.edu 1631376Sbinkertn@umich.edu }; 1641376Sbinkertn@umich.edu 1651376Sbinkertn@umich.edu ThreadState nState; 1661376Sbinkertn@umich.edu ThreadState mState; 1671376Sbinkertn@umich.edu 1681376Sbinkertn@umich.edu 1691376Sbinkertn@umich.edu public: 1701376Sbinkertn@umich.edu 1711376Sbinkertn@umich.edu template<class T> 1721376Sbinkertn@umich.edu bool 1731381Sbinkertn@umich.edu checkReg(const char * regName, T &val, T &realVal) 1741376Sbinkertn@umich.edu { 175 if(val != realVal) 176 { 177 DPRINTFN("Register %s should be %#x but is %#x.\n", 178 regName, realVal, val); 179 return false; 180 } 181 return true; 182 } 183 184 bool 185 checkRcxReg(const char * regName, uint64_t &, uint64_t &); 186 187 bool 188 checkR11Reg(const char * regName, uint64_t &, uint64_t &); 189 190 bool 191 checkXMM(int num, uint64_t mXmmBuf[], uint64_t nXmmBuf[]); 192 193 NativeTrace(const Params *p); 194 195 NativeTraceRecord * 196 getInstRecord(Tick when, ThreadContext *tc, 197 const StaticInstPtr staticInst, Addr pc, 198 const StaticInstPtr macroStaticInst = NULL, MicroPC upc = 0) 199 { 200 if (tc->misspeculating()) 201 return NULL; 202 203 return new NativeTraceRecord(this, when, tc, 204 staticInst, pc, tc->misspeculating(), macroStaticInst, upc); 205 } 206 207 void 208 check(ThreadContext *, bool syscall); 209 210 friend class NativeTraceRecord; 211}; 212 213/* namespace Trace */ } 214 215#endif // __CPU_NATIVETRACE_HH__ 216