exec_context.hh revision 11567
11758Ssaidi@eecs.umich.edu/* 21758Ssaidi@eecs.umich.edu * Copyright (c) 2014 ARM Limited 31758Ssaidi@eecs.umich.edu * All rights reserved 41758Ssaidi@eecs.umich.edu * 51758Ssaidi@eecs.umich.edu * The license below extends only to copyright in the software and shall 61758Ssaidi@eecs.umich.edu * not be construed as granting a license to any other intellectual 71758Ssaidi@eecs.umich.edu * property including but not limited to intellectual property relating 81758Ssaidi@eecs.umich.edu * to a hardware implementation of the functionality of the software 91758Ssaidi@eecs.umich.edu * licensed hereunder. You may use the software subject to the license 101758Ssaidi@eecs.umich.edu * terms below provided that you ensure that this notice is replicated 111758Ssaidi@eecs.umich.edu * unmodified and in its entirety in all distributions of the software, 121758Ssaidi@eecs.umich.edu * modified or unmodified, in source code or in binary form. 131758Ssaidi@eecs.umich.edu * 141758Ssaidi@eecs.umich.edu * Copyright (c) 2002-2005 The Regents of The University of Michigan 151758Ssaidi@eecs.umich.edu * Copyright (c) 2015 Advanced Micro Devices, Inc. 161758Ssaidi@eecs.umich.edu * All rights reserved. 171758Ssaidi@eecs.umich.edu * 181758Ssaidi@eecs.umich.edu * Redistribution and use in source and binary forms, with or without 191758Ssaidi@eecs.umich.edu * modification, are permitted provided that the following conditions are 201758Ssaidi@eecs.umich.edu * met: redistributions of source code must retain the above copyright 211758Ssaidi@eecs.umich.edu * notice, this list of conditions and the following disclaimer; 221758Ssaidi@eecs.umich.edu * redistributions in binary form must reproduce the above copyright 231758Ssaidi@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the 241758Ssaidi@eecs.umich.edu * documentation and/or other materials provided with the distribution; 251758Ssaidi@eecs.umich.edu * neither the name of the copyright holders nor the names of its 261758Ssaidi@eecs.umich.edu * contributors may be used to endorse or promote products derived from 271049Sbinkertn@umich.edu * this software without specific prior written permission. 281049Sbinkertn@umich.edu * 291049Sbinkertn@umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 302015Sbinkertn@umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 312015Sbinkertn@umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 322015Sbinkertn@umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 331929Sbinkertn@umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 341929Sbinkertn@umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 351929Sbinkertn@umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 361049Sbinkertn@umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 371929Sbinkertn@umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 381049Sbinkertn@umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 391929Sbinkertn@umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 401929Sbinkertn@umich.edu * 411929Sbinkertn@umich.edu * Authors: Kevin Lim 421929Sbinkertn@umich.edu * Andreas Sandberg 431049Sbinkertn@umich.edu */ 441929Sbinkertn@umich.edu 451929Sbinkertn@umich.edu#ifndef __CPU_EXEC_CONTEXT_HH__ 461929Sbinkertn@umich.edu#define __CPU_EXEC_CONTEXT_HH__ 471929Sbinkertn@umich.edu 481049Sbinkertn@umich.edu#include "arch/registers.hh" 491929Sbinkertn@umich.edu#include "base/types.hh" 501929Sbinkertn@umich.edu#include "config/the_isa.hh" 511929Sbinkertn@umich.edu#include "cpu/base.hh" 521049Sbinkertn@umich.edu#include "cpu/static_inst_fwd.hh" 531929Sbinkertn@umich.edu#include "cpu/translation.hh" 541929Sbinkertn@umich.edu 551929Sbinkertn@umich.edu/** 561929Sbinkertn@umich.edu * The ExecContext is an abstract base class the provides the 571934Sbinkertn@umich.edu * interface used by the ISA to manipulate the state of the CPU model. 581929Sbinkertn@umich.edu * 591929Sbinkertn@umich.edu * Register accessor methods in this class typically provide the index 601929Sbinkertn@umich.edu * of the instruction's operand (e.g., 0 or 1), not the architectural 611049Sbinkertn@umich.edu * register index, to simplify the implementation of register 621049Sbinkertn@umich.edu * renaming. The architectural register index can be found by 631929Sbinkertn@umich.edu * indexing into the instruction's own operand index table. 641929Sbinkertn@umich.edu * 651049Sbinkertn@umich.edu * @note The methods in this class typically take a raw pointer to the 661929Sbinkertn@umich.edu * StaticInst is provided instead of a ref-counted StaticInstPtr to 671929Sbinkertn@umich.edu * reduce overhead as an argument. This is fine as long as the 681929Sbinkertn@umich.edu * implementation doesn't copy the pointer into any long-term storage 691049Sbinkertn@umich.edu * (which is pretty hard to imagine they would have reason to do). 701929Sbinkertn@umich.edu */ 711929Sbinkertn@umich.educlass ExecContext { 721929Sbinkertn@umich.edu public: 731929Sbinkertn@umich.edu typedef TheISA::IntReg IntReg; 741929Sbinkertn@umich.edu typedef TheISA::PCState PCState; 751049Sbinkertn@umich.edu typedef TheISA::FloatReg FloatReg; 761929Sbinkertn@umich.edu typedef TheISA::FloatRegBits FloatRegBits; 771929Sbinkertn@umich.edu typedef TheISA::MiscReg MiscReg; 781929Sbinkertn@umich.edu 791929Sbinkertn@umich.edu typedef TheISA::CCReg CCReg; 801929Sbinkertn@umich.edu 811929Sbinkertn@umich.edu public: 821929Sbinkertn@umich.edu /** 831929Sbinkertn@umich.edu * @{ 841929Sbinkertn@umich.edu * @name Integer Register Interfaces 851929Sbinkertn@umich.edu * 861929Sbinkertn@umich.edu */ 871929Sbinkertn@umich.edu 881049Sbinkertn@umich.edu /** Reads an integer register. */ 891929Sbinkertn@umich.edu virtual IntReg readIntRegOperand(const StaticInst *si, int idx) = 0; 901929Sbinkertn@umich.edu 911929Sbinkertn@umich.edu /** Sets an integer register to a value. */ 921929Sbinkertn@umich.edu virtual void setIntRegOperand(const StaticInst *si, 931929Sbinkertn@umich.edu int idx, IntReg val) = 0; 941929Sbinkertn@umich.edu 951929Sbinkertn@umich.edu /** @} */ 961929Sbinkertn@umich.edu 971929Sbinkertn@umich.edu 981929Sbinkertn@umich.edu /** 991929Sbinkertn@umich.edu * @{ 1001929Sbinkertn@umich.edu * @name Floating Point Register Interfaces 1011929Sbinkertn@umich.edu */ 1021929Sbinkertn@umich.edu 1031929Sbinkertn@umich.edu /** Reads a floating point register of single register width. */ 1041929Sbinkertn@umich.edu virtual FloatReg readFloatRegOperand(const StaticInst *si, int idx) = 0; 1051929Sbinkertn@umich.edu 1061929Sbinkertn@umich.edu /** Reads a floating point register in its binary format, instead 1071929Sbinkertn@umich.edu * of by value. */ 1081929Sbinkertn@umich.edu virtual FloatRegBits readFloatRegOperandBits(const StaticInst *si, 1091929Sbinkertn@umich.edu int idx) = 0; 1101929Sbinkertn@umich.edu 1111929Sbinkertn@umich.edu /** Sets a floating point register of single width to a value. */ 1121929Sbinkertn@umich.edu virtual void setFloatRegOperand(const StaticInst *si, 1131929Sbinkertn@umich.edu int idx, FloatReg val) = 0; 1141929Sbinkertn@umich.edu 1151929Sbinkertn@umich.edu /** Sets the bits of a floating point register of single width 1161929Sbinkertn@umich.edu * to a binary value. */ 1171929Sbinkertn@umich.edu virtual void setFloatRegOperandBits(const StaticInst *si, 1181929Sbinkertn@umich.edu int idx, FloatRegBits val) = 0; 1191929Sbinkertn@umich.edu 1201929Sbinkertn@umich.edu /** @} */ 1211929Sbinkertn@umich.edu 1221929Sbinkertn@umich.edu /** 1231929Sbinkertn@umich.edu * @{ 1241929Sbinkertn@umich.edu * @name Condition Code Registers 1251929Sbinkertn@umich.edu */ 1261929Sbinkertn@umich.edu virtual CCReg readCCRegOperand(const StaticInst *si, int idx) = 0; 1271929Sbinkertn@umich.edu virtual void setCCRegOperand(const StaticInst *si, int idx, CCReg val) = 0; 1281929Sbinkertn@umich.edu /** @} */ 1291929Sbinkertn@umich.edu 1301929Sbinkertn@umich.edu /** 1311929Sbinkertn@umich.edu * @{ 1321929Sbinkertn@umich.edu * @name Misc Register Interfaces 1331929Sbinkertn@umich.edu */ 1341929Sbinkertn@umich.edu virtual MiscReg readMiscRegOperand(const StaticInst *si, int idx) = 0; 1351929Sbinkertn@umich.edu virtual void setMiscRegOperand(const StaticInst *si, 1361929Sbinkertn@umich.edu int idx, const MiscReg &val) = 0; 1371929Sbinkertn@umich.edu 1381929Sbinkertn@umich.edu /** 1391929Sbinkertn@umich.edu * Reads a miscellaneous register, handling any architectural 1401929Sbinkertn@umich.edu * side effects due to reading that register. 1411929Sbinkertn@umich.edu */ 1421929Sbinkertn@umich.edu virtual MiscReg readMiscReg(int misc_reg) = 0; 1431929Sbinkertn@umich.edu 1441929Sbinkertn@umich.edu /** 1451929Sbinkertn@umich.edu * Sets a miscellaneous register, handling any architectural 1461929Sbinkertn@umich.edu * side effects due to writing that register. 1471929Sbinkertn@umich.edu */ 1481929Sbinkertn@umich.edu virtual void setMiscReg(int misc_reg, const MiscReg &val) = 0; 1491929Sbinkertn@umich.edu 1501929Sbinkertn@umich.edu /** @} */ 1511986Sbinkertn@umich.edu 1521986Sbinkertn@umich.edu /** 1531929Sbinkertn@umich.edu * @{ 1541929Sbinkertn@umich.edu * @name PC Control 1551929Sbinkertn@umich.edu */ 1561929Sbinkertn@umich.edu virtual PCState pcState() const = 0; 1571929Sbinkertn@umich.edu virtual void pcState(const PCState &val) = 0; 1581929Sbinkertn@umich.edu /** @} */ 1591929Sbinkertn@umich.edu 1601929Sbinkertn@umich.edu /** 1611986Sbinkertn@umich.edu * @{ 1621986Sbinkertn@umich.edu * @name Memory Interface 1631929Sbinkertn@umich.edu */ 1641929Sbinkertn@umich.edu /** 1651929Sbinkertn@umich.edu * Record the effective address of the instruction. 1661929Sbinkertn@umich.edu * 1671929Sbinkertn@umich.edu * @note Only valid for memory ops. 1681929Sbinkertn@umich.edu */ 1691929Sbinkertn@umich.edu virtual void setEA(Addr EA) = 0; 1701929Sbinkertn@umich.edu /** 1711929Sbinkertn@umich.edu * Get the effective address of the instruction. 1721929Sbinkertn@umich.edu * 1731049Sbinkertn@umich.edu * @note Only valid for memory ops. 1741049Sbinkertn@umich.edu */ 1751929Sbinkertn@umich.edu virtual Addr getEA() const = 0; 1761929Sbinkertn@umich.edu 1772343Sbinkertn@umich.edu /** 1781929Sbinkertn@umich.edu * Perform an atomic memory read operation. Must be overridden 1791929Sbinkertn@umich.edu * for exec contexts that support atomic memory mode. Not pure 1801929Sbinkertn@umich.edu * virtual since exec contexts that only support timing memory 1811929Sbinkertn@umich.edu * mode need not override (though in that case this function 1821049Sbinkertn@umich.edu * should never be called). 1831049Sbinkertn@umich.edu */ 1841929Sbinkertn@umich.edu virtual Fault readMem(Addr addr, uint8_t *data, unsigned int size, 1851929Sbinkertn@umich.edu unsigned int flags) 1862343Sbinkertn@umich.edu { 1871929Sbinkertn@umich.edu panic("ExecContext::readMem() should be overridden\n"); 1881929Sbinkertn@umich.edu } 1891929Sbinkertn@umich.edu 1901049Sbinkertn@umich.edu /** 1911929Sbinkertn@umich.edu * Initiate a timing memory read operation. Must be overridden 1921049Sbinkertn@umich.edu * for exec contexts that support timing memory mode. Not pure 1931986Sbinkertn@umich.edu * virtual since exec contexts that only support atomic memory 1941986Sbinkertn@umich.edu * mode need not override (though in that case this function 1951986Sbinkertn@umich.edu * should never be called). 1961929Sbinkertn@umich.edu */ 1971929Sbinkertn@umich.edu virtual Fault initiateMemRead(Addr addr, unsigned int size, 1981929Sbinkertn@umich.edu unsigned int flags) 1991929Sbinkertn@umich.edu { 2001929Sbinkertn@umich.edu panic("ExecContext::initiateMemRead() should be overridden\n"); 2011929Sbinkertn@umich.edu } 2021929Sbinkertn@umich.edu 2031929Sbinkertn@umich.edu /** 2041929Sbinkertn@umich.edu * For atomic-mode contexts, perform an atomic memory write operation. 2051929Sbinkertn@umich.edu * For timing-mode contexts, initiate a timing memory write operation. 2061929Sbinkertn@umich.edu */ 2071049Sbinkertn@umich.edu virtual Fault writeMem(uint8_t *data, unsigned int size, Addr addr, 2081929Sbinkertn@umich.edu unsigned int flags, uint64_t *res) = 0; 2091929Sbinkertn@umich.edu 2101929Sbinkertn@umich.edu /** 2111929Sbinkertn@umich.edu * Sets the number of consecutive store conditional failures. 2121049Sbinkertn@umich.edu */ 2131929Sbinkertn@umich.edu virtual void setStCondFailures(unsigned int sc_failures) = 0; 2141929Sbinkertn@umich.edu 2151049Sbinkertn@umich.edu /** 2161929Sbinkertn@umich.edu * Returns the number of consecutive store conditional failures. 2171929Sbinkertn@umich.edu */ 2181049Sbinkertn@umich.edu virtual unsigned int readStCondFailures() const = 0; 2191929Sbinkertn@umich.edu 2201929Sbinkertn@umich.edu /** @} */ 2211929Sbinkertn@umich.edu 2221929Sbinkertn@umich.edu /** 2231929Sbinkertn@umich.edu * @{ 2241049Sbinkertn@umich.edu * @name SysCall Emulation Interfaces 2251929Sbinkertn@umich.edu */ 2261929Sbinkertn@umich.edu 2271929Sbinkertn@umich.edu /** 2281929Sbinkertn@umich.edu * Executes a syscall specified by the callnum. 2291929Sbinkertn@umich.edu */ 2301049Sbinkertn@umich.edu virtual void syscall(int64_t callnum) = 0; 2311929Sbinkertn@umich.edu 2321929Sbinkertn@umich.edu /** @} */ 2331049Sbinkertn@umich.edu 2341986Sbinkertn@umich.edu /** Returns a pointer to the ThreadContext. */ 2351986Sbinkertn@umich.edu virtual ThreadContext *tcBase() = 0; 2361986Sbinkertn@umich.edu 2371986Sbinkertn@umich.edu /** 2381986Sbinkertn@umich.edu * @{ 2391986Sbinkertn@umich.edu * @name Alpha-Specific Interfaces 2401986Sbinkertn@umich.edu */ 2411986Sbinkertn@umich.edu 2421929Sbinkertn@umich.edu /** 2431929Sbinkertn@umich.edu * Somewhat Alpha-specific function that handles returning from an 2441929Sbinkertn@umich.edu * error or interrupt. 2451929Sbinkertn@umich.edu */ 2461929Sbinkertn@umich.edu virtual Fault hwrei() = 0; 2471929Sbinkertn@umich.edu 2481049Sbinkertn@umich.edu /** 2491929Sbinkertn@umich.edu * Check for special simulator handling of specific PAL calls. If 2501929Sbinkertn@umich.edu * return value is false, actual PAL call will be suppressed. 2511049Sbinkertn@umich.edu */ 2521929Sbinkertn@umich.edu virtual bool simPalCheck(int palFunc) = 0; 2531929Sbinkertn@umich.edu 2541929Sbinkertn@umich.edu /** @} */ 2551929Sbinkertn@umich.edu 2561929Sbinkertn@umich.edu /** 2571929Sbinkertn@umich.edu * @{ 2581929Sbinkertn@umich.edu * @name ARM-Specific Interfaces 2591929Sbinkertn@umich.edu */ 2601987Sbinkertn@umich.edu 2611987Sbinkertn@umich.edu virtual bool readPredicate() = 0; 2621987Sbinkertn@umich.edu virtual void setPredicate(bool val) = 0; 2631987Sbinkertn@umich.edu 2641929Sbinkertn@umich.edu /** @} */ 2651929Sbinkertn@umich.edu 2661929Sbinkertn@umich.edu /** 2671929Sbinkertn@umich.edu * @{ 2681929Sbinkertn@umich.edu * @name X86-Specific Interfaces 2691929Sbinkertn@umich.edu */ 2701929Sbinkertn@umich.edu 2711929Sbinkertn@umich.edu /** 2721929Sbinkertn@umich.edu * Invalidate a page in the DTLB <i>and</i> ITLB. 2731929Sbinkertn@umich.edu */ 2741929Sbinkertn@umich.edu virtual void demapPage(Addr vaddr, uint64_t asn) = 0; 2751929Sbinkertn@umich.edu virtual void armMonitor(Addr address) = 0; 2761929Sbinkertn@umich.edu virtual bool mwait(PacketPtr pkt) = 0; 2771929Sbinkertn@umich.edu virtual void mwaitAtomic(ThreadContext *tc) = 0; 2781987Sbinkertn@umich.edu virtual AddressMonitor *getAddrMonitor() = 0; 2791987Sbinkertn@umich.edu 2801987Sbinkertn@umich.edu /** @} */ 2811987Sbinkertn@umich.edu 2821929Sbinkertn@umich.edu /** 2831929Sbinkertn@umich.edu * @{ 2841929Sbinkertn@umich.edu * @name MIPS-Specific Interfaces 2851929Sbinkertn@umich.edu */ 2861929Sbinkertn@umich.edu 2871929Sbinkertn@umich.edu#if THE_ISA == MIPS_ISA 2881929Sbinkertn@umich.edu virtual MiscReg readRegOtherThread(int regIdx, 2891929Sbinkertn@umich.edu ThreadID tid = InvalidThreadID) = 0; 2901929Sbinkertn@umich.edu virtual void setRegOtherThread(int regIdx, MiscReg val, 2911929Sbinkertn@umich.edu ThreadID tid = InvalidThreadID) = 0; 2921929Sbinkertn@umich.edu#endif 2931929Sbinkertn@umich.edu 2941929Sbinkertn@umich.edu /** @} */ 2951929Sbinkertn@umich.edu}; 2961929Sbinkertn@umich.edu 2971929Sbinkertn@umich.edu#endif // __CPU_EXEC_CONTEXT_HH__ 2981986Sbinkertn@umich.edu