faults.hh revision 2680
114184Sgabeblack@google.com/*
214184Sgabeblack@google.com * Copyright (c) 2003-2005 The Regents of The University of Michigan
314184Sgabeblack@google.com * All rights reserved.
414184Sgabeblack@google.com *
514184Sgabeblack@google.com * Redistribution and use in source and binary forms, with or without
614184Sgabeblack@google.com * modification, are permitted provided that the following conditions are
714184Sgabeblack@google.com * met: redistributions of source code must retain the above copyright
814184Sgabeblack@google.com * notice, this list of conditions and the following disclaimer;
914184Sgabeblack@google.com * redistributions in binary form must reproduce the above copyright
1014184Sgabeblack@google.com * notice, this list of conditions and the following disclaimer in the
1114184Sgabeblack@google.com * documentation and/or other materials provided with the distribution;
1214184Sgabeblack@google.com * neither the name of the copyright holders nor the names of its
1314184Sgabeblack@google.com * contributors may be used to endorse or promote products derived from
1414184Sgabeblack@google.com * this software without specific prior written permission.
1514184Sgabeblack@google.com *
1614184Sgabeblack@google.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1714184Sgabeblack@google.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1814184Sgabeblack@google.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1914184Sgabeblack@google.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2014184Sgabeblack@google.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2114184Sgabeblack@google.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2214184Sgabeblack@google.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2314184Sgabeblack@google.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2414184Sgabeblack@google.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2514184Sgabeblack@google.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2614184Sgabeblack@google.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2714184Sgabeblack@google.com *
2814184Sgabeblack@google.com * Authors: Gabe Black
2914184Sgabeblack@google.com *          Kevin Lim
3014184Sgabeblack@google.com */
3114184Sgabeblack@google.com
3214184Sgabeblack@google.com#ifndef __ALPHA_FAULTS_HH__
3314184Sgabeblack@google.com#define __ALPHA_FAULTS_HH__
3414184Sgabeblack@google.com
3514184Sgabeblack@google.com#include "arch/alpha/isa_traits.hh"
3614184Sgabeblack@google.com#include "sim/faults.hh"
3714184Sgabeblack@google.com
3814184Sgabeblack@google.com// The design of the "name" and "vect" functions is in sim/faults.hh
3914184Sgabeblack@google.com
4014184Sgabeblack@google.comnamespace AlphaISA
4114184Sgabeblack@google.com{
4214184Sgabeblack@google.com
4314184Sgabeblack@google.comtypedef const Addr FaultVect;
4414184Sgabeblack@google.com
4514184Sgabeblack@google.comclass AlphaFault : public FaultBase
4614184Sgabeblack@google.com{
4714184Sgabeblack@google.com  protected:
4814184Sgabeblack@google.com    virtual bool skipFaultingInstruction() {return false;}
4914184Sgabeblack@google.com    virtual bool setRestartAddress() {return true;}
5014184Sgabeblack@google.com  public:
5114184Sgabeblack@google.com#if FULL_SYSTEM
5214184Sgabeblack@google.com    void invoke(ThreadContext * tc);
5314184Sgabeblack@google.com#endif
5414184Sgabeblack@google.com    virtual FaultVect vect() = 0;
5514184Sgabeblack@google.com    virtual FaultStat & countStat() = 0;
5614184Sgabeblack@google.com};
5714184Sgabeblack@google.com
5814184Sgabeblack@google.comclass MachineCheckFault : public AlphaFault
5914184Sgabeblack@google.com{
6014184Sgabeblack@google.com  private:
6114184Sgabeblack@google.com    static FaultName _name;
6214184Sgabeblack@google.com    static FaultVect _vect;
6314184Sgabeblack@google.com    static FaultStat _count;
6414184Sgabeblack@google.com  public:
6514184Sgabeblack@google.com    FaultName name() {return _name;}
6614184Sgabeblack@google.com    FaultVect vect() {return _vect;}
6714184Sgabeblack@google.com    FaultStat & countStat() {return _count;}
6814184Sgabeblack@google.com    bool isMachineCheckFault() {return true;}
6914184Sgabeblack@google.com};
7014184Sgabeblack@google.com
7114184Sgabeblack@google.comclass AlignmentFault : public AlphaFault
7214184Sgabeblack@google.com{
7314184Sgabeblack@google.com  private:
7414184Sgabeblack@google.com    static FaultName _name;
7514184Sgabeblack@google.com    static FaultVect _vect;
7614184Sgabeblack@google.com    static FaultStat _count;
7714184Sgabeblack@google.com  public:
7814184Sgabeblack@google.com    FaultName name() {return _name;}
7914184Sgabeblack@google.com    FaultVect vect() {return _vect;}
8014184Sgabeblack@google.com    FaultStat & countStat() {return _count;}
8114184Sgabeblack@google.com    bool isAlignmentFault() {return true;}
8214184Sgabeblack@google.com};
8314184Sgabeblack@google.com
8414184Sgabeblack@google.comstatic inline Fault genMachineCheckFault()
8514184Sgabeblack@google.com{
8614184Sgabeblack@google.com    return new MachineCheckFault;
8714184Sgabeblack@google.com}
8814184Sgabeblack@google.com
8914184Sgabeblack@google.comstatic inline Fault genAlignmentFault()
9014184Sgabeblack@google.com{
9114184Sgabeblack@google.com    return new AlignmentFault;
9214184Sgabeblack@google.com}
9314184Sgabeblack@google.com
9414184Sgabeblack@google.comclass ResetFault : public AlphaFault
9514184Sgabeblack@google.com{
9614184Sgabeblack@google.com  private:
9714184Sgabeblack@google.com    static FaultName _name;
9814184Sgabeblack@google.com    static FaultVect _vect;
9914184Sgabeblack@google.com    static FaultStat _count;
10014184Sgabeblack@google.com  public:
10114184Sgabeblack@google.com    FaultName name() {return _name;}
10214184Sgabeblack@google.com    FaultVect vect() {return _vect;}
10314184Sgabeblack@google.com    FaultStat & countStat() {return _count;}
10414184Sgabeblack@google.com};
10514184Sgabeblack@google.com
10614184Sgabeblack@google.comclass ArithmeticFault : public AlphaFault
10714184Sgabeblack@google.com{
10814184Sgabeblack@google.com  protected:
10914184Sgabeblack@google.com    bool skipFaultingInstruction() {return true;}
11014184Sgabeblack@google.com  private:
11114184Sgabeblack@google.com    static FaultName _name;
11214184Sgabeblack@google.com    static FaultVect _vect;
11314184Sgabeblack@google.com    static FaultStat _count;
11414184Sgabeblack@google.com  public:
11514184Sgabeblack@google.com    FaultName name() {return _name;}
11614184Sgabeblack@google.com    FaultVect vect() {return _vect;}
11714184Sgabeblack@google.com    FaultStat & countStat() {return _count;}
11814184Sgabeblack@google.com#if FULL_SYSTEM
11914184Sgabeblack@google.com    void invoke(ThreadContext * tc);
12014184Sgabeblack@google.com#endif
12114184Sgabeblack@google.com};
12214184Sgabeblack@google.com
12314184Sgabeblack@google.comclass InterruptFault : public AlphaFault
12414184Sgabeblack@google.com{
12514184Sgabeblack@google.com  protected:
12614184Sgabeblack@google.com    bool setRestartAddress() {return false;}
12714184Sgabeblack@google.com  private:
12814184Sgabeblack@google.com    static FaultName _name;
12914184Sgabeblack@google.com    static FaultVect _vect;
13014184Sgabeblack@google.com    static FaultStat _count;
13114184Sgabeblack@google.com  public:
13214184Sgabeblack@google.com    FaultName name() {return _name;}
13314184Sgabeblack@google.com    FaultVect vect() {return _vect;}
13414184Sgabeblack@google.com    FaultStat & countStat() {return _count;}
13514184Sgabeblack@google.com};
13614184Sgabeblack@google.com
13714184Sgabeblack@google.comclass DtbFault : public AlphaFault
13814184Sgabeblack@google.com{
13914184Sgabeblack@google.com#if FULL_SYSTEM
14014184Sgabeblack@google.com  private:
14114184Sgabeblack@google.com    AlphaISA::VAddr vaddr;
14214184Sgabeblack@google.com    uint32_t reqFlags;
14314184Sgabeblack@google.com    uint64_t flags;
14414184Sgabeblack@google.com  public:
14514184Sgabeblack@google.com    DtbFault(AlphaISA::VAddr _vaddr, uint32_t _reqFlags, uint64_t _flags)
14614184Sgabeblack@google.com        : vaddr(_vaddr), reqFlags(_reqFlags), flags(_flags)
14714184Sgabeblack@google.com    { }
14814184Sgabeblack@google.com#endif
14914184Sgabeblack@google.com    FaultName name() = 0;
15014184Sgabeblack@google.com    FaultVect vect() = 0;
15114184Sgabeblack@google.com    FaultStat & countStat() = 0;
15214184Sgabeblack@google.com#if FULL_SYSTEM
15314184Sgabeblack@google.com    void invoke(ThreadContext * tc);
15414184Sgabeblack@google.com#endif
15514184Sgabeblack@google.com};
15614184Sgabeblack@google.com
15714184Sgabeblack@google.comclass NDtbMissFault : public DtbFault
15814184Sgabeblack@google.com{
15914184Sgabeblack@google.com  private:
16014184Sgabeblack@google.com    static FaultName _name;
16114184Sgabeblack@google.com    static FaultVect _vect;
16214184Sgabeblack@google.com    static FaultStat _count;
16314184Sgabeblack@google.com  public:
16414184Sgabeblack@google.com#if FULL_SYSTEM
16514184Sgabeblack@google.com    NDtbMissFault(AlphaISA::VAddr vaddr, uint32_t reqFlags, uint64_t flags)
16614184Sgabeblack@google.com        : DtbFault(vaddr, reqFlags, flags)
16714184Sgabeblack@google.com    { }
16814184Sgabeblack@google.com#endif
16914184Sgabeblack@google.com    FaultName name() {return _name;}
17014184Sgabeblack@google.com    FaultVect vect() {return _vect;}
17114184Sgabeblack@google.com    FaultStat & countStat() {return _count;}
17214184Sgabeblack@google.com};
17314184Sgabeblack@google.com
17414184Sgabeblack@google.comclass PDtbMissFault : public DtbFault
17514184Sgabeblack@google.com{
17614184Sgabeblack@google.com  private:
17714184Sgabeblack@google.com    static FaultName _name;
17814184Sgabeblack@google.com    static FaultVect _vect;
17914184Sgabeblack@google.com    static FaultStat _count;
18014184Sgabeblack@google.com  public:
18114184Sgabeblack@google.com#if FULL_SYSTEM
18214184Sgabeblack@google.com    PDtbMissFault(AlphaISA::VAddr vaddr, uint32_t reqFlags, uint64_t flags)
18314184Sgabeblack@google.com        : DtbFault(vaddr, reqFlags, flags)
18414184Sgabeblack@google.com    { }
18514184Sgabeblack@google.com#endif
18614184Sgabeblack@google.com    FaultName name() {return _name;}
18714184Sgabeblack@google.com    FaultVect vect() {return _vect;}
18814184Sgabeblack@google.com    FaultStat & countStat() {return _count;}
18914184Sgabeblack@google.com};
19014184Sgabeblack@google.com
19114184Sgabeblack@google.comclass DtbPageFault : public DtbFault
19214184Sgabeblack@google.com{
19314184Sgabeblack@google.com  private:
19414184Sgabeblack@google.com    static FaultName _name;
19514184Sgabeblack@google.com    static FaultVect _vect;
19614184Sgabeblack@google.com    static FaultStat _count;
19714184Sgabeblack@google.com  public:
19814184Sgabeblack@google.com#if FULL_SYSTEM
19914184Sgabeblack@google.com    DtbPageFault(AlphaISA::VAddr vaddr, uint32_t reqFlags, uint64_t flags)
20014184Sgabeblack@google.com        : DtbFault(vaddr, reqFlags, flags)
20114184Sgabeblack@google.com    { }
20214184Sgabeblack@google.com#endif
20314184Sgabeblack@google.com    FaultName name() {return _name;}
20414184Sgabeblack@google.com    FaultVect vect() {return _vect;}
20514184Sgabeblack@google.com    FaultStat & countStat() {return _count;}
20614184Sgabeblack@google.com};
20714184Sgabeblack@google.com
20814184Sgabeblack@google.comclass DtbAcvFault : public DtbFault
20914184Sgabeblack@google.com{
21014184Sgabeblack@google.com  private:
21114184Sgabeblack@google.com    static FaultName _name;
21214184Sgabeblack@google.com    static FaultVect _vect;
21314184Sgabeblack@google.com    static FaultStat _count;
21414184Sgabeblack@google.com  public:
21514184Sgabeblack@google.com#if FULL_SYSTEM
21614184Sgabeblack@google.com    DtbAcvFault(AlphaISA::VAddr vaddr, uint32_t reqFlags, uint64_t flags)
21714184Sgabeblack@google.com        : DtbFault(vaddr, reqFlags, flags)
21814184Sgabeblack@google.com    { }
21914184Sgabeblack@google.com#endif
22014184Sgabeblack@google.com    FaultName name() {return _name;}
22114184Sgabeblack@google.com    FaultVect vect() {return _vect;}
22214184Sgabeblack@google.com    FaultStat & countStat() {return _count;}
22314184Sgabeblack@google.com};
22414184Sgabeblack@google.com
22514184Sgabeblack@google.comclass DtbAlignmentFault : public DtbFault
22614184Sgabeblack@google.com{
22714184Sgabeblack@google.com  private:
22814184Sgabeblack@google.com    static FaultName _name;
22914184Sgabeblack@google.com    static FaultVect _vect;
23014184Sgabeblack@google.com    static FaultStat _count;
23114184Sgabeblack@google.com  public:
23214184Sgabeblack@google.com#if FULL_SYSTEM
23314184Sgabeblack@google.com    DtbAlignmentFault(AlphaISA::VAddr vaddr, uint32_t reqFlags, uint64_t flags)
23414184Sgabeblack@google.com        : DtbFault(vaddr, reqFlags, flags)
23514184Sgabeblack@google.com    { }
23614184Sgabeblack@google.com#endif
23714184Sgabeblack@google.com    FaultName name() {return _name;}
23814184Sgabeblack@google.com    FaultVect vect() {return _vect;}
23914184Sgabeblack@google.com    FaultStat & countStat() {return _count;}
24014184Sgabeblack@google.com};
24114184Sgabeblack@google.com
24214184Sgabeblack@google.comclass ItbFault : public AlphaFault
24314184Sgabeblack@google.com{
24414184Sgabeblack@google.com  private:
24514184Sgabeblack@google.com    Addr pc;
24614184Sgabeblack@google.com  public:
24714184Sgabeblack@google.com    ItbFault(Addr _pc)
24814184Sgabeblack@google.com        : pc(_pc)
24914184Sgabeblack@google.com    { }
25014184Sgabeblack@google.com    FaultName name() = 0;
25114184Sgabeblack@google.com    FaultVect vect() = 0;
25214184Sgabeblack@google.com    FaultStat & countStat() = 0;
25314184Sgabeblack@google.com#if FULL_SYSTEM
25414184Sgabeblack@google.com    void invoke(ThreadContext * tc);
25514184Sgabeblack@google.com#endif
25614184Sgabeblack@google.com};
25714184Sgabeblack@google.com
25814184Sgabeblack@google.comclass ItbMissFault : public ItbFault
25914184Sgabeblack@google.com{
26014184Sgabeblack@google.com  private:
26114184Sgabeblack@google.com    static FaultName _name;
26214184Sgabeblack@google.com    static FaultVect _vect;
26314184Sgabeblack@google.com    static FaultStat _count;
26414184Sgabeblack@google.com  public:
26514184Sgabeblack@google.com    ItbMissFault(Addr pc)
26614184Sgabeblack@google.com        : ItbFault(pc)
26714184Sgabeblack@google.com    { }
26814184Sgabeblack@google.com    FaultName name() {return _name;}
26914184Sgabeblack@google.com    FaultVect vect() {return _vect;}
27014184Sgabeblack@google.com    FaultStat & countStat() {return _count;}
27114184Sgabeblack@google.com};
27214184Sgabeblack@google.com
27314184Sgabeblack@google.comclass ItbPageFault : public ItbFault
27414184Sgabeblack@google.com{
27514184Sgabeblack@google.com  private:
27614184Sgabeblack@google.com    static FaultName _name;
27714184Sgabeblack@google.com    static FaultVect _vect;
27814184Sgabeblack@google.com    static FaultStat _count;
27914184Sgabeblack@google.com  public:
28014184Sgabeblack@google.com    ItbPageFault(Addr pc)
28114184Sgabeblack@google.com        : ItbFault(pc)
28214184Sgabeblack@google.com    { }
28314184Sgabeblack@google.com    FaultName name() {return _name;}
28414184Sgabeblack@google.com    FaultVect vect() {return _vect;}
28514184Sgabeblack@google.com    FaultStat & countStat() {return _count;}
28614184Sgabeblack@google.com};
28714184Sgabeblack@google.com
28814184Sgabeblack@google.comclass ItbAcvFault : public ItbFault
28914184Sgabeblack@google.com{
29014184Sgabeblack@google.com  private:
29114184Sgabeblack@google.com    static FaultName _name;
29214184Sgabeblack@google.com    static FaultVect _vect;
29314184Sgabeblack@google.com    static FaultStat _count;
29414184Sgabeblack@google.com  public:
29514184Sgabeblack@google.com    ItbAcvFault(Addr pc)
29614184Sgabeblack@google.com        : ItbFault(pc)
29714184Sgabeblack@google.com    { }
29814184Sgabeblack@google.com    FaultName name() {return _name;}
29914184Sgabeblack@google.com    FaultVect vect() {return _vect;}
30014184Sgabeblack@google.com    FaultStat & countStat() {return _count;}
30114184Sgabeblack@google.com};
30214184Sgabeblack@google.com
30314184Sgabeblack@google.comclass UnimplementedOpcodeFault : public AlphaFault
30414184Sgabeblack@google.com{
30514184Sgabeblack@google.com  private:
30614184Sgabeblack@google.com    static FaultName _name;
30714184Sgabeblack@google.com    static FaultVect _vect;
30814184Sgabeblack@google.com    static FaultStat _count;
30914184Sgabeblack@google.com  public:
31014184Sgabeblack@google.com    FaultName name() {return _name;}
31114184Sgabeblack@google.com    FaultVect vect() {return _vect;}
31214184Sgabeblack@google.com    FaultStat & countStat() {return _count;}
31314184Sgabeblack@google.com};
31414184Sgabeblack@google.com
31514184Sgabeblack@google.comclass FloatEnableFault : public AlphaFault
31614184Sgabeblack@google.com{
31714184Sgabeblack@google.com  private:
31814184Sgabeblack@google.com    static FaultName _name;
31914184Sgabeblack@google.com    static FaultVect _vect;
32014184Sgabeblack@google.com    static FaultStat _count;
32114184Sgabeblack@google.com  public:
32214184Sgabeblack@google.com    FaultName name() {return _name;}
32314184Sgabeblack@google.com    FaultVect vect() {return _vect;}
32414184Sgabeblack@google.com    FaultStat & countStat() {return _count;}
32514184Sgabeblack@google.com};
32614184Sgabeblack@google.com
32714184Sgabeblack@google.comclass PalFault : public AlphaFault
32814184Sgabeblack@google.com{
32914184Sgabeblack@google.com  protected:
33014184Sgabeblack@google.com    bool skipFaultingInstruction() {return true;}
33114184Sgabeblack@google.com  private:
33214184Sgabeblack@google.com    static FaultName _name;
33314184Sgabeblack@google.com    static FaultVect _vect;
33414184Sgabeblack@google.com    static FaultStat _count;
33514184Sgabeblack@google.com  public:
33614184Sgabeblack@google.com    FaultName name() {return _name;}
33714184Sgabeblack@google.com    FaultVect vect() {return _vect;}
33814184Sgabeblack@google.com    FaultStat & countStat() {return _count;}
33914184Sgabeblack@google.com};
34014184Sgabeblack@google.com
34114184Sgabeblack@google.comclass IntegerOverflowFault : public AlphaFault
34214184Sgabeblack@google.com{
34314184Sgabeblack@google.com  private:
34414184Sgabeblack@google.com    static FaultName _name;
34514184Sgabeblack@google.com    static FaultVect _vect;
34614184Sgabeblack@google.com    static FaultStat _count;
34714184Sgabeblack@google.com  public:
34814184Sgabeblack@google.com    FaultName name() {return _name;}
34914184Sgabeblack@google.com    FaultVect vect() {return _vect;}
35014184Sgabeblack@google.com    FaultStat & countStat() {return _count;}
35114184Sgabeblack@google.com};
35214184Sgabeblack@google.com
35314184Sgabeblack@google.com} // AlphaISA namespace
35414184Sgabeblack@google.com
35514184Sgabeblack@google.com#endif // __FAULTS_HH__
35614184Sgabeblack@google.com