base.hh revision 10193
12810SN/A/* 212724Snikos.nikoleris@arm.com * Copyright (c) 2011-2012 ARM Limited 38856Sandreas.hansson@arm.com * Copyright (c) 2013 Advanced Micro Devices, Inc. 48856Sandreas.hansson@arm.com * All rights reserved 58856Sandreas.hansson@arm.com * 68856Sandreas.hansson@arm.com * The license below extends only to copyright in the software and shall 78856Sandreas.hansson@arm.com * not be construed as granting a license to any other intellectual 88856Sandreas.hansson@arm.com * property including but not limited to intellectual property relating 98856Sandreas.hansson@arm.com * to a hardware implementation of the functionality of the software 108856Sandreas.hansson@arm.com * licensed hereunder. You may use the software subject to the license 118856Sandreas.hansson@arm.com * terms below provided that you ensure that this notice is replicated 128856Sandreas.hansson@arm.com * unmodified and in its entirety in all distributions of the software, 138856Sandreas.hansson@arm.com * modified or unmodified, in source code or in binary form. 142810SN/A * 152810SN/A * Copyright (c) 2002-2005 The Regents of The University of Michigan 162810SN/A * All rights reserved. 172810SN/A * 182810SN/A * Redistribution and use in source and binary forms, with or without 192810SN/A * modification, are permitted provided that the following conditions are 202810SN/A * met: redistributions of source code must retain the above copyright 212810SN/A * notice, this list of conditions and the following disclaimer; 222810SN/A * redistributions in binary form must reproduce the above copyright 232810SN/A * notice, this list of conditions and the following disclaimer in the 242810SN/A * documentation and/or other materials provided with the distribution; 252810SN/A * neither the name of the copyright holders nor the names of its 262810SN/A * contributors may be used to endorse or promote products derived from 272810SN/A * this software without specific prior written permission. 282810SN/A * 292810SN/A * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 302810SN/A * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 312810SN/A * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 322810SN/A * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 332810SN/A * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 342810SN/A * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 352810SN/A * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 362810SN/A * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 372810SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 382810SN/A * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 392810SN/A * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 402810SN/A * 4112724Snikos.nikoleris@arm.com * Authors: Steve Reinhardt 422810SN/A * Dave Greene 432810SN/A * Nathan Binkert 442810SN/A */ 452810SN/A 462810SN/A#ifndef __CPU_SIMPLE_BASE_HH__ 472810SN/A#define __CPU_SIMPLE_BASE_HH__ 482810SN/A 4911486Snikos.nikoleris@arm.com#include "base/statistics.hh" 5011486Snikos.nikoleris@arm.com#include "config/the_isa.hh" 5112724Snikos.nikoleris@arm.com#include "cpu/base.hh" 5212724Snikos.nikoleris@arm.com#include "cpu/checker/cpu.hh" 538232Snate@binkert.org#include "cpu/pc_event.hh" 5412724Snikos.nikoleris@arm.com#include "cpu/simple_thread.hh" 5512724Snikos.nikoleris@arm.com#include "cpu/static_inst.hh" 5611486Snikos.nikoleris@arm.com#include "mem/packet.hh" 5712724Snikos.nikoleris@arm.com#include "mem/port.hh" 5812724Snikos.nikoleris@arm.com#include "mem/request.hh" 5912724Snikos.nikoleris@arm.com#include "sim/eventq.hh" 6012724Snikos.nikoleris@arm.com#include "sim/full_system.hh" 6112724Snikos.nikoleris@arm.com#include "sim/system.hh" 6212724Snikos.nikoleris@arm.com 6312724Snikos.nikoleris@arm.com// forward declarations 642810SN/Aclass Checkpoint; 652810SN/Aclass Process; 662810SN/Aclass Processor; 678856Sandreas.hansson@arm.comclass ThreadContext; 688856Sandreas.hansson@arm.com 698856Sandreas.hansson@arm.comnamespace TheISA 708922Swilliam.wang@arm.com{ 7112084Sspwilson2@wisc.edu class DTB; 7212084Sspwilson2@wisc.edu class ITB; 738856Sandreas.hansson@arm.com} 748856Sandreas.hansson@arm.com 754475SN/Anamespace Trace { 7611053Sandreas.hansson@arm.com class InstRecord; 775034SN/A} 7812724Snikos.nikoleris@arm.com 7912724Snikos.nikoleris@arm.comstruct BaseSimpleCPUParams; 8011377Sandreas.hansson@arm.comclass BPredUnit; 8111377Sandreas.hansson@arm.com 8212724Snikos.nikoleris@arm.comclass BaseSimpleCPU : public BaseCPU 8312724Snikos.nikoleris@arm.com{ 8412724Snikos.nikoleris@arm.com protected: 8512724Snikos.nikoleris@arm.com typedef TheISA::MiscReg MiscReg; 8612724Snikos.nikoleris@arm.com typedef TheISA::FloatReg FloatReg; 8712724Snikos.nikoleris@arm.com typedef TheISA::FloatRegBits FloatRegBits; 8812724Snikos.nikoleris@arm.com typedef TheISA::CCReg CCReg; 8912724Snikos.nikoleris@arm.com 9011053Sandreas.hansson@arm.com BPredUnit *branchPred; 9111722Ssophiane.senni@gmail.com 9211722Ssophiane.senni@gmail.com protected: 9311722Ssophiane.senni@gmail.com Trace::InstRecord *traceData; 9411722Ssophiane.senni@gmail.com 959263Smrinmoy.ghosh@arm.com inline void checkPcEventQueue() { 965034SN/A Addr oldpc, pc = thread->instAddr(); 9711331Sandreas.hansson@arm.com do { 9812724Snikos.nikoleris@arm.com oldpc = pc; 9910884Sandreas.hansson@arm.com system->pcEventQueue.service(tc); 1004626SN/A pc = thread->instAddr(); 10110360Sandreas.hansson@arm.com } while (oldpc != pc); 10211484Snikos.nikoleris@arm.com } 1035034SN/A 1048883SAli.Saidi@ARM.com public: 1058833Sdam.sunwoo@arm.com void wakeup(); 1064458SN/A 10711377Sandreas.hansson@arm.com void zero_fill_64(Addr addr) { 10811377Sandreas.hansson@arm.com static int warned = 0; 10911377Sandreas.hansson@arm.com if (!warned) { 11011377Sandreas.hansson@arm.com warn ("WH64 is not implemented"); 11111377Sandreas.hansson@arm.com warned = 1; 11211377Sandreas.hansson@arm.com } 11311331Sandreas.hansson@arm.com }; 11411331Sandreas.hansson@arm.com 11512724Snikos.nikoleris@arm.com public: 11612730Sodanrc@yahoo.com.br BaseSimpleCPU(BaseSimpleCPUParams *params); 11712724Snikos.nikoleris@arm.com virtual ~BaseSimpleCPU(); 11812724Snikos.nikoleris@arm.com 11912724Snikos.nikoleris@arm.com public: 12012724Snikos.nikoleris@arm.com /** SimpleThread object, provides all the architectural state. */ 12112724Snikos.nikoleris@arm.com SimpleThread *thread; 12212724Snikos.nikoleris@arm.com 12312724Snikos.nikoleris@arm.com /** ThreadContext object, provides an interface for external 12412724Snikos.nikoleris@arm.com * objects to modify this thread's state. 12512724Snikos.nikoleris@arm.com */ 12612724Snikos.nikoleris@arm.com ThreadContext *tc; 12712724Snikos.nikoleris@arm.com 1282810SN/A CheckerCPU *checker; 1292810SN/A 1303013SN/A protected: 1318856Sandreas.hansson@arm.com 1322810SN/A enum Status { 1333013SN/A Idle, 13410714Sandreas.hansson@arm.com Running, 1352810SN/A Faulting, 1369614Srene.dejong@arm.com ITBWaitResponse, 1379614Srene.dejong@arm.com IcacheRetry, 1389614Srene.dejong@arm.com IcacheWaitResponse, 13910345SCurtis.Dunham@arm.com IcacheWaitSwitch, 14010714Sandreas.hansson@arm.com DTBWaitResponse, 14110345SCurtis.Dunham@arm.com DcacheRetry, 1429614Srene.dejong@arm.com DcacheWaitResponse, 1432810SN/A DcacheWaitSwitch, 1442810SN/A }; 1452810SN/A 1468856Sandreas.hansson@arm.com Status _status; 1472810SN/A 1483013SN/A public: 14910714Sandreas.hansson@arm.com 1503013SN/A Addr dbg_vtophys(Addr addr); 1518856Sandreas.hansson@arm.com 15210714Sandreas.hansson@arm.com bool interval_stats; 1538922Swilliam.wang@arm.com 1542897SN/A // current instruction 1552810SN/A TheISA::MachInst inst; 1562810SN/A 15710344Sandreas.hansson@arm.com StaticInstPtr curStaticInst; 15810344Sandreas.hansson@arm.com StaticInstPtr curMacroStaticInst; 15910344Sandreas.hansson@arm.com 16010714Sandreas.hansson@arm.com //This is the offset from the current pc that fetch should be performed at 16110344Sandreas.hansson@arm.com Addr fetchOffset; 16210344Sandreas.hansson@arm.com //This flag says to stay at the current pc. This is useful for 16310344Sandreas.hansson@arm.com //instructions which go beyond MachInst boundaries. 16410713Sandreas.hansson@arm.com bool stayAtPC; 16510344Sandreas.hansson@arm.com 1662844SN/A void checkForInterrupts(); 16712730Sodanrc@yahoo.com.br void setupFetchRequest(Request *req); 16812730Sodanrc@yahoo.com.br void preExecute(); 16912730Sodanrc@yahoo.com.br void postExecute(); 17012730Sodanrc@yahoo.com.br void advancePC(Fault fault); 17112730Sodanrc@yahoo.com.br 17212730Sodanrc@yahoo.com.br virtual void deallocateContext(ThreadID thread_num); 17312730Sodanrc@yahoo.com.br virtual void haltContext(ThreadID thread_num); 17412730Sodanrc@yahoo.com.br 17512730Sodanrc@yahoo.com.br // statistics 17612730Sodanrc@yahoo.com.br virtual void regStats(); 1772810SN/A virtual void resetStats(); 1782858SN/A 1792858SN/A virtual void startup(); 18012724Snikos.nikoleris@arm.com 1818922Swilliam.wang@arm.com // number of simulated instructions 18212724Snikos.nikoleris@arm.com Counter numInst; 18312724Snikos.nikoleris@arm.com Counter startNumInst; 1842858SN/A Stats::Scalar numInsts; 1852858SN/A Counter numOp; 1869294Sandreas.hansson@arm.com Counter startNumOp; 1879294Sandreas.hansson@arm.com Stats::Scalar numOps; 1888922Swilliam.wang@arm.com 1898922Swilliam.wang@arm.com void countInst() 19012724Snikos.nikoleris@arm.com { 1918922Swilliam.wang@arm.com if (!curStaticInst->isMicroop() || curStaticInst->isLastMicroop()) { 1928922Swilliam.wang@arm.com numInst++; 1938922Swilliam.wang@arm.com numInsts++; 1948922Swilliam.wang@arm.com } 1958922Swilliam.wang@arm.com numOp++; 1969294Sandreas.hansson@arm.com numOps++; 1979294Sandreas.hansson@arm.com 1988922Swilliam.wang@arm.com system->totalNumInsts++; 1998922Swilliam.wang@arm.com thread->funcExeInst++; 20012724Snikos.nikoleris@arm.com } 2018922Swilliam.wang@arm.com 2028922Swilliam.wang@arm.com virtual Counter totalInsts() const 2038922Swilliam.wang@arm.com { 2048922Swilliam.wang@arm.com return numInst - startNumInst; 2054628SN/A } 20610821Sandreas.hansson@arm.com 20710821Sandreas.hansson@arm.com virtual Counter totalOps() const 20810821Sandreas.hansson@arm.com { 20910821Sandreas.hansson@arm.com return numOp - startNumOp; 21010821Sandreas.hansson@arm.com } 21110821Sandreas.hansson@arm.com 21210821Sandreas.hansson@arm.com //number of integer alu accesses 21310821Sandreas.hansson@arm.com Stats::Scalar numIntAluAccesses; 21410821Sandreas.hansson@arm.com 21510821Sandreas.hansson@arm.com //number of float alu accesses 21610821Sandreas.hansson@arm.com Stats::Scalar numFpAluAccesses; 2172858SN/A 21812724Snikos.nikoleris@arm.com //number of function calls/returns 21912724Snikos.nikoleris@arm.com Stats::Scalar numCallsReturns; 22012724Snikos.nikoleris@arm.com 22112724Snikos.nikoleris@arm.com //conditional control instructions; 22212724Snikos.nikoleris@arm.com Stats::Scalar numCondCtrlInsts; 22312724Snikos.nikoleris@arm.com 22412724Snikos.nikoleris@arm.com //number of int instructions 22512724Snikos.nikoleris@arm.com Stats::Scalar numIntInsts; 22612724Snikos.nikoleris@arm.com 22712724Snikos.nikoleris@arm.com //number of float instructions 22812724Snikos.nikoleris@arm.com Stats::Scalar numFpInsts; 22912724Snikos.nikoleris@arm.com 23012724Snikos.nikoleris@arm.com //number of integer register file accesses 23112724Snikos.nikoleris@arm.com Stats::Scalar numIntRegReads; 23212724Snikos.nikoleris@arm.com Stats::Scalar numIntRegWrites; 23312724Snikos.nikoleris@arm.com 23412724Snikos.nikoleris@arm.com //number of float register file accesses 23512724Snikos.nikoleris@arm.com Stats::Scalar numFpRegReads; 23612724Snikos.nikoleris@arm.com Stats::Scalar numFpRegWrites; 23712724Snikos.nikoleris@arm.com 23812724Snikos.nikoleris@arm.com //number of condition code register file accesses 23912724Snikos.nikoleris@arm.com Stats::Scalar numCCRegReads; 24012724Snikos.nikoleris@arm.com Stats::Scalar numCCRegWrites; 24112724Snikos.nikoleris@arm.com 24212724Snikos.nikoleris@arm.com // number of simulated memory references 24312724Snikos.nikoleris@arm.com Stats::Scalar numMemRefs; 24412724Snikos.nikoleris@arm.com Stats::Scalar numLoadInsts; 24512724Snikos.nikoleris@arm.com Stats::Scalar numStoreInsts; 24612724Snikos.nikoleris@arm.com 24712724Snikos.nikoleris@arm.com // number of idle cycles 24812724Snikos.nikoleris@arm.com Stats::Formula numIdleCycles; 24912724Snikos.nikoleris@arm.com 25012724Snikos.nikoleris@arm.com // number of busy cycles 25112724Snikos.nikoleris@arm.com Stats::Formula numBusyCycles; 25212724Snikos.nikoleris@arm.com 25312724Snikos.nikoleris@arm.com // number of simulated loads 25412724Snikos.nikoleris@arm.com Counter numLoad; 25512724Snikos.nikoleris@arm.com Counter startNumLoad; 25612724Snikos.nikoleris@arm.com 25712724Snikos.nikoleris@arm.com // number of idle cycles 25812724Snikos.nikoleris@arm.com Stats::Average notIdleFraction; 25912724Snikos.nikoleris@arm.com Stats::Formula idleFraction; 26012724Snikos.nikoleris@arm.com 26112724Snikos.nikoleris@arm.com // number of cycles stalled for I-cache responses 26212724Snikos.nikoleris@arm.com Stats::Scalar icacheStallCycles; 26312724Snikos.nikoleris@arm.com Counter lastIcacheStall; 26412724Snikos.nikoleris@arm.com 26512724Snikos.nikoleris@arm.com // number of cycles stalled for I-cache retries 26612724Snikos.nikoleris@arm.com Stats::Scalar icacheRetryCycles; 26712724Snikos.nikoleris@arm.com Counter lastIcacheRetry; 26812724Snikos.nikoleris@arm.com 26912724Snikos.nikoleris@arm.com // number of cycles stalled for D-cache responses 27012724Snikos.nikoleris@arm.com Stats::Scalar dcacheStallCycles; 27112724Snikos.nikoleris@arm.com Counter lastDcacheStall; 27212724Snikos.nikoleris@arm.com 27312724Snikos.nikoleris@arm.com // number of cycles stalled for D-cache retries 27412724Snikos.nikoleris@arm.com Stats::Scalar dcacheRetryCycles; 27512724Snikos.nikoleris@arm.com Counter lastDcacheRetry; 27612724Snikos.nikoleris@arm.com 27712724Snikos.nikoleris@arm.com /// @{ 27812724Snikos.nikoleris@arm.com /// Total number of branches fetched 27912724Snikos.nikoleris@arm.com Stats::Scalar numBranches; 28012724Snikos.nikoleris@arm.com /// Number of branches predicted as taken 28112724Snikos.nikoleris@arm.com Stats::Scalar numPredictedBranches; 28212724Snikos.nikoleris@arm.com /// Number of misprediced branches 28312724Snikos.nikoleris@arm.com Stats::Scalar numBranchMispred; 28412724Snikos.nikoleris@arm.com /// @} 28512724Snikos.nikoleris@arm.com 28612724Snikos.nikoleris@arm.com // instruction mix histogram by OpClass 28712724Snikos.nikoleris@arm.com Stats::Vector statExecutedInstType; 28812724Snikos.nikoleris@arm.com 28912724Snikos.nikoleris@arm.com void serializeThread(std::ostream &os, ThreadID tid); 29012724Snikos.nikoleris@arm.com void unserializeThread(Checkpoint *cp, const std::string §ion, 29112724Snikos.nikoleris@arm.com ThreadID tid); 29212724Snikos.nikoleris@arm.com 29312724Snikos.nikoleris@arm.com // These functions are only used in CPU models that split 29412724Snikos.nikoleris@arm.com // effective address computation from the actual memory access. 29512724Snikos.nikoleris@arm.com void setEA(Addr EA) { panic("BaseSimpleCPU::setEA() not implemented\n"); } 29612724Snikos.nikoleris@arm.com Addr getEA() { panic("BaseSimpleCPU::getEA() not implemented\n"); 29712724Snikos.nikoleris@arm.com M5_DUMMY_RETURN} 29812724Snikos.nikoleris@arm.com 29912724Snikos.nikoleris@arm.com // The register accessor methods provide the index of the 30012724Snikos.nikoleris@arm.com // instruction's operand (e.g., 0 or 1), not the architectural 30112724Snikos.nikoleris@arm.com // register index, to simplify the implementation of register 30212724Snikos.nikoleris@arm.com // renaming. We find the architectural register index by indexing 30312724Snikos.nikoleris@arm.com // into the instruction's own operand index table. Note that a 30412724Snikos.nikoleris@arm.com // raw pointer to the StaticInst is provided instead of a 30512724Snikos.nikoleris@arm.com // ref-counted StaticInstPtr to redice overhead. This is fine as 30612724Snikos.nikoleris@arm.com // long as these methods don't copy the pointer into any long-term 30712724Snikos.nikoleris@arm.com // storage (which is pretty hard to imagine they would have reason 30812724Snikos.nikoleris@arm.com // to do). 30912724Snikos.nikoleris@arm.com 31012724Snikos.nikoleris@arm.com uint64_t readIntRegOperand(const StaticInst *si, int idx) 31112724Snikos.nikoleris@arm.com { 31212724Snikos.nikoleris@arm.com numIntRegReads++; 31312724Snikos.nikoleris@arm.com return thread->readIntReg(si->srcRegIdx(idx)); 31412724Snikos.nikoleris@arm.com } 31512724Snikos.nikoleris@arm.com 31612724Snikos.nikoleris@arm.com FloatReg readFloatRegOperand(const StaticInst *si, int idx) 31712724Snikos.nikoleris@arm.com { 31812724Snikos.nikoleris@arm.com numFpRegReads++; 31912724Snikos.nikoleris@arm.com int reg_idx = si->srcRegIdx(idx) - TheISA::FP_Reg_Base; 32012724Snikos.nikoleris@arm.com return thread->readFloatReg(reg_idx); 32112724Snikos.nikoleris@arm.com } 32212724Snikos.nikoleris@arm.com 32312724Snikos.nikoleris@arm.com FloatRegBits readFloatRegOperandBits(const StaticInst *si, int idx) 32412724Snikos.nikoleris@arm.com { 32512724Snikos.nikoleris@arm.com numFpRegReads++; 32612724Snikos.nikoleris@arm.com int reg_idx = si->srcRegIdx(idx) - TheISA::FP_Reg_Base; 32712724Snikos.nikoleris@arm.com return thread->readFloatRegBits(reg_idx); 32812724Snikos.nikoleris@arm.com } 32912724Snikos.nikoleris@arm.com 33012724Snikos.nikoleris@arm.com CCReg readCCRegOperand(const StaticInst *si, int idx) 33112724Snikos.nikoleris@arm.com { 33212724Snikos.nikoleris@arm.com numCCRegReads++; 33312724Snikos.nikoleris@arm.com int reg_idx = si->srcRegIdx(idx) - TheISA::CC_Reg_Base; 33412724Snikos.nikoleris@arm.com return thread->readCCReg(reg_idx); 33512724Snikos.nikoleris@arm.com } 33612724Snikos.nikoleris@arm.com 33712724Snikos.nikoleris@arm.com void setIntRegOperand(const StaticInst *si, int idx, uint64_t val) 33812724Snikos.nikoleris@arm.com { 33912724Snikos.nikoleris@arm.com numIntRegWrites++; 34012724Snikos.nikoleris@arm.com thread->setIntReg(si->destRegIdx(idx), val); 34112724Snikos.nikoleris@arm.com } 34212724Snikos.nikoleris@arm.com 34312724Snikos.nikoleris@arm.com void setFloatRegOperand(const StaticInst *si, int idx, FloatReg val) 34412724Snikos.nikoleris@arm.com { 34512724Snikos.nikoleris@arm.com numFpRegWrites++; 34612724Snikos.nikoleris@arm.com int reg_idx = si->destRegIdx(idx) - TheISA::FP_Reg_Base; 34712724Snikos.nikoleris@arm.com thread->setFloatReg(reg_idx, val); 34812724Snikos.nikoleris@arm.com } 34912724Snikos.nikoleris@arm.com 35012724Snikos.nikoleris@arm.com void setFloatRegOperandBits(const StaticInst *si, int idx, 35112724Snikos.nikoleris@arm.com FloatRegBits val) 35212724Snikos.nikoleris@arm.com { 35312724Snikos.nikoleris@arm.com numFpRegWrites++; 35412724Snikos.nikoleris@arm.com int reg_idx = si->destRegIdx(idx) - TheISA::FP_Reg_Base; 35512724Snikos.nikoleris@arm.com thread->setFloatRegBits(reg_idx, val); 35612724Snikos.nikoleris@arm.com } 35712724Snikos.nikoleris@arm.com 35812724Snikos.nikoleris@arm.com void setCCRegOperand(const StaticInst *si, int idx, CCReg val) 35912724Snikos.nikoleris@arm.com { 36012724Snikos.nikoleris@arm.com numCCRegWrites++; 36112724Snikos.nikoleris@arm.com int reg_idx = si->destRegIdx(idx) - TheISA::CC_Reg_Base; 36212724Snikos.nikoleris@arm.com thread->setCCReg(reg_idx, val); 36312724Snikos.nikoleris@arm.com } 36412724Snikos.nikoleris@arm.com 36512724Snikos.nikoleris@arm.com bool readPredicate() { return thread->readPredicate(); } 36612724Snikos.nikoleris@arm.com void setPredicate(bool val) 36712724Snikos.nikoleris@arm.com { 36812724Snikos.nikoleris@arm.com thread->setPredicate(val); 36912724Snikos.nikoleris@arm.com if (traceData) { 37012724Snikos.nikoleris@arm.com traceData->setPredicate(val); 37112724Snikos.nikoleris@arm.com } 37212724Snikos.nikoleris@arm.com } 37312724Snikos.nikoleris@arm.com TheISA::PCState pcState() { return thread->pcState(); } 37412724Snikos.nikoleris@arm.com void pcState(const TheISA::PCState &val) { thread->pcState(val); } 37512724Snikos.nikoleris@arm.com Addr instAddr() { return thread->instAddr(); } 37612724Snikos.nikoleris@arm.com Addr nextInstAddr() { return thread->nextInstAddr(); } 37712724Snikos.nikoleris@arm.com MicroPC microPC() { return thread->microPC(); } 37812724Snikos.nikoleris@arm.com 37912724Snikos.nikoleris@arm.com MiscReg readMiscRegNoEffect(int misc_reg) 38012724Snikos.nikoleris@arm.com { 38112724Snikos.nikoleris@arm.com return thread->readMiscRegNoEffect(misc_reg); 38212724Snikos.nikoleris@arm.com } 38312724Snikos.nikoleris@arm.com 38412724Snikos.nikoleris@arm.com MiscReg readMiscReg(int misc_reg) 38512724Snikos.nikoleris@arm.com { 38612724Snikos.nikoleris@arm.com numIntRegReads++; 38712724Snikos.nikoleris@arm.com return thread->readMiscReg(misc_reg); 38812724Snikos.nikoleris@arm.com } 38912724Snikos.nikoleris@arm.com 39012724Snikos.nikoleris@arm.com void setMiscReg(int misc_reg, const MiscReg &val) 39112724Snikos.nikoleris@arm.com { 39212724Snikos.nikoleris@arm.com numIntRegWrites++; 39312724Snikos.nikoleris@arm.com return thread->setMiscReg(misc_reg, val); 39412724Snikos.nikoleris@arm.com } 39512724Snikos.nikoleris@arm.com 39612724Snikos.nikoleris@arm.com MiscReg readMiscRegOperand(const StaticInst *si, int idx) 39712724Snikos.nikoleris@arm.com { 39812724Snikos.nikoleris@arm.com numIntRegReads++; 39912724Snikos.nikoleris@arm.com int reg_idx = si->srcRegIdx(idx) - TheISA::Misc_Reg_Base; 40012724Snikos.nikoleris@arm.com return thread->readMiscReg(reg_idx); 40112724Snikos.nikoleris@arm.com } 40212724Snikos.nikoleris@arm.com 40312724Snikos.nikoleris@arm.com void setMiscRegOperand( 40412724Snikos.nikoleris@arm.com const StaticInst *si, int idx, const MiscReg &val) 40512724Snikos.nikoleris@arm.com { 40612724Snikos.nikoleris@arm.com numIntRegWrites++; 40712724Snikos.nikoleris@arm.com int reg_idx = si->destRegIdx(idx) - TheISA::Misc_Reg_Base; 40812724Snikos.nikoleris@arm.com return thread->setMiscReg(reg_idx, val); 40912724Snikos.nikoleris@arm.com } 41012724Snikos.nikoleris@arm.com 41112724Snikos.nikoleris@arm.com void demapPage(Addr vaddr, uint64_t asn) 41212724Snikos.nikoleris@arm.com { 41312724Snikos.nikoleris@arm.com thread->demapPage(vaddr, asn); 41412724Snikos.nikoleris@arm.com } 41512724Snikos.nikoleris@arm.com 41612724Snikos.nikoleris@arm.com void demapInstPage(Addr vaddr, uint64_t asn) 41712724Snikos.nikoleris@arm.com { 41812724Snikos.nikoleris@arm.com thread->demapInstPage(vaddr, asn); 41912724Snikos.nikoleris@arm.com } 42012724Snikos.nikoleris@arm.com 42112724Snikos.nikoleris@arm.com void demapDataPage(Addr vaddr, uint64_t asn) 42212724Snikos.nikoleris@arm.com { 42312724Snikos.nikoleris@arm.com thread->demapDataPage(vaddr, asn); 42412724Snikos.nikoleris@arm.com } 42512724Snikos.nikoleris@arm.com 42612724Snikos.nikoleris@arm.com unsigned readStCondFailures() { 42712724Snikos.nikoleris@arm.com return thread->readStCondFailures(); 42812724Snikos.nikoleris@arm.com } 42912724Snikos.nikoleris@arm.com 43012724Snikos.nikoleris@arm.com void setStCondFailures(unsigned sc_failures) { 43112724Snikos.nikoleris@arm.com thread->setStCondFailures(sc_failures); 43212724Snikos.nikoleris@arm.com } 43312724Snikos.nikoleris@arm.com 43412724Snikos.nikoleris@arm.com MiscReg readRegOtherThread(int regIdx, ThreadID tid = InvalidThreadID) 43512724Snikos.nikoleris@arm.com { 43612724Snikos.nikoleris@arm.com panic("Simple CPU models do not support multithreaded " 43712724Snikos.nikoleris@arm.com "register access.\n"); 43812724Snikos.nikoleris@arm.com } 43912724Snikos.nikoleris@arm.com 44012724Snikos.nikoleris@arm.com void setRegOtherThread(int regIdx, const MiscReg &val, 44112724Snikos.nikoleris@arm.com ThreadID tid = InvalidThreadID) 44212724Snikos.nikoleris@arm.com { 44312724Snikos.nikoleris@arm.com panic("Simple CPU models do not support multithreaded " 44412724Snikos.nikoleris@arm.com "register access.\n"); 44512724Snikos.nikoleris@arm.com } 44612724Snikos.nikoleris@arm.com 44712724Snikos.nikoleris@arm.com //Fault CacheOp(uint8_t Op, Addr EA); 44812724Snikos.nikoleris@arm.com 44912724Snikos.nikoleris@arm.com Fault hwrei() { return thread->hwrei(); } 45012724Snikos.nikoleris@arm.com bool simPalCheck(int palFunc) { return thread->simPalCheck(palFunc); } 45112724Snikos.nikoleris@arm.com 45212724Snikos.nikoleris@arm.com void 45312724Snikos.nikoleris@arm.com syscall(int64_t callnum) 45412724Snikos.nikoleris@arm.com { 45512724Snikos.nikoleris@arm.com if (FullSystem) 45612724Snikos.nikoleris@arm.com panic("Syscall emulation isn't available in FS mode.\n"); 45712724Snikos.nikoleris@arm.com 45812724Snikos.nikoleris@arm.com thread->syscall(callnum); 45912724Snikos.nikoleris@arm.com } 46012724Snikos.nikoleris@arm.com 46112724Snikos.nikoleris@arm.com bool misspeculating() { return thread->misspeculating(); } 46212724Snikos.nikoleris@arm.com ThreadContext *tcBase() { return tc; } 46312724Snikos.nikoleris@arm.com 46412724Snikos.nikoleris@arm.com private: 46512724Snikos.nikoleris@arm.com TheISA::PCState pred_pc; 46612724Snikos.nikoleris@arm.com}; 46712724Snikos.nikoleris@arm.com 46812724Snikos.nikoleris@arm.com#endif // __CPU_SIMPLE_BASE_HH__ 46912724Snikos.nikoleris@arm.com