faults.hh revision 5568
12SN/A/*
21762SN/A * Copyright (c) 2003-2005 The Regents of The University of Michigan
32SN/A * All rights reserved.
42SN/A *
52SN/A * Redistribution and use in source and binary forms, with or without
62SN/A * modification, are permitted provided that the following conditions are
72SN/A * met: redistributions of source code must retain the above copyright
82SN/A * notice, this list of conditions and the following disclaimer;
92SN/A * redistributions in binary form must reproduce the above copyright
102SN/A * notice, this list of conditions and the following disclaimer in the
112SN/A * documentation and/or other materials provided with the distribution;
122SN/A * neither the name of the copyright holders nor the names of its
132SN/A * contributors may be used to endorse or promote products derived from
142SN/A * this software without specific prior written permission.
152SN/A *
162SN/A * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
172SN/A * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
182SN/A * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
192SN/A * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
202SN/A * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
212SN/A * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
222SN/A * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
232SN/A * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
242SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
252SN/A * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
262SN/A * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
272665Ssaidi@eecs.umich.edu *
282665Ssaidi@eecs.umich.edu * Authors: Gabe Black
292665Ssaidi@eecs.umich.edu *          Kevin Lim
302SN/A */
312SN/A
322090SN/A#ifndef __ALPHA_FAULTS_HH__
332090SN/A#define __ALPHA_FAULTS_HH__
342SN/A
353614Sgblack@eecs.umich.edu#include "config/full_system.hh"
363614Sgblack@eecs.umich.edu#include "sim/faults.hh"
373614Sgblack@eecs.umich.edu
382984Sgblack@eecs.umich.edu#include "arch/alpha/pagetable.hh"
392147SN/A
402166SN/A// The design of the "name" and "vect" functions is in sim/faults.hh
412147SN/A
422167SN/Anamespace AlphaISA
432167SN/A{
442167SN/A
452147SN/Atypedef const Addr FaultVect;
462090SN/A
472222SN/Aclass AlphaFault : public FaultBase
482090SN/A{
492201SN/A  protected:
502201SN/A    virtual bool skipFaultingInstruction() {return false;}
512201SN/A    virtual bool setRestartAddress() {return true;}
522112SN/A  public:
532174SN/A#if FULL_SYSTEM
542680Sktlim@umich.edu    void invoke(ThreadContext * tc);
552174SN/A#endif
562175SN/A    virtual FaultVect vect() = 0;
572222SN/A    virtual FaultStat & countStat() = 0;
582SN/A};
592SN/A
602203SN/Aclass MachineCheckFault : public AlphaFault
612166SN/A{
622166SN/A  private:
632203SN/A    static FaultName _name;
642166SN/A    static FaultVect _vect;
652222SN/A    static FaultStat _count;
662166SN/A  public:
674695Sgblack@eecs.umich.edu    FaultName name() const {return _name;}
682166SN/A    FaultVect vect() {return _vect;}
692222SN/A    FaultStat & countStat() {return _count;}
704695Sgblack@eecs.umich.edu    bool isMachineCheckFault() const {return true;}
712166SN/A};
722166SN/A
732203SN/Aclass AlignmentFault : public AlphaFault
742166SN/A{
752166SN/A  private:
762203SN/A    static FaultName _name;
772166SN/A    static FaultVect _vect;
782222SN/A    static FaultStat _count;
792166SN/A  public:
804695Sgblack@eecs.umich.edu    FaultName name() const {return _name;}
812166SN/A    FaultVect vect() {return _vect;}
822222SN/A    FaultStat & countStat() {return _count;}
834695Sgblack@eecs.umich.edu    bool isAlignmentFault() const {return true;}
842166SN/A};
852166SN/A
862166SN/Astatic inline Fault genMachineCheckFault()
872166SN/A{
882203SN/A    return new MachineCheckFault;
892166SN/A}
902166SN/A
912147SN/Aclass ResetFault : public AlphaFault
922090SN/A{
932147SN/A  private:
942147SN/A    static FaultName _name;
952147SN/A    static FaultVect _vect;
962222SN/A    static FaultStat _count;
972112SN/A  public:
984695Sgblack@eecs.umich.edu    FaultName name() const {return _name;}
992147SN/A    FaultVect vect() {return _vect;}
1002222SN/A    FaultStat & countStat() {return _count;}
1012147SN/A};
1022090SN/A
1032147SN/Aclass ArithmeticFault : public AlphaFault
1042090SN/A{
1052201SN/A  protected:
1062201SN/A    bool skipFaultingInstruction() {return true;}
1072147SN/A  private:
1082147SN/A    static FaultName _name;
1092147SN/A    static FaultVect _vect;
1102222SN/A    static FaultStat _count;
1112112SN/A  public:
1124695Sgblack@eecs.umich.edu    FaultName name() const {return _name;}
1132147SN/A    FaultVect vect() {return _vect;}
1142222SN/A    FaultStat & countStat() {return _count;}
1152203SN/A#if FULL_SYSTEM
1162680Sktlim@umich.edu    void invoke(ThreadContext * tc);
1172203SN/A#endif
1182147SN/A};
1192090SN/A
1202147SN/Aclass InterruptFault : public AlphaFault
1212090SN/A{
1222201SN/A  protected:
1232201SN/A    bool setRestartAddress() {return false;}
1242147SN/A  private:
1252147SN/A    static FaultName _name;
1262147SN/A    static FaultVect _vect;
1272222SN/A    static FaultStat _count;
1282112SN/A  public:
1294695Sgblack@eecs.umich.edu    FaultName name() const {return _name;}
1302147SN/A    FaultVect vect() {return _vect;}
1312222SN/A    FaultStat & countStat() {return _count;}
1322147SN/A};
1332090SN/A
1342502SN/Aclass DtbFault : public AlphaFault
1352502SN/A{
1364997Sgblack@eecs.umich.edu  protected:
1375568Snate@binkert.org    VAddr vaddr;
1382502SN/A    uint32_t reqFlags;
1392502SN/A    uint64_t flags;
1402502SN/A  public:
1415568Snate@binkert.org    DtbFault(VAddr _vaddr, uint32_t _reqFlags, uint64_t _flags)
1422502SN/A        : vaddr(_vaddr), reqFlags(_reqFlags), flags(_flags)
1432502SN/A    { }
1444695Sgblack@eecs.umich.edu    FaultName name() const = 0;
1452502SN/A    FaultVect vect() = 0;
1462502SN/A    FaultStat & countStat() = 0;
1472502SN/A#if FULL_SYSTEM
1482680Sktlim@umich.edu    void invoke(ThreadContext * tc);
1492502SN/A#endif
1502502SN/A};
1512502SN/A
1522502SN/Aclass NDtbMissFault : public DtbFault
1532090SN/A{
1542147SN/A  private:
1552147SN/A    static FaultName _name;
1562147SN/A    static FaultVect _vect;
1572222SN/A    static FaultStat _count;
1582112SN/A  public:
1595568Snate@binkert.org    NDtbMissFault(VAddr vaddr, uint32_t reqFlags, uint64_t flags)
1602502SN/A        : DtbFault(vaddr, reqFlags, flags)
1612502SN/A    { }
1624695Sgblack@eecs.umich.edu    FaultName name() const {return _name;}
1632147SN/A    FaultVect vect() {return _vect;}
1642222SN/A    FaultStat & countStat() {return _count;}
1654997Sgblack@eecs.umich.edu#if !FULL_SYSTEM
1664997Sgblack@eecs.umich.edu    void invoke(ThreadContext * tc);
1674997Sgblack@eecs.umich.edu#endif
1682147SN/A};
1692090SN/A
1702502SN/Aclass PDtbMissFault : public DtbFault
1712090SN/A{
1722147SN/A  private:
1732147SN/A    static FaultName _name;
1742147SN/A    static FaultVect _vect;
1752222SN/A    static FaultStat _count;
1762112SN/A  public:
1775568Snate@binkert.org    PDtbMissFault(VAddr vaddr, uint32_t reqFlags, uint64_t flags)
1782502SN/A        : DtbFault(vaddr, reqFlags, flags)
1792502SN/A    { }
1804695Sgblack@eecs.umich.edu    FaultName name() const {return _name;}
1812147SN/A    FaultVect vect() {return _vect;}
1822222SN/A    FaultStat & countStat() {return _count;}
1832147SN/A};
1842090SN/A
1852502SN/Aclass DtbPageFault : public DtbFault
1862090SN/A{
1872147SN/A  private:
1882147SN/A    static FaultName _name;
1892147SN/A    static FaultVect _vect;
1902222SN/A    static FaultStat _count;
1912112SN/A  public:
1925568Snate@binkert.org    DtbPageFault(VAddr vaddr, uint32_t reqFlags, uint64_t flags)
1932502SN/A        : DtbFault(vaddr, reqFlags, flags)
1942502SN/A    { }
1954695Sgblack@eecs.umich.edu    FaultName name() const {return _name;}
1962147SN/A    FaultVect vect() {return _vect;}
1972222SN/A    FaultStat & countStat() {return _count;}
1982147SN/A};
1992090SN/A
2002502SN/Aclass DtbAcvFault : public DtbFault
2012090SN/A{
2022147SN/A  private:
2032147SN/A    static FaultName _name;
2042147SN/A    static FaultVect _vect;
2052222SN/A    static FaultStat _count;
2062112SN/A  public:
2075568Snate@binkert.org    DtbAcvFault(VAddr vaddr, uint32_t reqFlags, uint64_t flags)
2082502SN/A        : DtbFault(vaddr, reqFlags, flags)
2092502SN/A    { }
2104695Sgblack@eecs.umich.edu    FaultName name() const {return _name;}
2112147SN/A    FaultVect vect() {return _vect;}
2122222SN/A    FaultStat & countStat() {return _count;}
2132147SN/A};
2142090SN/A
2152502SN/Aclass DtbAlignmentFault : public DtbFault
2162090SN/A{
2172147SN/A  private:
2182147SN/A    static FaultName _name;
2192147SN/A    static FaultVect _vect;
2202222SN/A    static FaultStat _count;
2212112SN/A  public:
2225568Snate@binkert.org    DtbAlignmentFault(VAddr vaddr, uint32_t reqFlags, uint64_t flags)
2232502SN/A        : DtbFault(vaddr, reqFlags, flags)
2242502SN/A    { }
2254695Sgblack@eecs.umich.edu    FaultName name() const {return _name;}
2262147SN/A    FaultVect vect() {return _vect;}
2272222SN/A    FaultStat & countStat() {return _count;}
2282147SN/A};
2292090SN/A
2302502SN/Aclass ItbFault : public AlphaFault
2312502SN/A{
2324997Sgblack@eecs.umich.edu  protected:
2332502SN/A    Addr pc;
2342502SN/A  public:
2352502SN/A    ItbFault(Addr _pc)
2362502SN/A        : pc(_pc)
2372502SN/A    { }
2384695Sgblack@eecs.umich.edu    FaultName name() const = 0;
2392505SN/A    FaultVect vect() = 0;
2402505SN/A    FaultStat & countStat() = 0;
2412502SN/A#if FULL_SYSTEM
2422680Sktlim@umich.edu    void invoke(ThreadContext * tc);
2432502SN/A#endif
2442502SN/A};
2452502SN/A
2462502SN/Aclass ItbPageFault : public ItbFault
2472090SN/A{
2482147SN/A  private:
2492147SN/A    static FaultName _name;
2502147SN/A    static FaultVect _vect;
2512222SN/A    static FaultStat _count;
2522112SN/A  public:
2532502SN/A    ItbPageFault(Addr pc)
2542502SN/A        : ItbFault(pc)
2552502SN/A    { }
2564695Sgblack@eecs.umich.edu    FaultName name() const {return _name;}
2572502SN/A    FaultVect vect() {return _vect;}
2582502SN/A    FaultStat & countStat() {return _count;}
2594997Sgblack@eecs.umich.edu#if !FULL_SYSTEM
2604997Sgblack@eecs.umich.edu    void invoke(ThreadContext * tc);
2614997Sgblack@eecs.umich.edu#endif
2622502SN/A};
2632502SN/A
2642502SN/Aclass ItbAcvFault : public ItbFault
2652502SN/A{
2662502SN/A  private:
2672502SN/A    static FaultName _name;
2682502SN/A    static FaultVect _vect;
2692502SN/A    static FaultStat _count;
2702502SN/A  public:
2712502SN/A    ItbAcvFault(Addr pc)
2722502SN/A        : ItbFault(pc)
2732502SN/A    { }
2744695Sgblack@eecs.umich.edu    FaultName name() const {return _name;}
2752147SN/A    FaultVect vect() {return _vect;}
2762222SN/A    FaultStat & countStat() {return _count;}
2772147SN/A};
2782090SN/A
2792147SN/Aclass UnimplementedOpcodeFault : public AlphaFault
2802090SN/A{
2812147SN/A  private:
2822147SN/A    static FaultName _name;
2832147SN/A    static FaultVect _vect;
2842222SN/A    static FaultStat _count;
2852112SN/A  public:
2864695Sgblack@eecs.umich.edu    FaultName name() const {return _name;}
2872147SN/A    FaultVect vect() {return _vect;}
2882222SN/A    FaultStat & countStat() {return _count;}
2892147SN/A};
2902090SN/A
2912147SN/Aclass FloatEnableFault : public AlphaFault
2922090SN/A{
2932147SN/A  private:
2942147SN/A    static FaultName _name;
2952147SN/A    static FaultVect _vect;
2962222SN/A    static FaultStat _count;
2972112SN/A  public:
2984695Sgblack@eecs.umich.edu    FaultName name() const {return _name;}
2992147SN/A    FaultVect vect() {return _vect;}
3002222SN/A    FaultStat & countStat() {return _count;}
3012147SN/A};
3022090SN/A
3032147SN/Aclass PalFault : public AlphaFault
3042090SN/A{
3052201SN/A  protected:
3062201SN/A    bool skipFaultingInstruction() {return true;}
3072147SN/A  private:
3082147SN/A    static FaultName _name;
3092147SN/A    static FaultVect _vect;
3102222SN/A    static FaultStat _count;
3112112SN/A  public:
3124695Sgblack@eecs.umich.edu    FaultName name() const {return _name;}
3132147SN/A    FaultVect vect() {return _vect;}
3142222SN/A    FaultStat & countStat() {return _count;}
3152147SN/A};
3162090SN/A
3172147SN/Aclass IntegerOverflowFault : public AlphaFault
3182090SN/A{
3192147SN/A  private:
3202147SN/A    static FaultName _name;
3212147SN/A    static FaultVect _vect;
3222222SN/A    static FaultStat _count;
3232112SN/A  public:
3244695Sgblack@eecs.umich.edu    FaultName name() const {return _name;}
3252147SN/A    FaultVect vect() {return _vect;}
3262222SN/A    FaultStat & countStat() {return _count;}
3272147SN/A};
3282090SN/A
3292167SN/A} // AlphaISA namespace
3302167SN/A
3312SN/A#endif // __FAULTS_HH__
332