simple_thread.hh revision 2330
17405SAli.Saidi@ARM.com/* 27405SAli.Saidi@ARM.com * Copyright (c) 2006 The Regents of The University of Michigan 37405SAli.Saidi@ARM.com * All rights reserved. 47405SAli.Saidi@ARM.com * 57405SAli.Saidi@ARM.com * Redistribution and use in source and binary forms, with or without 67405SAli.Saidi@ARM.com * modification, are permitted provided that the following conditions are 77405SAli.Saidi@ARM.com * met: redistributions of source code must retain the above copyright 87405SAli.Saidi@ARM.com * notice, this list of conditions and the following disclaimer; 97405SAli.Saidi@ARM.com * redistributions in binary form must reproduce the above copyright 107405SAli.Saidi@ARM.com * notice, this list of conditions and the following disclaimer in the 117405SAli.Saidi@ARM.com * documentation and/or other materials provided with the distribution; 127405SAli.Saidi@ARM.com * neither the name of the copyright holders nor the names of its 137405SAli.Saidi@ARM.com * contributors may be used to endorse or promote products derived from 147405SAli.Saidi@ARM.com * this software without specific prior written permission. 157405SAli.Saidi@ARM.com * 167405SAli.Saidi@ARM.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 177405SAli.Saidi@ARM.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 187405SAli.Saidi@ARM.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 197405SAli.Saidi@ARM.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 207405SAli.Saidi@ARM.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 217405SAli.Saidi@ARM.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 227405SAli.Saidi@ARM.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 237405SAli.Saidi@ARM.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 247405SAli.Saidi@ARM.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 257405SAli.Saidi@ARM.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 267405SAli.Saidi@ARM.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 277405SAli.Saidi@ARM.com */ 287405SAli.Saidi@ARM.com 297405SAli.Saidi@ARM.com#ifndef __CPU_EXEC_CONTEXT_HH__ 307405SAli.Saidi@ARM.com#define __CPU_EXEC_CONTEXT_HH__ 317405SAli.Saidi@ARM.com 327405SAli.Saidi@ARM.com#include "config/full_system.hh" 337405SAli.Saidi@ARM.com#include "mem/mem_req.hh" 347405SAli.Saidi@ARM.com#include "sim/faults.hh" 357405SAli.Saidi@ARM.com#include "sim/host.hh" 367405SAli.Saidi@ARM.com#include "sim/serialize.hh" 377405SAli.Saidi@ARM.com#include "sim/byteswap.hh" 387405SAli.Saidi@ARM.com 397405SAli.Saidi@ARM.com// forward declaration: see functional_memory.hh 407405SAli.Saidi@ARM.com// @todo: Figure out a more architecture independent way to obtain the ITB and 417405SAli.Saidi@ARM.com// DTB pointers. 427405SAli.Saidi@ARM.comclass AlphaDTB; 437405SAli.Saidi@ARM.comclass AlphaITB; 447405SAli.Saidi@ARM.comclass BaseCPU; 457405SAli.Saidi@ARM.comclass EndQuiesceEvent; 467427Sgblack@eecs.umich.educlass Event; 477427Sgblack@eecs.umich.educlass FunctionalMemory; 487427Sgblack@eecs.umich.educlass PhysicalMemory; 497427Sgblack@eecs.umich.educlass Process; 507427Sgblack@eecs.umich.educlass System; 517427Sgblack@eecs.umich.edunamespace Kernel { 527427Sgblack@eecs.umich.edu class Statistics; 537427Sgblack@eecs.umich.edu}; 547427Sgblack@eecs.umich.edu 557427Sgblack@eecs.umich.educlass ExecContext 567427Sgblack@eecs.umich.edu{ 577427Sgblack@eecs.umich.edu protected: 587604SGene.Wu@arm.com typedef TheISA::RegFile RegFile; 597427Sgblack@eecs.umich.edu typedef TheISA::MachInst MachInst; 607427Sgblack@eecs.umich.edu typedef TheISA::IntReg IntReg; 617427Sgblack@eecs.umich.edu typedef TheISA::MiscRegFile MiscRegFile; 627427Sgblack@eecs.umich.edu typedef TheISA::MiscReg MiscReg; 637427Sgblack@eecs.umich.edu public: 647427Sgblack@eecs.umich.edu enum Status 657427Sgblack@eecs.umich.edu { 667427Sgblack@eecs.umich.edu /// Initialized but not running yet. All CPUs start in 677427Sgblack@eecs.umich.edu /// this state, but most transition to Active on cycle 1. 687427Sgblack@eecs.umich.edu /// In MP or SMT systems, non-primary contexts will stay 697427Sgblack@eecs.umich.edu /// in this state until a thread is assigned to them. 707427Sgblack@eecs.umich.edu Unallocated, 717427Sgblack@eecs.umich.edu 727427Sgblack@eecs.umich.edu /// Running. Instructions should be executed only when 737427Sgblack@eecs.umich.edu /// the context is in this state. 747427Sgblack@eecs.umich.edu Active, 757427Sgblack@eecs.umich.edu 767427Sgblack@eecs.umich.edu /// Temporarily inactive. Entered while waiting for 777427Sgblack@eecs.umich.edu /// synchronization, etc. 787427Sgblack@eecs.umich.edu Suspended, 797427Sgblack@eecs.umich.edu 807427Sgblack@eecs.umich.edu /// Permanently shut down. Entered when target executes 817427Sgblack@eecs.umich.edu /// m5exit pseudo-instruction. When all contexts enter 827427Sgblack@eecs.umich.edu /// this state, the simulation will terminate. 837427Sgblack@eecs.umich.edu Halted 847427Sgblack@eecs.umich.edu }; 857427Sgblack@eecs.umich.edu 867427Sgblack@eecs.umich.edu virtual ~ExecContext() { }; 877427Sgblack@eecs.umich.edu 887427Sgblack@eecs.umich.edu virtual BaseCPU *getCpuPtr() = 0; 897427Sgblack@eecs.umich.edu 907427Sgblack@eecs.umich.edu virtual void setCpuId(int id) = 0; 917427Sgblack@eecs.umich.edu 927427Sgblack@eecs.umich.edu virtual int readCpuId() = 0; 937427Sgblack@eecs.umich.edu 947427Sgblack@eecs.umich.edu virtual FunctionalMemory *getMemPtr() = 0; 957427Sgblack@eecs.umich.edu 967427Sgblack@eecs.umich.edu#if FULL_SYSTEM 977427Sgblack@eecs.umich.edu virtual System *getSystemPtr() = 0; 987427Sgblack@eecs.umich.edu 997427Sgblack@eecs.umich.edu virtual PhysicalMemory *getPhysMemPtr() = 0; 1007427Sgblack@eecs.umich.edu 1017427Sgblack@eecs.umich.edu virtual AlphaITB *getITBPtr() = 0; 1027427Sgblack@eecs.umich.edu 1037427Sgblack@eecs.umich.edu virtual AlphaDTB * getDTBPtr() = 0; 1047427Sgblack@eecs.umich.edu 1057427Sgblack@eecs.umich.edu virtual Kernel::Statistics *getKernelStats() = 0; 1067427Sgblack@eecs.umich.edu#else 1077427Sgblack@eecs.umich.edu virtual Process *getProcessPtr() = 0; 1087427Sgblack@eecs.umich.edu#endif 1097427Sgblack@eecs.umich.edu 1107427Sgblack@eecs.umich.edu virtual Status status() const = 0; 1117427Sgblack@eecs.umich.edu 1127427Sgblack@eecs.umich.edu virtual void setStatus(Status new_status) = 0; 1137427Sgblack@eecs.umich.edu 1147427Sgblack@eecs.umich.edu /// Set the status to Active. Optional delay indicates number of 1157427Sgblack@eecs.umich.edu /// cycles to wait before beginning execution. 1167427Sgblack@eecs.umich.edu virtual void activate(int delay = 1) = 0; 1177427Sgblack@eecs.umich.edu 1187427Sgblack@eecs.umich.edu /// Set the status to Suspended. 1197427Sgblack@eecs.umich.edu virtual void suspend() = 0; 1207427Sgblack@eecs.umich.edu 1217436Sdam.sunwoo@arm.com /// Set the status to Unallocated. 1227436Sdam.sunwoo@arm.com virtual void deallocate() = 0; 1237436Sdam.sunwoo@arm.com 1247436Sdam.sunwoo@arm.com /// Set the status to Halted. 1257436Sdam.sunwoo@arm.com virtual void halt() = 0; 1267436Sdam.sunwoo@arm.com 1277436Sdam.sunwoo@arm.com#if FULL_SYSTEM 1287436Sdam.sunwoo@arm.com virtual void dumpFuncProfile() = 0; 1297436Sdam.sunwoo@arm.com#endif 1307436Sdam.sunwoo@arm.com 1317436Sdam.sunwoo@arm.com virtual void takeOverFrom(ExecContext *old_context) = 0; 1327436Sdam.sunwoo@arm.com 1337436Sdam.sunwoo@arm.com virtual void regStats(const std::string &name) = 0; 1347436Sdam.sunwoo@arm.com 1357436Sdam.sunwoo@arm.com virtual void serialize(std::ostream &os) = 0; 1367436Sdam.sunwoo@arm.com virtual void unserialize(Checkpoint *cp, const std::string §ion) = 0; 1377436Sdam.sunwoo@arm.com 1387436Sdam.sunwoo@arm.com#if FULL_SYSTEM 1397436Sdam.sunwoo@arm.com virtual EndQuiesceEvent *getQuiesceEvent() = 0; 1407436Sdam.sunwoo@arm.com 1417436Sdam.sunwoo@arm.com // Not necessarily the best location for these... 1427436Sdam.sunwoo@arm.com // Having an extra function just to read these is obnoxious 1437436Sdam.sunwoo@arm.com virtual Tick readLastActivate() = 0; 1447436Sdam.sunwoo@arm.com virtual Tick readLastSuspend() = 0; 1457436Sdam.sunwoo@arm.com 1467436Sdam.sunwoo@arm.com virtual void profileClear() = 0; 1477436Sdam.sunwoo@arm.com virtual void profileSample() = 0; 1487436Sdam.sunwoo@arm.com#endif 1497436Sdam.sunwoo@arm.com 1507436Sdam.sunwoo@arm.com virtual int getThreadNum() = 0; 1517436Sdam.sunwoo@arm.com 1527436Sdam.sunwoo@arm.com // Also somewhat obnoxious. Really only used for the TLB fault. 1537427Sgblack@eecs.umich.edu // However, may be quite useful in SPARC. 1547427Sgblack@eecs.umich.edu virtual TheISA::MachInst getInst() = 0; 1557427Sgblack@eecs.umich.edu 1567405SAli.Saidi@ARM.com virtual void copyArchRegs(ExecContext *xc) = 0; 1577405SAli.Saidi@ARM.com 1587405SAli.Saidi@ARM.com virtual void clearArchRegs() = 0; 1597405SAli.Saidi@ARM.com 1607614Sminkyu.jeong@arm.com // 1617614Sminkyu.jeong@arm.com // New accessors for new decoder. 1627614Sminkyu.jeong@arm.com // 1637614Sminkyu.jeong@arm.com virtual uint64_t readIntReg(int reg_idx) = 0; 1647614Sminkyu.jeong@arm.com 1657614Sminkyu.jeong@arm.com virtual float readFloatRegSingle(int reg_idx) = 0; 1667614Sminkyu.jeong@arm.com 1677614Sminkyu.jeong@arm.com virtual double readFloatRegDouble(int reg_idx) = 0; 1687614Sminkyu.jeong@arm.com 1697614Sminkyu.jeong@arm.com virtual uint64_t readFloatRegInt(int reg_idx) = 0; 1707614Sminkyu.jeong@arm.com 1717405SAli.Saidi@ARM.com virtual void setIntReg(int reg_idx, uint64_t val) = 0; 1727405SAli.Saidi@ARM.com 1737405SAli.Saidi@ARM.com virtual void setFloatRegSingle(int reg_idx, float val) = 0; 1747405SAli.Saidi@ARM.com 1757405SAli.Saidi@ARM.com virtual void setFloatRegDouble(int reg_idx, double val) = 0; 1767405SAli.Saidi@ARM.com 1777405SAli.Saidi@ARM.com virtual void setFloatRegInt(int reg_idx, uint64_t val) = 0; 1787405SAli.Saidi@ARM.com 1797405SAli.Saidi@ARM.com virtual uint64_t readPC() = 0; 1807405SAli.Saidi@ARM.com 1817405SAli.Saidi@ARM.com virtual void setPC(uint64_t val) = 0; 1827405SAli.Saidi@ARM.com 1837405SAli.Saidi@ARM.com virtual uint64_t readNextPC() = 0; 1847405SAli.Saidi@ARM.com 1857405SAli.Saidi@ARM.com virtual void setNextPC(uint64_t val) = 0; 1867405SAli.Saidi@ARM.com 1877405SAli.Saidi@ARM.com virtual MiscReg readMiscReg(int misc_reg) = 0; 1887405SAli.Saidi@ARM.com 1897405SAli.Saidi@ARM.com virtual MiscReg readMiscRegWithEffect(int misc_reg, Fault &fault) = 0; 1907405SAli.Saidi@ARM.com 1917405SAli.Saidi@ARM.com virtual Fault setMiscReg(int misc_reg, const MiscReg &val) = 0; 1927405SAli.Saidi@ARM.com 1937405SAli.Saidi@ARM.com virtual Fault setMiscRegWithEffect(int misc_reg, const MiscReg &val) = 0; 1947405SAli.Saidi@ARM.com 1957405SAli.Saidi@ARM.com // Also not necessarily the best location for these two. Hopefully will go 1967405SAli.Saidi@ARM.com // away once we decide upon where st cond failures goes. 1977405SAli.Saidi@ARM.com virtual unsigned readStCondFailures() = 0; 1987405SAli.Saidi@ARM.com 1997405SAli.Saidi@ARM.com virtual void setStCondFailures(unsigned sc_failures) = 0; 2007405SAli.Saidi@ARM.com 2017405SAli.Saidi@ARM.com#if FULL_SYSTEM 2027405SAli.Saidi@ARM.com virtual bool inPalMode() = 0; 2037405SAli.Saidi@ARM.com#endif 2047588SAli.Saidi@arm.com 2057588SAli.Saidi@arm.com // Only really makes sense for old CPU model. Still could be useful though. 2067588SAli.Saidi@arm.com virtual bool misspeculating() = 0; 2077583SAli.Saidi@arm.com 2087583SAli.Saidi@arm.com#if !FULL_SYSTEM 2097583SAli.Saidi@arm.com virtual IntReg getSyscallArg(int i) = 0; 2107583SAli.Saidi@arm.com 2117583SAli.Saidi@arm.com // used to shift args for indirect syscall 2127583SAli.Saidi@arm.com virtual void setSyscallArg(int i, IntReg val) = 0; 2137583SAli.Saidi@arm.com 2147583SAli.Saidi@arm.com virtual void setSyscallReturn(SyscallReturn return_value) = 0; 2157583SAli.Saidi@arm.com 2167583SAli.Saidi@arm.com// virtual void syscall() = 0; 2177583SAli.Saidi@arm.com 2187583SAli.Saidi@arm.com // Same with st cond failures. 2197583SAli.Saidi@arm.com virtual Counter readFuncExeInst() = 0; 2207583SAli.Saidi@arm.com#endif 2217405SAli.Saidi@ARM.com}; 2227405SAli.Saidi@ARM.com 2237405SAli.Saidi@ARM.comtemplate <class XC> 2247405SAli.Saidi@ARM.comclass ProxyExecContext : public ExecContext 2257405SAli.Saidi@ARM.com{ 2267405SAli.Saidi@ARM.com public: 2277405SAli.Saidi@ARM.com ProxyExecContext(XC *actual_xc) 2287405SAli.Saidi@ARM.com { actualXC = actual_xc; } 2297614Sminkyu.jeong@arm.com 2307614Sminkyu.jeong@arm.com private: 2317614Sminkyu.jeong@arm.com XC *actualXC; 2327614Sminkyu.jeong@arm.com 2337614Sminkyu.jeong@arm.com public: 2347614Sminkyu.jeong@arm.com 2357614Sminkyu.jeong@arm.com BaseCPU *getCpuPtr() { return actualXC->getCpuPtr(); } 2367614Sminkyu.jeong@arm.com 2377614Sminkyu.jeong@arm.com void setCpuId(int id) { actualXC->setCpuId(id); } 2387614Sminkyu.jeong@arm.com 2397405SAli.Saidi@ARM.com int readCpuId() { return actualXC->readCpuId(); } 2407405SAli.Saidi@ARM.com 2417405SAli.Saidi@ARM.com FunctionalMemory *getMemPtr() { return actualXC->getMemPtr(); } 2427405SAli.Saidi@ARM.com 2437405SAli.Saidi@ARM.com#if FULL_SYSTEM 2447405SAli.Saidi@ARM.com System *getSystemPtr() { return actualXC->getSystemPtr(); } 2457405SAli.Saidi@ARM.com 2467405SAli.Saidi@ARM.com PhysicalMemory *getPhysMemPtr() { return actualXC->getPhysMemPtr(); } 2477405SAli.Saidi@ARM.com 2487614Sminkyu.jeong@arm.com AlphaITB *getITBPtr() { return actualXC->getITBPtr(); } 2497614Sminkyu.jeong@arm.com 2507405SAli.Saidi@ARM.com AlphaDTB *getDTBPtr() { return actualXC->getDTBPtr(); } 2517405SAli.Saidi@ARM.com 2527405SAli.Saidi@ARM.com Kernel::Statistics *getKernelStats() { return actualXC->getKernelStats(); } 2537405SAli.Saidi@ARM.com#else 2547405SAli.Saidi@ARM.com Process *getProcessPtr() { return actualXC->getProcessPtr(); } 2557405SAli.Saidi@ARM.com#endif 2567405SAli.Saidi@ARM.com 2577408Sgblack@eecs.umich.edu Status status() const { return actualXC->status(); } 2587405SAli.Saidi@ARM.com 2597405SAli.Saidi@ARM.com void setStatus(Status new_status) { actualXC->setStatus(new_status); } 2607405SAli.Saidi@ARM.com 2617408Sgblack@eecs.umich.edu /// Set the status to Active. Optional delay indicates number of 2627408Sgblack@eecs.umich.edu /// cycles to wait before beginning execution. 2637408Sgblack@eecs.umich.edu void activate(int delay = 1) { actualXC->activate(delay); } 2647408Sgblack@eecs.umich.edu 2657408Sgblack@eecs.umich.edu /// Set the status to Suspended. 2667408Sgblack@eecs.umich.edu void suspend() { actualXC->suspend(); } 2677408Sgblack@eecs.umich.edu 2687408Sgblack@eecs.umich.edu /// Set the status to Unallocated. 2697408Sgblack@eecs.umich.edu void deallocate() { actualXC->deallocate(); } 2707408Sgblack@eecs.umich.edu 2717408Sgblack@eecs.umich.edu /// Set the status to Halted. 2727408Sgblack@eecs.umich.edu void halt() { actualXC->halt(); } 2737405SAli.Saidi@ARM.com 2747408Sgblack@eecs.umich.edu#if FULL_SYSTEM 2757408Sgblack@eecs.umich.edu void dumpFuncProfile() { actualXC->dumpFuncProfile(); } 2767408Sgblack@eecs.umich.edu#endif 2777408Sgblack@eecs.umich.edu 2787408Sgblack@eecs.umich.edu void takeOverFrom(ExecContext *oldContext) 2797408Sgblack@eecs.umich.edu { actualXC->takeOverFrom(oldContext); } 2807408Sgblack@eecs.umich.edu 2817408Sgblack@eecs.umich.edu void regStats(const std::string &name) { actualXC->regStats(name); } 2827408Sgblack@eecs.umich.edu 2837408Sgblack@eecs.umich.edu void serialize(std::ostream &os) { actualXC->serialize(os); } 2847408Sgblack@eecs.umich.edu void unserialize(Checkpoint *cp, const std::string §ion) 2857408Sgblack@eecs.umich.edu { actualXC->unserialize(cp, section); } 2867408Sgblack@eecs.umich.edu 2877408Sgblack@eecs.umich.edu#if FULL_SYSTEM 2887408Sgblack@eecs.umich.edu EndQuiesceEvent *getQuiesceEvent() { return actualXC->getQuiesceEvent(); } 2897408Sgblack@eecs.umich.edu 2907408Sgblack@eecs.umich.edu Tick readLastActivate() { return actualXC->readLastActivate(); } 2917408Sgblack@eecs.umich.edu Tick readLastSuspend() { return actualXC->readLastSuspend(); } 2927408Sgblack@eecs.umich.edu 2937408Sgblack@eecs.umich.edu void profileClear() { return actualXC->profileClear(); } 2947408Sgblack@eecs.umich.edu void profileSample() { return actualXC->profileSample(); } 2957408Sgblack@eecs.umich.edu#endif 2967408Sgblack@eecs.umich.edu 2977408Sgblack@eecs.umich.edu int getThreadNum() { return actualXC->getThreadNum(); } 2987408Sgblack@eecs.umich.edu 2997408Sgblack@eecs.umich.edu // @todo: Do I need this? 3007408Sgblack@eecs.umich.edu MachInst getInst() { return actualXC->getInst(); } 3017408Sgblack@eecs.umich.edu 3027408Sgblack@eecs.umich.edu // @todo: Do I need this? 3037408Sgblack@eecs.umich.edu void copyArchRegs(ExecContext *xc) { actualXC->copyArchRegs(xc); } 3047408Sgblack@eecs.umich.edu 3057408Sgblack@eecs.umich.edu void clearArchRegs() { actualXC->clearArchRegs(); } 3067408Sgblack@eecs.umich.edu 3077408Sgblack@eecs.umich.edu // 3087408Sgblack@eecs.umich.edu // New accessors for new decoder. 3097408Sgblack@eecs.umich.edu // 3107408Sgblack@eecs.umich.edu uint64_t readIntReg(int reg_idx) 3117408Sgblack@eecs.umich.edu { return actualXC->readIntReg(reg_idx); } 3127408Sgblack@eecs.umich.edu 3137408Sgblack@eecs.umich.edu float readFloatRegSingle(int reg_idx) 3147408Sgblack@eecs.umich.edu { return actualXC->readFloatRegSingle(reg_idx); } 3157408Sgblack@eecs.umich.edu 3167408Sgblack@eecs.umich.edu double readFloatRegDouble(int reg_idx) 3177408Sgblack@eecs.umich.edu { return actualXC->readFloatRegDouble(reg_idx); } 3187408Sgblack@eecs.umich.edu 3197408Sgblack@eecs.umich.edu uint64_t readFloatRegInt(int reg_idx) 3207408Sgblack@eecs.umich.edu { return actualXC->readFloatRegInt(reg_idx); } 3217408Sgblack@eecs.umich.edu 3227408Sgblack@eecs.umich.edu void setIntReg(int reg_idx, uint64_t val) 3237408Sgblack@eecs.umich.edu { actualXC->setIntReg(reg_idx, val); } 3247408Sgblack@eecs.umich.edu 3257408Sgblack@eecs.umich.edu void setFloatRegSingle(int reg_idx, float val) 3267408Sgblack@eecs.umich.edu { actualXC->setFloatRegSingle(reg_idx, val); } 3277408Sgblack@eecs.umich.edu 3287408Sgblack@eecs.umich.edu void setFloatRegDouble(int reg_idx, double val) 3297408Sgblack@eecs.umich.edu { actualXC->setFloatRegDouble(reg_idx, val); } 3307408Sgblack@eecs.umich.edu 3317408Sgblack@eecs.umich.edu void setFloatRegInt(int reg_idx, uint64_t val) 3327408Sgblack@eecs.umich.edu { actualXC->setFloatRegInt(reg_idx, val); } 3337408Sgblack@eecs.umich.edu 3347408Sgblack@eecs.umich.edu uint64_t readPC() { return actualXC->readPC(); } 3357408Sgblack@eecs.umich.edu 3367408Sgblack@eecs.umich.edu void setPC(uint64_t val) { actualXC->setPC(val); } 3377408Sgblack@eecs.umich.edu 3387408Sgblack@eecs.umich.edu uint64_t readNextPC() { return actualXC->readNextPC(); } 3397408Sgblack@eecs.umich.edu 3407408Sgblack@eecs.umich.edu void setNextPC(uint64_t val) { actualXC->setNextPC(val); } 3417408Sgblack@eecs.umich.edu 3427408Sgblack@eecs.umich.edu MiscReg readMiscReg(int misc_reg) 3437408Sgblack@eecs.umich.edu { return actualXC->readMiscReg(misc_reg); } 3447408Sgblack@eecs.umich.edu 3457408Sgblack@eecs.umich.edu MiscReg readMiscRegWithEffect(int misc_reg, Fault &fault) 3467408Sgblack@eecs.umich.edu { return actualXC->readMiscRegWithEffect(misc_reg, fault); } 3477408Sgblack@eecs.umich.edu 3487408Sgblack@eecs.umich.edu Fault setMiscReg(int misc_reg, const MiscReg &val) 3497408Sgblack@eecs.umich.edu { return actualXC->setMiscReg(misc_reg, val); } 3507408Sgblack@eecs.umich.edu 3517408Sgblack@eecs.umich.edu Fault setMiscRegWithEffect(int misc_reg, const MiscReg &val) 3527408Sgblack@eecs.umich.edu { return actualXC->setMiscRegWithEffect(misc_reg, val); } 3537408Sgblack@eecs.umich.edu 3547408Sgblack@eecs.umich.edu unsigned readStCondFailures() 3557408Sgblack@eecs.umich.edu { return actualXC->readStCondFailures(); } 3567408Sgblack@eecs.umich.edu 3577408Sgblack@eecs.umich.edu void setStCondFailures(unsigned sc_failures) 3587408Sgblack@eecs.umich.edu { actualXC->setStCondFailures(sc_failures); } 3597408Sgblack@eecs.umich.edu#if FULL_SYSTEM 3607408Sgblack@eecs.umich.edu bool inPalMode() { return actualXC->inPalMode(); } 3617408Sgblack@eecs.umich.edu#endif 3627408Sgblack@eecs.umich.edu 3637408Sgblack@eecs.umich.edu // @todo: Fix this! 3647408Sgblack@eecs.umich.edu bool misspeculating() { return actualXC->misspeculating(); } 3657408Sgblack@eecs.umich.edu 3667408Sgblack@eecs.umich.edu#if !FULL_SYSTEM 3677408Sgblack@eecs.umich.edu IntReg getSyscallArg(int i) { return actualXC->getSyscallArg(i); } 3687408Sgblack@eecs.umich.edu 3697408Sgblack@eecs.umich.edu // used to shift args for indirect syscall 3707408Sgblack@eecs.umich.edu void setSyscallArg(int i, IntReg val) 3717408Sgblack@eecs.umich.edu { actualXC->setSyscallArg(i, val); } 3727408Sgblack@eecs.umich.edu 3737408Sgblack@eecs.umich.edu void setSyscallReturn(SyscallReturn return_value) 3747408Sgblack@eecs.umich.edu { actualXC->setSyscallReturn(return_value); } 3757408Sgblack@eecs.umich.edu 3767408Sgblack@eecs.umich.edu// void syscall() { actualXC->syscall(); } 3777408Sgblack@eecs.umich.edu 3787408Sgblack@eecs.umich.edu Counter readFuncExeInst() { return actualXC->readFuncExeInst(); } 3797408Sgblack@eecs.umich.edu#endif 3807408Sgblack@eecs.umich.edu}; 3817408Sgblack@eecs.umich.edu 3827405SAli.Saidi@ARM.com#endif 3837583SAli.Saidi@arm.com