exec_context.hh revision 13610
110259SAndrew.Bardsley@arm.com/*
213610Sgiacomo.gabrielli@arm.com * Copyright (c) 2011-2014, 2016-2017 ARM Limited
310259SAndrew.Bardsley@arm.com * Copyright (c) 2013 Advanced Micro Devices, Inc.
410259SAndrew.Bardsley@arm.com * All rights reserved
510259SAndrew.Bardsley@arm.com *
610259SAndrew.Bardsley@arm.com * The license below extends only to copyright in the software and shall
710259SAndrew.Bardsley@arm.com * not be construed as granting a license to any other intellectual
810259SAndrew.Bardsley@arm.com * property including but not limited to intellectual property relating
910259SAndrew.Bardsley@arm.com * to a hardware implementation of the functionality of the software
1010259SAndrew.Bardsley@arm.com * licensed hereunder.  You may use the software subject to the license
1110259SAndrew.Bardsley@arm.com * terms below provided that you ensure that this notice is replicated
1210259SAndrew.Bardsley@arm.com * unmodified and in its entirety in all distributions of the software,
1310259SAndrew.Bardsley@arm.com * modified or unmodified, in source code or in binary form.
1410259SAndrew.Bardsley@arm.com *
1510259SAndrew.Bardsley@arm.com * Copyright (c) 2002-2005 The Regents of The University of Michigan
1610259SAndrew.Bardsley@arm.com * All rights reserved.
1710259SAndrew.Bardsley@arm.com *
1810259SAndrew.Bardsley@arm.com * Redistribution and use in source and binary forms, with or without
1910259SAndrew.Bardsley@arm.com * modification, are permitted provided that the following conditions are
2010259SAndrew.Bardsley@arm.com * met: redistributions of source code must retain the above copyright
2110259SAndrew.Bardsley@arm.com * notice, this list of conditions and the following disclaimer;
2210259SAndrew.Bardsley@arm.com * redistributions in binary form must reproduce the above copyright
2310259SAndrew.Bardsley@arm.com * notice, this list of conditions and the following disclaimer in the
2410259SAndrew.Bardsley@arm.com * documentation and/or other materials provided with the distribution;
2510259SAndrew.Bardsley@arm.com * neither the name of the copyright holders nor the names of its
2610259SAndrew.Bardsley@arm.com * contributors may be used to endorse or promote products derived from
2710259SAndrew.Bardsley@arm.com * this software without specific prior written permission.
2810259SAndrew.Bardsley@arm.com *
2910259SAndrew.Bardsley@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
3010259SAndrew.Bardsley@arm.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
3110259SAndrew.Bardsley@arm.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
3210259SAndrew.Bardsley@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
3310259SAndrew.Bardsley@arm.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
3410259SAndrew.Bardsley@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
3510259SAndrew.Bardsley@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
3610259SAndrew.Bardsley@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
3710259SAndrew.Bardsley@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
3810259SAndrew.Bardsley@arm.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
3910259SAndrew.Bardsley@arm.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
4010259SAndrew.Bardsley@arm.com *
4110259SAndrew.Bardsley@arm.com * Authors: Steve Reinhardt
4210259SAndrew.Bardsley@arm.com *          Dave Greene
4310259SAndrew.Bardsley@arm.com *          Nathan Binkert
4410259SAndrew.Bardsley@arm.com *          Andrew Bardsley
4510259SAndrew.Bardsley@arm.com */
4610259SAndrew.Bardsley@arm.com
4710259SAndrew.Bardsley@arm.com/**
4810259SAndrew.Bardsley@arm.com * @file
4910259SAndrew.Bardsley@arm.com *
5010259SAndrew.Bardsley@arm.com *  ExecContext bears the exec_context interface for Minor.
5110259SAndrew.Bardsley@arm.com */
5210259SAndrew.Bardsley@arm.com
5310259SAndrew.Bardsley@arm.com#ifndef __CPU_MINOR_EXEC_CONTEXT_HH__
5410259SAndrew.Bardsley@arm.com#define __CPU_MINOR_EXEC_CONTEXT_HH__
5510259SAndrew.Bardsley@arm.com
5610319SAndreas.Sandberg@ARM.com#include "cpu/exec_context.hh"
5710259SAndrew.Bardsley@arm.com#include "cpu/minor/execute.hh"
5810259SAndrew.Bardsley@arm.com#include "cpu/minor/pipeline.hh"
5910259SAndrew.Bardsley@arm.com#include "cpu/base.hh"
6010259SAndrew.Bardsley@arm.com#include "cpu/simple_thread.hh"
6111608Snikos.nikoleris@arm.com#include "mem/request.hh"
6210259SAndrew.Bardsley@arm.com#include "debug/MinorExecute.hh"
6310259SAndrew.Bardsley@arm.com
6410259SAndrew.Bardsley@arm.comnamespace Minor
6510259SAndrew.Bardsley@arm.com{
6610259SAndrew.Bardsley@arm.com
6710259SAndrew.Bardsley@arm.com/* Forward declaration of Execute */
6810259SAndrew.Bardsley@arm.comclass Execute;
6910259SAndrew.Bardsley@arm.com
7010259SAndrew.Bardsley@arm.com/** ExecContext bears the exec_context interface for Minor.  This nicely
7110259SAndrew.Bardsley@arm.com *  separates that interface from other classes such as Pipeline, MinorCPU
7210259SAndrew.Bardsley@arm.com *  and DynMinorInst and makes it easier to see what state is accessed by it.
7310259SAndrew.Bardsley@arm.com */
7410319SAndreas.Sandberg@ARM.comclass ExecContext : public ::ExecContext
7510259SAndrew.Bardsley@arm.com{
7610259SAndrew.Bardsley@arm.com  public:
7710259SAndrew.Bardsley@arm.com    MinorCPU &cpu;
7810259SAndrew.Bardsley@arm.com
7910259SAndrew.Bardsley@arm.com    /** ThreadState object, provides all the architectural state. */
8010259SAndrew.Bardsley@arm.com    SimpleThread &thread;
8110259SAndrew.Bardsley@arm.com
8210259SAndrew.Bardsley@arm.com    /** The execute stage so we can peek at its contents. */
8310259SAndrew.Bardsley@arm.com    Execute &execute;
8410259SAndrew.Bardsley@arm.com
8510259SAndrew.Bardsley@arm.com    /** Instruction for the benefit of memory operations and for PC */
8610259SAndrew.Bardsley@arm.com    MinorDynInstPtr inst;
8710259SAndrew.Bardsley@arm.com
8810259SAndrew.Bardsley@arm.com    ExecContext (
8910259SAndrew.Bardsley@arm.com        MinorCPU &cpu_,
9010259SAndrew.Bardsley@arm.com        SimpleThread &thread_, Execute &execute_,
9110259SAndrew.Bardsley@arm.com        MinorDynInstPtr inst_) :
9210259SAndrew.Bardsley@arm.com        cpu(cpu_),
9310259SAndrew.Bardsley@arm.com        thread(thread_),
9410259SAndrew.Bardsley@arm.com        execute(execute_),
9510259SAndrew.Bardsley@arm.com        inst(inst_)
9610259SAndrew.Bardsley@arm.com    {
9710259SAndrew.Bardsley@arm.com        DPRINTF(MinorExecute, "ExecContext setting PC: %s\n", inst->pc);
9810259SAndrew.Bardsley@arm.com        pcState(inst->pc);
9910259SAndrew.Bardsley@arm.com        setPredicate(true);
10010259SAndrew.Bardsley@arm.com        thread.setIntReg(TheISA::ZeroReg, 0);
10110259SAndrew.Bardsley@arm.com#if THE_ISA == ALPHA_ISA
10213500Sgabeblack@google.com        thread.setFloatRegBits(TheISA::ZeroReg, 0);
10310259SAndrew.Bardsley@arm.com#endif
10410259SAndrew.Bardsley@arm.com    }
10510259SAndrew.Bardsley@arm.com
10610259SAndrew.Bardsley@arm.com    Fault
10711612Sandreas.sandberg@arm.com    initiateMemRead(Addr addr, unsigned int size,
10811612Sandreas.sandberg@arm.com                    Request::Flags flags) override
10910259SAndrew.Bardsley@arm.com    {
11011303Ssteve.reinhardt@amd.com        execute.getLSQ().pushRequest(inst, true /* load */, nullptr,
11110259SAndrew.Bardsley@arm.com            size, addr, flags, NULL);
11210259SAndrew.Bardsley@arm.com        return NoFault;
11310259SAndrew.Bardsley@arm.com    }
11410259SAndrew.Bardsley@arm.com
11510259SAndrew.Bardsley@arm.com    Fault
11610259SAndrew.Bardsley@arm.com    writeMem(uint8_t *data, unsigned int size, Addr addr,
11711611SReiley.Jeyapaul@arm.com             Request::Flags flags, uint64_t *res) override
11810259SAndrew.Bardsley@arm.com    {
11910259SAndrew.Bardsley@arm.com        execute.getLSQ().pushRequest(inst, false /* store */, data,
12010259SAndrew.Bardsley@arm.com            size, addr, flags, res);
12110259SAndrew.Bardsley@arm.com        return NoFault;
12210259SAndrew.Bardsley@arm.com    }
12310259SAndrew.Bardsley@arm.com
12413557Sgabeblack@google.com    RegVal
12511611SReiley.Jeyapaul@arm.com    readIntRegOperand(const StaticInst *si, int idx) override
12610259SAndrew.Bardsley@arm.com    {
12712106SRekai.GonzalezAlberquilla@arm.com        const RegId& reg = si->srcRegIdx(idx);
12812106SRekai.GonzalezAlberquilla@arm.com        assert(reg.isIntReg());
12912106SRekai.GonzalezAlberquilla@arm.com        return thread.readIntReg(reg.index());
13010259SAndrew.Bardsley@arm.com    }
13110259SAndrew.Bardsley@arm.com
13213557Sgabeblack@google.com    RegVal
13311611SReiley.Jeyapaul@arm.com    readFloatRegOperandBits(const StaticInst *si, int idx) override
13410259SAndrew.Bardsley@arm.com    {
13512106SRekai.GonzalezAlberquilla@arm.com        const RegId& reg = si->srcRegIdx(idx);
13612106SRekai.GonzalezAlberquilla@arm.com        assert(reg.isFloatReg());
13712106SRekai.GonzalezAlberquilla@arm.com        return thread.readFloatRegBits(reg.index());
13810259SAndrew.Bardsley@arm.com    }
13910259SAndrew.Bardsley@arm.com
14013557Sgabeblack@google.com    const TheISA::VecRegContainer &
14112109SRekai.GonzalezAlberquilla@arm.com    readVecRegOperand(const StaticInst *si, int idx) const override
14212109SRekai.GonzalezAlberquilla@arm.com    {
14312109SRekai.GonzalezAlberquilla@arm.com        const RegId& reg = si->srcRegIdx(idx);
14412109SRekai.GonzalezAlberquilla@arm.com        assert(reg.isVecReg());
14512109SRekai.GonzalezAlberquilla@arm.com        return thread.readVecReg(reg);
14612109SRekai.GonzalezAlberquilla@arm.com    }
14712109SRekai.GonzalezAlberquilla@arm.com
14813557Sgabeblack@google.com    TheISA::VecRegContainer &
14912109SRekai.GonzalezAlberquilla@arm.com    getWritableVecRegOperand(const StaticInst *si, int idx) override
15012109SRekai.GonzalezAlberquilla@arm.com    {
15112109SRekai.GonzalezAlberquilla@arm.com        const RegId& reg = si->destRegIdx(idx);
15212109SRekai.GonzalezAlberquilla@arm.com        assert(reg.isVecReg());
15312109SRekai.GonzalezAlberquilla@arm.com        return thread.getWritableVecReg(reg);
15412109SRekai.GonzalezAlberquilla@arm.com    }
15512109SRekai.GonzalezAlberquilla@arm.com
15612109SRekai.GonzalezAlberquilla@arm.com    TheISA::VecElem
15712109SRekai.GonzalezAlberquilla@arm.com    readVecElemOperand(const StaticInst *si, int idx) const override
15812109SRekai.GonzalezAlberquilla@arm.com    {
15912109SRekai.GonzalezAlberquilla@arm.com        const RegId& reg = si->srcRegIdx(idx);
16013598Sgiacomo.travaglini@arm.com        assert(reg.isVecElem());
16112109SRekai.GonzalezAlberquilla@arm.com        return thread.readVecElem(reg);
16212109SRekai.GonzalezAlberquilla@arm.com    }
16312109SRekai.GonzalezAlberquilla@arm.com
16413610Sgiacomo.gabrielli@arm.com    const TheISA::VecPredRegContainer&
16513610Sgiacomo.gabrielli@arm.com    readVecPredRegOperand(const StaticInst *si, int idx) const override
16613610Sgiacomo.gabrielli@arm.com    {
16713610Sgiacomo.gabrielli@arm.com        const RegId& reg = si->srcRegIdx(idx);
16813610Sgiacomo.gabrielli@arm.com        assert(reg.isVecPredReg());
16913610Sgiacomo.gabrielli@arm.com        return thread.readVecPredReg(reg);
17013610Sgiacomo.gabrielli@arm.com    }
17113610Sgiacomo.gabrielli@arm.com
17213610Sgiacomo.gabrielli@arm.com    TheISA::VecPredRegContainer&
17313610Sgiacomo.gabrielli@arm.com    getWritableVecPredRegOperand(const StaticInst *si, int idx) override
17413610Sgiacomo.gabrielli@arm.com    {
17513610Sgiacomo.gabrielli@arm.com        const RegId& reg = si->destRegIdx(idx);
17613610Sgiacomo.gabrielli@arm.com        assert(reg.isVecPredReg());
17713610Sgiacomo.gabrielli@arm.com        return thread.getWritableVecPredReg(reg);
17813610Sgiacomo.gabrielli@arm.com    }
17913610Sgiacomo.gabrielli@arm.com
18010259SAndrew.Bardsley@arm.com    void
18113557Sgabeblack@google.com    setIntRegOperand(const StaticInst *si, int idx, RegVal val) override
18210259SAndrew.Bardsley@arm.com    {
18312106SRekai.GonzalezAlberquilla@arm.com        const RegId& reg = si->destRegIdx(idx);
18412106SRekai.GonzalezAlberquilla@arm.com        assert(reg.isIntReg());
18512106SRekai.GonzalezAlberquilla@arm.com        thread.setIntReg(reg.index(), val);
18610259SAndrew.Bardsley@arm.com    }
18710259SAndrew.Bardsley@arm.com
18810259SAndrew.Bardsley@arm.com    void
18913557Sgabeblack@google.com    setFloatRegOperandBits(const StaticInst *si, int idx, RegVal val) override
19010259SAndrew.Bardsley@arm.com    {
19112106SRekai.GonzalezAlberquilla@arm.com        const RegId& reg = si->destRegIdx(idx);
19212106SRekai.GonzalezAlberquilla@arm.com        assert(reg.isFloatReg());
19312106SRekai.GonzalezAlberquilla@arm.com        thread.setFloatRegBits(reg.index(), val);
19410259SAndrew.Bardsley@arm.com    }
19510259SAndrew.Bardsley@arm.com
19612109SRekai.GonzalezAlberquilla@arm.com    void
19712109SRekai.GonzalezAlberquilla@arm.com    setVecRegOperand(const StaticInst *si, int idx,
19812109SRekai.GonzalezAlberquilla@arm.com                     const TheISA::VecRegContainer& val) override
19912109SRekai.GonzalezAlberquilla@arm.com    {
20012109SRekai.GonzalezAlberquilla@arm.com        const RegId& reg = si->destRegIdx(idx);
20112109SRekai.GonzalezAlberquilla@arm.com        assert(reg.isVecReg());
20212109SRekai.GonzalezAlberquilla@arm.com        thread.setVecReg(reg, val);
20312109SRekai.GonzalezAlberquilla@arm.com    }
20412109SRekai.GonzalezAlberquilla@arm.com
20513610Sgiacomo.gabrielli@arm.com    void
20613610Sgiacomo.gabrielli@arm.com    setVecPredRegOperand(const StaticInst *si, int idx,
20713610Sgiacomo.gabrielli@arm.com                         const TheISA::VecPredRegContainer& val)
20813610Sgiacomo.gabrielli@arm.com    {
20913610Sgiacomo.gabrielli@arm.com        const RegId& reg = si->destRegIdx(idx);
21013610Sgiacomo.gabrielli@arm.com        assert(reg.isVecPredReg());
21113610Sgiacomo.gabrielli@arm.com        thread.setVecPredReg(reg, val);
21213610Sgiacomo.gabrielli@arm.com    }
21313610Sgiacomo.gabrielli@arm.com
21412109SRekai.GonzalezAlberquilla@arm.com    /** Vector Register Lane Interfaces. */
21512109SRekai.GonzalezAlberquilla@arm.com    /** @{ */
21612109SRekai.GonzalezAlberquilla@arm.com    /** Reads source vector 8bit operand. */
21712109SRekai.GonzalezAlberquilla@arm.com    ConstVecLane8
21812109SRekai.GonzalezAlberquilla@arm.com    readVec8BitLaneOperand(const StaticInst *si, int idx) const
21912109SRekai.GonzalezAlberquilla@arm.com                            override
22012109SRekai.GonzalezAlberquilla@arm.com    {
22112109SRekai.GonzalezAlberquilla@arm.com        const RegId& reg = si->srcRegIdx(idx);
22212109SRekai.GonzalezAlberquilla@arm.com        assert(reg.isVecReg());
22312109SRekai.GonzalezAlberquilla@arm.com        return thread.readVec8BitLaneReg(reg);
22412109SRekai.GonzalezAlberquilla@arm.com    }
22512109SRekai.GonzalezAlberquilla@arm.com
22612109SRekai.GonzalezAlberquilla@arm.com    /** Reads source vector 16bit operand. */
22712109SRekai.GonzalezAlberquilla@arm.com    ConstVecLane16
22812109SRekai.GonzalezAlberquilla@arm.com    readVec16BitLaneOperand(const StaticInst *si, int idx) const
22912109SRekai.GonzalezAlberquilla@arm.com                            override
23012109SRekai.GonzalezAlberquilla@arm.com    {
23112109SRekai.GonzalezAlberquilla@arm.com        const RegId& reg = si->srcRegIdx(idx);
23212109SRekai.GonzalezAlberquilla@arm.com        assert(reg.isVecReg());
23312109SRekai.GonzalezAlberquilla@arm.com        return thread.readVec16BitLaneReg(reg);
23412109SRekai.GonzalezAlberquilla@arm.com    }
23512109SRekai.GonzalezAlberquilla@arm.com
23612109SRekai.GonzalezAlberquilla@arm.com    /** Reads source vector 32bit operand. */
23712109SRekai.GonzalezAlberquilla@arm.com    ConstVecLane32
23812109SRekai.GonzalezAlberquilla@arm.com    readVec32BitLaneOperand(const StaticInst *si, int idx) const
23912109SRekai.GonzalezAlberquilla@arm.com                            override
24012109SRekai.GonzalezAlberquilla@arm.com    {
24112109SRekai.GonzalezAlberquilla@arm.com        const RegId& reg = si->srcRegIdx(idx);
24212109SRekai.GonzalezAlberquilla@arm.com        assert(reg.isVecReg());
24312109SRekai.GonzalezAlberquilla@arm.com        return thread.readVec32BitLaneReg(reg);
24412109SRekai.GonzalezAlberquilla@arm.com    }
24512109SRekai.GonzalezAlberquilla@arm.com
24612109SRekai.GonzalezAlberquilla@arm.com    /** Reads source vector 64bit operand. */
24712109SRekai.GonzalezAlberquilla@arm.com    ConstVecLane64
24812109SRekai.GonzalezAlberquilla@arm.com    readVec64BitLaneOperand(const StaticInst *si, int idx) const
24912109SRekai.GonzalezAlberquilla@arm.com                            override
25012109SRekai.GonzalezAlberquilla@arm.com    {
25112109SRekai.GonzalezAlberquilla@arm.com        const RegId& reg = si->srcRegIdx(idx);
25212109SRekai.GonzalezAlberquilla@arm.com        assert(reg.isVecReg());
25312109SRekai.GonzalezAlberquilla@arm.com        return thread.readVec64BitLaneReg(reg);
25412109SRekai.GonzalezAlberquilla@arm.com    }
25512109SRekai.GonzalezAlberquilla@arm.com
25612109SRekai.GonzalezAlberquilla@arm.com    /** Write a lane of the destination vector operand. */
25712109SRekai.GonzalezAlberquilla@arm.com    template <typename LD>
25812109SRekai.GonzalezAlberquilla@arm.com    void
25913557Sgabeblack@google.com    setVecLaneOperandT(const StaticInst *si, int idx, const LD& val)
26012109SRekai.GonzalezAlberquilla@arm.com    {
26112109SRekai.GonzalezAlberquilla@arm.com        const RegId& reg = si->destRegIdx(idx);
26212109SRekai.GonzalezAlberquilla@arm.com        assert(reg.isVecReg());
26312109SRekai.GonzalezAlberquilla@arm.com        return thread.setVecLane(reg, val);
26412109SRekai.GonzalezAlberquilla@arm.com    }
26512109SRekai.GonzalezAlberquilla@arm.com    virtual void
26612109SRekai.GonzalezAlberquilla@arm.com    setVecLaneOperand(const StaticInst *si, int idx,
26712109SRekai.GonzalezAlberquilla@arm.com            const LaneData<LaneSize::Byte>& val) override
26812109SRekai.GonzalezAlberquilla@arm.com    {
26912109SRekai.GonzalezAlberquilla@arm.com        setVecLaneOperandT(si, idx, val);
27012109SRekai.GonzalezAlberquilla@arm.com    }
27112109SRekai.GonzalezAlberquilla@arm.com    virtual void
27212109SRekai.GonzalezAlberquilla@arm.com    setVecLaneOperand(const StaticInst *si, int idx,
27312109SRekai.GonzalezAlberquilla@arm.com            const LaneData<LaneSize::TwoByte>& val) override
27412109SRekai.GonzalezAlberquilla@arm.com    {
27512109SRekai.GonzalezAlberquilla@arm.com        setVecLaneOperandT(si, idx, val);
27612109SRekai.GonzalezAlberquilla@arm.com    }
27712109SRekai.GonzalezAlberquilla@arm.com    virtual void
27812109SRekai.GonzalezAlberquilla@arm.com    setVecLaneOperand(const StaticInst *si, int idx,
27912109SRekai.GonzalezAlberquilla@arm.com            const LaneData<LaneSize::FourByte>& val) override
28012109SRekai.GonzalezAlberquilla@arm.com    {
28112109SRekai.GonzalezAlberquilla@arm.com        setVecLaneOperandT(si, idx, val);
28212109SRekai.GonzalezAlberquilla@arm.com    }
28312109SRekai.GonzalezAlberquilla@arm.com    virtual void
28412109SRekai.GonzalezAlberquilla@arm.com    setVecLaneOperand(const StaticInst *si, int idx,
28512109SRekai.GonzalezAlberquilla@arm.com            const LaneData<LaneSize::EightByte>& val) override
28612109SRekai.GonzalezAlberquilla@arm.com    {
28712109SRekai.GonzalezAlberquilla@arm.com        setVecLaneOperandT(si, idx, val);
28812109SRekai.GonzalezAlberquilla@arm.com    }
28912109SRekai.GonzalezAlberquilla@arm.com    /** @} */
29012109SRekai.GonzalezAlberquilla@arm.com
29112109SRekai.GonzalezAlberquilla@arm.com    void
29212109SRekai.GonzalezAlberquilla@arm.com    setVecElemOperand(const StaticInst *si, int idx,
29312109SRekai.GonzalezAlberquilla@arm.com                      const TheISA::VecElem val) override
29412109SRekai.GonzalezAlberquilla@arm.com    {
29512109SRekai.GonzalezAlberquilla@arm.com        const RegId& reg = si->destRegIdx(idx);
29613598Sgiacomo.travaglini@arm.com        assert(reg.isVecElem());
29712109SRekai.GonzalezAlberquilla@arm.com        thread.setVecElem(reg, val);
29812109SRekai.GonzalezAlberquilla@arm.com    }
29912109SRekai.GonzalezAlberquilla@arm.com
30010259SAndrew.Bardsley@arm.com    bool
30113429Srekai.gonzalezalberquilla@arm.com    readPredicate() const override
30210259SAndrew.Bardsley@arm.com    {
30310259SAndrew.Bardsley@arm.com        return thread.readPredicate();
30410259SAndrew.Bardsley@arm.com    }
30510259SAndrew.Bardsley@arm.com
30610259SAndrew.Bardsley@arm.com    void
30711611SReiley.Jeyapaul@arm.com    setPredicate(bool val) override
30810259SAndrew.Bardsley@arm.com    {
30910259SAndrew.Bardsley@arm.com        thread.setPredicate(val);
31010259SAndrew.Bardsley@arm.com    }
31110259SAndrew.Bardsley@arm.com
31210259SAndrew.Bardsley@arm.com    TheISA::PCState
31311611SReiley.Jeyapaul@arm.com    pcState() const override
31410259SAndrew.Bardsley@arm.com    {
31510259SAndrew.Bardsley@arm.com        return thread.pcState();
31610259SAndrew.Bardsley@arm.com    }
31710259SAndrew.Bardsley@arm.com
31810259SAndrew.Bardsley@arm.com    void
31911611SReiley.Jeyapaul@arm.com    pcState(const TheISA::PCState &val) override
32010259SAndrew.Bardsley@arm.com    {
32110259SAndrew.Bardsley@arm.com        thread.pcState(val);
32210259SAndrew.Bardsley@arm.com    }
32310259SAndrew.Bardsley@arm.com
32413557Sgabeblack@google.com    RegVal
32510698Sandreas.hansson@arm.com    readMiscRegNoEffect(int misc_reg) const
32610259SAndrew.Bardsley@arm.com    {
32710259SAndrew.Bardsley@arm.com        return thread.readMiscRegNoEffect(misc_reg);
32810259SAndrew.Bardsley@arm.com    }
32910259SAndrew.Bardsley@arm.com
33013557Sgabeblack@google.com    RegVal
33111611SReiley.Jeyapaul@arm.com    readMiscReg(int misc_reg) override
33210259SAndrew.Bardsley@arm.com    {
33310259SAndrew.Bardsley@arm.com        return thread.readMiscReg(misc_reg);
33410259SAndrew.Bardsley@arm.com    }
33510259SAndrew.Bardsley@arm.com
33610259SAndrew.Bardsley@arm.com    void
33713582Sgabeblack@google.com    setMiscReg(int misc_reg, RegVal val) override
33810259SAndrew.Bardsley@arm.com    {
33910259SAndrew.Bardsley@arm.com        thread.setMiscReg(misc_reg, val);
34010259SAndrew.Bardsley@arm.com    }
34110259SAndrew.Bardsley@arm.com
34213557Sgabeblack@google.com    RegVal
34311611SReiley.Jeyapaul@arm.com    readMiscRegOperand(const StaticInst *si, int idx) override
34410259SAndrew.Bardsley@arm.com    {
34512106SRekai.GonzalezAlberquilla@arm.com        const RegId& reg = si->srcRegIdx(idx);
34612106SRekai.GonzalezAlberquilla@arm.com        assert(reg.isMiscReg());
34712106SRekai.GonzalezAlberquilla@arm.com        return thread.readMiscReg(reg.index());
34810259SAndrew.Bardsley@arm.com    }
34910259SAndrew.Bardsley@arm.com
35010259SAndrew.Bardsley@arm.com    void
35113582Sgabeblack@google.com    setMiscRegOperand(const StaticInst *si, int idx, RegVal val) override
35210259SAndrew.Bardsley@arm.com    {
35312106SRekai.GonzalezAlberquilla@arm.com        const RegId& reg = si->destRegIdx(idx);
35412106SRekai.GonzalezAlberquilla@arm.com        assert(reg.isMiscReg());
35512106SRekai.GonzalezAlberquilla@arm.com        return thread.setMiscReg(reg.index(), val);
35610259SAndrew.Bardsley@arm.com    }
35710259SAndrew.Bardsley@arm.com
35810259SAndrew.Bardsley@arm.com    Fault
35911611SReiley.Jeyapaul@arm.com    hwrei() override
36010259SAndrew.Bardsley@arm.com    {
36110259SAndrew.Bardsley@arm.com#if THE_ISA == ALPHA_ISA
36210259SAndrew.Bardsley@arm.com        return thread.hwrei();
36310259SAndrew.Bardsley@arm.com#else
36410259SAndrew.Bardsley@arm.com        return NoFault;
36510259SAndrew.Bardsley@arm.com#endif
36610259SAndrew.Bardsley@arm.com    }
36710259SAndrew.Bardsley@arm.com
36810259SAndrew.Bardsley@arm.com    bool
36911611SReiley.Jeyapaul@arm.com    simPalCheck(int palFunc) override
37010259SAndrew.Bardsley@arm.com    {
37110259SAndrew.Bardsley@arm.com#if THE_ISA == ALPHA_ISA
37210259SAndrew.Bardsley@arm.com        return thread.simPalCheck(palFunc);
37310259SAndrew.Bardsley@arm.com#else
37410259SAndrew.Bardsley@arm.com        return false;
37510259SAndrew.Bardsley@arm.com#endif
37610259SAndrew.Bardsley@arm.com    }
37710259SAndrew.Bardsley@arm.com
37810259SAndrew.Bardsley@arm.com    void
37911877Sbrandon.potter@amd.com    syscall(int64_t callnum, Fault *fault) override
38013557Sgabeblack@google.com    {
38110259SAndrew.Bardsley@arm.com        if (FullSystem)
38210259SAndrew.Bardsley@arm.com            panic("Syscall emulation isn't available in FS mode.\n");
38310259SAndrew.Bardsley@arm.com
38411877Sbrandon.potter@amd.com        thread.syscall(callnum, fault);
38510259SAndrew.Bardsley@arm.com    }
38610259SAndrew.Bardsley@arm.com
38711611SReiley.Jeyapaul@arm.com    ThreadContext *tcBase() override { return thread.getTC(); }
38810259SAndrew.Bardsley@arm.com
38910259SAndrew.Bardsley@arm.com    /* @todo, should make stCondFailures persistent somewhere */
39011611SReiley.Jeyapaul@arm.com    unsigned int readStCondFailures() const override { return 0; }
39111611SReiley.Jeyapaul@arm.com    void setStCondFailures(unsigned int st_cond_failures) override {}
39210259SAndrew.Bardsley@arm.com
39311005Sandreas.sandberg@arm.com    ContextID contextId() { return thread.contextId(); }
39410259SAndrew.Bardsley@arm.com    /* ISA-specific (or at least currently ISA singleton) functions */
39510259SAndrew.Bardsley@arm.com
39610259SAndrew.Bardsley@arm.com    /* X86: TLB twiddling */
39710259SAndrew.Bardsley@arm.com    void
39811611SReiley.Jeyapaul@arm.com    demapPage(Addr vaddr, uint64_t asn) override
39910259SAndrew.Bardsley@arm.com    {
40010259SAndrew.Bardsley@arm.com        thread.getITBPtr()->demapPage(vaddr, asn);
40110259SAndrew.Bardsley@arm.com        thread.getDTBPtr()->demapPage(vaddr, asn);
40210259SAndrew.Bardsley@arm.com    }
40310259SAndrew.Bardsley@arm.com
40410935Snilay@cs.wisc.edu    TheISA::CCReg
40511611SReiley.Jeyapaul@arm.com    readCCRegOperand(const StaticInst *si, int idx) override
40610935Snilay@cs.wisc.edu    {
40712106SRekai.GonzalezAlberquilla@arm.com        const RegId& reg = si->srcRegIdx(idx);
40812106SRekai.GonzalezAlberquilla@arm.com        assert(reg.isCCReg());
40912106SRekai.GonzalezAlberquilla@arm.com        return thread.readCCReg(reg.index());
41010935Snilay@cs.wisc.edu    }
41110935Snilay@cs.wisc.edu
41210935Snilay@cs.wisc.edu    void
41311611SReiley.Jeyapaul@arm.com    setCCRegOperand(const StaticInst *si, int idx, TheISA::CCReg val) override
41410935Snilay@cs.wisc.edu    {
41512106SRekai.GonzalezAlberquilla@arm.com        const RegId& reg = si->destRegIdx(idx);
41612106SRekai.GonzalezAlberquilla@arm.com        assert(reg.isCCReg());
41712106SRekai.GonzalezAlberquilla@arm.com        thread.setCCReg(reg.index(), val);
41810935Snilay@cs.wisc.edu    }
41910935Snilay@cs.wisc.edu
42010259SAndrew.Bardsley@arm.com    void
42110259SAndrew.Bardsley@arm.com    demapInstPage(Addr vaddr, uint64_t asn)
42210259SAndrew.Bardsley@arm.com    {
42310259SAndrew.Bardsley@arm.com        thread.getITBPtr()->demapPage(vaddr, asn);
42410259SAndrew.Bardsley@arm.com    }
42510259SAndrew.Bardsley@arm.com
42610259SAndrew.Bardsley@arm.com    void
42710259SAndrew.Bardsley@arm.com    demapDataPage(Addr vaddr, uint64_t asn)
42810259SAndrew.Bardsley@arm.com    {
42910259SAndrew.Bardsley@arm.com        thread.getDTBPtr()->demapPage(vaddr, asn);
43010259SAndrew.Bardsley@arm.com    }
43110259SAndrew.Bardsley@arm.com
43210259SAndrew.Bardsley@arm.com    BaseCPU *getCpuPtr() { return &cpu; }
43310259SAndrew.Bardsley@arm.com
43410259SAndrew.Bardsley@arm.com    /* MIPS: other thread register reading/writing */
43513557Sgabeblack@google.com    RegVal
43613557Sgabeblack@google.com    readRegOtherThread(const RegId &reg, ThreadID tid=InvalidThreadID)
43710259SAndrew.Bardsley@arm.com    {
43810259SAndrew.Bardsley@arm.com        SimpleThread *other_thread = (tid == InvalidThreadID
43910259SAndrew.Bardsley@arm.com            ? &thread : cpu.threads[tid]);
44010259SAndrew.Bardsley@arm.com
44112106SRekai.GonzalezAlberquilla@arm.com        switch (reg.classValue()) {
44212104Snathanael.premillieu@arm.com            case IntRegClass:
44312106SRekai.GonzalezAlberquilla@arm.com                return other_thread->readIntReg(reg.index());
44412104Snathanael.premillieu@arm.com                break;
44512104Snathanael.premillieu@arm.com            case FloatRegClass:
44612106SRekai.GonzalezAlberquilla@arm.com                return other_thread->readFloatRegBits(reg.index());
44712104Snathanael.premillieu@arm.com                break;
44812104Snathanael.premillieu@arm.com            case MiscRegClass:
44912106SRekai.GonzalezAlberquilla@arm.com                return other_thread->readMiscReg(reg.index());
45012104Snathanael.premillieu@arm.com            default:
45112104Snathanael.premillieu@arm.com                panic("Unexpected reg class! (%s)",
45212106SRekai.GonzalezAlberquilla@arm.com                      reg.className());
45312104Snathanael.premillieu@arm.com                return 0;
45410259SAndrew.Bardsley@arm.com        }
45510259SAndrew.Bardsley@arm.com    }
45610259SAndrew.Bardsley@arm.com
45710259SAndrew.Bardsley@arm.com    void
45813582Sgabeblack@google.com    setRegOtherThread(const RegId &reg, RegVal val,
45913557Sgabeblack@google.com                      ThreadID tid=InvalidThreadID)
46010259SAndrew.Bardsley@arm.com    {
46110259SAndrew.Bardsley@arm.com        SimpleThread *other_thread = (tid == InvalidThreadID
46210259SAndrew.Bardsley@arm.com            ? &thread : cpu.threads[tid]);
46310259SAndrew.Bardsley@arm.com
46412106SRekai.GonzalezAlberquilla@arm.com        switch (reg.classValue()) {
46512104Snathanael.premillieu@arm.com            case IntRegClass:
46612106SRekai.GonzalezAlberquilla@arm.com                return other_thread->setIntReg(reg.index(), val);
46712104Snathanael.premillieu@arm.com                break;
46812104Snathanael.premillieu@arm.com            case FloatRegClass:
46912106SRekai.GonzalezAlberquilla@arm.com                return other_thread->setFloatRegBits(reg.index(), val);
47012104Snathanael.premillieu@arm.com                break;
47112104Snathanael.premillieu@arm.com            case MiscRegClass:
47212106SRekai.GonzalezAlberquilla@arm.com                return other_thread->setMiscReg(reg.index(), val);
47312104Snathanael.premillieu@arm.com            default:
47412104Snathanael.premillieu@arm.com                panic("Unexpected reg class! (%s)",
47512106SRekai.GonzalezAlberquilla@arm.com                      reg.className());
47610259SAndrew.Bardsley@arm.com        }
47710259SAndrew.Bardsley@arm.com    }
47810529Smorr@cs.wisc.edu
47910529Smorr@cs.wisc.edu  public:
48010529Smorr@cs.wisc.edu    // monitor/mwait funtions
48111611SReiley.Jeyapaul@arm.com    void armMonitor(Addr address) override
48211567Smitch.hayenga@arm.com    { getCpuPtr()->armMonitor(inst->id.threadId, address); }
48311567Smitch.hayenga@arm.com
48411611SReiley.Jeyapaul@arm.com    bool mwait(PacketPtr pkt) override
48511567Smitch.hayenga@arm.com    { return getCpuPtr()->mwait(inst->id.threadId, pkt); }
48611567Smitch.hayenga@arm.com
48711611SReiley.Jeyapaul@arm.com    void mwaitAtomic(ThreadContext *tc) override
48811567Smitch.hayenga@arm.com    { return getCpuPtr()->mwaitAtomic(inst->id.threadId, tc, thread.dtb); }
48911567Smitch.hayenga@arm.com
49011611SReiley.Jeyapaul@arm.com    AddressMonitor *getAddrMonitor() override
49111567Smitch.hayenga@arm.com    { return getCpuPtr()->getCpuAddrMonitor(inst->id.threadId); }
49210259SAndrew.Bardsley@arm.com};
49310259SAndrew.Bardsley@arm.com
49410259SAndrew.Bardsley@arm.com}
49510259SAndrew.Bardsley@arm.com
49610259SAndrew.Bardsley@arm.com#endif /* __CPU_MINOR_EXEC_CONTEXT_HH__ */
497