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