faults.hh revision 4183
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
383614Sgblack@eecs.umich.edu#if FULL_SYSTEM
392984Sgblack@eecs.umich.edu#include "arch/alpha/pagetable.hh"
403614Sgblack@eecs.umich.edu#endif
412147SN/A
422166SN/A// The design of the "name" and "vect" functions is in sim/faults.hh
432147SN/A
442167SN/Anamespace AlphaISA
452167SN/A{
462167SN/A
472147SN/Atypedef const Addr FaultVect;
482090SN/A
492222SN/Aclass AlphaFault : public FaultBase
502090SN/A{
512201SN/A  protected:
522201SN/A    virtual bool skipFaultingInstruction() {return false;}
532201SN/A    virtual bool setRestartAddress() {return true;}
542112SN/A  public:
552174SN/A#if FULL_SYSTEM
562680Sktlim@umich.edu    void invoke(ThreadContext * tc);
572174SN/A#endif
582175SN/A    virtual FaultVect vect() = 0;
592222SN/A    virtual FaultStat & countStat() = 0;
602SN/A};
612SN/A
622203SN/Aclass MachineCheckFault : public AlphaFault
632166SN/A{
642166SN/A  private:
652203SN/A    static FaultName _name;
662166SN/A    static FaultVect _vect;
672222SN/A    static FaultStat _count;
682166SN/A  public:
692203SN/A    FaultName name() {return _name;}
702166SN/A    FaultVect vect() {return _vect;}
712222SN/A    FaultStat & countStat() {return _count;}
722203SN/A    bool isMachineCheckFault() {return true;}
732166SN/A};
742166SN/A
752203SN/Aclass AlignmentFault : public AlphaFault
762166SN/A{
772166SN/A  private:
782203SN/A    static FaultName _name;
792166SN/A    static FaultVect _vect;
802222SN/A    static FaultStat _count;
812166SN/A  public:
822203SN/A    FaultName name() {return _name;}
832166SN/A    FaultVect vect() {return _vect;}
842222SN/A    FaultStat & countStat() {return _count;}
852203SN/A    bool isAlignmentFault() {return true;}
862166SN/A};
872166SN/A
882166SN/Astatic inline Fault genMachineCheckFault()
892166SN/A{
902203SN/A    return new MachineCheckFault;
912166SN/A}
922166SN/A
932166SN/Astatic inline Fault genAlignmentFault()
942166SN/A{
952203SN/A    return new AlignmentFault;
962166SN/A}
972166SN/A
982147SN/Aclass ResetFault : public AlphaFault
992090SN/A{
1002147SN/A  private:
1012147SN/A    static FaultName _name;
1022147SN/A    static FaultVect _vect;
1032222SN/A    static FaultStat _count;
1042112SN/A  public:
1052147SN/A    FaultName name() {return _name;}
1062147SN/A    FaultVect vect() {return _vect;}
1072222SN/A    FaultStat & countStat() {return _count;}
1082147SN/A};
1092090SN/A
1102147SN/Aclass ArithmeticFault : public AlphaFault
1112090SN/A{
1122201SN/A  protected:
1132201SN/A    bool skipFaultingInstruction() {return true;}
1142147SN/A  private:
1152147SN/A    static FaultName _name;
1162147SN/A    static FaultVect _vect;
1172222SN/A    static FaultStat _count;
1182112SN/A  public:
1192147SN/A    FaultName name() {return _name;}
1202147SN/A    FaultVect vect() {return _vect;}
1212222SN/A    FaultStat & countStat() {return _count;}
1222203SN/A#if FULL_SYSTEM
1232680Sktlim@umich.edu    void invoke(ThreadContext * tc);
1242203SN/A#endif
1252147SN/A};
1262090SN/A
1272147SN/Aclass InterruptFault : public AlphaFault
1282090SN/A{
1292201SN/A  protected:
1302201SN/A    bool setRestartAddress() {return false;}
1312147SN/A  private:
1322147SN/A    static FaultName _name;
1332147SN/A    static FaultVect _vect;
1342222SN/A    static FaultStat _count;
1352112SN/A  public:
1362147SN/A    FaultName name() {return _name;}
1372147SN/A    FaultVect vect() {return _vect;}
1382222SN/A    FaultStat & countStat() {return _count;}
1392147SN/A};
1402090SN/A
1412502SN/Aclass DtbFault : public AlphaFault
1422502SN/A{
1432502SN/A#if FULL_SYSTEM
1442502SN/A  private:
1452502SN/A    AlphaISA::VAddr vaddr;
1462502SN/A    uint32_t reqFlags;
1472502SN/A    uint64_t flags;
1482502SN/A  public:
1492502SN/A    DtbFault(AlphaISA::VAddr _vaddr, uint32_t _reqFlags, uint64_t _flags)
1502502SN/A        : vaddr(_vaddr), reqFlags(_reqFlags), flags(_flags)
1512502SN/A    { }
1522502SN/A#endif
1532502SN/A    FaultName name() = 0;
1542502SN/A    FaultVect vect() = 0;
1552502SN/A    FaultStat & countStat() = 0;
1562502SN/A#if FULL_SYSTEM
1572680Sktlim@umich.edu    void invoke(ThreadContext * tc);
1582502SN/A#endif
1592502SN/A};
1602502SN/A
1612502SN/Aclass NDtbMissFault : public DtbFault
1622090SN/A{
1632147SN/A  private:
1642147SN/A    static FaultName _name;
1652147SN/A    static FaultVect _vect;
1662222SN/A    static FaultStat _count;
1672112SN/A  public:
1682502SN/A#if FULL_SYSTEM
1692502SN/A    NDtbMissFault(AlphaISA::VAddr vaddr, uint32_t reqFlags, uint64_t flags)
1702502SN/A        : DtbFault(vaddr, reqFlags, flags)
1712502SN/A    { }
1722502SN/A#endif
1732147SN/A    FaultName name() {return _name;}
1742147SN/A    FaultVect vect() {return _vect;}
1752222SN/A    FaultStat & countStat() {return _count;}
1762147SN/A};
1772090SN/A
1782502SN/Aclass PDtbMissFault : public DtbFault
1792090SN/A{
1802147SN/A  private:
1812147SN/A    static FaultName _name;
1822147SN/A    static FaultVect _vect;
1832222SN/A    static FaultStat _count;
1842112SN/A  public:
1852502SN/A#if FULL_SYSTEM
1862502SN/A    PDtbMissFault(AlphaISA::VAddr vaddr, uint32_t reqFlags, uint64_t flags)
1872502SN/A        : DtbFault(vaddr, reqFlags, flags)
1882502SN/A    { }
1892502SN/A#endif
1902147SN/A    FaultName name() {return _name;}
1912147SN/A    FaultVect vect() {return _vect;}
1922222SN/A    FaultStat & countStat() {return _count;}
1932147SN/A};
1942090SN/A
1952502SN/Aclass DtbPageFault : public DtbFault
1962090SN/A{
1972147SN/A  private:
1982147SN/A    static FaultName _name;
1992147SN/A    static FaultVect _vect;
2002222SN/A    static FaultStat _count;
2012112SN/A  public:
2022502SN/A#if FULL_SYSTEM
2032502SN/A    DtbPageFault(AlphaISA::VAddr vaddr, uint32_t reqFlags, uint64_t flags)
2042502SN/A        : DtbFault(vaddr, reqFlags, flags)
2052502SN/A    { }
2062502SN/A#endif
2072147SN/A    FaultName name() {return _name;}
2082147SN/A    FaultVect vect() {return _vect;}
2092222SN/A    FaultStat & countStat() {return _count;}
2102147SN/A};
2112090SN/A
2122502SN/Aclass DtbAcvFault : public DtbFault
2132090SN/A{
2142147SN/A  private:
2152147SN/A    static FaultName _name;
2162147SN/A    static FaultVect _vect;
2172222SN/A    static FaultStat _count;
2182112SN/A  public:
2192502SN/A#if FULL_SYSTEM
2202502SN/A    DtbAcvFault(AlphaISA::VAddr vaddr, uint32_t reqFlags, uint64_t flags)
2212502SN/A        : DtbFault(vaddr, reqFlags, flags)
2222502SN/A    { }
2232502SN/A#endif
2242147SN/A    FaultName name() {return _name;}
2252147SN/A    FaultVect vect() {return _vect;}
2262222SN/A    FaultStat & countStat() {return _count;}
2272147SN/A};
2282090SN/A
2292502SN/Aclass DtbAlignmentFault : public DtbFault
2302090SN/A{
2312147SN/A  private:
2322147SN/A    static FaultName _name;
2332147SN/A    static FaultVect _vect;
2342222SN/A    static FaultStat _count;
2352112SN/A  public:
2362502SN/A#if FULL_SYSTEM
2372502SN/A    DtbAlignmentFault(AlphaISA::VAddr vaddr, uint32_t reqFlags, uint64_t flags)
2382502SN/A        : DtbFault(vaddr, reqFlags, flags)
2392502SN/A    { }
2402502SN/A#endif
2412147SN/A    FaultName name() {return _name;}
2422147SN/A    FaultVect vect() {return _vect;}
2432222SN/A    FaultStat & countStat() {return _count;}
2442147SN/A};
2452090SN/A
2462502SN/Aclass ItbFault : public AlphaFault
2472502SN/A{
2482502SN/A  private:
2492502SN/A    Addr pc;
2502502SN/A  public:
2512502SN/A    ItbFault(Addr _pc)
2522502SN/A        : pc(_pc)
2532502SN/A    { }
2542505SN/A    FaultName name() = 0;
2552505SN/A    FaultVect vect() = 0;
2562505SN/A    FaultStat & countStat() = 0;
2572502SN/A#if FULL_SYSTEM
2582680Sktlim@umich.edu    void invoke(ThreadContext * tc);
2592502SN/A#endif
2602502SN/A};
2612502SN/A
2622502SN/Aclass ItbMissFault : public ItbFault
2632090SN/A{
2642147SN/A  private:
2652147SN/A    static FaultName _name;
2662147SN/A    static FaultVect _vect;
2672222SN/A    static FaultStat _count;
2682112SN/A  public:
2692502SN/A    ItbMissFault(Addr pc)
2702502SN/A        : ItbFault(pc)
2712502SN/A    { }
2722147SN/A    FaultName name() {return _name;}
2732147SN/A    FaultVect vect() {return _vect;}
2742222SN/A    FaultStat & countStat() {return _count;}
2752147SN/A};
2762090SN/A
2772502SN/Aclass ItbPageFault : public ItbFault
2782090SN/A{
2792147SN/A  private:
2802147SN/A    static FaultName _name;
2812147SN/A    static FaultVect _vect;
2822222SN/A    static FaultStat _count;
2832112SN/A  public:
2842502SN/A    ItbPageFault(Addr pc)
2852502SN/A        : ItbFault(pc)
2862502SN/A    { }
2872502SN/A    FaultName name() {return _name;}
2882502SN/A    FaultVect vect() {return _vect;}
2892502SN/A    FaultStat & countStat() {return _count;}
2902502SN/A};
2912502SN/A
2922502SN/Aclass ItbAcvFault : public ItbFault
2932502SN/A{
2942502SN/A  private:
2952502SN/A    static FaultName _name;
2962502SN/A    static FaultVect _vect;
2972502SN/A    static FaultStat _count;
2982502SN/A  public:
2992502SN/A    ItbAcvFault(Addr pc)
3002502SN/A        : ItbFault(pc)
3012502SN/A    { }
3022147SN/A    FaultName name() {return _name;}
3032147SN/A    FaultVect vect() {return _vect;}
3042222SN/A    FaultStat & countStat() {return _count;}
3052147SN/A};
3062090SN/A
3072147SN/Aclass UnimplementedOpcodeFault : public AlphaFault
3082090SN/A{
3092147SN/A  private:
3102147SN/A    static FaultName _name;
3112147SN/A    static FaultVect _vect;
3122222SN/A    static FaultStat _count;
3132112SN/A  public:
3142147SN/A    FaultName name() {return _name;}
3152147SN/A    FaultVect vect() {return _vect;}
3162222SN/A    FaultStat & countStat() {return _count;}
3172147SN/A};
3182090SN/A
3192147SN/Aclass FloatEnableFault : public AlphaFault
3202090SN/A{
3212147SN/A  private:
3222147SN/A    static FaultName _name;
3232147SN/A    static FaultVect _vect;
3242222SN/A    static FaultStat _count;
3252112SN/A  public:
3262147SN/A    FaultName name() {return _name;}
3272147SN/A    FaultVect vect() {return _vect;}
3282222SN/A    FaultStat & countStat() {return _count;}
3292147SN/A};
3302090SN/A
3312147SN/Aclass PalFault : public AlphaFault
3322090SN/A{
3332201SN/A  protected:
3342201SN/A    bool skipFaultingInstruction() {return true;}
3352147SN/A  private:
3362147SN/A    static FaultName _name;
3372147SN/A    static FaultVect _vect;
3382222SN/A    static FaultStat _count;
3392112SN/A  public:
3402147SN/A    FaultName name() {return _name;}
3412147SN/A    FaultVect vect() {return _vect;}
3422222SN/A    FaultStat & countStat() {return _count;}
3432147SN/A};
3442090SN/A
3452147SN/Aclass IntegerOverflowFault : public AlphaFault
3462090SN/A{
3472147SN/A  private:
3482147SN/A    static FaultName _name;
3492147SN/A    static FaultVect _vect;
3502222SN/A    static FaultStat _count;
3512112SN/A  public:
3522147SN/A    FaultName name() {return _name;}
3532147SN/A    FaultVect vect() {return _vect;}
3542222SN/A    FaultStat & countStat() {return _count;}
3552147SN/A};
3562090SN/A
3572167SN/A} // AlphaISA namespace
3582167SN/A
3592SN/A#endif // __FAULTS_HH__
360