nativetrace.hh revision 5038
14776Sgblack@eecs.umich.edu/* 24776Sgblack@eecs.umich.edu * Copyright (c) 2001-2005 The Regents of The University of Michigan 34776Sgblack@eecs.umich.edu * All rights reserved. 44776Sgblack@eecs.umich.edu * 54776Sgblack@eecs.umich.edu * Redistribution and use in source and binary forms, with or without 64776Sgblack@eecs.umich.edu * modification, are permitted provided that the following conditions are 74776Sgblack@eecs.umich.edu * met: redistributions of source code must retain the above copyright 84776Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer; 94776Sgblack@eecs.umich.edu * redistributions in binary form must reproduce the above copyright 104776Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the 114776Sgblack@eecs.umich.edu * documentation and/or other materials provided with the distribution; 124776Sgblack@eecs.umich.edu * neither the name of the copyright holders nor the names of its 134776Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from 144776Sgblack@eecs.umich.edu * this software without specific prior written permission. 154776Sgblack@eecs.umich.edu * 164776Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 174776Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 184776Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 194776Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 204776Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 214776Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 224776Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 234776Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 244776Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 254776Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 264776Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 274776Sgblack@eecs.umich.edu * 284776Sgblack@eecs.umich.edu * Authors: Steve Reinhardt 294776Sgblack@eecs.umich.edu * Nathan Binkert 304776Sgblack@eecs.umich.edu */ 314776Sgblack@eecs.umich.edu 324776Sgblack@eecs.umich.edu#ifndef __NATIVETRACE_HH__ 334776Sgblack@eecs.umich.edu#define __NATIVETRACE_HH__ 344776Sgblack@eecs.umich.edu 354776Sgblack@eecs.umich.edu#include "base/trace.hh" 364776Sgblack@eecs.umich.edu#include "cpu/static_inst.hh" 374776Sgblack@eecs.umich.edu#include "sim/host.hh" 384776Sgblack@eecs.umich.edu#include "sim/insttracer.hh" 394830Sgblack@eecs.umich.edu#include "arch/x86/intregs.hh" 404776Sgblack@eecs.umich.edu 414776Sgblack@eecs.umich.educlass ThreadContext; 424776Sgblack@eecs.umich.edu 434776Sgblack@eecs.umich.edu 444776Sgblack@eecs.umich.edunamespace Trace { 454776Sgblack@eecs.umich.edu 464776Sgblack@eecs.umich.educlass NativeTrace; 474776Sgblack@eecs.umich.edu 484776Sgblack@eecs.umich.educlass NativeTraceRecord : public InstRecord 494776Sgblack@eecs.umich.edu{ 504776Sgblack@eecs.umich.edu protected: 514776Sgblack@eecs.umich.edu NativeTrace * parent; 524776Sgblack@eecs.umich.edu 534776Sgblack@eecs.umich.edu public: 544776Sgblack@eecs.umich.edu NativeTraceRecord(NativeTrace * _parent, 554776Sgblack@eecs.umich.edu Tick _when, ThreadContext *_thread, 564776Sgblack@eecs.umich.edu const StaticInstPtr &_staticInst, Addr _pc, bool spec) 574776Sgblack@eecs.umich.edu : InstRecord(_when, _thread, _staticInst, _pc, spec), parent(_parent) 584776Sgblack@eecs.umich.edu { 594776Sgblack@eecs.umich.edu } 604776Sgblack@eecs.umich.edu 614776Sgblack@eecs.umich.edu void dump(); 624776Sgblack@eecs.umich.edu}; 634776Sgblack@eecs.umich.edu 644776Sgblack@eecs.umich.educlass NativeTrace : public InstTracer 654776Sgblack@eecs.umich.edu{ 664776Sgblack@eecs.umich.edu protected: 674776Sgblack@eecs.umich.edu int fd; 684776Sgblack@eecs.umich.edu 694776Sgblack@eecs.umich.edu ListenSocket native_listener; 704776Sgblack@eecs.umich.edu 714830Sgblack@eecs.umich.edu bool checkRcx; 724830Sgblack@eecs.umich.edu bool checkR11; 734830Sgblack@eecs.umich.edu uint64_t oldRcxVal, oldR11Val; 744830Sgblack@eecs.umich.edu uint64_t oldRealRcxVal, oldRealR11Val; 754830Sgblack@eecs.umich.edu 764830Sgblack@eecs.umich.edu struct ThreadState { 774830Sgblack@eecs.umich.edu uint64_t rax; 784830Sgblack@eecs.umich.edu uint64_t rcx; 794830Sgblack@eecs.umich.edu uint64_t rdx; 804830Sgblack@eecs.umich.edu uint64_t rbx; 814830Sgblack@eecs.umich.edu uint64_t rsp; 824830Sgblack@eecs.umich.edu uint64_t rbp; 834830Sgblack@eecs.umich.edu uint64_t rsi; 844830Sgblack@eecs.umich.edu uint64_t rdi; 854830Sgblack@eecs.umich.edu uint64_t r8; 864830Sgblack@eecs.umich.edu uint64_t r9; 874830Sgblack@eecs.umich.edu uint64_t r10; 884830Sgblack@eecs.umich.edu uint64_t r11; 894830Sgblack@eecs.umich.edu uint64_t r12; 904830Sgblack@eecs.umich.edu uint64_t r13; 914830Sgblack@eecs.umich.edu uint64_t r14; 924830Sgblack@eecs.umich.edu uint64_t r15; 934830Sgblack@eecs.umich.edu uint64_t rip; 944830Sgblack@eecs.umich.edu 954830Sgblack@eecs.umich.edu void update(int fd) 964830Sgblack@eecs.umich.edu { 974830Sgblack@eecs.umich.edu int bytesLeft = sizeof(ThreadState); 984830Sgblack@eecs.umich.edu int bytesRead = 0; 994830Sgblack@eecs.umich.edu do 1004830Sgblack@eecs.umich.edu { 1014830Sgblack@eecs.umich.edu int res = read(fd, ((char *)this) + bytesRead, bytesLeft); 1024830Sgblack@eecs.umich.edu if(res < 0) 1034830Sgblack@eecs.umich.edu panic("Read call failed! %s\n", strerror(errno)); 1044830Sgblack@eecs.umich.edu bytesLeft -= res; 1054830Sgblack@eecs.umich.edu bytesRead += res; 1064830Sgblack@eecs.umich.edu } while(bytesLeft); 1074830Sgblack@eecs.umich.edu rax = TheISA::gtoh(rax); 1084830Sgblack@eecs.umich.edu rcx = TheISA::gtoh(rcx); 1094830Sgblack@eecs.umich.edu rdx = TheISA::gtoh(rdx); 1104830Sgblack@eecs.umich.edu rbx = TheISA::gtoh(rbx); 1114830Sgblack@eecs.umich.edu rsp = TheISA::gtoh(rsp); 1124830Sgblack@eecs.umich.edu rbp = TheISA::gtoh(rbp); 1134830Sgblack@eecs.umich.edu rsi = TheISA::gtoh(rsi); 1144830Sgblack@eecs.umich.edu rdi = TheISA::gtoh(rdi); 1154830Sgblack@eecs.umich.edu r8 = TheISA::gtoh(r8); 1164830Sgblack@eecs.umich.edu r9 = TheISA::gtoh(r9); 1174830Sgblack@eecs.umich.edu r10 = TheISA::gtoh(r10); 1184830Sgblack@eecs.umich.edu r11 = TheISA::gtoh(r11); 1194830Sgblack@eecs.umich.edu r12 = TheISA::gtoh(r12); 1204830Sgblack@eecs.umich.edu r13 = TheISA::gtoh(r13); 1214830Sgblack@eecs.umich.edu r14 = TheISA::gtoh(r14); 1224830Sgblack@eecs.umich.edu r15 = TheISA::gtoh(r15); 1234830Sgblack@eecs.umich.edu rip = TheISA::gtoh(rip); 1244830Sgblack@eecs.umich.edu } 1254830Sgblack@eecs.umich.edu 1264830Sgblack@eecs.umich.edu void update(ThreadContext * tc) 1274830Sgblack@eecs.umich.edu { 1284830Sgblack@eecs.umich.edu rax = tc->readIntReg(X86ISA::INTREG_RAX); 1294830Sgblack@eecs.umich.edu rcx = tc->readIntReg(X86ISA::INTREG_RCX); 1304830Sgblack@eecs.umich.edu rdx = tc->readIntReg(X86ISA::INTREG_RDX); 1314830Sgblack@eecs.umich.edu rbx = tc->readIntReg(X86ISA::INTREG_RBX); 1324830Sgblack@eecs.umich.edu rsp = tc->readIntReg(X86ISA::INTREG_RSP); 1334830Sgblack@eecs.umich.edu rbp = tc->readIntReg(X86ISA::INTREG_RBP); 1344830Sgblack@eecs.umich.edu rsi = tc->readIntReg(X86ISA::INTREG_RSI); 1354830Sgblack@eecs.umich.edu rdi = tc->readIntReg(X86ISA::INTREG_RDI); 1364830Sgblack@eecs.umich.edu r8 = tc->readIntReg(X86ISA::INTREG_R8); 1374830Sgblack@eecs.umich.edu r9 = tc->readIntReg(X86ISA::INTREG_R9); 1384830Sgblack@eecs.umich.edu r10 = tc->readIntReg(X86ISA::INTREG_R10); 1394830Sgblack@eecs.umich.edu r11 = tc->readIntReg(X86ISA::INTREG_R11); 1404830Sgblack@eecs.umich.edu r12 = tc->readIntReg(X86ISA::INTREG_R12); 1414830Sgblack@eecs.umich.edu r13 = tc->readIntReg(X86ISA::INTREG_R13); 1424830Sgblack@eecs.umich.edu r14 = tc->readIntReg(X86ISA::INTREG_R14); 1434830Sgblack@eecs.umich.edu r15 = tc->readIntReg(X86ISA::INTREG_R15); 1444830Sgblack@eecs.umich.edu rip = tc->readNextPC(); 1454830Sgblack@eecs.umich.edu } 1464830Sgblack@eecs.umich.edu 1474830Sgblack@eecs.umich.edu }; 1484830Sgblack@eecs.umich.edu 1494830Sgblack@eecs.umich.edu ThreadState nState; 1504830Sgblack@eecs.umich.edu ThreadState mState; 1514830Sgblack@eecs.umich.edu 1524830Sgblack@eecs.umich.edu 1534776Sgblack@eecs.umich.edu public: 1544776Sgblack@eecs.umich.edu 1554830Sgblack@eecs.umich.edu template<class T> 1564830Sgblack@eecs.umich.edu bool 1574830Sgblack@eecs.umich.edu checkReg(const char * regName, T &val, T &realVal) 1584830Sgblack@eecs.umich.edu { 1594830Sgblack@eecs.umich.edu if(val != realVal) 1604830Sgblack@eecs.umich.edu { 1614830Sgblack@eecs.umich.edu DPRINTFN("Register %s should be %#x but is %#x.\n", 1624830Sgblack@eecs.umich.edu regName, realVal, val); 1634830Sgblack@eecs.umich.edu return false; 1644830Sgblack@eecs.umich.edu } 1654830Sgblack@eecs.umich.edu return true; 1664830Sgblack@eecs.umich.edu } 1674830Sgblack@eecs.umich.edu 1684830Sgblack@eecs.umich.edu bool 1694830Sgblack@eecs.umich.edu checkRcxReg(const char * regName, uint64_t &, uint64_t &); 1704830Sgblack@eecs.umich.edu 1714830Sgblack@eecs.umich.edu bool 1724830Sgblack@eecs.umich.edu checkR11Reg(const char * regName, uint64_t &, uint64_t &); 1734830Sgblack@eecs.umich.edu 1745038Sgblack@eecs.umich.edu NativeTrace(const Params *p); 1754776Sgblack@eecs.umich.edu 1764776Sgblack@eecs.umich.edu NativeTraceRecord * 1774776Sgblack@eecs.umich.edu getInstRecord(Tick when, ThreadContext *tc, 1784776Sgblack@eecs.umich.edu const StaticInstPtr staticInst, Addr pc) 1794776Sgblack@eecs.umich.edu { 1804776Sgblack@eecs.umich.edu if (tc->misspeculating()) 1814776Sgblack@eecs.umich.edu return NULL; 1824776Sgblack@eecs.umich.edu 1834776Sgblack@eecs.umich.edu return new NativeTraceRecord(this, when, tc, 1844776Sgblack@eecs.umich.edu staticInst, pc, tc->misspeculating()); 1854776Sgblack@eecs.umich.edu } 1864776Sgblack@eecs.umich.edu 1874830Sgblack@eecs.umich.edu void 1884830Sgblack@eecs.umich.edu check(ThreadContext *, bool syscall); 1894830Sgblack@eecs.umich.edu 1904776Sgblack@eecs.umich.edu friend class NativeTraceRecord; 1914776Sgblack@eecs.umich.edu}; 1924776Sgblack@eecs.umich.edu 1934776Sgblack@eecs.umich.edu/* namespace Trace */ } 1944776Sgblack@eecs.umich.edu 1954776Sgblack@eecs.umich.edu#endif // __EXETRACE_HH__ 196