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