faults.hh revision 2935
12131SN/A/*
22131SN/A * Copyright (c) 2003-2005 The Regents of The University of Michigan
32131SN/A * All rights reserved.
42131SN/A *
52131SN/A * Redistribution and use in source and binary forms, with or without
62131SN/A * modification, are permitted provided that the following conditions are
72131SN/A * met: redistributions of source code must retain the above copyright
82131SN/A * notice, this list of conditions and the following disclaimer;
92131SN/A * redistributions in binary form must reproduce the above copyright
102131SN/A * notice, this list of conditions and the following disclaimer in the
112131SN/A * documentation and/or other materials provided with the distribution;
122131SN/A * neither the name of the copyright holders nor the names of its
132131SN/A * contributors may be used to endorse or promote products derived from
142131SN/A * this software without specific prior written permission.
152131SN/A *
162131SN/A * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
172131SN/A * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
182131SN/A * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
192131SN/A * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
202131SN/A * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
212131SN/A * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
222131SN/A * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
232131SN/A * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
242131SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
252131SN/A * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
262131SN/A * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
272665Ssaidi@eecs.umich.edu *
282935Sksewell@umich.edu * Authors: Gabe Black
292935Sksewell@umich.edu *          Korey Sewell
302131SN/A */
312131SN/A
322239SN/A#ifndef __MIPS_FAULTS_HH__
332239SN/A#define __MIPS_FAULTS_HH__
342131SN/A
352131SN/A#include "sim/faults.hh"
362447SN/A
372447SN/A// The design of the "name" and "vect" functions is in sim/faults.hh
382447SN/A
392447SN/Anamespace MipsISA
402447SN/A{
412447SN/A
422447SN/Atypedef const Addr FaultVect;
432131SN/A
442239SN/Aclass MipsFault : public FaultBase
452131SN/A{
462447SN/A  protected:
472447SN/A    virtual bool skipFaultingInstruction() {return false;}
482447SN/A    virtual bool setRestartAddress() {return true;}
492131SN/A  public:
502447SN/A#if FULL_SYSTEM
512680Sktlim@umich.edu    void invoke(ThreadContext * tc);
522447SN/A#endif
532447SN/A    virtual FaultVect vect() = 0;
542447SN/A    virtual FaultStat & countStat() = 0;
552131SN/A};
562131SN/A
572447SN/Aclass MachineCheckFault : public MipsFault
582131SN/A{
592447SN/A  private:
602447SN/A    static FaultName _name;
612447SN/A    static FaultVect _vect;
622447SN/A    static FaultStat _count;
632131SN/A  public:
642447SN/A    FaultName name() {return _name;}
652447SN/A    FaultVect vect() {return _vect;}
662447SN/A    FaultStat & countStat() {return _count;}
672447SN/A    bool isMachineCheckFault() {return true;}
682447SN/A};
692131SN/A
702447SN/Aclass AlignmentFault : public MipsFault
712131SN/A{
722447SN/A  private:
732447SN/A    static FaultName _name;
742447SN/A    static FaultVect _vect;
752447SN/A    static FaultStat _count;
762131SN/A  public:
772447SN/A    FaultName name() {return _name;}
782447SN/A    FaultVect vect() {return _vect;}
792447SN/A    FaultStat & countStat() {return _count;}
802447SN/A    bool isAlignmentFault() {return true;}
812447SN/A};
822131SN/A
832800Ssaidi@eecs.umich.edu#if !FULL_SYSTEM
842800Ssaidi@eecs.umich.educlass PageTableFault : public MipsFault
852800Ssaidi@eecs.umich.edu{
862800Ssaidi@eecs.umich.edu  private:
872800Ssaidi@eecs.umich.edu    Addr vaddr;
882800Ssaidi@eecs.umich.edu    static FaultName _name;
892800Ssaidi@eecs.umich.edu    static FaultVect _vect;
902800Ssaidi@eecs.umich.edu    static FaultStat _count;
912800Ssaidi@eecs.umich.edu  public:
922800Ssaidi@eecs.umich.edu    PageTableFault(Addr va)
932800Ssaidi@eecs.umich.edu        : vaddr(va) {}
942800Ssaidi@eecs.umich.edu    FaultName name() {return _name;}
952800Ssaidi@eecs.umich.edu    FaultVect vect() {return _vect;}
962800Ssaidi@eecs.umich.edu    FaultStat & countStat() {return _count;}
972800Ssaidi@eecs.umich.edu    void invoke(ThreadContext * tc);
982800Ssaidi@eecs.umich.edu};
992800Ssaidi@eecs.umich.edu
1002800Ssaidi@eecs.umich.edustatic inline Fault genPageTableFault(Addr va)
1012800Ssaidi@eecs.umich.edu{
1022800Ssaidi@eecs.umich.edu    return new PageTableFault(va);
1032800Ssaidi@eecs.umich.edu}
1042800Ssaidi@eecs.umich.edu#endif
1052800Ssaidi@eecs.umich.edu
1062800Ssaidi@eecs.umich.edu
1072447SN/Astatic inline Fault genMachineCheckFault()
1082131SN/A{
1092447SN/A    return new MachineCheckFault;
1102447SN/A}
1112447SN/A
1122447SN/Astatic inline Fault genAlignmentFault()
1132447SN/A{
1142447SN/A    return new AlignmentFault;
1152447SN/A}
1162447SN/A
1172447SN/Aclass ResetFault : public MipsFault
1182447SN/A{
1192447SN/A  private:
1202447SN/A    static FaultName _name;
1212447SN/A    static FaultVect _vect;
1222447SN/A    static FaultStat _count;
1232131SN/A  public:
1242447SN/A    FaultName name() {return _name;}
1252447SN/A    FaultVect vect() {return _vect;}
1262447SN/A    FaultStat & countStat() {return _count;}
1272447SN/A};
1282131SN/A
1292447SN/Aclass ArithmeticFault : public MipsFault
1302131SN/A{
1312447SN/A  protected:
1322447SN/A    bool skipFaultingInstruction() {return true;}
1332447SN/A  private:
1342447SN/A    static FaultName _name;
1352447SN/A    static FaultVect _vect;
1362447SN/A    static FaultStat _count;
1372131SN/A  public:
1382447SN/A    FaultName name() {return _name;}
1392447SN/A    FaultVect vect() {return _vect;}
1402447SN/A    FaultStat & countStat() {return _count;}
1412447SN/A#if FULL_SYSTEM
1422680Sktlim@umich.edu    void invoke(ThreadContext * tc);
1432447SN/A#endif
1442447SN/A};
1452131SN/A
1462447SN/Aclass InterruptFault : public MipsFault
1472131SN/A{
1482447SN/A  protected:
1492447SN/A    bool setRestartAddress() {return false;}
1502447SN/A  private:
1512447SN/A    static FaultName _name;
1522447SN/A    static FaultVect _vect;
1532447SN/A    static FaultStat _count;
1542131SN/A  public:
1552447SN/A    FaultName name() {return _name;}
1562447SN/A    FaultVect vect() {return _vect;}
1572447SN/A    FaultStat & countStat() {return _count;}
1582447SN/A};
1592131SN/A
1602447SN/Aclass NDtbMissFault : public MipsFault
1612131SN/A{
1622447SN/A  private:
1632447SN/A    static FaultName _name;
1642447SN/A    static FaultVect _vect;
1652447SN/A    static FaultStat _count;
1662131SN/A  public:
1672447SN/A    FaultName name() {return _name;}
1682447SN/A    FaultVect vect() {return _vect;}
1692447SN/A    FaultStat & countStat() {return _count;}
1702447SN/A};
1712131SN/A
1722447SN/Aclass PDtbMissFault : public MipsFault
1732131SN/A{
1742447SN/A  private:
1752447SN/A    static FaultName _name;
1762447SN/A    static FaultVect _vect;
1772447SN/A    static FaultStat _count;
1782131SN/A  public:
1792447SN/A    FaultName name() {return _name;}
1802447SN/A    FaultVect vect() {return _vect;}
1812447SN/A    FaultStat & countStat() {return _count;}
1822447SN/A};
1832131SN/A
1842447SN/Aclass DtbPageFault : public MipsFault
1852131SN/A{
1862447SN/A  private:
1872447SN/A    static FaultName _name;
1882447SN/A    static FaultVect _vect;
1892447SN/A    static FaultStat _count;
1902131SN/A  public:
1912447SN/A    FaultName name() {return _name;}
1922447SN/A    FaultVect vect() {return _vect;}
1932447SN/A    FaultStat & countStat() {return _count;}
1942447SN/A};
1952131SN/A
1962447SN/Aclass DtbAcvFault : public MipsFault
1972131SN/A{
1982447SN/A  private:
1992447SN/A    static FaultName _name;
2002447SN/A    static FaultVect _vect;
2012447SN/A    static FaultStat _count;
2022131SN/A  public:
2032447SN/A    FaultName name() {return _name;}
2042447SN/A    FaultVect vect() {return _vect;}
2052447SN/A    FaultStat & countStat() {return _count;}
2062447SN/A};
2072131SN/A
2082447SN/Aclass ItbMissFault : public MipsFault
2092131SN/A{
2102447SN/A  private:
2112447SN/A    static FaultName _name;
2122447SN/A    static FaultVect _vect;
2132447SN/A    static FaultStat _count;
2142131SN/A  public:
2152447SN/A    FaultName name() {return _name;}
2162447SN/A    FaultVect vect() {return _vect;}
2172447SN/A    FaultStat & countStat() {return _count;}
2182447SN/A};
2192131SN/A
2202447SN/Aclass ItbPageFault : public MipsFault
2212131SN/A{
2222447SN/A  private:
2232447SN/A    static FaultName _name;
2242447SN/A    static FaultVect _vect;
2252447SN/A    static FaultStat _count;
2262131SN/A  public:
2272447SN/A    FaultName name() {return _name;}
2282447SN/A    FaultVect vect() {return _vect;}
2292447SN/A    FaultStat & countStat() {return _count;}
2302447SN/A};
2312131SN/A
2322447SN/Aclass ItbAcvFault : public MipsFault
2332131SN/A{
2342447SN/A  private:
2352447SN/A    static FaultName _name;
2362447SN/A    static FaultVect _vect;
2372447SN/A    static FaultStat _count;
2382131SN/A  public:
2392447SN/A    FaultName name() {return _name;}
2402447SN/A    FaultVect vect() {return _vect;}
2412447SN/A    FaultStat & countStat() {return _count;}
2422447SN/A};
2432131SN/A
2442447SN/Aclass UnimplementedOpcodeFault : public MipsFault
2452131SN/A{
2462447SN/A  private:
2472447SN/A    static FaultName _name;
2482447SN/A    static FaultVect _vect;
2492447SN/A    static FaultStat _count;
2502131SN/A  public:
2512447SN/A    FaultName name() {return _name;}
2522447SN/A    FaultVect vect() {return _vect;}
2532447SN/A    FaultStat & countStat() {return _count;}
2542447SN/A};
2552131SN/A
2562447SN/Aclass FloatEnableFault : public MipsFault
2572131SN/A{
2582447SN/A  private:
2592447SN/A    static FaultName _name;
2602447SN/A    static FaultVect _vect;
2612447SN/A    static FaultStat _count;
2622131SN/A  public:
2632447SN/A    FaultName name() {return _name;}
2642447SN/A    FaultVect vect() {return _vect;}
2652447SN/A    FaultStat & countStat() {return _count;}
2662447SN/A};
2672131SN/A
2682447SN/Aclass PalFault : public MipsFault
2692447SN/A{
2702447SN/A  protected:
2712447SN/A    bool skipFaultingInstruction() {return true;}
2722447SN/A  private:
2732447SN/A    static FaultName _name;
2742447SN/A    static FaultVect _vect;
2752447SN/A    static FaultStat _count;
2762447SN/A  public:
2772447SN/A    FaultName name() {return _name;}
2782447SN/A    FaultVect vect() {return _vect;}
2792447SN/A    FaultStat & countStat() {return _count;}
2802447SN/A};
2812447SN/A
2822447SN/Aclass IntegerOverflowFault : public MipsFault
2832447SN/A{
2842447SN/A  private:
2852447SN/A    static FaultName _name;
2862447SN/A    static FaultVect _vect;
2872447SN/A    static FaultStat _count;
2882447SN/A  public:
2892447SN/A    FaultName name() {return _name;}
2902447SN/A    FaultVect vect() {return _vect;}
2912447SN/A    FaultStat & countStat() {return _count;}
2922447SN/A};
2932447SN/A
2942447SN/A} // MipsISA namespace
2952131SN/A
2962131SN/A#endif // __FAULTS_HH__
297