faults.hh revision 5569
17927SN/A/*
27927SN/A * Copyright (c) 2003-2005 The Regents of The University of Michigan
39289Sandreas.hansson@arm.com * All rights reserved.
49289Sandreas.hansson@arm.com *
59289Sandreas.hansson@arm.com * Redistribution and use in source and binary forms, with or without
67927SN/A * modification, are permitted provided that the following conditions are
79289Sandreas.hansson@arm.com * met: redistributions of source code must retain the above copyright
89289Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer;
99289Sandreas.hansson@arm.com * redistributions in binary form must reproduce the above copyright
109289Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer in the
119289Sandreas.hansson@arm.com * documentation and/or other materials provided with the distribution;
129289Sandreas.hansson@arm.com * neither the name of the copyright holders nor the names of its
139289Sandreas.hansson@arm.com * contributors may be used to endorse or promote products derived from
149289Sandreas.hansson@arm.com * this software without specific prior written permission.
159079SAli.Saidi@ARM.com *
169079SAli.Saidi@ARM.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
179079SAli.Saidi@ARM.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
189289Sandreas.hansson@arm.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
199289Sandreas.hansson@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
209079SAli.Saidi@ARM.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
219079SAli.Saidi@ARM.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
229289Sandreas.hansson@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
239289Sandreas.hansson@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
249289Sandreas.hansson@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
259079SAli.Saidi@ARM.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
269079SAli.Saidi@ARM.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
279079SAli.Saidi@ARM.com *
289289Sandreas.hansson@arm.com * Authors: Gabe Black
299289Sandreas.hansson@arm.com *          Kevin Lim
309289Sandreas.hansson@arm.com */
319289Sandreas.hansson@arm.com
329289Sandreas.hansson@arm.com#ifndef __ARCH_ALPHA_FAULTS_HH__
339079SAli.Saidi@ARM.com#define __ARCH_ALPHA_FAULTS_HH__
349079SAli.Saidi@ARM.com
359079SAli.Saidi@ARM.com#include "arch/alpha/pagetable.hh"
369289Sandreas.hansson@arm.com#include "config/full_system.hh"
379289Sandreas.hansson@arm.com#include "sim/faults.hh"
389079SAli.Saidi@ARM.com
399079SAli.Saidi@ARM.com// The design of the "name" and "vect" functions is in sim/faults.hh
409289Sandreas.hansson@arm.com
419289Sandreas.hansson@arm.comnamespace AlphaISA {
429289Sandreas.hansson@arm.com
439289Sandreas.hansson@arm.comtypedef const Addr FaultVect;
449079SAli.Saidi@ARM.com
459079SAli.Saidi@ARM.comclass AlphaFault : public FaultBase
469079SAli.Saidi@ARM.com{
479289Sandreas.hansson@arm.com  protected:
489289Sandreas.hansson@arm.com    virtual bool skipFaultingInstruction() {return false;}
499289Sandreas.hansson@arm.com    virtual bool setRestartAddress() {return true;}
509289Sandreas.hansson@arm.com  public:
518613SN/A#if FULL_SYSTEM
529289Sandreas.hansson@arm.com    void invoke(ThreadContext * tc);
538613SN/A#endif
549289Sandreas.hansson@arm.com    virtual FaultVect vect() = 0;
559289Sandreas.hansson@arm.com    virtual FaultStat & countStat() = 0;
569289Sandreas.hansson@arm.com};
579289Sandreas.hansson@arm.com
589289Sandreas.hansson@arm.comclass MachineCheckFault : public AlphaFault
599289Sandreas.hansson@arm.com{
608835SAli.Saidi@ARM.com  private:
618613SN/A    static FaultName _name;
629289Sandreas.hansson@arm.com    static FaultVect _vect;
639289Sandreas.hansson@arm.com    static FaultStat _count;
649289Sandreas.hansson@arm.com
659289Sandreas.hansson@arm.com  public:
669289Sandreas.hansson@arm.com    FaultName name() const {return _name;}
679289Sandreas.hansson@arm.com    FaultVect vect() {return _vect;}
688835SAli.Saidi@ARM.com    FaultStat & countStat() {return _count;}
698613SN/A    bool isMachineCheckFault() const {return true;}
709289Sandreas.hansson@arm.com};
719289Sandreas.hansson@arm.com
729289Sandreas.hansson@arm.comclass AlignmentFault : public AlphaFault
739289Sandreas.hansson@arm.com{
748835SAli.Saidi@ARM.com  private:
759055Ssaidi@eecs.umich.edu    static FaultName _name;
768835SAli.Saidi@ARM.com    static FaultVect _vect;
779055Ssaidi@eecs.umich.edu    static FaultStat _count;
788835SAli.Saidi@ARM.com
799055Ssaidi@eecs.umich.edu  public:
808835SAli.Saidi@ARM.com    FaultName name() const {return _name;}
819055Ssaidi@eecs.umich.edu    FaultVect vect() {return _vect;}
828613SN/A    FaultStat & countStat() {return _count;}
838613SN/A    bool isAlignmentFault() const {return true;}
848613SN/A};
858613SN/A
868983Snate@binkert.orgstatic inline Fault genMachineCheckFault()
878983Snate@binkert.org{
888613SN/A    return new MachineCheckFault;
898613SN/A}
908835SAli.Saidi@ARM.com
918835SAli.Saidi@ARM.comclass ResetFault : public AlphaFault
928613SN/A{
938613SN/A  private:
948613SN/A    static FaultName _name;
959289Sandreas.hansson@arm.com    static FaultVect _vect;
968613SN/A    static FaultStat _count;
978613SN/A
988613SN/A  public:
998613SN/A    FaultName name() const {return _name;}
1008613SN/A    FaultVect vect() {return _vect;}
1018613SN/A    FaultStat & countStat() {return _count;}
1028613SN/A};
1038613SN/A
1048613SN/Aclass ArithmeticFault : public AlphaFault
1059289Sandreas.hansson@arm.com{
1068613SN/A  private:
1078613SN/A    static FaultName _name;
1089289Sandreas.hansson@arm.com    static FaultVect _vect;
1099289Sandreas.hansson@arm.com    static FaultStat _count;
1109289Sandreas.hansson@arm.com
1118613SN/A  protected:
1128613SN/A    bool skipFaultingInstruction() {return true;}
1139289Sandreas.hansson@arm.com
1149289Sandreas.hansson@arm.com  public:
1158613SN/A    FaultName name() const {return _name;}
1169289Sandreas.hansson@arm.com    FaultVect vect() {return _vect;}
1179289Sandreas.hansson@arm.com    FaultStat & countStat() {return _count;}
1188613SN/A#if FULL_SYSTEM
1198613SN/A    void invoke(ThreadContext * tc);
1209289Sandreas.hansson@arm.com#endif
1219289Sandreas.hansson@arm.com};
1229289Sandreas.hansson@arm.com
1239289Sandreas.hansson@arm.comclass InterruptFault : public AlphaFault
1249289Sandreas.hansson@arm.com{
1259289Sandreas.hansson@arm.com  private:
1269289Sandreas.hansson@arm.com    static FaultName _name;
1278613SN/A    static FaultVect _vect;
1288613SN/A    static FaultStat _count;
1299289Sandreas.hansson@arm.com
1308673SN/A  protected:
1319289Sandreas.hansson@arm.com    bool setRestartAddress() {return false;}
1329289Sandreas.hansson@arm.com
1339289Sandreas.hansson@arm.com  public:
1349125Snilay@cs.wisc.edu    FaultName name() const {return _name;}
1358835SAli.Saidi@ARM.com    FaultVect vect() {return _vect;}
1368835SAli.Saidi@ARM.com    FaultStat & countStat() {return _count;}
1378835SAli.Saidi@ARM.com};
1389289Sandreas.hansson@arm.com
1399289Sandreas.hansson@arm.comclass DtbFault : public AlphaFault
1409289Sandreas.hansson@arm.com{
1419289Sandreas.hansson@arm.com  protected:
1429289Sandreas.hansson@arm.com    VAddr vaddr;
1439289Sandreas.hansson@arm.com    uint32_t reqFlags;
1449289Sandreas.hansson@arm.com    uint64_t flags;
1459289Sandreas.hansson@arm.com
1469289Sandreas.hansson@arm.com  public:
1479289Sandreas.hansson@arm.com    DtbFault(VAddr _vaddr, uint32_t _reqFlags, uint64_t _flags)
1489289Sandreas.hansson@arm.com        : vaddr(_vaddr), reqFlags(_reqFlags), flags(_flags)
1499289Sandreas.hansson@arm.com    { }
1509289Sandreas.hansson@arm.com    FaultName name() const = 0;
1519289Sandreas.hansson@arm.com    FaultVect vect() = 0;
1529289Sandreas.hansson@arm.com    FaultStat & countStat() = 0;
1539289Sandreas.hansson@arm.com#if FULL_SYSTEM
1549289Sandreas.hansson@arm.com    void invoke(ThreadContext * tc);
1559289Sandreas.hansson@arm.com#endif
1568835SAli.Saidi@ARM.com};
1579055Ssaidi@eecs.umich.edu
1588835SAli.Saidi@ARM.comclass NDtbMissFault : public DtbFault
1599055Ssaidi@eecs.umich.edu{
1608835SAli.Saidi@ARM.com  private:
1619055Ssaidi@eecs.umich.edu    static FaultName _name;
1628613SN/A    static FaultVect _vect;
1638613SN/A    static FaultStat _count;
1648613SN/A
1658613SN/A  public:
1668983Snate@binkert.org    NDtbMissFault(VAddr vaddr, uint32_t reqFlags, uint64_t flags)
1678983Snate@binkert.org        : DtbFault(vaddr, reqFlags, flags)
1688613SN/A    { }
1698613SN/A    FaultName name() const {return _name;}
1708613SN/A    FaultVect vect() {return _vect;}
1719079SAli.Saidi@ARM.com    FaultStat & countStat() {return _count;}
1729289Sandreas.hansson@arm.com#if !FULL_SYSTEM
1739079SAli.Saidi@ARM.com    void invoke(ThreadContext * tc);
1749079SAli.Saidi@ARM.com#endif
1759079SAli.Saidi@ARM.com};
1769289Sandreas.hansson@arm.com
1779289Sandreas.hansson@arm.comclass PDtbMissFault : public DtbFault
1789289Sandreas.hansson@arm.com{
1799289Sandreas.hansson@arm.com  private:
1809079SAli.Saidi@ARM.com    static FaultName _name;
1819079SAli.Saidi@ARM.com    static FaultVect _vect;
1828835SAli.Saidi@ARM.com    static FaultStat _count;
1838613SN/A
1849079SAli.Saidi@ARM.com  public:
1859079SAli.Saidi@ARM.com    PDtbMissFault(VAddr vaddr, uint32_t reqFlags, uint64_t flags)
1869079SAli.Saidi@ARM.com        : DtbFault(vaddr, reqFlags, flags)
1879079SAli.Saidi@ARM.com    { }
1889079SAli.Saidi@ARM.com    FaultName name() const {return _name;}
1899079SAli.Saidi@ARM.com    FaultVect vect() {return _vect;}
1909079SAli.Saidi@ARM.com    FaultStat & countStat() {return _count;}
1919079SAli.Saidi@ARM.com};
1929079SAli.Saidi@ARM.com
1939079SAli.Saidi@ARM.comclass DtbPageFault : public DtbFault
1948835SAli.Saidi@ARM.com{
1958673SN/A  private:
1968835SAli.Saidi@ARM.com    static FaultName _name;
1978613SN/A    static FaultVect _vect;
1988835SAli.Saidi@ARM.com    static FaultStat _count;
1998673SN/A
2008835SAli.Saidi@ARM.com  public:
2018673SN/A    DtbPageFault(VAddr vaddr, uint32_t reqFlags, uint64_t flags)
2029079SAli.Saidi@ARM.com        : DtbFault(vaddr, reqFlags, flags)
2039079SAli.Saidi@ARM.com    { }
2049079SAli.Saidi@ARM.com    FaultName name() const {return _name;}
2059079SAli.Saidi@ARM.com    FaultVect vect() {return _vect;}
2069079SAli.Saidi@ARM.com    FaultStat & countStat() {return _count;}
2079079SAli.Saidi@ARM.com};
2088613SN/A
2098613SN/Aclass DtbAcvFault : public DtbFault
2108613SN/A{
2118613SN/A  private:
2128983Snate@binkert.org    static FaultName _name;
2138983Snate@binkert.org    static FaultVect _vect;
2148613SN/A    static FaultStat _count;
2158613SN/A
2169079SAli.Saidi@ARM.com  public:
2179079SAli.Saidi@ARM.com    DtbAcvFault(VAddr vaddr, uint32_t reqFlags, uint64_t flags)
2188613SN/A        : DtbFault(vaddr, reqFlags, flags)
2199289Sandreas.hansson@arm.com    { }
2209289Sandreas.hansson@arm.com    FaultName name() const {return _name;}
2219289Sandreas.hansson@arm.com    FaultVect vect() {return _vect;}
2229289Sandreas.hansson@arm.com    FaultStat & countStat() {return _count;}
2239289Sandreas.hansson@arm.com};
2249289Sandreas.hansson@arm.com
2259289Sandreas.hansson@arm.comclass DtbAlignmentFault : public DtbFault
2269289Sandreas.hansson@arm.com{
2279289Sandreas.hansson@arm.com  private:
2289289Sandreas.hansson@arm.com    static FaultName _name;
2299289Sandreas.hansson@arm.com    static FaultVect _vect;
2309289Sandreas.hansson@arm.com    static FaultStat _count;
2319289Sandreas.hansson@arm.com
2329289Sandreas.hansson@arm.com  public:
2339289Sandreas.hansson@arm.com    DtbAlignmentFault(VAddr vaddr, uint32_t reqFlags, uint64_t flags)
2349289Sandreas.hansson@arm.com        : DtbFault(vaddr, reqFlags, flags)
2359289Sandreas.hansson@arm.com    { }
2369289Sandreas.hansson@arm.com    FaultName name() const {return _name;}
2379289Sandreas.hansson@arm.com    FaultVect vect() {return _vect;}
2389289Sandreas.hansson@arm.com    FaultStat & countStat() {return _count;}
2399289Sandreas.hansson@arm.com};
2408835SAli.Saidi@ARM.com
2418673SN/Aclass ItbFault : public AlphaFault
2428835SAli.Saidi@ARM.com{
2438673SN/A  protected:
2448835SAli.Saidi@ARM.com    Addr pc;
2458673SN/A
2469289Sandreas.hansson@arm.com  public:
2479289Sandreas.hansson@arm.com    ItbFault(Addr _pc) : pc(_pc) { }
2489289Sandreas.hansson@arm.com    FaultName name() const = 0;
2499289Sandreas.hansson@arm.com    FaultVect vect() = 0;
2509289Sandreas.hansson@arm.com    FaultStat & countStat() = 0;
2519289Sandreas.hansson@arm.com#if FULL_SYSTEM
2528613SN/A    void invoke(ThreadContext * tc);
2538613SN/A#endif
2548613SN/A};
2558613SN/A
2568983Snate@binkert.orgclass ItbPageFault : public ItbFault
2578983Snate@binkert.org{
2588613SN/A  private:
2598613SN/A    static FaultName _name;
2609079SAli.Saidi@ARM.com    static FaultVect _vect;
2619079SAli.Saidi@ARM.com    static FaultStat _count;
2628613SN/A
2639289Sandreas.hansson@arm.com  public:
2649079SAli.Saidi@ARM.com    ItbPageFault(Addr pc) : ItbFault(pc) { }
2659289Sandreas.hansson@arm.com    FaultName name() const {return _name;}
2669289Sandreas.hansson@arm.com    FaultVect vect() {return _vect;}
2679289Sandreas.hansson@arm.com    FaultStat & countStat() {return _count;}
2688613SN/A#if !FULL_SYSTEM
2699079SAli.Saidi@ARM.com    void invoke(ThreadContext * tc);
2708835SAli.Saidi@ARM.com#endif
2718835SAli.Saidi@ARM.com};
2729289Sandreas.hansson@arm.com
2739289Sandreas.hansson@arm.comclass ItbAcvFault : public ItbFault
2749289Sandreas.hansson@arm.com{
2759289Sandreas.hansson@arm.com  private:
2769289Sandreas.hansson@arm.com    static FaultName _name;
2779289Sandreas.hansson@arm.com    static FaultVect _vect;
2789289Sandreas.hansson@arm.com    static FaultStat _count;
2799289Sandreas.hansson@arm.com
2809289Sandreas.hansson@arm.com  public:
2819289Sandreas.hansson@arm.com    ItbAcvFault(Addr pc) : ItbFault(pc) { }
2829289Sandreas.hansson@arm.com    FaultName name() const {return _name;}
2839289Sandreas.hansson@arm.com    FaultVect vect() {return _vect;}
2849289Sandreas.hansson@arm.com    FaultStat & countStat() {return _count;}
2859289Sandreas.hansson@arm.com};
2869289Sandreas.hansson@arm.com
2879289Sandreas.hansson@arm.comclass UnimplementedOpcodeFault : public AlphaFault
2889289Sandreas.hansson@arm.com{
2899289Sandreas.hansson@arm.com  private:
2909289Sandreas.hansson@arm.com    static FaultName _name;
2919289Sandreas.hansson@arm.com    static FaultVect _vect;
2929289Sandreas.hansson@arm.com    static FaultStat _count;
2939289Sandreas.hansson@arm.com
2949289Sandreas.hansson@arm.com  public:
2959289Sandreas.hansson@arm.com    FaultName name() const {return _name;}
2968835SAli.Saidi@ARM.com    FaultVect vect() {return _vect;}
2979055Ssaidi@eecs.umich.edu    FaultStat & countStat() {return _count;}
2988835SAli.Saidi@ARM.com};
2999055Ssaidi@eecs.umich.edu
3008835SAli.Saidi@ARM.comclass FloatEnableFault : public AlphaFault
3019055Ssaidi@eecs.umich.edu{
3028835SAli.Saidi@ARM.com  private:
3039055Ssaidi@eecs.umich.edu    static FaultName _name;
3048613SN/A    static FaultVect _vect;
3058613SN/A    static FaultStat _count;
3068613SN/A
3078613SN/A  public:
3088983Snate@binkert.org    FaultName name() const {return _name;}
3098983Snate@binkert.org    FaultVect vect() {return _vect;}
3108613SN/A    FaultStat & countStat() {return _count;}
3118613SN/A};
3129289Sandreas.hansson@arm.com
3139289Sandreas.hansson@arm.comclass PalFault : public AlphaFault
3148613SN/A{
3159289Sandreas.hansson@arm.com  private:
3169289Sandreas.hansson@arm.com    static FaultName _name;
3179289Sandreas.hansson@arm.com    static FaultVect _vect;
3189289Sandreas.hansson@arm.com    static FaultStat _count;
3199289Sandreas.hansson@arm.com
3209289Sandreas.hansson@arm.com  protected:
3219289Sandreas.hansson@arm.com    bool skipFaultingInstruction() {return true;}
3229289Sandreas.hansson@arm.com
3239289Sandreas.hansson@arm.com  public:
3249289Sandreas.hansson@arm.com    FaultName name() const {return _name;}
3259289Sandreas.hansson@arm.com    FaultVect vect() {return _vect;}
3269289Sandreas.hansson@arm.com    FaultStat & countStat() {return _count;}
3279289Sandreas.hansson@arm.com};
3289289Sandreas.hansson@arm.com
3299289Sandreas.hansson@arm.comclass IntegerOverflowFault : public AlphaFault
3309289Sandreas.hansson@arm.com{
3319289Sandreas.hansson@arm.com  private:
3329289Sandreas.hansson@arm.com    static FaultName _name;
3339289Sandreas.hansson@arm.com    static FaultVect _vect;
3349289Sandreas.hansson@arm.com    static FaultStat _count;
3359289Sandreas.hansson@arm.com
3369289Sandreas.hansson@arm.com  public:
3379289Sandreas.hansson@arm.com    FaultName name() const {return _name;}
3389289Sandreas.hansson@arm.com    FaultVect vect() {return _vect;}
3399289Sandreas.hansson@arm.com    FaultStat & countStat() {return _count;}
3409289Sandreas.hansson@arm.com};
3419289Sandreas.hansson@arm.com
3429289Sandreas.hansson@arm.com} // namespace AlphaISA
3439289Sandreas.hansson@arm.com
3449289Sandreas.hansson@arm.com#endif // __ARCH_ALPHA_FAULTS_HH__
3459289Sandreas.hansson@arm.com