faults.hh revision 11294:a368064a2ab5
114039Sstacze01@arm.com/*
214039Sstacze01@arm.com * Copyright (c) 2003-2005 The Regents of The University of Michigan
314039Sstacze01@arm.com * All rights reserved.
414039Sstacze01@arm.com *
514039Sstacze01@arm.com * Redistribution and use in source and binary forms, with or without
614039Sstacze01@arm.com * modification, are permitted provided that the following conditions are
714039Sstacze01@arm.com * met: redistributions of source code must retain the above copyright
814039Sstacze01@arm.com * notice, this list of conditions and the following disclaimer;
914039Sstacze01@arm.com * redistributions in binary form must reproduce the above copyright
1014039Sstacze01@arm.com * notice, this list of conditions and the following disclaimer in the
1114039Sstacze01@arm.com * documentation and/or other materials provided with the distribution;
1214039Sstacze01@arm.com * neither the name of the copyright holders nor the names of its
1314039Sstacze01@arm.com * contributors may be used to endorse or promote products derived from
1414039Sstacze01@arm.com * this software without specific prior written permission.
1514039Sstacze01@arm.com *
1614039Sstacze01@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1714039Sstacze01@arm.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1814039Sstacze01@arm.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1914039Sstacze01@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2014039Sstacze01@arm.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2114039Sstacze01@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2214039Sstacze01@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2314039Sstacze01@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2414039Sstacze01@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2514039Sstacze01@arm.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2614039Sstacze01@arm.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2714039Sstacze01@arm.com *
2814039Sstacze01@arm.com * Authors: Gabe Black
2914039Sstacze01@arm.com *          Kevin Lim
3014039Sstacze01@arm.com */
3114039Sstacze01@arm.com
3214039Sstacze01@arm.com#ifndef __ARCH_ALPHA_FAULTS_HH__
3314039Sstacze01@arm.com#define __ARCH_ALPHA_FAULTS_HH__
3414039Sstacze01@arm.com
3514039Sstacze01@arm.com#include "arch/alpha/pagetable.hh"
3614039Sstacze01@arm.com#include "mem/request.hh"
3714039Sstacze01@arm.com#include "sim/faults.hh"
3814039Sstacze01@arm.com
3914039Sstacze01@arm.com// The design of the "name" and "vect" functions is in sim/faults.hh
4014039Sstacze01@arm.com
4114039Sstacze01@arm.comnamespace AlphaISA {
4214039Sstacze01@arm.com
4314039Sstacze01@arm.comtypedef Addr FaultVect;
4414039Sstacze01@arm.com
4514039Sstacze01@arm.comclass AlphaFault : public FaultBase
4614039Sstacze01@arm.com{
4714039Sstacze01@arm.com  protected:
4814039Sstacze01@arm.com    virtual bool skipFaultingInstruction() {return false;}
4914039Sstacze01@arm.com    virtual bool setRestartAddress() {return true;}
5014039Sstacze01@arm.com  public:
5114039Sstacze01@arm.com    virtual ~AlphaFault() {}
5214039Sstacze01@arm.com    void invoke(ThreadContext * tc, const StaticInstPtr &inst =
5314039Sstacze01@arm.com                StaticInst::nullStaticInstPtr);
5414039Sstacze01@arm.com    virtual FaultVect vect() = 0;
5514039Sstacze01@arm.com    virtual FaultStat & countStat() = 0;
5614039Sstacze01@arm.com};
5714039Sstacze01@arm.com
5814039Sstacze01@arm.comclass MachineCheckFault : public AlphaFault
5914039Sstacze01@arm.com{
6014039Sstacze01@arm.com  private:
6114039Sstacze01@arm.com    static FaultName _name;
6214039Sstacze01@arm.com    static FaultVect _vect;
6314039Sstacze01@arm.com    static FaultStat _count;
6414039Sstacze01@arm.com
6514039Sstacze01@arm.com  public:
6614039Sstacze01@arm.com    FaultName name() const {return _name;}
6714039Sstacze01@arm.com    FaultVect vect() {return _vect;}
6814039Sstacze01@arm.com    FaultStat & countStat() {return _count;}
6914039Sstacze01@arm.com};
7014039Sstacze01@arm.com
7114039Sstacze01@arm.comclass AlignmentFault : public AlphaFault
7214039Sstacze01@arm.com{
7314039Sstacze01@arm.com  private:
7414039Sstacze01@arm.com    static FaultName _name;
7514039Sstacze01@arm.com    static FaultVect _vect;
7614039Sstacze01@arm.com    static FaultStat _count;
7714039Sstacze01@arm.com
7814039Sstacze01@arm.com  public:
7914039Sstacze01@arm.com    FaultName name() const {return _name;}
8014039Sstacze01@arm.com    FaultVect vect() {return _vect;}
8114039Sstacze01@arm.com    FaultStat & countStat() {return _count;}
8214039Sstacze01@arm.com    bool isAlignmentFault() const {return true;}
8314039Sstacze01@arm.com};
8414039Sstacze01@arm.com
8514039Sstacze01@arm.comclass ResetFault : public AlphaFault
8614039Sstacze01@arm.com{
8714039Sstacze01@arm.com  private:
8814039Sstacze01@arm.com    static FaultName _name;
8914039Sstacze01@arm.com    static FaultVect _vect;
9014039Sstacze01@arm.com    static FaultStat _count;
9114039Sstacze01@arm.com
9214039Sstacze01@arm.com  public:
9314039Sstacze01@arm.com    FaultName name() const {return _name;}
9414039Sstacze01@arm.com    FaultVect vect() {return _vect;}
9514039Sstacze01@arm.com    FaultStat & countStat() {return _count;}
9614039Sstacze01@arm.com};
9714039Sstacze01@arm.com
9814039Sstacze01@arm.comclass ArithmeticFault : public AlphaFault
9914039Sstacze01@arm.com{
10014039Sstacze01@arm.com  private:
10114039Sstacze01@arm.com    static FaultName _name;
10214039Sstacze01@arm.com    static FaultVect _vect;
10314039Sstacze01@arm.com    static FaultStat _count;
10414039Sstacze01@arm.com
10514039Sstacze01@arm.com  protected:
10614039Sstacze01@arm.com    bool skipFaultingInstruction() {return true;}
10714039Sstacze01@arm.com
10814039Sstacze01@arm.com  public:
10914039Sstacze01@arm.com    FaultName name() const {return _name;}
11014039Sstacze01@arm.com    FaultVect vect() {return _vect;}
11114039Sstacze01@arm.com    FaultStat & countStat() {return _count;}
11214039Sstacze01@arm.com    void invoke(ThreadContext * tc, const StaticInstPtr &inst =
11314039Sstacze01@arm.com                StaticInst::nullStaticInstPtr);
11414039Sstacze01@arm.com};
11514039Sstacze01@arm.com
11614039Sstacze01@arm.comclass InterruptFault : public AlphaFault
11714039Sstacze01@arm.com{
11814039Sstacze01@arm.com  private:
11914039Sstacze01@arm.com    static FaultName _name;
12014039Sstacze01@arm.com    static FaultVect _vect;
12114039Sstacze01@arm.com    static FaultStat _count;
12214039Sstacze01@arm.com
12314039Sstacze01@arm.com  protected:
12414039Sstacze01@arm.com    bool setRestartAddress() {return false;}
12514039Sstacze01@arm.com
12614039Sstacze01@arm.com  public:
12714039Sstacze01@arm.com    FaultName name() const {return _name;}
12814039Sstacze01@arm.com    FaultVect vect() {return _vect;}
12914039Sstacze01@arm.com    FaultStat & countStat() {return _count;}
13014039Sstacze01@arm.com};
13114039Sstacze01@arm.com
13214039Sstacze01@arm.comclass DtbFault : public AlphaFault
13314039Sstacze01@arm.com{
13414039Sstacze01@arm.com  protected:
13514039Sstacze01@arm.com    VAddr vaddr;
13614039Sstacze01@arm.com    Request::Flags reqFlags;
13714039Sstacze01@arm.com    uint64_t flags;
13814039Sstacze01@arm.com
13914039Sstacze01@arm.com  public:
14014039Sstacze01@arm.com    DtbFault(VAddr _vaddr, Request::Flags _reqFlags, uint64_t _flags)
14114039Sstacze01@arm.com        : vaddr(_vaddr), reqFlags(_reqFlags), flags(_flags)
14214039Sstacze01@arm.com    { }
14314039Sstacze01@arm.com    FaultName name() const = 0;
14414039Sstacze01@arm.com    FaultVect vect() = 0;
14514039Sstacze01@arm.com    FaultStat & countStat() = 0;
14614039Sstacze01@arm.com    void invoke(ThreadContext * tc, const StaticInstPtr &inst =
14714039Sstacze01@arm.com                StaticInst::nullStaticInstPtr);
14814039Sstacze01@arm.com};
14914039Sstacze01@arm.com
15014039Sstacze01@arm.comclass NDtbMissFault : public DtbFault
15114039Sstacze01@arm.com{
15214039Sstacze01@arm.com  private:
15314039Sstacze01@arm.com    static FaultName _name;
15414039Sstacze01@arm.com    static FaultVect _vect;
15514039Sstacze01@arm.com    static FaultStat _count;
15614039Sstacze01@arm.com
15714039Sstacze01@arm.com  public:
15814039Sstacze01@arm.com    NDtbMissFault(VAddr vaddr, Request::Flags reqFlags, uint64_t flags)
15914039Sstacze01@arm.com        : DtbFault(vaddr, reqFlags, flags)
16014039Sstacze01@arm.com    { }
16114039Sstacze01@arm.com    FaultName name() const {return _name;}
16214039Sstacze01@arm.com    FaultVect vect() {return _vect;}
16314039Sstacze01@arm.com    FaultStat & countStat() {return _count;}
16414039Sstacze01@arm.com    void invoke(ThreadContext * tc, const StaticInstPtr &inst =
16514039Sstacze01@arm.com                StaticInst::nullStaticInstPtr);
16614039Sstacze01@arm.com};
16714039Sstacze01@arm.com
16814039Sstacze01@arm.comclass PDtbMissFault : public DtbFault
16914039Sstacze01@arm.com{
17014039Sstacze01@arm.com  private:
17114039Sstacze01@arm.com    static FaultName _name;
17214039Sstacze01@arm.com    static FaultVect _vect;
17314039Sstacze01@arm.com    static FaultStat _count;
17414039Sstacze01@arm.com
17514039Sstacze01@arm.com  public:
17614039Sstacze01@arm.com    PDtbMissFault(VAddr vaddr, Request::Flags reqFlags, uint64_t flags)
17714039Sstacze01@arm.com        : DtbFault(vaddr, reqFlags, flags)
17814039Sstacze01@arm.com    { }
17914039Sstacze01@arm.com    FaultName name() const {return _name;}
18014039Sstacze01@arm.com    FaultVect vect() {return _vect;}
18114039Sstacze01@arm.com    FaultStat & countStat() {return _count;}
18214039Sstacze01@arm.com};
18314039Sstacze01@arm.com
18414039Sstacze01@arm.comclass DtbPageFault : public DtbFault
18514039Sstacze01@arm.com{
18614039Sstacze01@arm.com  private:
18714039Sstacze01@arm.com    static FaultName _name;
18814039Sstacze01@arm.com    static FaultVect _vect;
18914039Sstacze01@arm.com    static FaultStat _count;
19014039Sstacze01@arm.com
19114039Sstacze01@arm.com  public:
19214039Sstacze01@arm.com    DtbPageFault(VAddr vaddr, Request::Flags reqFlags, uint64_t flags)
19314039Sstacze01@arm.com        : DtbFault(vaddr, reqFlags, flags)
19414039Sstacze01@arm.com    { }
19514039Sstacze01@arm.com    FaultName name() const {return _name;}
19614039Sstacze01@arm.com    FaultVect vect() {return _vect;}
19714039Sstacze01@arm.com    FaultStat & countStat() {return _count;}
19814039Sstacze01@arm.com};
19914039Sstacze01@arm.com
20014039Sstacze01@arm.comclass DtbAcvFault : public DtbFault
20114039Sstacze01@arm.com{
20214039Sstacze01@arm.com  private:
20314039Sstacze01@arm.com    static FaultName _name;
20414039Sstacze01@arm.com    static FaultVect _vect;
20514039Sstacze01@arm.com    static FaultStat _count;
20614039Sstacze01@arm.com
20714039Sstacze01@arm.com  public:
20814039Sstacze01@arm.com    DtbAcvFault(VAddr vaddr, Request::Flags reqFlags, uint64_t flags)
20914039Sstacze01@arm.com        : DtbFault(vaddr, reqFlags, flags)
21014039Sstacze01@arm.com    { }
21114039Sstacze01@arm.com    FaultName name() const {return _name;}
21214039Sstacze01@arm.com    FaultVect vect() {return _vect;}
21314039Sstacze01@arm.com    FaultStat & countStat() {return _count;}
21414039Sstacze01@arm.com};
21514039Sstacze01@arm.com
21614039Sstacze01@arm.comclass DtbAlignmentFault : public DtbFault
21714039Sstacze01@arm.com{
21814039Sstacze01@arm.com  private:
21914039Sstacze01@arm.com    static FaultName _name;
22014039Sstacze01@arm.com    static FaultVect _vect;
22114039Sstacze01@arm.com    static FaultStat _count;
22214039Sstacze01@arm.com
22314039Sstacze01@arm.com  public:
22414039Sstacze01@arm.com    DtbAlignmentFault(VAddr vaddr, Request::Flags reqFlags, uint64_t flags)
22514039Sstacze01@arm.com        : DtbFault(vaddr, reqFlags, flags)
22614039Sstacze01@arm.com    { }
22714039Sstacze01@arm.com    FaultName name() const {return _name;}
22814039Sstacze01@arm.com    FaultVect vect() {return _vect;}
22914039Sstacze01@arm.com    FaultStat & countStat() {return _count;}
23014039Sstacze01@arm.com};
23114039Sstacze01@arm.com
23214039Sstacze01@arm.comclass ItbFault : public AlphaFault
23314039Sstacze01@arm.com{
23414039Sstacze01@arm.com  protected:
23514039Sstacze01@arm.com    Addr pc;
23614039Sstacze01@arm.com
23714039Sstacze01@arm.com  public:
23814039Sstacze01@arm.com    ItbFault(Addr _pc) : pc(_pc) { }
23914039Sstacze01@arm.com    FaultName name() const = 0;
24014039Sstacze01@arm.com    FaultVect vect() = 0;
24114039Sstacze01@arm.com    FaultStat & countStat() = 0;
24214039Sstacze01@arm.com    void invoke(ThreadContext * tc, const StaticInstPtr &inst =
24314039Sstacze01@arm.com                StaticInst::nullStaticInstPtr);
24414039Sstacze01@arm.com};
24514039Sstacze01@arm.com
24614039Sstacze01@arm.comclass ItbPageFault : public ItbFault
24714039Sstacze01@arm.com{
24814039Sstacze01@arm.com  private:
24914039Sstacze01@arm.com    static FaultName _name;
25014039Sstacze01@arm.com    static FaultVect _vect;
25114039Sstacze01@arm.com    static FaultStat _count;
25214039Sstacze01@arm.com
25314039Sstacze01@arm.com  public:
25414039Sstacze01@arm.com    ItbPageFault(Addr pc) : ItbFault(pc) { }
25514039Sstacze01@arm.com    FaultName name() const {return _name;}
25614039Sstacze01@arm.com    FaultVect vect() {return _vect;}
25714039Sstacze01@arm.com    FaultStat & countStat() {return _count;}
25814039Sstacze01@arm.com    void invoke(ThreadContext * tc, const StaticInstPtr &inst =
25914039Sstacze01@arm.com                StaticInst::nullStaticInstPtr);
26014039Sstacze01@arm.com};
26114039Sstacze01@arm.com
26214039Sstacze01@arm.comclass ItbAcvFault : public ItbFault
26314039Sstacze01@arm.com{
26414039Sstacze01@arm.com  private:
26514039Sstacze01@arm.com    static FaultName _name;
26614039Sstacze01@arm.com    static FaultVect _vect;
26714039Sstacze01@arm.com    static FaultStat _count;
26814039Sstacze01@arm.com
26914039Sstacze01@arm.com  public:
27014039Sstacze01@arm.com    ItbAcvFault(Addr pc) : ItbFault(pc) { }
27114039Sstacze01@arm.com    FaultName name() const {return _name;}
27214039Sstacze01@arm.com    FaultVect vect() {return _vect;}
27314039Sstacze01@arm.com    FaultStat & countStat() {return _count;}
27414039Sstacze01@arm.com};
27514039Sstacze01@arm.com
27614039Sstacze01@arm.comclass UnimplementedOpcodeFault : public AlphaFault
27714039Sstacze01@arm.com{
27814039Sstacze01@arm.com  private:
27914039Sstacze01@arm.com    static FaultName _name;
28014039Sstacze01@arm.com    static FaultVect _vect;
28114039Sstacze01@arm.com    static FaultStat _count;
28214039Sstacze01@arm.com
28314039Sstacze01@arm.com  public:
28414039Sstacze01@arm.com    FaultName name() const {return _name;}
28514039Sstacze01@arm.com    FaultVect vect() {return _vect;}
28614039Sstacze01@arm.com    FaultStat & countStat() {return _count;}
28714039Sstacze01@arm.com};
28814039Sstacze01@arm.com
28914039Sstacze01@arm.comclass FloatEnableFault : public AlphaFault
29014039Sstacze01@arm.com{
29114039Sstacze01@arm.com  private:
29214039Sstacze01@arm.com    static FaultName _name;
29314039Sstacze01@arm.com    static FaultVect _vect;
29414039Sstacze01@arm.com    static FaultStat _count;
29514039Sstacze01@arm.com
29614039Sstacze01@arm.com  public:
29714039Sstacze01@arm.com    FaultName name() const {return _name;}
29814039Sstacze01@arm.com    FaultVect vect() {return _vect;}
29914039Sstacze01@arm.com    FaultStat & countStat() {return _count;}
30014039Sstacze01@arm.com};
30114039Sstacze01@arm.com
30214039Sstacze01@arm.comclass PalFault : public AlphaFault
30314039Sstacze01@arm.com{
30414039Sstacze01@arm.com  private:
30514039Sstacze01@arm.com    static FaultName _name;
30614039Sstacze01@arm.com    static FaultVect _vect;
30714039Sstacze01@arm.com    static FaultStat _count;
30814039Sstacze01@arm.com
30914039Sstacze01@arm.com  protected:
31014039Sstacze01@arm.com    bool skipFaultingInstruction() {return true;}
31114039Sstacze01@arm.com
31214039Sstacze01@arm.com  public:
31314039Sstacze01@arm.com    FaultName name() const {return _name;}
31414039Sstacze01@arm.com    FaultVect vect() {return _vect;}
31514039Sstacze01@arm.com    FaultStat & countStat() {return _count;}
31614039Sstacze01@arm.com};
317
318class IntegerOverflowFault : public AlphaFault
319{
320  private:
321    static FaultName _name;
322    static FaultVect _vect;
323    static FaultStat _count;
324
325  public:
326    FaultName name() const {return _name;}
327    FaultVect vect() {return _vect;}
328    FaultStat & countStat() {return _count;}
329};
330
331} // namespace AlphaISA
332
333#endif // __ARCH_ALPHA_FAULTS_HH__
334