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
325569Snate@binkert.org#ifndef __ARCH_ALPHA_FAULTS_HH__
335569Snate@binkert.org#define __ARCH_ALPHA_FAULTS_HH__
342SN/A
355569Snate@binkert.org#include "arch/alpha/pagetable.hh"
367678Sgblack@eecs.umich.edu#include "mem/request.hh"
373614Sgblack@eecs.umich.edu#include "sim/faults.hh"
383614Sgblack@eecs.umich.edu
392166SN/A// The design of the "name" and "vect" functions is in sim/faults.hh
402147SN/A
415569Snate@binkert.orgnamespace AlphaISA {
422167SN/A
4311294Sandreas.hansson@arm.comtypedef Addr FaultVect;
442090SN/A
452222SN/Aclass AlphaFault : public FaultBase
462090SN/A{
472201SN/A  protected:
482201SN/A    virtual bool skipFaultingInstruction() {return false;}
492201SN/A    virtual bool setRestartAddress() {return true;}
502112SN/A  public:
5110474Sandreas.hansson@arm.com    virtual ~AlphaFault() {}
5210417Sandreas.hansson@arm.com    void invoke(ThreadContext * tc, const StaticInstPtr &inst =
5310417Sandreas.hansson@arm.com                StaticInst::nullStaticInstPtr);
542175SN/A    virtual FaultVect vect() = 0;
552222SN/A    virtual FaultStat & countStat() = 0;
562SN/A};
572SN/A
582203SN/Aclass MachineCheckFault : public AlphaFault
592166SN/A{
602166SN/A  private:
612203SN/A    static FaultName _name;
622166SN/A    static FaultVect _vect;
632222SN/A    static FaultStat _count;
645569Snate@binkert.org
652166SN/A  public:
664695Sgblack@eecs.umich.edu    FaultName name() const {return _name;}
672166SN/A    FaultVect vect() {return _vect;}
682222SN/A    FaultStat & countStat() {return _count;}
692166SN/A};
702166SN/A
712203SN/Aclass AlignmentFault : public AlphaFault
722166SN/A{
732166SN/A  private:
742203SN/A    static FaultName _name;
752166SN/A    static FaultVect _vect;
762222SN/A    static FaultStat _count;
775569Snate@binkert.org
782166SN/A  public:
794695Sgblack@eecs.umich.edu    FaultName name() const {return _name;}
802166SN/A    FaultVect vect() {return _vect;}
812222SN/A    FaultStat & countStat() {return _count;}
824695Sgblack@eecs.umich.edu    bool isAlignmentFault() const {return true;}
832166SN/A};
842166SN/A
852147SN/Aclass ResetFault : public AlphaFault
862090SN/A{
872147SN/A  private:
882147SN/A    static FaultName _name;
892147SN/A    static FaultVect _vect;
902222SN/A    static FaultStat _count;
915569Snate@binkert.org
922112SN/A  public:
934695Sgblack@eecs.umich.edu    FaultName name() const {return _name;}
942147SN/A    FaultVect vect() {return _vect;}
952222SN/A    FaultStat & countStat() {return _count;}
962147SN/A};
972090SN/A
982147SN/Aclass ArithmeticFault : public AlphaFault
992090SN/A{
1002147SN/A  private:
1012147SN/A    static FaultName _name;
1022147SN/A    static FaultVect _vect;
1032222SN/A    static FaultStat _count;
1045569Snate@binkert.org
1055569Snate@binkert.org  protected:
1065569Snate@binkert.org    bool skipFaultingInstruction() {return true;}
1075569Snate@binkert.org
1082112SN/A  public:
1094695Sgblack@eecs.umich.edu    FaultName name() const {return _name;}
1102147SN/A    FaultVect vect() {return _vect;}
1112222SN/A    FaultStat & countStat() {return _count;}
11210417Sandreas.hansson@arm.com    void invoke(ThreadContext * tc, const StaticInstPtr &inst =
11310417Sandreas.hansson@arm.com                StaticInst::nullStaticInstPtr);
1142147SN/A};
1152090SN/A
1162147SN/Aclass InterruptFault : public AlphaFault
1172090SN/A{
1182147SN/A  private:
1192147SN/A    static FaultName _name;
1202147SN/A    static FaultVect _vect;
1212222SN/A    static FaultStat _count;
1225569Snate@binkert.org
1235569Snate@binkert.org  protected:
1245569Snate@binkert.org    bool setRestartAddress() {return false;}
1255569Snate@binkert.org
1262112SN/A  public:
1274695Sgblack@eecs.umich.edu    FaultName name() const {return _name;}
1282147SN/A    FaultVect vect() {return _vect;}
1292222SN/A    FaultStat & countStat() {return _count;}
1302147SN/A};
1312090SN/A
1322502SN/Aclass DtbFault : public AlphaFault
1332502SN/A{
1344997Sgblack@eecs.umich.edu  protected:
1355568Snate@binkert.org    VAddr vaddr;
1365736Snate@binkert.org    Request::Flags reqFlags;
1372502SN/A    uint64_t flags;
1385569Snate@binkert.org
1392502SN/A  public:
1405736Snate@binkert.org    DtbFault(VAddr _vaddr, Request::Flags _reqFlags, uint64_t _flags)
1412502SN/A        : vaddr(_vaddr), reqFlags(_reqFlags), flags(_flags)
1422502SN/A    { }
1434695Sgblack@eecs.umich.edu    FaultName name() const = 0;
1442502SN/A    FaultVect vect() = 0;
1452502SN/A    FaultStat & countStat() = 0;
14610417Sandreas.hansson@arm.com    void invoke(ThreadContext * tc, const StaticInstPtr &inst =
14710417Sandreas.hansson@arm.com                StaticInst::nullStaticInstPtr);
1482502SN/A};
1492502SN/A
1502502SN/Aclass NDtbMissFault : public DtbFault
1512090SN/A{
1522147SN/A  private:
1532147SN/A    static FaultName _name;
1542147SN/A    static FaultVect _vect;
1552222SN/A    static FaultStat _count;
1565569Snate@binkert.org
1572112SN/A  public:
1585736Snate@binkert.org    NDtbMissFault(VAddr vaddr, Request::Flags reqFlags, uint64_t flags)
1592502SN/A        : DtbFault(vaddr, reqFlags, flags)
1602502SN/A    { }
1614695Sgblack@eecs.umich.edu    FaultName name() const {return _name;}
1622147SN/A    FaultVect vect() {return _vect;}
1632222SN/A    FaultStat & countStat() {return _count;}
16410417Sandreas.hansson@arm.com    void invoke(ThreadContext * tc, const StaticInstPtr &inst =
16510417Sandreas.hansson@arm.com                StaticInst::nullStaticInstPtr);
1662147SN/A};
1672090SN/A
1682502SN/Aclass PDtbMissFault : public DtbFault
1692090SN/A{
1702147SN/A  private:
1712147SN/A    static FaultName _name;
1722147SN/A    static FaultVect _vect;
1732222SN/A    static FaultStat _count;
1745569Snate@binkert.org
1752112SN/A  public:
1765736Snate@binkert.org    PDtbMissFault(VAddr vaddr, Request::Flags reqFlags, uint64_t flags)
1772502SN/A        : DtbFault(vaddr, reqFlags, flags)
1782502SN/A    { }
1794695Sgblack@eecs.umich.edu    FaultName name() const {return _name;}
1802147SN/A    FaultVect vect() {return _vect;}
1812222SN/A    FaultStat & countStat() {return _count;}
1822147SN/A};
1832090SN/A
1842502SN/Aclass DtbPageFault : public DtbFault
1852090SN/A{
1862147SN/A  private:
1872147SN/A    static FaultName _name;
1882147SN/A    static FaultVect _vect;
1892222SN/A    static FaultStat _count;
1905569Snate@binkert.org
1912112SN/A  public:
1925736Snate@binkert.org    DtbPageFault(VAddr vaddr, Request::Flags reqFlags, uint64_t flags)
1932502SN/A        : DtbFault(vaddr, reqFlags, flags)
1942502SN/A    { }
1954695Sgblack@eecs.umich.edu    FaultName name() const {return _name;}
1962147SN/A    FaultVect vect() {return _vect;}
1972222SN/A    FaultStat & countStat() {return _count;}
1982147SN/A};
1992090SN/A
2002502SN/Aclass DtbAcvFault : public DtbFault
2012090SN/A{
2022147SN/A  private:
2032147SN/A    static FaultName _name;
2042147SN/A    static FaultVect _vect;
2052222SN/A    static FaultStat _count;
2065569Snate@binkert.org
2072112SN/A  public:
2085736Snate@binkert.org    DtbAcvFault(VAddr vaddr, Request::Flags reqFlags, uint64_t flags)
2092502SN/A        : DtbFault(vaddr, reqFlags, flags)
2102502SN/A    { }
2114695Sgblack@eecs.umich.edu    FaultName name() const {return _name;}
2122147SN/A    FaultVect vect() {return _vect;}
2132222SN/A    FaultStat & countStat() {return _count;}
2142147SN/A};
2152090SN/A
2162502SN/Aclass DtbAlignmentFault : public DtbFault
2172090SN/A{
2182147SN/A  private:
2192147SN/A    static FaultName _name;
2202147SN/A    static FaultVect _vect;
2212222SN/A    static FaultStat _count;
2225569Snate@binkert.org
2232112SN/A  public:
2245736Snate@binkert.org    DtbAlignmentFault(VAddr vaddr, Request::Flags reqFlags, uint64_t flags)
2252502SN/A        : DtbFault(vaddr, reqFlags, flags)
2262502SN/A    { }
2274695Sgblack@eecs.umich.edu    FaultName name() const {return _name;}
2282147SN/A    FaultVect vect() {return _vect;}
2292222SN/A    FaultStat & countStat() {return _count;}
2302147SN/A};
2312090SN/A
2322502SN/Aclass ItbFault : public AlphaFault
2332502SN/A{
2344997Sgblack@eecs.umich.edu  protected:
2352502SN/A    Addr pc;
2365569Snate@binkert.org
2372502SN/A  public:
2385569Snate@binkert.org    ItbFault(Addr _pc) : pc(_pc) { }
2394695Sgblack@eecs.umich.edu    FaultName name() const = 0;
2402505SN/A    FaultVect vect() = 0;
2412505SN/A    FaultStat & countStat() = 0;
24210417Sandreas.hansson@arm.com    void invoke(ThreadContext * tc, const StaticInstPtr &inst =
24310417Sandreas.hansson@arm.com                StaticInst::nullStaticInstPtr);
2442502SN/A};
2452502SN/A
2462502SN/Aclass ItbPageFault : public ItbFault
2472090SN/A{
2482147SN/A  private:
2492147SN/A    static FaultName _name;
2502147SN/A    static FaultVect _vect;
2512222SN/A    static FaultStat _count;
2525569Snate@binkert.org
2532112SN/A  public:
2545569Snate@binkert.org    ItbPageFault(Addr pc) : ItbFault(pc) { }
2554695Sgblack@eecs.umich.edu    FaultName name() const {return _name;}
2562502SN/A    FaultVect vect() {return _vect;}
2572502SN/A    FaultStat & countStat() {return _count;}
25810417Sandreas.hansson@arm.com    void invoke(ThreadContext * tc, const StaticInstPtr &inst =
25910417Sandreas.hansson@arm.com                StaticInst::nullStaticInstPtr);
2602502SN/A};
2612502SN/A
2622502SN/Aclass ItbAcvFault : public ItbFault
2632502SN/A{
2642502SN/A  private:
2652502SN/A    static FaultName _name;
2662502SN/A    static FaultVect _vect;
2672502SN/A    static FaultStat _count;
2685569Snate@binkert.org
2692502SN/A  public:
2705569Snate@binkert.org    ItbAcvFault(Addr pc) : ItbFault(pc) { }
2714695Sgblack@eecs.umich.edu    FaultName name() const {return _name;}
2722147SN/A    FaultVect vect() {return _vect;}
2732222SN/A    FaultStat & countStat() {return _count;}
2742147SN/A};
2752090SN/A
2762147SN/Aclass UnimplementedOpcodeFault : public AlphaFault
2772090SN/A{
2782147SN/A  private:
2792147SN/A    static FaultName _name;
2802147SN/A    static FaultVect _vect;
2812222SN/A    static FaultStat _count;
2825569Snate@binkert.org
2832112SN/A  public:
2844695Sgblack@eecs.umich.edu    FaultName name() const {return _name;}
2852147SN/A    FaultVect vect() {return _vect;}
2862222SN/A    FaultStat & countStat() {return _count;}
2872147SN/A};
2882090SN/A
2892147SN/Aclass FloatEnableFault : public AlphaFault
2902090SN/A{
2912147SN/A  private:
2922147SN/A    static FaultName _name;
2932147SN/A    static FaultVect _vect;
2942222SN/A    static FaultStat _count;
2955569Snate@binkert.org
2962112SN/A  public:
2974695Sgblack@eecs.umich.edu    FaultName name() const {return _name;}
2982147SN/A    FaultVect vect() {return _vect;}
2992222SN/A    FaultStat & countStat() {return _count;}
3002147SN/A};
3012090SN/A
30212110SRekai.GonzalezAlberquilla@arm.comclass VectorEnableFault : public AlphaFault
30312110SRekai.GonzalezAlberquilla@arm.com{
30412110SRekai.GonzalezAlberquilla@arm.com  private:
30512110SRekai.GonzalezAlberquilla@arm.com    static FaultName _name;
30612110SRekai.GonzalezAlberquilla@arm.com    static FaultVect _vect;
30712110SRekai.GonzalezAlberquilla@arm.com    static FaultStat _count;
30812110SRekai.GonzalezAlberquilla@arm.com
30912110SRekai.GonzalezAlberquilla@arm.com  public:
31012110SRekai.GonzalezAlberquilla@arm.com    FaultName name() const {return _name;}
31112110SRekai.GonzalezAlberquilla@arm.com    FaultVect vect() {return _vect;}
31212110SRekai.GonzalezAlberquilla@arm.com    FaultStat & countStat() {return _count;}
31312110SRekai.GonzalezAlberquilla@arm.com};
31412110SRekai.GonzalezAlberquilla@arm.com
3152147SN/Aclass PalFault : public AlphaFault
3162090SN/A{
3172147SN/A  private:
3182147SN/A    static FaultName _name;
3192147SN/A    static FaultVect _vect;
3202222SN/A    static FaultStat _count;
3215569Snate@binkert.org
3225569Snate@binkert.org  protected:
3235569Snate@binkert.org    bool skipFaultingInstruction() {return true;}
3245569Snate@binkert.org
3252112SN/A  public:
3264695Sgblack@eecs.umich.edu    FaultName name() const {return _name;}
3272147SN/A    FaultVect vect() {return _vect;}
3282222SN/A    FaultStat & countStat() {return _count;}
3292147SN/A};
3302090SN/A
3312147SN/Aclass IntegerOverflowFault : public AlphaFault
3322090SN/A{
3332147SN/A  private:
3342147SN/A    static FaultName _name;
3352147SN/A    static FaultVect _vect;
3362222SN/A    static FaultStat _count;
3375569Snate@binkert.org
3382112SN/A  public:
3394695Sgblack@eecs.umich.edu    FaultName name() const {return _name;}
3402147SN/A    FaultVect vect() {return _vect;}
3412222SN/A    FaultStat & countStat() {return _count;}
3422147SN/A};
3432090SN/A
3445569Snate@binkert.org} // namespace AlphaISA
3452167SN/A
3465569Snate@binkert.org#endif // __ARCH_ALPHA_FAULTS_HH__
347