exec_context.hh revision 11608
111147Smitch.hayenga@arm.com/*
211147Smitch.hayenga@arm.com * Copyright (c) 2014-2015 ARM Limited
311147Smitch.hayenga@arm.com * All rights reserved
411147Smitch.hayenga@arm.com *
511147Smitch.hayenga@arm.com * The license below extends only to copyright in the software and shall
611147Smitch.hayenga@arm.com * not be construed as granting a license to any other intellectual
711147Smitch.hayenga@arm.com * property including but not limited to intellectual property relating
811147Smitch.hayenga@arm.com * to a hardware implementation of the functionality of the software
911147Smitch.hayenga@arm.com * licensed hereunder.  You may use the software subject to the license
1011147Smitch.hayenga@arm.com * terms below provided that you ensure that this notice is replicated
1111147Smitch.hayenga@arm.com * unmodified and in its entirety in all distributions of the software,
1211147Smitch.hayenga@arm.com * modified or unmodified, in source code or in binary form.
1311147Smitch.hayenga@arm.com *
1411147Smitch.hayenga@arm.com * Copyright (c) 2002-2005 The Regents of The University of Michigan
1511147Smitch.hayenga@arm.com * All rights reserved.
1611147Smitch.hayenga@arm.com *
1711147Smitch.hayenga@arm.com * Redistribution and use in source and binary forms, with or without
1811147Smitch.hayenga@arm.com * modification, are permitted provided that the following conditions are
1911147Smitch.hayenga@arm.com * met: redistributions of source code must retain the above copyright
2011147Smitch.hayenga@arm.com * notice, this list of conditions and the following disclaimer;
2111147Smitch.hayenga@arm.com * redistributions in binary form must reproduce the above copyright
2211147Smitch.hayenga@arm.com * notice, this list of conditions and the following disclaimer in the
2311147Smitch.hayenga@arm.com * documentation and/or other materials provided with the distribution;
2411147Smitch.hayenga@arm.com * neither the name of the copyright holders nor the names of its
2511147Smitch.hayenga@arm.com * contributors may be used to endorse or promote products derived from
2611147Smitch.hayenga@arm.com * this software without specific prior written permission.
2711147Smitch.hayenga@arm.com *
2811147Smitch.hayenga@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
2911147Smitch.hayenga@arm.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
3011147Smitch.hayenga@arm.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
3111147Smitch.hayenga@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
3211147Smitch.hayenga@arm.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
3311147Smitch.hayenga@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
3411147Smitch.hayenga@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
3511147Smitch.hayenga@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
3611147Smitch.hayenga@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
3711147Smitch.hayenga@arm.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
3811147Smitch.hayenga@arm.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3911147Smitch.hayenga@arm.com *
4011147Smitch.hayenga@arm.com * Authors: Kevin Lim
4111147Smitch.hayenga@arm.com *          Andreas Sandberg
4211147Smitch.hayenga@arm.com *          Mitch Hayenga
4311147Smitch.hayenga@arm.com */
4411147Smitch.hayenga@arm.com
4511147Smitch.hayenga@arm.com#ifndef __CPU_SIMPLE_EXEC_CONTEXT_HH__
4611147Smitch.hayenga@arm.com#define __CPU_SIMPLE_EXEC_CONTEXT_HH__
4711147Smitch.hayenga@arm.com
4811147Smitch.hayenga@arm.com#include "arch/registers.hh"
4911147Smitch.hayenga@arm.com#include "base/types.hh"
5011147Smitch.hayenga@arm.com#include "config/the_isa.hh"
5111147Smitch.hayenga@arm.com#include "cpu/base.hh"
5211147Smitch.hayenga@arm.com#include "cpu/exec_context.hh"
5311147Smitch.hayenga@arm.com#include "cpu/simple/base.hh"
5411147Smitch.hayenga@arm.com#include "cpu/static_inst_fwd.hh"
5511147Smitch.hayenga@arm.com#include "cpu/translation.hh"
5611608Snikos.nikoleris@arm.com#include "mem/request.hh"
5711147Smitch.hayenga@arm.com
5811147Smitch.hayenga@arm.comclass BaseSimpleCPU;
5911147Smitch.hayenga@arm.com
6011147Smitch.hayenga@arm.comclass SimpleExecContext : public ExecContext {
6111147Smitch.hayenga@arm.com  protected:
6211147Smitch.hayenga@arm.com    typedef TheISA::MiscReg MiscReg;
6311147Smitch.hayenga@arm.com    typedef TheISA::FloatReg FloatReg;
6411147Smitch.hayenga@arm.com    typedef TheISA::FloatRegBits FloatRegBits;
6511147Smitch.hayenga@arm.com    typedef TheISA::CCReg CCReg;
6611147Smitch.hayenga@arm.com
6711147Smitch.hayenga@arm.com  public:
6811147Smitch.hayenga@arm.com    BaseSimpleCPU *cpu;
6911147Smitch.hayenga@arm.com    SimpleThread* thread;
7011147Smitch.hayenga@arm.com
7111147Smitch.hayenga@arm.com    // This is the offset from the current pc that fetch should be performed
7211147Smitch.hayenga@arm.com    Addr fetchOffset;
7311147Smitch.hayenga@arm.com    // This flag says to stay at the current pc. This is useful for
7411147Smitch.hayenga@arm.com    // instructions which go beyond MachInst boundaries.
7511147Smitch.hayenga@arm.com    bool stayAtPC;
7611147Smitch.hayenga@arm.com
7711147Smitch.hayenga@arm.com    // Branch prediction
7811147Smitch.hayenga@arm.com    TheISA::PCState predPC;
7911147Smitch.hayenga@arm.com
8011147Smitch.hayenga@arm.com    /** PER-THREAD STATS */
8111147Smitch.hayenga@arm.com
8211147Smitch.hayenga@arm.com    // Number of simulated instructions
8311147Smitch.hayenga@arm.com    Counter numInst;
8411147Smitch.hayenga@arm.com    Stats::Scalar numInsts;
8511147Smitch.hayenga@arm.com    Counter numOp;
8611147Smitch.hayenga@arm.com    Stats::Scalar numOps;
8711147Smitch.hayenga@arm.com
8811147Smitch.hayenga@arm.com    // Number of integer alu accesses
8911147Smitch.hayenga@arm.com    Stats::Scalar numIntAluAccesses;
9011147Smitch.hayenga@arm.com
9111147Smitch.hayenga@arm.com    // Number of float alu accesses
9211147Smitch.hayenga@arm.com    Stats::Scalar numFpAluAccesses;
9311147Smitch.hayenga@arm.com
9411147Smitch.hayenga@arm.com    // Number of function calls/returns
9511147Smitch.hayenga@arm.com    Stats::Scalar numCallsReturns;
9611147Smitch.hayenga@arm.com
9711147Smitch.hayenga@arm.com    // Conditional control instructions;
9811147Smitch.hayenga@arm.com    Stats::Scalar numCondCtrlInsts;
9911147Smitch.hayenga@arm.com
10011147Smitch.hayenga@arm.com    // Number of int instructions
10111147Smitch.hayenga@arm.com    Stats::Scalar numIntInsts;
10211147Smitch.hayenga@arm.com
10311147Smitch.hayenga@arm.com    // Number of float instructions
10411147Smitch.hayenga@arm.com    Stats::Scalar numFpInsts;
10511147Smitch.hayenga@arm.com
10611147Smitch.hayenga@arm.com    // Number of integer register file accesses
10711147Smitch.hayenga@arm.com    Stats::Scalar numIntRegReads;
10811147Smitch.hayenga@arm.com    Stats::Scalar numIntRegWrites;
10911147Smitch.hayenga@arm.com
11011147Smitch.hayenga@arm.com    // Number of float register file accesses
11111147Smitch.hayenga@arm.com    Stats::Scalar numFpRegReads;
11211147Smitch.hayenga@arm.com    Stats::Scalar numFpRegWrites;
11311147Smitch.hayenga@arm.com
11411147Smitch.hayenga@arm.com    // Number of condition code register file accesses
11511147Smitch.hayenga@arm.com    Stats::Scalar numCCRegReads;
11611147Smitch.hayenga@arm.com    Stats::Scalar numCCRegWrites;
11711147Smitch.hayenga@arm.com
11811147Smitch.hayenga@arm.com    // Number of simulated memory references
11911147Smitch.hayenga@arm.com    Stats::Scalar numMemRefs;
12011147Smitch.hayenga@arm.com    Stats::Scalar numLoadInsts;
12111147Smitch.hayenga@arm.com    Stats::Scalar numStoreInsts;
12211147Smitch.hayenga@arm.com
12311147Smitch.hayenga@arm.com    // Number of idle cycles
12411147Smitch.hayenga@arm.com    Stats::Formula numIdleCycles;
12511147Smitch.hayenga@arm.com
12611147Smitch.hayenga@arm.com    // Number of busy cycles
12711147Smitch.hayenga@arm.com    Stats::Formula numBusyCycles;
12811147Smitch.hayenga@arm.com
12911147Smitch.hayenga@arm.com    // Number of simulated loads
13011147Smitch.hayenga@arm.com    Counter numLoad;
13111147Smitch.hayenga@arm.com
13211147Smitch.hayenga@arm.com    // Number of idle cycles
13311147Smitch.hayenga@arm.com    Stats::Average notIdleFraction;
13411147Smitch.hayenga@arm.com    Stats::Formula idleFraction;
13511147Smitch.hayenga@arm.com
13611147Smitch.hayenga@arm.com    // Number of cycles stalled for I-cache responses
13711147Smitch.hayenga@arm.com    Stats::Scalar icacheStallCycles;
13811147Smitch.hayenga@arm.com    Counter lastIcacheStall;
13911147Smitch.hayenga@arm.com
14011147Smitch.hayenga@arm.com    // Number of cycles stalled for D-cache responses
14111147Smitch.hayenga@arm.com    Stats::Scalar dcacheStallCycles;
14211147Smitch.hayenga@arm.com    Counter lastDcacheStall;
14311147Smitch.hayenga@arm.com
14411147Smitch.hayenga@arm.com    /// @{
14511147Smitch.hayenga@arm.com    /// Total number of branches fetched
14611147Smitch.hayenga@arm.com    Stats::Scalar numBranches;
14711147Smitch.hayenga@arm.com    /// Number of branches predicted as taken
14811147Smitch.hayenga@arm.com    Stats::Scalar numPredictedBranches;
14911147Smitch.hayenga@arm.com    /// Number of misprediced branches
15011147Smitch.hayenga@arm.com    Stats::Scalar numBranchMispred;
15111147Smitch.hayenga@arm.com    /// @}
15211147Smitch.hayenga@arm.com
15311147Smitch.hayenga@arm.com   // Instruction mix histogram by OpClass
15411147Smitch.hayenga@arm.com   Stats::Vector statExecutedInstType;
15511147Smitch.hayenga@arm.com
15611147Smitch.hayenga@arm.com  public:
15711147Smitch.hayenga@arm.com    /** Constructor */
15811147Smitch.hayenga@arm.com    SimpleExecContext(BaseSimpleCPU* _cpu, SimpleThread* _thread)
15911147Smitch.hayenga@arm.com        : cpu(_cpu), thread(_thread), fetchOffset(0), stayAtPC(false),
16011147Smitch.hayenga@arm.com        numInst(0), numOp(0), numLoad(0), lastIcacheStall(0), lastDcacheStall(0)
16111147Smitch.hayenga@arm.com    { }
16211147Smitch.hayenga@arm.com
16311147Smitch.hayenga@arm.com    /** Reads an integer register. */
16411168Sandreas.hansson@arm.com    IntReg readIntRegOperand(const StaticInst *si, int idx) override
16511147Smitch.hayenga@arm.com    {
16611147Smitch.hayenga@arm.com        numIntRegReads++;
16711147Smitch.hayenga@arm.com        return thread->readIntReg(si->srcRegIdx(idx));
16811147Smitch.hayenga@arm.com    }
16911147Smitch.hayenga@arm.com
17011147Smitch.hayenga@arm.com    /** Sets an integer register to a value. */
17111168Sandreas.hansson@arm.com    void setIntRegOperand(const StaticInst *si, int idx, IntReg val) override
17211147Smitch.hayenga@arm.com    {
17311147Smitch.hayenga@arm.com        numIntRegWrites++;
17411147Smitch.hayenga@arm.com        thread->setIntReg(si->destRegIdx(idx), val);
17511147Smitch.hayenga@arm.com    }
17611147Smitch.hayenga@arm.com
17711147Smitch.hayenga@arm.com    /** Reads a floating point register of single register width. */
17811168Sandreas.hansson@arm.com    FloatReg readFloatRegOperand(const StaticInst *si, int idx) override
17911147Smitch.hayenga@arm.com    {
18011147Smitch.hayenga@arm.com        numFpRegReads++;
18111147Smitch.hayenga@arm.com        int reg_idx = si->srcRegIdx(idx) - TheISA::FP_Reg_Base;
18211147Smitch.hayenga@arm.com        return thread->readFloatReg(reg_idx);
18311147Smitch.hayenga@arm.com    }
18411147Smitch.hayenga@arm.com
18511147Smitch.hayenga@arm.com    /** Reads a floating point register in its binary format, instead
18611147Smitch.hayenga@arm.com     * of by value. */
18711168Sandreas.hansson@arm.com    FloatRegBits readFloatRegOperandBits(const StaticInst *si, int idx) override
18811147Smitch.hayenga@arm.com    {
18911147Smitch.hayenga@arm.com        numFpRegReads++;
19011147Smitch.hayenga@arm.com        int reg_idx = si->srcRegIdx(idx) - TheISA::FP_Reg_Base;
19111147Smitch.hayenga@arm.com        return thread->readFloatRegBits(reg_idx);
19211147Smitch.hayenga@arm.com    }
19311147Smitch.hayenga@arm.com
19411147Smitch.hayenga@arm.com    /** Sets a floating point register of single width to a value. */
19511168Sandreas.hansson@arm.com    void setFloatRegOperand(const StaticInst *si, int idx,
19611168Sandreas.hansson@arm.com                            FloatReg val) override
19711147Smitch.hayenga@arm.com    {
19811147Smitch.hayenga@arm.com        numFpRegWrites++;
19911147Smitch.hayenga@arm.com        int reg_idx = si->destRegIdx(idx) - TheISA::FP_Reg_Base;
20011147Smitch.hayenga@arm.com        thread->setFloatReg(reg_idx, val);
20111147Smitch.hayenga@arm.com    }
20211147Smitch.hayenga@arm.com
20311147Smitch.hayenga@arm.com    /** Sets the bits of a floating point register of single width
20411147Smitch.hayenga@arm.com     * to a binary value. */
20511147Smitch.hayenga@arm.com    void setFloatRegOperandBits(const StaticInst *si, int idx,
20611168Sandreas.hansson@arm.com                                FloatRegBits val) override
20711147Smitch.hayenga@arm.com    {
20811147Smitch.hayenga@arm.com        numFpRegWrites++;
20911147Smitch.hayenga@arm.com        int reg_idx = si->destRegIdx(idx) - TheISA::FP_Reg_Base;
21011147Smitch.hayenga@arm.com        thread->setFloatRegBits(reg_idx, val);
21111147Smitch.hayenga@arm.com    }
21211147Smitch.hayenga@arm.com
21311168Sandreas.hansson@arm.com    CCReg readCCRegOperand(const StaticInst *si, int idx) override
21411147Smitch.hayenga@arm.com    {
21511147Smitch.hayenga@arm.com        numCCRegReads++;
21611147Smitch.hayenga@arm.com        int reg_idx = si->srcRegIdx(idx) - TheISA::CC_Reg_Base;
21711147Smitch.hayenga@arm.com        return thread->readCCReg(reg_idx);
21811147Smitch.hayenga@arm.com    }
21911147Smitch.hayenga@arm.com
22011168Sandreas.hansson@arm.com    void setCCRegOperand(const StaticInst *si, int idx, CCReg val) override
22111147Smitch.hayenga@arm.com    {
22211147Smitch.hayenga@arm.com        numCCRegWrites++;
22311147Smitch.hayenga@arm.com        int reg_idx = si->destRegIdx(idx) - TheISA::CC_Reg_Base;
22411147Smitch.hayenga@arm.com        thread->setCCReg(reg_idx, val);
22511147Smitch.hayenga@arm.com    }
22611147Smitch.hayenga@arm.com
22711168Sandreas.hansson@arm.com    MiscReg readMiscRegOperand(const StaticInst *si, int idx) override
22811147Smitch.hayenga@arm.com    {
22911147Smitch.hayenga@arm.com        numIntRegReads++;
23011147Smitch.hayenga@arm.com        int reg_idx = si->srcRegIdx(idx) - TheISA::Misc_Reg_Base;
23111147Smitch.hayenga@arm.com        return thread->readMiscReg(reg_idx);
23211147Smitch.hayenga@arm.com    }
23311147Smitch.hayenga@arm.com
23411168Sandreas.hansson@arm.com    void setMiscRegOperand(const StaticInst *si, int idx,
23511168Sandreas.hansson@arm.com                           const MiscReg &val) override
23611147Smitch.hayenga@arm.com    {
23711147Smitch.hayenga@arm.com        numIntRegWrites++;
23811147Smitch.hayenga@arm.com        int reg_idx = si->destRegIdx(idx) - TheISA::Misc_Reg_Base;
23911147Smitch.hayenga@arm.com        thread->setMiscReg(reg_idx, val);
24011147Smitch.hayenga@arm.com    }
24111147Smitch.hayenga@arm.com
24211147Smitch.hayenga@arm.com    /**
24311147Smitch.hayenga@arm.com     * Reads a miscellaneous register, handling any architectural
24411147Smitch.hayenga@arm.com     * side effects due to reading that register.
24511147Smitch.hayenga@arm.com     */
24611168Sandreas.hansson@arm.com    MiscReg readMiscReg(int misc_reg) override
24711147Smitch.hayenga@arm.com    {
24811147Smitch.hayenga@arm.com        numIntRegReads++;
24911147Smitch.hayenga@arm.com        return thread->readMiscReg(misc_reg);
25011147Smitch.hayenga@arm.com    }
25111147Smitch.hayenga@arm.com
25211147Smitch.hayenga@arm.com    /**
25311147Smitch.hayenga@arm.com     * Sets a miscellaneous register, handling any architectural
25411147Smitch.hayenga@arm.com     * side effects due to writing that register.
25511147Smitch.hayenga@arm.com     */
25611168Sandreas.hansson@arm.com    void setMiscReg(int misc_reg, const MiscReg &val) override
25711147Smitch.hayenga@arm.com    {
25811147Smitch.hayenga@arm.com        numIntRegWrites++;
25911147Smitch.hayenga@arm.com        thread->setMiscReg(misc_reg, val);
26011147Smitch.hayenga@arm.com    }
26111147Smitch.hayenga@arm.com
26211168Sandreas.hansson@arm.com    PCState pcState() const override
26311147Smitch.hayenga@arm.com    {
26411147Smitch.hayenga@arm.com        return thread->pcState();
26511147Smitch.hayenga@arm.com    }
26611147Smitch.hayenga@arm.com
26711168Sandreas.hansson@arm.com    void pcState(const PCState &val) override
26811147Smitch.hayenga@arm.com    {
26911147Smitch.hayenga@arm.com        thread->pcState(val);
27011147Smitch.hayenga@arm.com    }
27111147Smitch.hayenga@arm.com
27211147Smitch.hayenga@arm.com
27311147Smitch.hayenga@arm.com    /**
27411147Smitch.hayenga@arm.com     * Record the effective address of the instruction.
27511147Smitch.hayenga@arm.com     *
27611147Smitch.hayenga@arm.com     * @note Only valid for memory ops.
27711147Smitch.hayenga@arm.com     */
27811168Sandreas.hansson@arm.com    void setEA(Addr EA) override
27911147Smitch.hayenga@arm.com    { panic("BaseSimpleCPU::setEA() not implemented\n"); }
28011147Smitch.hayenga@arm.com
28111147Smitch.hayenga@arm.com    /**
28211147Smitch.hayenga@arm.com     * Get the effective address of the instruction.
28311147Smitch.hayenga@arm.com     *
28411147Smitch.hayenga@arm.com     * @note Only valid for memory ops.
28511147Smitch.hayenga@arm.com     */
28611168Sandreas.hansson@arm.com    Addr getEA() const override
28711147Smitch.hayenga@arm.com    { panic("BaseSimpleCPU::getEA() not implemented\n"); }
28811147Smitch.hayenga@arm.com
28911147Smitch.hayenga@arm.com    Fault readMem(Addr addr, uint8_t *data, unsigned int size,
29011608Snikos.nikoleris@arm.com                  Request::Flags flags) override
29111147Smitch.hayenga@arm.com    {
29211147Smitch.hayenga@arm.com        return cpu->readMem(addr, data, size, flags);
29311147Smitch.hayenga@arm.com    }
29411147Smitch.hayenga@arm.com
29511303Ssteve.reinhardt@amd.com    Fault initiateMemRead(Addr addr, unsigned int size,
29611608Snikos.nikoleris@arm.com                          Request::Flags flags) override
29711303Ssteve.reinhardt@amd.com    {
29811303Ssteve.reinhardt@amd.com        return cpu->initiateMemRead(addr, size, flags);
29911303Ssteve.reinhardt@amd.com    }
30011303Ssteve.reinhardt@amd.com
30111147Smitch.hayenga@arm.com    Fault writeMem(uint8_t *data, unsigned int size, Addr addr,
30211608Snikos.nikoleris@arm.com                   Request::Flags flags, uint64_t *res) override
30311147Smitch.hayenga@arm.com    {
30411147Smitch.hayenga@arm.com        return cpu->writeMem(data, size, addr, flags, res);
30511147Smitch.hayenga@arm.com    }
30611147Smitch.hayenga@arm.com
30711147Smitch.hayenga@arm.com    /**
30811147Smitch.hayenga@arm.com     * Sets the number of consecutive store conditional failures.
30911147Smitch.hayenga@arm.com     */
31011168Sandreas.hansson@arm.com    void setStCondFailures(unsigned int sc_failures) override
31111147Smitch.hayenga@arm.com    {
31211147Smitch.hayenga@arm.com        thread->setStCondFailures(sc_failures);
31311147Smitch.hayenga@arm.com    }
31411147Smitch.hayenga@arm.com
31511147Smitch.hayenga@arm.com    /**
31611147Smitch.hayenga@arm.com     * Returns the number of consecutive store conditional failures.
31711147Smitch.hayenga@arm.com     */
31811168Sandreas.hansson@arm.com    unsigned int readStCondFailures() const override
31911147Smitch.hayenga@arm.com    {
32011147Smitch.hayenga@arm.com        return thread->readStCondFailures();
32111147Smitch.hayenga@arm.com    }
32211147Smitch.hayenga@arm.com
32311147Smitch.hayenga@arm.com    /**
32411147Smitch.hayenga@arm.com     * Executes a syscall specified by the callnum.
32511147Smitch.hayenga@arm.com     */
32611168Sandreas.hansson@arm.com    void syscall(int64_t callnum) override
32711147Smitch.hayenga@arm.com    {
32811147Smitch.hayenga@arm.com        if (FullSystem)
32911147Smitch.hayenga@arm.com            panic("Syscall emulation isn't available in FS mode.");
33011147Smitch.hayenga@arm.com
33111147Smitch.hayenga@arm.com        thread->syscall(callnum);
33211147Smitch.hayenga@arm.com    }
33311147Smitch.hayenga@arm.com
33411147Smitch.hayenga@arm.com    /** Returns a pointer to the ThreadContext. */
33511168Sandreas.hansson@arm.com    ThreadContext *tcBase() override
33611147Smitch.hayenga@arm.com    {
33711147Smitch.hayenga@arm.com        return thread->getTC();
33811147Smitch.hayenga@arm.com    }
33911147Smitch.hayenga@arm.com
34011147Smitch.hayenga@arm.com    /**
34111147Smitch.hayenga@arm.com     * Somewhat Alpha-specific function that handles returning from an
34211147Smitch.hayenga@arm.com     * error or interrupt.
34311147Smitch.hayenga@arm.com     */
34411168Sandreas.hansson@arm.com    Fault hwrei() override
34511147Smitch.hayenga@arm.com    {
34611147Smitch.hayenga@arm.com        return thread->hwrei();
34711147Smitch.hayenga@arm.com    }
34811147Smitch.hayenga@arm.com
34911147Smitch.hayenga@arm.com    /**
35011147Smitch.hayenga@arm.com     * Check for special simulator handling of specific PAL calls.  If
35111147Smitch.hayenga@arm.com     * return value is false, actual PAL call will be suppressed.
35211147Smitch.hayenga@arm.com     */
35311168Sandreas.hansson@arm.com    bool simPalCheck(int palFunc) override
35411147Smitch.hayenga@arm.com    {
35511147Smitch.hayenga@arm.com        return thread->simPalCheck(palFunc);
35611147Smitch.hayenga@arm.com    }
35711147Smitch.hayenga@arm.com
35811168Sandreas.hansson@arm.com    bool readPredicate() override
35911147Smitch.hayenga@arm.com    {
36011147Smitch.hayenga@arm.com        return thread->readPredicate();
36111147Smitch.hayenga@arm.com    }
36211147Smitch.hayenga@arm.com
36311168Sandreas.hansson@arm.com    void setPredicate(bool val) override
36411147Smitch.hayenga@arm.com    {
36511147Smitch.hayenga@arm.com        thread->setPredicate(val);
36611147Smitch.hayenga@arm.com
36711147Smitch.hayenga@arm.com        if (cpu->traceData) {
36811147Smitch.hayenga@arm.com            cpu->traceData->setPredicate(val);
36911147Smitch.hayenga@arm.com        }
37011147Smitch.hayenga@arm.com    }
37111147Smitch.hayenga@arm.com
37211147Smitch.hayenga@arm.com    /**
37311147Smitch.hayenga@arm.com     * Invalidate a page in the DTLB <i>and</i> ITLB.
37411147Smitch.hayenga@arm.com     */
37511168Sandreas.hansson@arm.com    void demapPage(Addr vaddr, uint64_t asn) override
37611147Smitch.hayenga@arm.com    {
37711147Smitch.hayenga@arm.com        thread->demapPage(vaddr, asn);
37811147Smitch.hayenga@arm.com    }
37911147Smitch.hayenga@arm.com
38011168Sandreas.hansson@arm.com    void armMonitor(Addr address) override
38111147Smitch.hayenga@arm.com    {
38211148Smitch.hayenga@arm.com        cpu->armMonitor(thread->threadId(), address);
38311147Smitch.hayenga@arm.com    }
38411147Smitch.hayenga@arm.com
38511168Sandreas.hansson@arm.com    bool mwait(PacketPtr pkt) override
38611147Smitch.hayenga@arm.com    {
38711148Smitch.hayenga@arm.com        return cpu->mwait(thread->threadId(), pkt);
38811147Smitch.hayenga@arm.com    }
38911147Smitch.hayenga@arm.com
39011168Sandreas.hansson@arm.com    void mwaitAtomic(ThreadContext *tc) override
39111147Smitch.hayenga@arm.com    {
39211148Smitch.hayenga@arm.com        cpu->mwaitAtomic(thread->threadId(), tc, thread->dtb);
39311147Smitch.hayenga@arm.com    }
39411147Smitch.hayenga@arm.com
39511168Sandreas.hansson@arm.com    AddressMonitor *getAddrMonitor() override
39611147Smitch.hayenga@arm.com    {
39711148Smitch.hayenga@arm.com        return cpu->getCpuAddrMonitor(thread->threadId());
39811147Smitch.hayenga@arm.com    }
39911147Smitch.hayenga@arm.com
40011147Smitch.hayenga@arm.com#if THE_ISA == MIPS_ISA
40111147Smitch.hayenga@arm.com    MiscReg readRegOtherThread(int regIdx, ThreadID tid = InvalidThreadID)
40211168Sandreas.hansson@arm.com        override
40311147Smitch.hayenga@arm.com    {
40411147Smitch.hayenga@arm.com        panic("Simple CPU models do not support multithreaded "
40511147Smitch.hayenga@arm.com              "register access.");
40611147Smitch.hayenga@arm.com    }
40711147Smitch.hayenga@arm.com
40811147Smitch.hayenga@arm.com    void setRegOtherThread(int regIdx, MiscReg val,
40911168Sandreas.hansson@arm.com                           ThreadID tid = InvalidThreadID) override
41011147Smitch.hayenga@arm.com    {
41111147Smitch.hayenga@arm.com        panic("Simple CPU models do not support multithreaded "
41211147Smitch.hayenga@arm.com              "register access.");
41311147Smitch.hayenga@arm.com    }
41411147Smitch.hayenga@arm.com
41511147Smitch.hayenga@arm.com#endif
41611147Smitch.hayenga@arm.com
41711147Smitch.hayenga@arm.com};
41811147Smitch.hayenga@arm.com
41911147Smitch.hayenga@arm.com#endif // __CPU_EXEC_CONTEXT_HH__
420