faults.hh revision 10417
16019Shines@cs.fsu.edu/*
210037SARM gem5 Developers * Copyright (c) 2010, 2012-2013 ARM Limited
37189Sgblack@eecs.umich.edu * All rights reserved
47189Sgblack@eecs.umich.edu *
57189Sgblack@eecs.umich.edu * The license below extends only to copyright in the software and shall
67189Sgblack@eecs.umich.edu * not be construed as granting a license to any other intellectual
77189Sgblack@eecs.umich.edu * property including but not limited to intellectual property relating
87189Sgblack@eecs.umich.edu * to a hardware implementation of the functionality of the software
97189Sgblack@eecs.umich.edu * licensed hereunder.  You may use the software subject to the license
107189Sgblack@eecs.umich.edu * terms below provided that you ensure that this notice is replicated
117189Sgblack@eecs.umich.edu * unmodified and in its entirety in all distributions of the software,
127189Sgblack@eecs.umich.edu * modified or unmodified, in source code or in binary form.
137189Sgblack@eecs.umich.edu *
146019Shines@cs.fsu.edu * Copyright (c) 2003-2005 The Regents of The University of Michigan
156019Shines@cs.fsu.edu * Copyright (c) 2007-2008 The Florida State University
166019Shines@cs.fsu.edu * All rights reserved.
176019Shines@cs.fsu.edu *
186019Shines@cs.fsu.edu * Redistribution and use in source and binary forms, with or without
196019Shines@cs.fsu.edu * modification, are permitted provided that the following conditions are
206019Shines@cs.fsu.edu * met: redistributions of source code must retain the above copyright
216019Shines@cs.fsu.edu * notice, this list of conditions and the following disclaimer;
226019Shines@cs.fsu.edu * redistributions in binary form must reproduce the above copyright
236019Shines@cs.fsu.edu * notice, this list of conditions and the following disclaimer in the
246019Shines@cs.fsu.edu * documentation and/or other materials provided with the distribution;
256019Shines@cs.fsu.edu * neither the name of the copyright holders nor the names of its
266019Shines@cs.fsu.edu * contributors may be used to endorse or promote products derived from
276019Shines@cs.fsu.edu * this software without specific prior written permission.
286019Shines@cs.fsu.edu *
296019Shines@cs.fsu.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
306019Shines@cs.fsu.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
316019Shines@cs.fsu.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
326019Shines@cs.fsu.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
336019Shines@cs.fsu.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
346019Shines@cs.fsu.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
356019Shines@cs.fsu.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
366019Shines@cs.fsu.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
376019Shines@cs.fsu.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
386019Shines@cs.fsu.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
396019Shines@cs.fsu.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
406019Shines@cs.fsu.edu *
416735Sgblack@eecs.umich.edu * Authors: Ali Saidi
426735Sgblack@eecs.umich.edu *          Gabe Black
4310037SARM gem5 Developers *          Giacomo Gabrielli
4410037SARM gem5 Developers *          Thomas Grocutt
456019Shines@cs.fsu.edu */
466019Shines@cs.fsu.edu
476019Shines@cs.fsu.edu#ifndef __ARM_FAULTS_HH__
486019Shines@cs.fsu.edu#define __ARM_FAULTS_HH__
496019Shines@cs.fsu.edu
507362Sgblack@eecs.umich.edu#include "arch/arm/miscregs.hh"
5110037SARM gem5 Developers#include "arch/arm/pagetable.hh"
526735Sgblack@eecs.umich.edu#include "arch/arm/types.hh"
538229Snate@binkert.org#include "base/misc.hh"
546019Shines@cs.fsu.edu#include "sim/faults.hh"
558782Sgblack@eecs.umich.edu#include "sim/full_system.hh"
566019Shines@cs.fsu.edu
576019Shines@cs.fsu.edu// The design of the "name" and "vect" functions is in sim/faults.hh
586019Shines@cs.fsu.edu
596019Shines@cs.fsu.edunamespace ArmISA
606019Shines@cs.fsu.edu{
616735Sgblack@eecs.umich.edutypedef const Addr FaultOffset;
626019Shines@cs.fsu.edu
637362Sgblack@eecs.umich.educlass ArmFault : public FaultBase
646019Shines@cs.fsu.edu{
656019Shines@cs.fsu.edu  protected:
6610037SARM gem5 Developers    ExtMachInst machInst;
6710037SARM gem5 Developers    uint32_t issRaw;
6810037SARM gem5 Developers
6910037SARM gem5 Developers    // Helper variables for ARMv8 exception handling
7010037SARM gem5 Developers    bool from64;  // True if the exception is generated from the AArch64 state
7110037SARM gem5 Developers    bool to64;  // True if the exception is taken in AArch64 state
7210037SARM gem5 Developers    ExceptionLevel fromEL;  // Source exception level
7310037SARM gem5 Developers    ExceptionLevel toEL;  // Target exception level
7410037SARM gem5 Developers    OperatingMode fromMode;  // Source operating mode
7510037SARM gem5 Developers
766735Sgblack@eecs.umich.edu    Addr getVector(ThreadContext *tc);
7710037SARM gem5 Developers    Addr getVector64(ThreadContext *tc);
786735Sgblack@eecs.umich.edu
796019Shines@cs.fsu.edu  public:
8010037SARM gem5 Developers    /// Generic fault source enums used to index into
8110037SARM gem5 Developers    /// {short/long/aarch64}DescFaultSources[] to get the actual encodings based
8210037SARM gem5 Developers    /// on the current register width state and the translation table format in
8310037SARM gem5 Developers    /// use
8410037SARM gem5 Developers    enum FaultSource
857362Sgblack@eecs.umich.edu    {
8610037SARM gem5 Developers        AlignmentFault = 0,
8710037SARM gem5 Developers        InstructionCacheMaintenance,  // Short-desc. format only
8810037SARM gem5 Developers        SynchExtAbtOnTranslTableWalkLL,
8910037SARM gem5 Developers        SynchPtyErrOnTranslTableWalkLL = SynchExtAbtOnTranslTableWalkLL + 4,
9010037SARM gem5 Developers        TranslationLL = SynchPtyErrOnTranslTableWalkLL + 4,
9110037SARM gem5 Developers        AccessFlagLL = TranslationLL + 4,
9210037SARM gem5 Developers        DomainLL = AccessFlagLL + 4,
9310037SARM gem5 Developers        PermissionLL = DomainLL + 4,
9410037SARM gem5 Developers        DebugEvent = PermissionLL + 4,
9510037SARM gem5 Developers        SynchronousExternalAbort,
9610037SARM gem5 Developers        TLBConflictAbort,  // Requires LPAE
9710037SARM gem5 Developers        SynchPtyErrOnMemoryAccess,
9810037SARM gem5 Developers        AsynchronousExternalAbort,
9910037SARM gem5 Developers        AsynchPtyErrOnMemoryAccess,
10010037SARM gem5 Developers        AddressSizeLL,  // AArch64 only
1017611SGene.Wu@arm.com
10210037SARM gem5 Developers        // Not real faults. These are faults to allow the translation function
10310037SARM gem5 Developers        // to inform the memory access function not to proceed for a prefetch
10410037SARM gem5 Developers        // that misses in the TLB or that targets an uncacheable address
10510037SARM gem5 Developers        PrefetchTLBMiss = AddressSizeLL + 4,
10610037SARM gem5 Developers        PrefetchUncacheable,
10710037SARM gem5 Developers
10810037SARM gem5 Developers        NumFaultSources,
10910037SARM gem5 Developers        FaultSourceInvalid = 0xff
11010037SARM gem5 Developers    };
11110037SARM gem5 Developers
11210037SARM gem5 Developers    /// Encodings of the fault sources when the short-desc. translation table
11310037SARM gem5 Developers    /// format is in use (ARM ARM Issue C B3.13.3)
11410037SARM gem5 Developers    static uint8_t shortDescFaultSources[NumFaultSources];
11510037SARM gem5 Developers    /// Encodings of the fault sources when the long-desc. translation table
11610037SARM gem5 Developers    /// format is in use (ARM ARM Issue C B3.13.3)
11710037SARM gem5 Developers    static uint8_t longDescFaultSources[NumFaultSources];
11810037SARM gem5 Developers    /// Encodings of the fault sources in AArch64 state
11910037SARM gem5 Developers    static uint8_t aarch64FaultSources[NumFaultSources];
12010037SARM gem5 Developers
12110037SARM gem5 Developers    enum AnnotationIDs
12210037SARM gem5 Developers    {
12310037SARM gem5 Developers        S1PTW, // DataAbort, PrefetchAbort: Stage 1 Page Table Walk,
12410037SARM gem5 Developers        OVA,   // DataAbort, PrefetchAbort: stage 1 Virtual Address for stage 2 faults
12510037SARM gem5 Developers        SAS,   // DataAbort: Syndrome Access Size
12610037SARM gem5 Developers        SSE,   // DataAbort: Syndrome Sign Extend
12710037SARM gem5 Developers        SRT,   // DataAbort: Syndrome Register Transfer
12810037SARM gem5 Developers
12910037SARM gem5 Developers        // AArch64 only
13010037SARM gem5 Developers        SF,    // DataAbort: width of the accessed register is SixtyFour
13110037SARM gem5 Developers        AR     // DataAbort: Acquire/Release semantics
13210037SARM gem5 Developers    };
13310037SARM gem5 Developers
13410037SARM gem5 Developers    enum TranMethod
13510037SARM gem5 Developers    {
13610037SARM gem5 Developers        LpaeTran,
13710037SARM gem5 Developers        VmsaTran,
13810037SARM gem5 Developers        UnknownTran
1397362Sgblack@eecs.umich.edu    };
1407362Sgblack@eecs.umich.edu
1416735Sgblack@eecs.umich.edu    struct FaultVals
1426735Sgblack@eecs.umich.edu    {
1436735Sgblack@eecs.umich.edu        const FaultName name;
14410037SARM gem5 Developers
1456735Sgblack@eecs.umich.edu        const FaultOffset offset;
14610037SARM gem5 Developers
14710037SARM gem5 Developers        // Offsets used for exceptions taken in AArch64 state
14810037SARM gem5 Developers        const uint16_t currELTOffset;
14910037SARM gem5 Developers        const uint16_t currELHOffset;
15010037SARM gem5 Developers        const uint16_t lowerEL64Offset;
15110037SARM gem5 Developers        const uint16_t lowerEL32Offset;
15210037SARM gem5 Developers
1536735Sgblack@eecs.umich.edu        const OperatingMode nextMode;
15410037SARM gem5 Developers
1556735Sgblack@eecs.umich.edu        const uint8_t armPcOffset;
1566735Sgblack@eecs.umich.edu        const uint8_t thumbPcOffset;
15710037SARM gem5 Developers        // The following two values are used in place of armPcOffset and
15810037SARM gem5 Developers        // thumbPcOffset when the exception return address is saved into ELR
15910037SARM gem5 Developers        // registers (exceptions taken in HYP mode or in AArch64 state)
16010037SARM gem5 Developers        const uint8_t armPcElrOffset;
16110037SARM gem5 Developers        const uint8_t thumbPcElrOffset;
16210037SARM gem5 Developers
16310037SARM gem5 Developers        const bool hypTrappable;
1646735Sgblack@eecs.umich.edu        const bool abortDisable;
1656735Sgblack@eecs.umich.edu        const bool fiqDisable;
16610037SARM gem5 Developers
16710037SARM gem5 Developers        // Exception class used to appropriately set the syndrome register
16810037SARM gem5 Developers        // (exceptions taken in HYP mode or in AArch64 state)
16910037SARM gem5 Developers        const ExceptionClass ec;
17010037SARM gem5 Developers
1716735Sgblack@eecs.umich.edu        FaultStat count;
1726735Sgblack@eecs.umich.edu    };
1736735Sgblack@eecs.umich.edu
17410037SARM gem5 Developers    ArmFault(ExtMachInst _machInst = 0, uint32_t _iss = 0) :
17510037SARM gem5 Developers        machInst(_machInst), issRaw(_iss), from64(false), to64(false) {}
17610037SARM gem5 Developers
17710037SARM gem5 Developers    // Returns the actual syndrome register to use based on the target
17810037SARM gem5 Developers    // exception level
17910037SARM gem5 Developers    MiscRegIndex getSyndromeReg64() const;
18010037SARM gem5 Developers    // Returns the actual fault address register to use based on the target
18110037SARM gem5 Developers    // exception level
18210037SARM gem5 Developers    MiscRegIndex getFaultAddrReg64() const;
18310037SARM gem5 Developers
18410417Sandreas.hansson@arm.com    void invoke(ThreadContext *tc, const StaticInstPtr &inst =
18510417Sandreas.hansson@arm.com                StaticInst::nullStaticInstPtr);
18610417Sandreas.hansson@arm.com    void invoke64(ThreadContext *tc, const StaticInstPtr &inst =
18710417Sandreas.hansson@arm.com                  StaticInst::nullStaticInstPtr);
18810037SARM gem5 Developers    virtual void annotate(AnnotationIDs id, uint64_t val) {}
1896735Sgblack@eecs.umich.edu    virtual FaultStat& countStat() = 0;
19010037SARM gem5 Developers    virtual FaultOffset offset(ThreadContext *tc) = 0;
19110037SARM gem5 Developers    virtual FaultOffset offset64() = 0;
1926735Sgblack@eecs.umich.edu    virtual OperatingMode nextMode() = 0;
19310037SARM gem5 Developers    virtual bool routeToMonitor(ThreadContext *tc) const = 0;
19410037SARM gem5 Developers    virtual bool routeToHyp(ThreadContext *tc) const { return false; }
19510037SARM gem5 Developers    virtual uint8_t armPcOffset(bool isHyp) = 0;
19610037SARM gem5 Developers    virtual uint8_t thumbPcOffset(bool isHyp) = 0;
19710037SARM gem5 Developers    virtual uint8_t armPcElrOffset() = 0;
19810037SARM gem5 Developers    virtual uint8_t thumbPcElrOffset() = 0;
19910037SARM gem5 Developers    virtual bool abortDisable(ThreadContext *tc) = 0;
20010037SARM gem5 Developers    virtual bool fiqDisable(ThreadContext *tc) = 0;
20110037SARM gem5 Developers    virtual ExceptionClass ec(ThreadContext *tc) const = 0;
20210037SARM gem5 Developers    virtual uint32_t iss() const = 0;
20310037SARM gem5 Developers    virtual bool isStage2() const { return false; }
20410037SARM gem5 Developers    virtual FSR getFsr(ThreadContext *tc) { return 0; }
20510037SARM gem5 Developers    virtual void setSyndrome(ThreadContext *tc, MiscRegIndex syndrome_reg);
2066019Shines@cs.fsu.edu};
2076019Shines@cs.fsu.edu
2086735Sgblack@eecs.umich.edutemplate<typename T>
2097362Sgblack@eecs.umich.educlass ArmFaultVals : public ArmFault
2106019Shines@cs.fsu.edu{
2116735Sgblack@eecs.umich.edu  protected:
2126735Sgblack@eecs.umich.edu    static FaultVals vals;
2136735Sgblack@eecs.umich.edu
2146019Shines@cs.fsu.edu  public:
21510037SARM gem5 Developers    ArmFaultVals<T>(ExtMachInst _machInst = 0, uint32_t _iss = 0) :
21610037SARM gem5 Developers        ArmFault(_machInst, _iss) {}
2176735Sgblack@eecs.umich.edu    FaultName name() const { return vals.name; }
21810037SARM gem5 Developers    FaultStat & countStat() { return vals.count; }
21910037SARM gem5 Developers    FaultOffset offset(ThreadContext *tc);
22010037SARM gem5 Developers
22110037SARM gem5 Developers    FaultOffset
22210037SARM gem5 Developers    offset64()
22310037SARM gem5 Developers    {
22410037SARM gem5 Developers        if (toEL == fromEL) {
22510037SARM gem5 Developers            if (opModeIsT(fromMode))
22610037SARM gem5 Developers                return vals.currELTOffset;
22710037SARM gem5 Developers            return vals.currELHOffset;
22810037SARM gem5 Developers        } else {
22910037SARM gem5 Developers            if (from64)
23010037SARM gem5 Developers                return vals.lowerEL64Offset;
23110037SARM gem5 Developers            return vals.lowerEL32Offset;
23210037SARM gem5 Developers        }
23310037SARM gem5 Developers    }
23410037SARM gem5 Developers
2356735Sgblack@eecs.umich.edu    OperatingMode nextMode() { return vals.nextMode; }
23610037SARM gem5 Developers    virtual bool routeToMonitor(ThreadContext *tc) const { return false; }
23710037SARM gem5 Developers    uint8_t armPcOffset(bool isHyp)   { return isHyp ? vals.armPcElrOffset
23810037SARM gem5 Developers                                                     : vals.armPcOffset; }
23910037SARM gem5 Developers    uint8_t thumbPcOffset(bool isHyp) { return isHyp ? vals.thumbPcElrOffset
24010037SARM gem5 Developers                                                     : vals.thumbPcOffset; }
24110037SARM gem5 Developers    uint8_t armPcElrOffset() { return vals.armPcElrOffset; }
24210037SARM gem5 Developers    uint8_t thumbPcElrOffset() { return vals.thumbPcElrOffset; }
24310037SARM gem5 Developers    virtual bool abortDisable(ThreadContext* tc) { return vals.abortDisable; }
24410037SARM gem5 Developers    virtual bool fiqDisable(ThreadContext* tc) { return vals.fiqDisable; }
24510037SARM gem5 Developers    virtual ExceptionClass ec(ThreadContext *tc) const { return vals.ec; }
24610037SARM gem5 Developers    virtual uint32_t iss() const { return issRaw; }
2476019Shines@cs.fsu.edu};
2486019Shines@cs.fsu.edu
2497400SAli.Saidi@ARM.comclass Reset : public ArmFaultVals<Reset>
2507400SAli.Saidi@ARM.com{
2517400SAli.Saidi@ARM.com  public:
25210417Sandreas.hansson@arm.com    void invoke(ThreadContext *tc, const StaticInstPtr &inst =
25310417Sandreas.hansson@arm.com                StaticInst::nullStaticInstPtr);
2547400SAli.Saidi@ARM.com};
2557189Sgblack@eecs.umich.edu
2567362Sgblack@eecs.umich.educlass UndefinedInstruction : public ArmFaultVals<UndefinedInstruction>
2577189Sgblack@eecs.umich.edu{
2587189Sgblack@eecs.umich.edu  protected:
2597189Sgblack@eecs.umich.edu    bool unknown;
2607640Sgblack@eecs.umich.edu    bool disabled;
26110037SARM gem5 Developers    ExceptionClass overrideEc;
26210205SAli.Saidi@ARM.com    const char *mnemonic;
2637189Sgblack@eecs.umich.edu
2647189Sgblack@eecs.umich.edu  public:
2657189Sgblack@eecs.umich.edu    UndefinedInstruction(ExtMachInst _machInst,
2667189Sgblack@eecs.umich.edu                         bool _unknown,
2677640Sgblack@eecs.umich.edu                         const char *_mnemonic = NULL,
2687640Sgblack@eecs.umich.edu                         bool _disabled = false) :
26910037SARM gem5 Developers        ArmFaultVals<UndefinedInstruction>(_machInst),
27010205SAli.Saidi@ARM.com        unknown(_unknown), disabled(_disabled),
27110205SAli.Saidi@ARM.com        overrideEc(EC_INVALID), mnemonic(_mnemonic)
27210037SARM gem5 Developers    {}
27310205SAli.Saidi@ARM.com    UndefinedInstruction(ExtMachInst _machInst, uint32_t _iss,
27410205SAli.Saidi@ARM.com            ExceptionClass _overrideEc, const char *_mnemonic = NULL) :
27510037SARM gem5 Developers        ArmFaultVals<UndefinedInstruction>(_machInst, _iss),
27610205SAli.Saidi@ARM.com        unknown(false), disabled(true), overrideEc(_overrideEc),
27710205SAli.Saidi@ARM.com        mnemonic(_mnemonic)
2788782Sgblack@eecs.umich.edu    {}
2797189Sgblack@eecs.umich.edu
28010417Sandreas.hansson@arm.com    void invoke(ThreadContext *tc, const StaticInstPtr &inst =
28110417Sandreas.hansson@arm.com                StaticInst::nullStaticInstPtr);
28210037SARM gem5 Developers    bool routeToHyp(ThreadContext *tc) const;
28310037SARM gem5 Developers    ExceptionClass ec(ThreadContext *tc) const;
28410037SARM gem5 Developers    uint32_t iss() const;
2857189Sgblack@eecs.umich.edu};
2867189Sgblack@eecs.umich.edu
2877362Sgblack@eecs.umich.educlass SupervisorCall : public ArmFaultVals<SupervisorCall>
2887197Sgblack@eecs.umich.edu{
2897197Sgblack@eecs.umich.edu  protected:
29010037SARM gem5 Developers    ExceptionClass overrideEc;
2917197Sgblack@eecs.umich.edu  public:
29210037SARM gem5 Developers    SupervisorCall(ExtMachInst _machInst, uint32_t _iss,
29310037SARM gem5 Developers                   ExceptionClass _overrideEc = EC_INVALID) :
29410037SARM gem5 Developers        ArmFaultVals<SupervisorCall>(_machInst, _iss),
29510037SARM gem5 Developers        overrideEc(_overrideEc)
2968782Sgblack@eecs.umich.edu    {}
2977197Sgblack@eecs.umich.edu
29810417Sandreas.hansson@arm.com    void invoke(ThreadContext *tc, const StaticInstPtr &inst =
29910417Sandreas.hansson@arm.com                StaticInst::nullStaticInstPtr);
30010037SARM gem5 Developers    bool routeToHyp(ThreadContext *tc) const;
30110037SARM gem5 Developers    ExceptionClass ec(ThreadContext *tc) const;
30210037SARM gem5 Developers    uint32_t iss() const;
30310037SARM gem5 Developers};
30410037SARM gem5 Developers
30510037SARM gem5 Developersclass SecureMonitorCall : public ArmFaultVals<SecureMonitorCall>
30610037SARM gem5 Developers{
30710037SARM gem5 Developers  public:
30810037SARM gem5 Developers    SecureMonitorCall(ExtMachInst _machInst) :
30910037SARM gem5 Developers        ArmFaultVals<SecureMonitorCall>(_machInst)
31010037SARM gem5 Developers    {}
31110037SARM gem5 Developers
31210417Sandreas.hansson@arm.com    void invoke(ThreadContext *tc, const StaticInstPtr &inst =
31310417Sandreas.hansson@arm.com                StaticInst::nullStaticInstPtr);
31410037SARM gem5 Developers    ExceptionClass ec(ThreadContext *tc) const;
31510037SARM gem5 Developers    uint32_t iss() const;
31610037SARM gem5 Developers};
31710037SARM gem5 Developers
31810037SARM gem5 Developersclass SupervisorTrap : public ArmFaultVals<SupervisorTrap>
31910037SARM gem5 Developers{
32010037SARM gem5 Developers  protected:
32110037SARM gem5 Developers    ExtMachInst machInst;
32210037SARM gem5 Developers    ExceptionClass overrideEc;
32310037SARM gem5 Developers
32410037SARM gem5 Developers  public:
32510037SARM gem5 Developers    SupervisorTrap(ExtMachInst _machInst, uint32_t _iss,
32610037SARM gem5 Developers                   ExceptionClass _overrideEc = EC_INVALID) :
32710037SARM gem5 Developers        ArmFaultVals<SupervisorTrap>(_machInst, _iss),
32810037SARM gem5 Developers        overrideEc(_overrideEc)
32910037SARM gem5 Developers    {}
33010037SARM gem5 Developers
33110037SARM gem5 Developers    ExceptionClass ec(ThreadContext *tc) const;
33210037SARM gem5 Developers};
33310037SARM gem5 Developers
33410037SARM gem5 Developersclass SecureMonitorTrap : public ArmFaultVals<SecureMonitorTrap>
33510037SARM gem5 Developers{
33610037SARM gem5 Developers protected:
33710037SARM gem5 Developers    ExtMachInst machInst;
33810037SARM gem5 Developers    ExceptionClass overrideEc;
33910037SARM gem5 Developers
34010037SARM gem5 Developers  public:
34110037SARM gem5 Developers    SecureMonitorTrap(ExtMachInst _machInst, uint32_t _iss,
34210037SARM gem5 Developers                      ExceptionClass _overrideEc = EC_INVALID) :
34310037SARM gem5 Developers        ArmFaultVals<SecureMonitorTrap>(_machInst, _iss),
34410037SARM gem5 Developers        overrideEc(_overrideEc)
34510037SARM gem5 Developers    {}
34610037SARM gem5 Developers
34710037SARM gem5 Developers    ExceptionClass ec(ThreadContext *tc) const;
34810037SARM gem5 Developers};
34910037SARM gem5 Developers
35010037SARM gem5 Developersclass HypervisorCall : public ArmFaultVals<HypervisorCall>
35110037SARM gem5 Developers{
35210037SARM gem5 Developers  public:
35310037SARM gem5 Developers    HypervisorCall(ExtMachInst _machInst, uint32_t _imm);
35410037SARM gem5 Developers};
35510037SARM gem5 Developers
35610037SARM gem5 Developersclass HypervisorTrap : public ArmFaultVals<HypervisorTrap>
35710037SARM gem5 Developers{
35810037SARM gem5 Developers  protected:
35910037SARM gem5 Developers    ExtMachInst machInst;
36010037SARM gem5 Developers    ExceptionClass overrideEc;
36110037SARM gem5 Developers
36210037SARM gem5 Developers  public:
36310037SARM gem5 Developers    HypervisorTrap(ExtMachInst _machInst, uint32_t _iss,
36410037SARM gem5 Developers                   ExceptionClass _overrideEc = EC_INVALID) :
36510037SARM gem5 Developers      ArmFaultVals<HypervisorTrap>(_machInst, _iss),
36610037SARM gem5 Developers      overrideEc(_overrideEc)
36710037SARM gem5 Developers    {}
36810037SARM gem5 Developers
36910037SARM gem5 Developers    ExceptionClass ec(ThreadContext *tc) const;
3707197Sgblack@eecs.umich.edu};
3717362Sgblack@eecs.umich.edu
3727362Sgblack@eecs.umich.edutemplate <class T>
3737362Sgblack@eecs.umich.educlass AbortFault : public ArmFaultVals<T>
3747362Sgblack@eecs.umich.edu{
3757362Sgblack@eecs.umich.edu  protected:
37610037SARM gem5 Developers    /**
37710037SARM gem5 Developers     * The virtual address the fault occured at. If 2 stages of
37810037SARM gem5 Developers     * translation are being used then this is the intermediate
37910037SARM gem5 Developers     * physical address that is the starting point for the second
38010037SARM gem5 Developers     * stage of translation.
38110037SARM gem5 Developers     */
3827362Sgblack@eecs.umich.edu    Addr faultAddr;
38310037SARM gem5 Developers    /**
38410037SARM gem5 Developers     * Original virtual address. If the fault was generated on the
38510037SARM gem5 Developers     * second stage of translation then this variable stores the
38610037SARM gem5 Developers     * virtual address used in the original stage 1 translation.
38710037SARM gem5 Developers     */
38810037SARM gem5 Developers    Addr OVAddr;
3897362Sgblack@eecs.umich.edu    bool write;
39010037SARM gem5 Developers    TlbEntry::DomainType domain;
39110037SARM gem5 Developers    uint8_t source;
39210037SARM gem5 Developers    uint8_t srcEncoded;
39310037SARM gem5 Developers    bool stage2;
39410037SARM gem5 Developers    bool s1ptw;
39510037SARM gem5 Developers    ArmFault::TranMethod tranMethod;
3967362Sgblack@eecs.umich.edu
3977362Sgblack@eecs.umich.edu  public:
39810037SARM gem5 Developers    AbortFault(Addr _faultAddr, bool _write, TlbEntry::DomainType _domain, uint8_t _source,
39910037SARM gem5 Developers               bool _stage2, ArmFault::TranMethod _tranMethod = ArmFault::UnknownTran) :
40010037SARM gem5 Developers        faultAddr(_faultAddr), write(_write), domain(_domain), source(_source),
40110037SARM gem5 Developers        stage2(_stage2), s1ptw(false), tranMethod(_tranMethod)
4027362Sgblack@eecs.umich.edu    {}
4037362Sgblack@eecs.umich.edu
40410417Sandreas.hansson@arm.com    void invoke(ThreadContext *tc, const StaticInstPtr &inst =
40510417Sandreas.hansson@arm.com                StaticInst::nullStaticInstPtr);
40610037SARM gem5 Developers
40710037SARM gem5 Developers    FSR getFsr(ThreadContext *tc);
40810037SARM gem5 Developers    bool abortDisable(ThreadContext *tc);
40910037SARM gem5 Developers    uint32_t iss() const;
41010037SARM gem5 Developers    bool isStage2() const { return stage2; }
41110037SARM gem5 Developers    void annotate(ArmFault::AnnotationIDs id, uint64_t val);
41210037SARM gem5 Developers    bool isMMUFault() const;
4137362Sgblack@eecs.umich.edu};
4147362Sgblack@eecs.umich.edu
4157362Sgblack@eecs.umich.educlass PrefetchAbort : public AbortFault<PrefetchAbort>
4167362Sgblack@eecs.umich.edu{
4177362Sgblack@eecs.umich.edu  public:
41810037SARM gem5 Developers    static const MiscRegIndex FsrIndex  = MISCREG_IFSR;
41910037SARM gem5 Developers    static const MiscRegIndex FarIndex  = MISCREG_IFAR;
42010037SARM gem5 Developers    static const MiscRegIndex HFarIndex = MISCREG_HIFAR;
4217362Sgblack@eecs.umich.edu
42210037SARM gem5 Developers    PrefetchAbort(Addr _addr, uint8_t _source, bool _stage2 = false,
42310037SARM gem5 Developers                  ArmFault::TranMethod _tranMethod = ArmFault::UnknownTran) :
42410037SARM gem5 Developers        AbortFault<PrefetchAbort>(_addr, false, TlbEntry::DomainType::NoAccess,
42510037SARM gem5 Developers                _source, _stage2, _tranMethod)
4267362Sgblack@eecs.umich.edu    {}
42710037SARM gem5 Developers
42810037SARM gem5 Developers    ExceptionClass ec(ThreadContext *tc) const;
42910037SARM gem5 Developers    // @todo: external aborts should be routed if SCR.EA == 1
43010037SARM gem5 Developers    bool routeToMonitor(ThreadContext *tc) const;
43110037SARM gem5 Developers    bool routeToHyp(ThreadContext *tc) const;
4327362Sgblack@eecs.umich.edu};
4337362Sgblack@eecs.umich.edu
4347362Sgblack@eecs.umich.educlass DataAbort : public AbortFault<DataAbort>
4357362Sgblack@eecs.umich.edu{
4367362Sgblack@eecs.umich.edu  public:
43710037SARM gem5 Developers    static const MiscRegIndex FsrIndex  = MISCREG_DFSR;
43810037SARM gem5 Developers    static const MiscRegIndex FarIndex  = MISCREG_DFAR;
43910037SARM gem5 Developers    static const MiscRegIndex HFarIndex = MISCREG_HDFAR;
44010037SARM gem5 Developers    bool    isv;
44110037SARM gem5 Developers    uint8_t sas;
44210037SARM gem5 Developers    uint8_t sse;
44310037SARM gem5 Developers    uint8_t srt;
4447362Sgblack@eecs.umich.edu
44510037SARM gem5 Developers    // AArch64 only
44610037SARM gem5 Developers    bool sf;
44710037SARM gem5 Developers    bool ar;
44810037SARM gem5 Developers
44910037SARM gem5 Developers    DataAbort(Addr _addr, TlbEntry::DomainType _domain, bool _write, uint8_t _source,
45010037SARM gem5 Developers              bool _stage2 = false, ArmFault::TranMethod _tranMethod = ArmFault::UnknownTran) :
45110037SARM gem5 Developers        AbortFault<DataAbort>(_addr, _write, _domain, _source, _stage2,
45210037SARM gem5 Developers                              _tranMethod),
45310037SARM gem5 Developers        isv(false), sas (0), sse(0), srt(0), sf(false), ar(false)
4547362Sgblack@eecs.umich.edu    {}
45510037SARM gem5 Developers
45610037SARM gem5 Developers    ExceptionClass ec(ThreadContext *tc) const;
45710037SARM gem5 Developers    // @todo: external aborts should be routed if SCR.EA == 1
45810037SARM gem5 Developers    bool routeToMonitor(ThreadContext *tc) const;
45910037SARM gem5 Developers    bool routeToHyp(ThreadContext *tc) const;
46010037SARM gem5 Developers    uint32_t iss() const;
46110037SARM gem5 Developers    void annotate(AnnotationIDs id, uint64_t val);
4627362Sgblack@eecs.umich.edu};
4637362Sgblack@eecs.umich.edu
46410037SARM gem5 Developersclass VirtualDataAbort : public AbortFault<VirtualDataAbort>
46510037SARM gem5 Developers{
46610037SARM gem5 Developers  public:
46710037SARM gem5 Developers    static const MiscRegIndex FsrIndex  = MISCREG_DFSR;
46810037SARM gem5 Developers    static const MiscRegIndex FarIndex  = MISCREG_DFAR;
46910037SARM gem5 Developers    static const MiscRegIndex HFarIndex = MISCREG_HDFAR;
47010037SARM gem5 Developers
47110037SARM gem5 Developers    VirtualDataAbort(Addr _addr, TlbEntry::DomainType _domain, bool _write,
47210037SARM gem5 Developers                     uint8_t _source) :
47310037SARM gem5 Developers        AbortFault<VirtualDataAbort>(_addr, _write, _domain, _source, false)
47410037SARM gem5 Developers    {}
47510037SARM gem5 Developers
47610417Sandreas.hansson@arm.com    void invoke(ThreadContext *tc, const StaticInstPtr &inst);
47710037SARM gem5 Developers};
47810037SARM gem5 Developers
47910037SARM gem5 Developersclass Interrupt : public ArmFaultVals<Interrupt>
48010037SARM gem5 Developers{
48110037SARM gem5 Developers  public:
48210037SARM gem5 Developers    bool routeToMonitor(ThreadContext *tc) const;
48310037SARM gem5 Developers    bool routeToHyp(ThreadContext *tc) const;
48410037SARM gem5 Developers    bool abortDisable(ThreadContext *tc);
48510037SARM gem5 Developers};
48610037SARM gem5 Developers
48710037SARM gem5 Developersclass VirtualInterrupt : public ArmFaultVals<VirtualInterrupt>
48810037SARM gem5 Developers{
48910037SARM gem5 Developers  public:
49010037SARM gem5 Developers    VirtualInterrupt();
49110037SARM gem5 Developers};
49210037SARM gem5 Developers
49310037SARM gem5 Developersclass FastInterrupt : public ArmFaultVals<FastInterrupt>
49410037SARM gem5 Developers{
49510037SARM gem5 Developers  public:
49610037SARM gem5 Developers    bool routeToMonitor(ThreadContext *tc) const;
49710037SARM gem5 Developers    bool routeToHyp(ThreadContext *tc) const;
49810037SARM gem5 Developers    bool abortDisable(ThreadContext *tc);
49910037SARM gem5 Developers    bool fiqDisable(ThreadContext *tc);
50010037SARM gem5 Developers};
50110037SARM gem5 Developers
50210037SARM gem5 Developersclass VirtualFastInterrupt : public ArmFaultVals<VirtualFastInterrupt>
50310037SARM gem5 Developers{
50410037SARM gem5 Developers  public:
50510037SARM gem5 Developers    VirtualFastInterrupt();
50610037SARM gem5 Developers};
50710037SARM gem5 Developers
50810037SARM gem5 Developers/// PC alignment fault (AArch64 only)
50910037SARM gem5 Developersclass PCAlignmentFault : public ArmFaultVals<PCAlignmentFault>
51010037SARM gem5 Developers{
51110037SARM gem5 Developers  protected:
51210037SARM gem5 Developers    /// The unaligned value of the PC
51310037SARM gem5 Developers    Addr faultPC;
51410037SARM gem5 Developers  public:
51510037SARM gem5 Developers    PCAlignmentFault(Addr _faultPC) : faultPC(_faultPC)
51610037SARM gem5 Developers    {}
51710417Sandreas.hansson@arm.com    void invoke(ThreadContext *tc, const StaticInstPtr &inst =
51810417Sandreas.hansson@arm.com                StaticInst::nullStaticInstPtr);
51910037SARM gem5 Developers};
52010037SARM gem5 Developers
52110037SARM gem5 Developers/// Stack pointer alignment fault (AArch64 only)
52210037SARM gem5 Developersclass SPAlignmentFault : public ArmFaultVals<SPAlignmentFault>
52310037SARM gem5 Developers{
52410037SARM gem5 Developers  public:
52510037SARM gem5 Developers    SPAlignmentFault();
52610037SARM gem5 Developers};
52710037SARM gem5 Developers
52810037SARM gem5 Developers/// System error (AArch64 only)
52910037SARM gem5 Developersclass SystemError : public ArmFaultVals<SystemError>
53010037SARM gem5 Developers{
53110037SARM gem5 Developers  public:
53210037SARM gem5 Developers    SystemError();
53310417Sandreas.hansson@arm.com    void invoke(ThreadContext *tc, const StaticInstPtr &inst =
53410417Sandreas.hansson@arm.com                StaticInst::nullStaticInstPtr);
53510037SARM gem5 Developers    bool routeToMonitor(ThreadContext *tc) const;
53610037SARM gem5 Developers    bool routeToHyp(ThreadContext *tc) const;
53710037SARM gem5 Developers};
5386019Shines@cs.fsu.edu
5397652Sminkyu.jeong@arm.com// A fault that flushes the pipe, excluding the faulting instructions
5407652Sminkyu.jeong@arm.comclass FlushPipe : public ArmFaultVals<FlushPipe>
5417652Sminkyu.jeong@arm.com{
5427652Sminkyu.jeong@arm.com  public:
5437652Sminkyu.jeong@arm.com    FlushPipe() {}
54410417Sandreas.hansson@arm.com    void invoke(ThreadContext *tc, const StaticInstPtr &inst =
54510417Sandreas.hansson@arm.com                StaticInst::nullStaticInstPtr);
5467652Sminkyu.jeong@arm.com};
5477652Sminkyu.jeong@arm.com
5488518Sgeoffrey.blake@arm.com// A fault that flushes the pipe, excluding the faulting instructions
5498518Sgeoffrey.blake@arm.comclass ArmSev : public ArmFaultVals<ArmSev>
5508518Sgeoffrey.blake@arm.com{
5518518Sgeoffrey.blake@arm.com  public:
5528518Sgeoffrey.blake@arm.com    ArmSev () {}
55310417Sandreas.hansson@arm.com    void invoke(ThreadContext *tc, const StaticInstPtr &inst =
55410417Sandreas.hansson@arm.com                StaticInst::nullStaticInstPtr);
5558518Sgeoffrey.blake@arm.com};
5568518Sgeoffrey.blake@arm.com
55710037SARM gem5 Developers/// Illegal Instruction Set State fault (AArch64 only)
55810037SARM gem5 Developersclass IllegalInstSetStateFault : public ArmFaultVals<IllegalInstSetStateFault>
55910037SARM gem5 Developers{
56010037SARM gem5 Developers  public:
56110037SARM gem5 Developers    IllegalInstSetStateFault();
56210037SARM gem5 Developers};
56310037SARM gem5 Developers
5647811Ssteve.reinhardt@amd.com} // namespace ArmISA
5656019Shines@cs.fsu.edu
5666019Shines@cs.fsu.edu#endif // __ARM_FAULTS_HH__
567