faults.hh revision 4997
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
912166SN/Astatic inline Fault genAlignmentFault()
922166SN/A{
932203SN/A    return new AlignmentFault;
942166SN/A}
952166SN/A
962147SN/Aclass ResetFault : public AlphaFault
972090SN/A{
982147SN/A  private:
992147SN/A    static FaultName _name;
1002147SN/A    static FaultVect _vect;
1012222SN/A    static FaultStat _count;
1022112SN/A  public:
1034695Sgblack@eecs.umich.edu    FaultName name() const {return _name;}
1042147SN/A    FaultVect vect() {return _vect;}
1052222SN/A    FaultStat & countStat() {return _count;}
1062147SN/A};
1072090SN/A
1082147SN/Aclass ArithmeticFault : public AlphaFault
1092090SN/A{
1102201SN/A  protected:
1112201SN/A    bool skipFaultingInstruction() {return true;}
1122147SN/A  private:
1132147SN/A    static FaultName _name;
1142147SN/A    static FaultVect _vect;
1152222SN/A    static FaultStat _count;
1162112SN/A  public:
1174695Sgblack@eecs.umich.edu    FaultName name() const {return _name;}
1182147SN/A    FaultVect vect() {return _vect;}
1192222SN/A    FaultStat & countStat() {return _count;}
1202203SN/A#if FULL_SYSTEM
1212680Sktlim@umich.edu    void invoke(ThreadContext * tc);
1222203SN/A#endif
1232147SN/A};
1242090SN/A
1252147SN/Aclass InterruptFault : public AlphaFault
1262090SN/A{
1272201SN/A  protected:
1282201SN/A    bool setRestartAddress() {return false;}
1292147SN/A  private:
1302147SN/A    static FaultName _name;
1312147SN/A    static FaultVect _vect;
1322222SN/A    static FaultStat _count;
1332112SN/A  public:
1344695Sgblack@eecs.umich.edu    FaultName name() const {return _name;}
1352147SN/A    FaultVect vect() {return _vect;}
1362222SN/A    FaultStat & countStat() {return _count;}
1372147SN/A};
1382090SN/A
1392502SN/Aclass DtbFault : public AlphaFault
1402502SN/A{
1414997Sgblack@eecs.umich.edu  protected:
1422502SN/A    AlphaISA::VAddr vaddr;
1432502SN/A    uint32_t reqFlags;
1442502SN/A    uint64_t flags;
1452502SN/A  public:
1462502SN/A    DtbFault(AlphaISA::VAddr _vaddr, uint32_t _reqFlags, uint64_t _flags)
1472502SN/A        : vaddr(_vaddr), reqFlags(_reqFlags), flags(_flags)
1482502SN/A    { }
1494695Sgblack@eecs.umich.edu    FaultName name() const = 0;
1502502SN/A    FaultVect vect() = 0;
1512502SN/A    FaultStat & countStat() = 0;
1522502SN/A#if FULL_SYSTEM
1532680Sktlim@umich.edu    void invoke(ThreadContext * tc);
1542502SN/A#endif
1552502SN/A};
1562502SN/A
1572502SN/Aclass NDtbMissFault : public DtbFault
1582090SN/A{
1592147SN/A  private:
1602147SN/A    static FaultName _name;
1612147SN/A    static FaultVect _vect;
1622222SN/A    static FaultStat _count;
1632112SN/A  public:
1642502SN/A    NDtbMissFault(AlphaISA::VAddr vaddr, uint32_t reqFlags, uint64_t flags)
1652502SN/A        : DtbFault(vaddr, reqFlags, flags)
1662502SN/A    { }
1674695Sgblack@eecs.umich.edu    FaultName name() const {return _name;}
1682147SN/A    FaultVect vect() {return _vect;}
1692222SN/A    FaultStat & countStat() {return _count;}
1704997Sgblack@eecs.umich.edu#if !FULL_SYSTEM
1714997Sgblack@eecs.umich.edu    void invoke(ThreadContext * tc);
1724997Sgblack@eecs.umich.edu#endif
1732147SN/A};
1742090SN/A
1752502SN/Aclass PDtbMissFault : public DtbFault
1762090SN/A{
1772147SN/A  private:
1782147SN/A    static FaultName _name;
1792147SN/A    static FaultVect _vect;
1802222SN/A    static FaultStat _count;
1812112SN/A  public:
1822502SN/A    PDtbMissFault(AlphaISA::VAddr vaddr, uint32_t reqFlags, uint64_t flags)
1832502SN/A        : DtbFault(vaddr, reqFlags, flags)
1842502SN/A    { }
1854695Sgblack@eecs.umich.edu    FaultName name() const {return _name;}
1862147SN/A    FaultVect vect() {return _vect;}
1872222SN/A    FaultStat & countStat() {return _count;}
1882147SN/A};
1892090SN/A
1902502SN/Aclass DtbPageFault : public DtbFault
1912090SN/A{
1922147SN/A  private:
1932147SN/A    static FaultName _name;
1942147SN/A    static FaultVect _vect;
1952222SN/A    static FaultStat _count;
1962112SN/A  public:
1972502SN/A    DtbPageFault(AlphaISA::VAddr vaddr, uint32_t reqFlags, uint64_t flags)
1982502SN/A        : DtbFault(vaddr, reqFlags, flags)
1992502SN/A    { }
2004695Sgblack@eecs.umich.edu    FaultName name() const {return _name;}
2012147SN/A    FaultVect vect() {return _vect;}
2022222SN/A    FaultStat & countStat() {return _count;}
2032147SN/A};
2042090SN/A
2052502SN/Aclass DtbAcvFault : public DtbFault
2062090SN/A{
2072147SN/A  private:
2082147SN/A    static FaultName _name;
2092147SN/A    static FaultVect _vect;
2102222SN/A    static FaultStat _count;
2112112SN/A  public:
2122502SN/A    DtbAcvFault(AlphaISA::VAddr vaddr, uint32_t reqFlags, uint64_t flags)
2132502SN/A        : DtbFault(vaddr, reqFlags, flags)
2142502SN/A    { }
2154695Sgblack@eecs.umich.edu    FaultName name() const {return _name;}
2162147SN/A    FaultVect vect() {return _vect;}
2172222SN/A    FaultStat & countStat() {return _count;}
2182147SN/A};
2192090SN/A
2202502SN/Aclass DtbAlignmentFault : public DtbFault
2212090SN/A{
2222147SN/A  private:
2232147SN/A    static FaultName _name;
2242147SN/A    static FaultVect _vect;
2252222SN/A    static FaultStat _count;
2262112SN/A  public:
2272502SN/A    DtbAlignmentFault(AlphaISA::VAddr vaddr, uint32_t reqFlags, uint64_t flags)
2282502SN/A        : DtbFault(vaddr, reqFlags, flags)
2292502SN/A    { }
2304695Sgblack@eecs.umich.edu    FaultName name() const {return _name;}
2312147SN/A    FaultVect vect() {return _vect;}
2322222SN/A    FaultStat & countStat() {return _count;}
2332147SN/A};
2342090SN/A
2352502SN/Aclass ItbFault : public AlphaFault
2362502SN/A{
2374997Sgblack@eecs.umich.edu  protected:
2382502SN/A    Addr pc;
2392502SN/A  public:
2402502SN/A    ItbFault(Addr _pc)
2412502SN/A        : pc(_pc)
2422502SN/A    { }
2434695Sgblack@eecs.umich.edu    FaultName name() const = 0;
2442505SN/A    FaultVect vect() = 0;
2452505SN/A    FaultStat & countStat() = 0;
2462502SN/A#if FULL_SYSTEM
2472680Sktlim@umich.edu    void invoke(ThreadContext * tc);
2482502SN/A#endif
2492502SN/A};
2502502SN/A
2512502SN/Aclass ItbPageFault : public ItbFault
2522090SN/A{
2532147SN/A  private:
2542147SN/A    static FaultName _name;
2552147SN/A    static FaultVect _vect;
2562222SN/A    static FaultStat _count;
2572112SN/A  public:
2582502SN/A    ItbPageFault(Addr pc)
2592502SN/A        : ItbFault(pc)
2602502SN/A    { }
2614695Sgblack@eecs.umich.edu    FaultName name() const {return _name;}
2622502SN/A    FaultVect vect() {return _vect;}
2632502SN/A    FaultStat & countStat() {return _count;}
2644997Sgblack@eecs.umich.edu#if !FULL_SYSTEM
2654997Sgblack@eecs.umich.edu    void invoke(ThreadContext * tc);
2664997Sgblack@eecs.umich.edu#endif
2672502SN/A};
2682502SN/A
2692502SN/Aclass ItbAcvFault : public ItbFault
2702502SN/A{
2712502SN/A  private:
2722502SN/A    static FaultName _name;
2732502SN/A    static FaultVect _vect;
2742502SN/A    static FaultStat _count;
2752502SN/A  public:
2762502SN/A    ItbAcvFault(Addr pc)
2772502SN/A        : ItbFault(pc)
2782502SN/A    { }
2794695Sgblack@eecs.umich.edu    FaultName name() const {return _name;}
2802147SN/A    FaultVect vect() {return _vect;}
2812222SN/A    FaultStat & countStat() {return _count;}
2822147SN/A};
2832090SN/A
2842147SN/Aclass UnimplementedOpcodeFault : public AlphaFault
2852090SN/A{
2862147SN/A  private:
2872147SN/A    static FaultName _name;
2882147SN/A    static FaultVect _vect;
2892222SN/A    static FaultStat _count;
2902112SN/A  public:
2914695Sgblack@eecs.umich.edu    FaultName name() const {return _name;}
2922147SN/A    FaultVect vect() {return _vect;}
2932222SN/A    FaultStat & countStat() {return _count;}
2942147SN/A};
2952090SN/A
2962147SN/Aclass FloatEnableFault : public AlphaFault
2972090SN/A{
2982147SN/A  private:
2992147SN/A    static FaultName _name;
3002147SN/A    static FaultVect _vect;
3012222SN/A    static FaultStat _count;
3022112SN/A  public:
3034695Sgblack@eecs.umich.edu    FaultName name() const {return _name;}
3042147SN/A    FaultVect vect() {return _vect;}
3052222SN/A    FaultStat & countStat() {return _count;}
3062147SN/A};
3072090SN/A
3082147SN/Aclass PalFault : public AlphaFault
3092090SN/A{
3102201SN/A  protected:
3112201SN/A    bool skipFaultingInstruction() {return true;}
3122147SN/A  private:
3132147SN/A    static FaultName _name;
3142147SN/A    static FaultVect _vect;
3152222SN/A    static FaultStat _count;
3162112SN/A  public:
3174695Sgblack@eecs.umich.edu    FaultName name() const {return _name;}
3182147SN/A    FaultVect vect() {return _vect;}
3192222SN/A    FaultStat & countStat() {return _count;}
3202147SN/A};
3212090SN/A
3222147SN/Aclass IntegerOverflowFault : public AlphaFault
3232090SN/A{
3242147SN/A  private:
3252147SN/A    static FaultName _name;
3262147SN/A    static FaultVect _vect;
3272222SN/A    static FaultStat _count;
3282112SN/A  public:
3294695Sgblack@eecs.umich.edu    FaultName name() const {return _name;}
3302147SN/A    FaultVect vect() {return _vect;}
3312222SN/A    FaultStat & countStat() {return _count;}
3322147SN/A};
3332090SN/A
3342167SN/A} // AlphaISA namespace
3352167SN/A
3362SN/A#endif // __FAULTS_HH__
337