exec_context.hh revision 13954
1955SN/A/*
2955SN/A * Copyright (c) 2011-2014, 2016-2018 ARM Limited
311408Sandreas.sandberg@arm.com * Copyright (c) 2013 Advanced Micro Devices, Inc.
49812Sandreas.hansson@arm.com * All rights reserved
59812Sandreas.hansson@arm.com *
69812Sandreas.hansson@arm.com * The license below extends only to copyright in the software and shall
79812Sandreas.hansson@arm.com * not be construed as granting a license to any other intellectual
89812Sandreas.hansson@arm.com * property including but not limited to intellectual property relating
99812Sandreas.hansson@arm.com * to a hardware implementation of the functionality of the software
109812Sandreas.hansson@arm.com * licensed hereunder.  You may use the software subject to the license
119812Sandreas.hansson@arm.com * terms below provided that you ensure that this notice is replicated
129812Sandreas.hansson@arm.com * unmodified and in its entirety in all distributions of the software,
139812Sandreas.hansson@arm.com * modified or unmodified, in source code or in binary form.
149812Sandreas.hansson@arm.com *
157816Ssteve.reinhardt@amd.com * Copyright (c) 2002-2005 The Regents of The University of Michigan
165871Snate@binkert.org * All rights reserved.
171762SN/A *
18955SN/A * Redistribution and use in source and binary forms, with or without
19955SN/A * modification, are permitted provided that the following conditions are
20955SN/A * met: redistributions of source code must retain the above copyright
21955SN/A * notice, this list of conditions and the following disclaimer;
22955SN/A * redistributions in binary form must reproduce the above copyright
23955SN/A * notice, this list of conditions and the following disclaimer in the
24955SN/A * documentation and/or other materials provided with the distribution;
25955SN/A * neither the name of the copyright holders nor the names of its
26955SN/A * contributors may be used to endorse or promote products derived from
27955SN/A * this software without specific prior written permission.
28955SN/A *
29955SN/A * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
30955SN/A * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
31955SN/A * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
32955SN/A * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
33955SN/A * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
34955SN/A * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
35955SN/A * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
36955SN/A * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
37955SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
38955SN/A * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
39955SN/A * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
40955SN/A *
41955SN/A * Authors: Steve Reinhardt
422665Ssaidi@eecs.umich.edu *          Dave Greene
432665Ssaidi@eecs.umich.edu *          Nathan Binkert
445863Snate@binkert.org *          Andrew Bardsley
45955SN/A */
46955SN/A
47955SN/A/**
48955SN/A * @file
49955SN/A *
508878Ssteve.reinhardt@amd.com *  ExecContext bears the exec_context interface for Minor.
512632Sstever@eecs.umich.edu */
528878Ssteve.reinhardt@amd.com
532632Sstever@eecs.umich.edu#ifndef __CPU_MINOR_EXEC_CONTEXT_HH__
54955SN/A#define __CPU_MINOR_EXEC_CONTEXT_HH__
558878Ssteve.reinhardt@amd.com
562632Sstever@eecs.umich.edu#include "cpu/exec_context.hh"
572761Sstever@eecs.umich.edu#include "cpu/minor/execute.hh"
582632Sstever@eecs.umich.edu#include "cpu/minor/pipeline.hh"
592632Sstever@eecs.umich.edu#include "cpu/base.hh"
602632Sstever@eecs.umich.edu#include "cpu/simple_thread.hh"
612761Sstever@eecs.umich.edu#include "mem/request.hh"
622761Sstever@eecs.umich.edu#include "debug/MinorExecute.hh"
632761Sstever@eecs.umich.edu
648878Ssteve.reinhardt@amd.comnamespace Minor
658878Ssteve.reinhardt@amd.com{
662761Sstever@eecs.umich.edu
672761Sstever@eecs.umich.edu/* Forward declaration of Execute */
682761Sstever@eecs.umich.educlass Execute;
692761Sstever@eecs.umich.edu
702761Sstever@eecs.umich.edu/** ExecContext bears the exec_context interface for Minor.  This nicely
718878Ssteve.reinhardt@amd.com *  separates that interface from other classes such as Pipeline, MinorCPU
728878Ssteve.reinhardt@amd.com *  and DynMinorInst and makes it easier to see what state is accessed by it.
732632Sstever@eecs.umich.edu */
742632Sstever@eecs.umich.educlass ExecContext : public ::ExecContext
758878Ssteve.reinhardt@amd.com{
768878Ssteve.reinhardt@amd.com  public:
772632Sstever@eecs.umich.edu    MinorCPU &cpu;
78955SN/A
79955SN/A    /** ThreadState object, provides all the architectural state. */
80955SN/A    SimpleThread &thread;
815863Snate@binkert.org
825863Snate@binkert.org    /** The execute stage so we can peek at its contents. */
835863Snate@binkert.org    Execute &execute;
845863Snate@binkert.org
855863Snate@binkert.org    /** Instruction for the benefit of memory operations and for PC */
865863Snate@binkert.org    MinorDynInstPtr inst;
875863Snate@binkert.org
885863Snate@binkert.org    ExecContext (
895863Snate@binkert.org        MinorCPU &cpu_,
905863Snate@binkert.org        SimpleThread &thread_, Execute &execute_,
915863Snate@binkert.org        MinorDynInstPtr inst_) :
928878Ssteve.reinhardt@amd.com        cpu(cpu_),
935863Snate@binkert.org        thread(thread_),
945863Snate@binkert.org        execute(execute_),
955863Snate@binkert.org        inst(inst_)
969812Sandreas.hansson@arm.com    {
979812Sandreas.hansson@arm.com        DPRINTF(MinorExecute, "ExecContext setting PC: %s\n", inst->pc);
985863Snate@binkert.org        pcState(inst->pc);
999812Sandreas.hansson@arm.com        setPredicate(inst->readPredicate());
1005863Snate@binkert.org        setMemAccPredicate(inst->readMemAccPredicate());
1015863Snate@binkert.org        thread.setIntReg(TheISA::ZeroReg, 0);
1025863Snate@binkert.org#if THE_ISA == ALPHA_ISA
1039812Sandreas.hansson@arm.com        thread.setFloatReg(TheISA::ZeroReg, 0);
1049812Sandreas.hansson@arm.com#endif
1055863Snate@binkert.org    }
1065863Snate@binkert.org
1078878Ssteve.reinhardt@amd.com    ~ExecContext()
1085863Snate@binkert.org    {
1095863Snate@binkert.org        inst->setPredicate(readPredicate());
1105863Snate@binkert.org        inst->setMemAccPredicate(readMemAccPredicate());
1116654Snate@binkert.org    }
11210196SCurtis.Dunham@arm.com
113955SN/A    Fault
1145396Ssaidi@eecs.umich.edu    initiateMemRead(Addr addr, unsigned int size,
11511401Sandreas.sandberg@arm.com                    Request::Flags flags,
1165863Snate@binkert.org                    const std::vector<bool>& byteEnable = std::vector<bool>())
1175863Snate@binkert.org        override
1184202Sbinkertn@umich.edu    {
1195863Snate@binkert.org        execute.getLSQ().pushRequest(inst, true /* load */, nullptr,
1205863Snate@binkert.org            size, addr, flags, nullptr, nullptr, byteEnable);
1215863Snate@binkert.org        return NoFault;
1225863Snate@binkert.org    }
123955SN/A
1246654Snate@binkert.org    Fault
1255273Sstever@gmail.com    writeMem(uint8_t *data, unsigned int size, Addr addr,
1265871Snate@binkert.org             Request::Flags flags, uint64_t *res,
1275273Sstever@gmail.com             const std::vector<bool>& byteEnable = std::vector<bool>())
1286655Snate@binkert.org        override
1298878Ssteve.reinhardt@amd.com    {
1306655Snate@binkert.org        assert(byteEnable.empty() || byteEnable.size() == size);
1316655Snate@binkert.org        execute.getLSQ().pushRequest(inst, false /* store */, data,
1329219Spower.jg@gmail.com            size, addr, flags, res, nullptr, byteEnable);
1336655Snate@binkert.org        return NoFault;
1345871Snate@binkert.org    }
1356654Snate@binkert.org
1368947Sandreas.hansson@arm.com    Fault
1375396Ssaidi@eecs.umich.edu    initiateMemAMO(Addr addr, unsigned int size, Request::Flags flags,
1388120Sgblack@eecs.umich.edu                   AtomicOpFunctor *amo_op) override
1398120Sgblack@eecs.umich.edu    {
1408120Sgblack@eecs.umich.edu        // AMO requests are pushed through the store path
1418120Sgblack@eecs.umich.edu        execute.getLSQ().pushRequest(inst, false /* amo */, nullptr,
1428120Sgblack@eecs.umich.edu            size, addr, flags, nullptr, amo_op);
1438120Sgblack@eecs.umich.edu        return NoFault;
1448120Sgblack@eecs.umich.edu    }
1458120Sgblack@eecs.umich.edu
1468879Ssteve.reinhardt@amd.com    RegVal
1478879Ssteve.reinhardt@amd.com    readIntRegOperand(const StaticInst *si, int idx) override
1488879Ssteve.reinhardt@amd.com    {
1498879Ssteve.reinhardt@amd.com        const RegId& reg = si->srcRegIdx(idx);
1508879Ssteve.reinhardt@amd.com        assert(reg.isIntReg());
1518879Ssteve.reinhardt@amd.com        return thread.readIntReg(reg.index());
1528879Ssteve.reinhardt@amd.com    }
1538879Ssteve.reinhardt@amd.com
1548879Ssteve.reinhardt@amd.com    RegVal
1558879Ssteve.reinhardt@amd.com    readFloatRegOperandBits(const StaticInst *si, int idx) override
1568879Ssteve.reinhardt@amd.com    {
1578879Ssteve.reinhardt@amd.com        const RegId& reg = si->srcRegIdx(idx);
1588879Ssteve.reinhardt@amd.com        assert(reg.isFloatReg());
1598120Sgblack@eecs.umich.edu        return thread.readFloatReg(reg.index());
1608120Sgblack@eecs.umich.edu    }
1618120Sgblack@eecs.umich.edu
1628120Sgblack@eecs.umich.edu    const TheISA::VecRegContainer &
1638120Sgblack@eecs.umich.edu    readVecRegOperand(const StaticInst *si, int idx) const override
1648120Sgblack@eecs.umich.edu    {
1658120Sgblack@eecs.umich.edu        const RegId& reg = si->srcRegIdx(idx);
1668120Sgblack@eecs.umich.edu        assert(reg.isVecReg());
1678120Sgblack@eecs.umich.edu        return thread.readVecReg(reg);
1688120Sgblack@eecs.umich.edu    }
1698120Sgblack@eecs.umich.edu
1708120Sgblack@eecs.umich.edu    TheISA::VecRegContainer &
1718120Sgblack@eecs.umich.edu    getWritableVecRegOperand(const StaticInst *si, int idx) override
1728120Sgblack@eecs.umich.edu    {
1738879Ssteve.reinhardt@amd.com        const RegId& reg = si->destRegIdx(idx);
1748879Ssteve.reinhardt@amd.com        assert(reg.isVecReg());
1758879Ssteve.reinhardt@amd.com        return thread.getWritableVecReg(reg);
1768879Ssteve.reinhardt@amd.com    }
17710458Sandreas.hansson@arm.com
17810458Sandreas.hansson@arm.com    TheISA::VecElem
17910458Sandreas.hansson@arm.com    readVecElemOperand(const StaticInst *si, int idx) const override
1808879Ssteve.reinhardt@amd.com    {
1818879Ssteve.reinhardt@amd.com        const RegId& reg = si->srcRegIdx(idx);
1828879Ssteve.reinhardt@amd.com        assert(reg.isVecElem());
1838879Ssteve.reinhardt@amd.com        return thread.readVecElem(reg);
1849227Sandreas.hansson@arm.com    }
1859227Sandreas.hansson@arm.com
18612063Sgabeblack@google.com    const TheISA::VecPredRegContainer&
18712063Sgabeblack@google.com    readVecPredRegOperand(const StaticInst *si, int idx) const override
18812063Sgabeblack@google.com    {
1898879Ssteve.reinhardt@amd.com        const RegId& reg = si->srcRegIdx(idx);
1908879Ssteve.reinhardt@amd.com        assert(reg.isVecPredReg());
1918879Ssteve.reinhardt@amd.com        return thread.readVecPredReg(reg);
1928879Ssteve.reinhardt@amd.com    }
19310453SAndrew.Bardsley@arm.com
19410453SAndrew.Bardsley@arm.com    TheISA::VecPredRegContainer&
19510453SAndrew.Bardsley@arm.com    getWritableVecPredRegOperand(const StaticInst *si, int idx) override
19610456SCurtis.Dunham@arm.com    {
19710456SCurtis.Dunham@arm.com        const RegId& reg = si->destRegIdx(idx);
19810456SCurtis.Dunham@arm.com        assert(reg.isVecPredReg());
19910457Sandreas.hansson@arm.com        return thread.getWritableVecPredReg(reg);
20010457Sandreas.hansson@arm.com    }
20111342Sandreas.hansson@arm.com
20211342Sandreas.hansson@arm.com    void
2038120Sgblack@eecs.umich.edu    setIntRegOperand(const StaticInst *si, int idx, RegVal val) override
20412063Sgabeblack@google.com    {
20512063Sgabeblack@google.com        const RegId& reg = si->destRegIdx(idx);
20612063Sgabeblack@google.com        assert(reg.isIntReg());
20712063Sgabeblack@google.com        thread.setIntReg(reg.index(), val);
2088947Sandreas.hansson@arm.com    }
2097816Ssteve.reinhardt@amd.com
2105871Snate@binkert.org    void
2115871Snate@binkert.org    setFloatRegOperandBits(const StaticInst *si, int idx, RegVal val) override
2126121Snate@binkert.org    {
2135871Snate@binkert.org        const RegId& reg = si->destRegIdx(idx);
2145871Snate@binkert.org        assert(reg.isFloatReg());
2159926Sstan.czerniawski@arm.com        thread.setFloatReg(reg.index(), val);
2169926Sstan.czerniawski@arm.com    }
2179119Sandreas.hansson@arm.com
21810068Sandreas.hansson@arm.com    void
21911989Sandreas.sandberg@arm.com    setVecRegOperand(const StaticInst *si, int idx,
220955SN/A                     const TheISA::VecRegContainer& val) override
2219416SAndreas.Sandberg@ARM.com    {
22211342Sandreas.hansson@arm.com        const RegId& reg = si->destRegIdx(idx);
22311212Sjoseph.gross@amd.com        assert(reg.isVecReg());
22411212Sjoseph.gross@amd.com        thread.setVecReg(reg, val);
22511212Sjoseph.gross@amd.com    }
22611212Sjoseph.gross@amd.com
22711212Sjoseph.gross@amd.com    void
2289416SAndreas.Sandberg@ARM.com    setVecPredRegOperand(const StaticInst *si, int idx,
2299416SAndreas.Sandberg@ARM.com                         const TheISA::VecPredRegContainer& val) override
2305871Snate@binkert.org    {
23110584Sandreas.hansson@arm.com        const RegId& reg = si->destRegIdx(idx);
2329416SAndreas.Sandberg@ARM.com        assert(reg.isVecPredReg());
2339416SAndreas.Sandberg@ARM.com        thread.setVecPredReg(reg, val);
2345871Snate@binkert.org    }
235955SN/A
23610671Sandreas.hansson@arm.com    /** Vector Register Lane Interfaces. */
23710671Sandreas.hansson@arm.com    /** @{ */
23810671Sandreas.hansson@arm.com    /** Reads source vector 8bit operand. */
23910671Sandreas.hansson@arm.com    ConstVecLane8
2408881Smarc.orr@gmail.com    readVec8BitLaneOperand(const StaticInst *si, int idx) const
2416121Snate@binkert.org                            override
2426121Snate@binkert.org    {
2431533SN/A        const RegId& reg = si->srcRegIdx(idx);
2449239Sandreas.hansson@arm.com        assert(reg.isVecReg());
2459239Sandreas.hansson@arm.com        return thread.readVec8BitLaneReg(reg);
2469239Sandreas.hansson@arm.com    }
2479239Sandreas.hansson@arm.com
2489239Sandreas.hansson@arm.com    /** Reads source vector 16bit operand. */
2499239Sandreas.hansson@arm.com    ConstVecLane16
2509239Sandreas.hansson@arm.com    readVec16BitLaneOperand(const StaticInst *si, int idx) const
2516655Snate@binkert.org                            override
2526655Snate@binkert.org    {
2536655Snate@binkert.org        const RegId& reg = si->srcRegIdx(idx);
2546655Snate@binkert.org        assert(reg.isVecReg());
2555871Snate@binkert.org        return thread.readVec16BitLaneReg(reg);
2565871Snate@binkert.org    }
2575863Snate@binkert.org
2585871Snate@binkert.org    /** Reads source vector 32bit operand. */
2598878Ssteve.reinhardt@amd.com    ConstVecLane32
2605871Snate@binkert.org    readVec32BitLaneOperand(const StaticInst *si, int idx) const
2615871Snate@binkert.org                            override
2625871Snate@binkert.org    {
2635863Snate@binkert.org        const RegId& reg = si->srcRegIdx(idx);
2646121Snate@binkert.org        assert(reg.isVecReg());
2655863Snate@binkert.org        return thread.readVec32BitLaneReg(reg);
26611408Sandreas.sandberg@arm.com    }
26711408Sandreas.sandberg@arm.com
2688336Ssteve.reinhardt@amd.com    /** Reads source vector 64bit operand. */
26911469SCurtis.Dunham@arm.com    ConstVecLane64
27011469SCurtis.Dunham@arm.com    readVec64BitLaneOperand(const StaticInst *si, int idx) const
2718336Ssteve.reinhardt@amd.com                            override
2724678Snate@binkert.org    {
27311887Sandreas.sandberg@arm.com        const RegId& reg = si->srcRegIdx(idx);
27411887Sandreas.sandberg@arm.com        assert(reg.isVecReg());
27511887Sandreas.sandberg@arm.com        return thread.readVec64BitLaneReg(reg);
27611887Sandreas.sandberg@arm.com    }
27711887Sandreas.sandberg@arm.com
27811887Sandreas.sandberg@arm.com    /** Write a lane of the destination vector operand. */
27911887Sandreas.sandberg@arm.com    template <typename LD>
28011887Sandreas.sandberg@arm.com    void
28111887Sandreas.sandberg@arm.com    setVecLaneOperandT(const StaticInst *si, int idx, const LD& val)
28211887Sandreas.sandberg@arm.com    {
28311887Sandreas.sandberg@arm.com        const RegId& reg = si->destRegIdx(idx);
28411408Sandreas.sandberg@arm.com        assert(reg.isVecReg());
28511401Sandreas.sandberg@arm.com        return thread.setVecLane(reg, val);
28611401Sandreas.sandberg@arm.com    }
28711401Sandreas.sandberg@arm.com    virtual void
28811401Sandreas.sandberg@arm.com    setVecLaneOperand(const StaticInst *si, int idx,
28911401Sandreas.sandberg@arm.com            const LaneData<LaneSize::Byte>& val) override
29011401Sandreas.sandberg@arm.com    {
2918336Ssteve.reinhardt@amd.com        setVecLaneOperandT(si, idx, val);
2928336Ssteve.reinhardt@amd.com    }
2938336Ssteve.reinhardt@amd.com    virtual void
2944678Snate@binkert.org    setVecLaneOperand(const StaticInst *si, int idx,
29511401Sandreas.sandberg@arm.com            const LaneData<LaneSize::TwoByte>& val) override
2964678Snate@binkert.org    {
2974678Snate@binkert.org        setVecLaneOperandT(si, idx, val);
29811401Sandreas.sandberg@arm.com    }
29911401Sandreas.sandberg@arm.com    virtual void
3008336Ssteve.reinhardt@amd.com    setVecLaneOperand(const StaticInst *si, int idx,
3014678Snate@binkert.org            const LaneData<LaneSize::FourByte>& val) override
3028336Ssteve.reinhardt@amd.com    {
3038336Ssteve.reinhardt@amd.com        setVecLaneOperandT(si, idx, val);
3048336Ssteve.reinhardt@amd.com    }
3058336Ssteve.reinhardt@amd.com    virtual void
3068336Ssteve.reinhardt@amd.com    setVecLaneOperand(const StaticInst *si, int idx,
3078336Ssteve.reinhardt@amd.com            const LaneData<LaneSize::EightByte>& val) override
3085871Snate@binkert.org    {
3095871Snate@binkert.org        setVecLaneOperandT(si, idx, val);
3108336Ssteve.reinhardt@amd.com    }
31111408Sandreas.sandberg@arm.com    /** @} */
31211408Sandreas.sandberg@arm.com
31311408Sandreas.sandberg@arm.com    void
31411408Sandreas.sandberg@arm.com    setVecElemOperand(const StaticInst *si, int idx,
31511408Sandreas.sandberg@arm.com                      const TheISA::VecElem val) override
31611408Sandreas.sandberg@arm.com    {
31711408Sandreas.sandberg@arm.com        const RegId& reg = si->destRegIdx(idx);
3188336Ssteve.reinhardt@amd.com        assert(reg.isVecElem());
31911401Sandreas.sandberg@arm.com        thread.setVecElem(reg, val);
32011401Sandreas.sandberg@arm.com    }
32111401Sandreas.sandberg@arm.com
3225871Snate@binkert.org    bool
3238336Ssteve.reinhardt@amd.com    readPredicate() const override
3248336Ssteve.reinhardt@amd.com    {
32511401Sandreas.sandberg@arm.com        return thread.readPredicate();
32611401Sandreas.sandberg@arm.com    }
32711401Sandreas.sandberg@arm.com
32811401Sandreas.sandberg@arm.com    void
32911401Sandreas.sandberg@arm.com    setPredicate(bool val) override
3304678Snate@binkert.org    {
3315871Snate@binkert.org        thread.setPredicate(val);
3324678Snate@binkert.org    }
33311401Sandreas.sandberg@arm.com
33411401Sandreas.sandberg@arm.com    bool
33511401Sandreas.sandberg@arm.com    readMemAccPredicate() const override
33611401Sandreas.sandberg@arm.com    {
33711401Sandreas.sandberg@arm.com        return thread.readMemAccPredicate();
33811401Sandreas.sandberg@arm.com    }
33911401Sandreas.sandberg@arm.com
34011401Sandreas.sandberg@arm.com    void
34111401Sandreas.sandberg@arm.com    setMemAccPredicate(bool val) override
34211401Sandreas.sandberg@arm.com    {
34311401Sandreas.sandberg@arm.com        thread.setMemAccPredicate(val);
34411401Sandreas.sandberg@arm.com    }
34511450Sandreas.sandberg@arm.com
34611450Sandreas.sandberg@arm.com    TheISA::PCState
34711450Sandreas.sandberg@arm.com    pcState() const override
34811450Sandreas.sandberg@arm.com    {
34911450Sandreas.sandberg@arm.com        return thread.pcState();
35011450Sandreas.sandberg@arm.com    }
35111450Sandreas.sandberg@arm.com
35211450Sandreas.sandberg@arm.com    void
35311450Sandreas.sandberg@arm.com    pcState(const TheISA::PCState &val) override
35411450Sandreas.sandberg@arm.com    {
35511450Sandreas.sandberg@arm.com        thread.pcState(val);
35611401Sandreas.sandberg@arm.com    }
35711450Sandreas.sandberg@arm.com
35811450Sandreas.sandberg@arm.com    RegVal
35911450Sandreas.sandberg@arm.com    readMiscRegNoEffect(int misc_reg) const
36011401Sandreas.sandberg@arm.com    {
36111450Sandreas.sandberg@arm.com        return thread.readMiscRegNoEffect(misc_reg);
36211401Sandreas.sandberg@arm.com    }
3638336Ssteve.reinhardt@amd.com
3648336Ssteve.reinhardt@amd.com    RegVal
3658336Ssteve.reinhardt@amd.com    readMiscReg(int misc_reg) override
3668336Ssteve.reinhardt@amd.com    {
3678336Ssteve.reinhardt@amd.com        return thread.readMiscReg(misc_reg);
3688336Ssteve.reinhardt@amd.com    }
3698336Ssteve.reinhardt@amd.com
3708336Ssteve.reinhardt@amd.com    void
3718336Ssteve.reinhardt@amd.com    setMiscReg(int misc_reg, RegVal val) override
3728336Ssteve.reinhardt@amd.com    {
37311401Sandreas.sandberg@arm.com        thread.setMiscReg(misc_reg, val);
37411401Sandreas.sandberg@arm.com    }
3758336Ssteve.reinhardt@amd.com
3768336Ssteve.reinhardt@amd.com    RegVal
3778336Ssteve.reinhardt@amd.com    readMiscRegOperand(const StaticInst *si, int idx) override
3785871Snate@binkert.org    {
37911476Sandreas.sandberg@arm.com        const RegId& reg = si->srcRegIdx(idx);
38011476Sandreas.sandberg@arm.com        assert(reg.isMiscReg());
38111476Sandreas.sandberg@arm.com        return thread.readMiscReg(reg.index());
38211476Sandreas.sandberg@arm.com    }
38311476Sandreas.sandberg@arm.com
38411476Sandreas.sandberg@arm.com    void
38511476Sandreas.sandberg@arm.com    setMiscRegOperand(const StaticInst *si, int idx, RegVal val) override
38611476Sandreas.sandberg@arm.com    {
38711476Sandreas.sandberg@arm.com        const RegId& reg = si->destRegIdx(idx);
38811887Sandreas.sandberg@arm.com        assert(reg.isMiscReg());
38911887Sandreas.sandberg@arm.com        return thread.setMiscReg(reg.index(), val);
39011887Sandreas.sandberg@arm.com    }
39111408Sandreas.sandberg@arm.com
39211887Sandreas.sandberg@arm.com    void
39311887Sandreas.sandberg@arm.com    syscall(int64_t callnum, Fault *fault) override
39411887Sandreas.sandberg@arm.com    {
39511887Sandreas.sandberg@arm.com        if (FullSystem)
39611887Sandreas.sandberg@arm.com            panic("Syscall emulation isn't available in FS mode.\n");
39711887Sandreas.sandberg@arm.com
39811926Sgabeblack@google.com        thread.syscall(callnum, fault);
39911926Sgabeblack@google.com    }
40011926Sgabeblack@google.com
40111926Sgabeblack@google.com    ThreadContext *tcBase() override { return thread.getTC(); }
40211887Sandreas.sandberg@arm.com
40311887Sandreas.sandberg@arm.com    /* @todo, should make stCondFailures persistent somewhere */
40411944Sandreas.sandberg@arm.com    unsigned int readStCondFailures() const override { return 0; }
40511887Sandreas.sandberg@arm.com    void setStCondFailures(unsigned int st_cond_failures) override {}
40611927Sgabeblack@google.com
40711927Sgabeblack@google.com    ContextID contextId() { return thread.contextId(); }
40811927Sgabeblack@google.com    /* ISA-specific (or at least currently ISA singleton) functions */
40911927Sgabeblack@google.com
41011927Sgabeblack@google.com    /* X86: TLB twiddling */
41111927Sgabeblack@google.com    void
41211887Sandreas.sandberg@arm.com    demapPage(Addr vaddr, uint64_t asn) override
41311928Sgabeblack@google.com    {
41411928Sgabeblack@google.com        thread.getITBPtr()->demapPage(vaddr, asn);
41511887Sandreas.sandberg@arm.com        thread.getDTBPtr()->demapPage(vaddr, asn);
41611887Sandreas.sandberg@arm.com    }
41711887Sandreas.sandberg@arm.com
41811887Sandreas.sandberg@arm.com    RegVal
41911887Sandreas.sandberg@arm.com    readCCRegOperand(const StaticInst *si, int idx) override
42011887Sandreas.sandberg@arm.com    {
42111887Sandreas.sandberg@arm.com        const RegId& reg = si->srcRegIdx(idx);
42211887Sandreas.sandberg@arm.com        assert(reg.isCCReg());
42311887Sandreas.sandberg@arm.com        return thread.readCCReg(reg.index());
42411887Sandreas.sandberg@arm.com    }
42511476Sandreas.sandberg@arm.com
42611476Sandreas.sandberg@arm.com    void
42711408Sandreas.sandberg@arm.com    setCCRegOperand(const StaticInst *si, int idx, RegVal val) override
42811408Sandreas.sandberg@arm.com    {
42911408Sandreas.sandberg@arm.com        const RegId& reg = si->destRegIdx(idx);
43011408Sandreas.sandberg@arm.com        assert(reg.isCCReg());
43111408Sandreas.sandberg@arm.com        thread.setCCReg(reg.index(), val);
43211408Sandreas.sandberg@arm.com    }
43311408Sandreas.sandberg@arm.com
43411887Sandreas.sandberg@arm.com    void
43511887Sandreas.sandberg@arm.com    demapInstPage(Addr vaddr, uint64_t asn)
43611476Sandreas.sandberg@arm.com    {
43711887Sandreas.sandberg@arm.com        thread.getITBPtr()->demapPage(vaddr, asn);
43811887Sandreas.sandberg@arm.com    }
43911476Sandreas.sandberg@arm.com
44011476Sandreas.sandberg@arm.com    void
44111476Sandreas.sandberg@arm.com    demapDataPage(Addr vaddr, uint64_t asn)
44211476Sandreas.sandberg@arm.com    {
4436121Snate@binkert.org        thread.getDTBPtr()->demapPage(vaddr, asn);
444955SN/A    }
445955SN/A
4462632Sstever@eecs.umich.edu    BaseCPU *getCpuPtr() { return &cpu; }
4472632Sstever@eecs.umich.edu
448955SN/A  public:
449955SN/A    // monitor/mwait funtions
450955SN/A    void armMonitor(Addr address) override
451955SN/A    { getCpuPtr()->armMonitor(inst->id.threadId, address); }
4528878Ssteve.reinhardt@amd.com
453955SN/A    bool mwait(PacketPtr pkt) override
4542632Sstever@eecs.umich.edu    { return getCpuPtr()->mwait(inst->id.threadId, pkt); }
4552632Sstever@eecs.umich.edu
4562632Sstever@eecs.umich.edu    void mwaitAtomic(ThreadContext *tc) override
4572632Sstever@eecs.umich.edu    { return getCpuPtr()->mwaitAtomic(inst->id.threadId, tc, thread.dtb); }
4582632Sstever@eecs.umich.edu
4592632Sstever@eecs.umich.edu    AddressMonitor *getAddrMonitor() override
4602632Sstever@eecs.umich.edu    { return getCpuPtr()->getCpuAddrMonitor(inst->id.threadId); }
4618268Ssteve.reinhardt@amd.com};
4628268Ssteve.reinhardt@amd.com
4638268Ssteve.reinhardt@amd.com}
4648268Ssteve.reinhardt@amd.com
4658268Ssteve.reinhardt@amd.com#endif /* __CPU_MINOR_EXEC_CONTEXT_HH__ */
4668268Ssteve.reinhardt@amd.com