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 &section) = 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 &section)
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