faults.hh revision 3614
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
882800Ssaidi@eecs.umich.edu#if !FULL_SYSTEM
892800Ssaidi@eecs.umich.educlass PageTableFault : public AlphaFault
902800Ssaidi@eecs.umich.edu{
912800Ssaidi@eecs.umich.edu  private:
922800Ssaidi@eecs.umich.edu    Addr vaddr;
932800Ssaidi@eecs.umich.edu    static FaultName _name;
942800Ssaidi@eecs.umich.edu    static FaultVect _vect;
952800Ssaidi@eecs.umich.edu    static FaultStat _count;
962800Ssaidi@eecs.umich.edu  public:
972800Ssaidi@eecs.umich.edu    PageTableFault(Addr va)
982800Ssaidi@eecs.umich.edu        : vaddr(va) {}
992800Ssaidi@eecs.umich.edu    FaultName name() {return _name;}
1002800Ssaidi@eecs.umich.edu    FaultVect vect() {return _vect;}
1012800Ssaidi@eecs.umich.edu    FaultStat & countStat() {return _count;}
1022800Ssaidi@eecs.umich.edu    void invoke(ThreadContext * tc);
1032800Ssaidi@eecs.umich.edu};
1042800Ssaidi@eecs.umich.edu
1052800Ssaidi@eecs.umich.edustatic inline Fault genPageTableFault(Addr va)
1062800Ssaidi@eecs.umich.edu{
1072800Ssaidi@eecs.umich.edu    return new PageTableFault(va);
1082800Ssaidi@eecs.umich.edu}
1092800Ssaidi@eecs.umich.edu#endif
1102800Ssaidi@eecs.umich.edu
1112166SN/Astatic inline Fault genMachineCheckFault()
1122166SN/A{
1132203SN/A    return new MachineCheckFault;
1142166SN/A}
1152166SN/A
1162166SN/Astatic inline Fault genAlignmentFault()
1172166SN/A{
1182203SN/A    return new AlignmentFault;
1192166SN/A}
1202166SN/A
1212147SN/Aclass ResetFault : public AlphaFault
1222090SN/A{
1232147SN/A  private:
1242147SN/A    static FaultName _name;
1252147SN/A    static FaultVect _vect;
1262222SN/A    static FaultStat _count;
1272112SN/A  public:
1282147SN/A    FaultName name() {return _name;}
1292147SN/A    FaultVect vect() {return _vect;}
1302222SN/A    FaultStat & countStat() {return _count;}
1312147SN/A};
1322090SN/A
1332147SN/Aclass ArithmeticFault : public AlphaFault
1342090SN/A{
1352201SN/A  protected:
1362201SN/A    bool skipFaultingInstruction() {return true;}
1372147SN/A  private:
1382147SN/A    static FaultName _name;
1392147SN/A    static FaultVect _vect;
1402222SN/A    static FaultStat _count;
1412112SN/A  public:
1422147SN/A    FaultName name() {return _name;}
1432147SN/A    FaultVect vect() {return _vect;}
1442222SN/A    FaultStat & countStat() {return _count;}
1452203SN/A#if FULL_SYSTEM
1462680Sktlim@umich.edu    void invoke(ThreadContext * tc);
1472203SN/A#endif
1482147SN/A};
1492090SN/A
1502147SN/Aclass InterruptFault : public AlphaFault
1512090SN/A{
1522201SN/A  protected:
1532201SN/A    bool setRestartAddress() {return false;}
1542147SN/A  private:
1552147SN/A    static FaultName _name;
1562147SN/A    static FaultVect _vect;
1572222SN/A    static FaultStat _count;
1582112SN/A  public:
1592147SN/A    FaultName name() {return _name;}
1602147SN/A    FaultVect vect() {return _vect;}
1612222SN/A    FaultStat & countStat() {return _count;}
1622147SN/A};
1632090SN/A
1642502SN/Aclass DtbFault : public AlphaFault
1652502SN/A{
1662502SN/A#if FULL_SYSTEM
1672502SN/A  private:
1682502SN/A    AlphaISA::VAddr vaddr;
1692502SN/A    uint32_t reqFlags;
1702502SN/A    uint64_t flags;
1712502SN/A  public:
1722502SN/A    DtbFault(AlphaISA::VAddr _vaddr, uint32_t _reqFlags, uint64_t _flags)
1732502SN/A        : vaddr(_vaddr), reqFlags(_reqFlags), flags(_flags)
1742502SN/A    { }
1752502SN/A#endif
1762502SN/A    FaultName name() = 0;
1772502SN/A    FaultVect vect() = 0;
1782502SN/A    FaultStat & countStat() = 0;
1792502SN/A#if FULL_SYSTEM
1802680Sktlim@umich.edu    void invoke(ThreadContext * tc);
1812502SN/A#endif
1822502SN/A};
1832502SN/A
1842502SN/Aclass NDtbMissFault : public DtbFault
1852090SN/A{
1862147SN/A  private:
1872147SN/A    static FaultName _name;
1882147SN/A    static FaultVect _vect;
1892222SN/A    static FaultStat _count;
1902112SN/A  public:
1912502SN/A#if FULL_SYSTEM
1922502SN/A    NDtbMissFault(AlphaISA::VAddr vaddr, uint32_t reqFlags, uint64_t flags)
1932502SN/A        : DtbFault(vaddr, reqFlags, flags)
1942502SN/A    { }
1952502SN/A#endif
1962147SN/A    FaultName name() {return _name;}
1972147SN/A    FaultVect vect() {return _vect;}
1982222SN/A    FaultStat & countStat() {return _count;}
1992147SN/A};
2002090SN/A
2012502SN/Aclass PDtbMissFault : public DtbFault
2022090SN/A{
2032147SN/A  private:
2042147SN/A    static FaultName _name;
2052147SN/A    static FaultVect _vect;
2062222SN/A    static FaultStat _count;
2072112SN/A  public:
2082502SN/A#if FULL_SYSTEM
2092502SN/A    PDtbMissFault(AlphaISA::VAddr vaddr, uint32_t reqFlags, uint64_t flags)
2102502SN/A        : DtbFault(vaddr, reqFlags, flags)
2112502SN/A    { }
2122502SN/A#endif
2132147SN/A    FaultName name() {return _name;}
2142147SN/A    FaultVect vect() {return _vect;}
2152222SN/A    FaultStat & countStat() {return _count;}
2162147SN/A};
2172090SN/A
2182502SN/Aclass DtbPageFault : public DtbFault
2192090SN/A{
2202147SN/A  private:
2212147SN/A    static FaultName _name;
2222147SN/A    static FaultVect _vect;
2232222SN/A    static FaultStat _count;
2242112SN/A  public:
2252502SN/A#if FULL_SYSTEM
2262502SN/A    DtbPageFault(AlphaISA::VAddr vaddr, uint32_t reqFlags, uint64_t flags)
2272502SN/A        : DtbFault(vaddr, reqFlags, flags)
2282502SN/A    { }
2292502SN/A#endif
2302147SN/A    FaultName name() {return _name;}
2312147SN/A    FaultVect vect() {return _vect;}
2322222SN/A    FaultStat & countStat() {return _count;}
2332147SN/A};
2342090SN/A
2352502SN/Aclass DtbAcvFault : public DtbFault
2362090SN/A{
2372147SN/A  private:
2382147SN/A    static FaultName _name;
2392147SN/A    static FaultVect _vect;
2402222SN/A    static FaultStat _count;
2412112SN/A  public:
2422502SN/A#if FULL_SYSTEM
2432502SN/A    DtbAcvFault(AlphaISA::VAddr vaddr, uint32_t reqFlags, uint64_t flags)
2442502SN/A        : DtbFault(vaddr, reqFlags, flags)
2452502SN/A    { }
2462502SN/A#endif
2472147SN/A    FaultName name() {return _name;}
2482147SN/A    FaultVect vect() {return _vect;}
2492222SN/A    FaultStat & countStat() {return _count;}
2502147SN/A};
2512090SN/A
2522502SN/Aclass DtbAlignmentFault : public DtbFault
2532090SN/A{
2542147SN/A  private:
2552147SN/A    static FaultName _name;
2562147SN/A    static FaultVect _vect;
2572222SN/A    static FaultStat _count;
2582112SN/A  public:
2592502SN/A#if FULL_SYSTEM
2602502SN/A    DtbAlignmentFault(AlphaISA::VAddr vaddr, uint32_t reqFlags, uint64_t flags)
2612502SN/A        : DtbFault(vaddr, reqFlags, flags)
2622502SN/A    { }
2632502SN/A#endif
2642147SN/A    FaultName name() {return _name;}
2652147SN/A    FaultVect vect() {return _vect;}
2662222SN/A    FaultStat & countStat() {return _count;}
2672147SN/A};
2682090SN/A
2692502SN/Aclass ItbFault : public AlphaFault
2702502SN/A{
2712502SN/A  private:
2722502SN/A    Addr pc;
2732502SN/A  public:
2742502SN/A    ItbFault(Addr _pc)
2752502SN/A        : pc(_pc)
2762502SN/A    { }
2772505SN/A    FaultName name() = 0;
2782505SN/A    FaultVect vect() = 0;
2792505SN/A    FaultStat & countStat() = 0;
2802502SN/A#if FULL_SYSTEM
2812680Sktlim@umich.edu    void invoke(ThreadContext * tc);
2822502SN/A#endif
2832502SN/A};
2842502SN/A
2852502SN/Aclass ItbMissFault : public ItbFault
2862090SN/A{
2872147SN/A  private:
2882147SN/A    static FaultName _name;
2892147SN/A    static FaultVect _vect;
2902222SN/A    static FaultStat _count;
2912112SN/A  public:
2922502SN/A    ItbMissFault(Addr pc)
2932502SN/A        : ItbFault(pc)
2942502SN/A    { }
2952147SN/A    FaultName name() {return _name;}
2962147SN/A    FaultVect vect() {return _vect;}
2972222SN/A    FaultStat & countStat() {return _count;}
2982147SN/A};
2992090SN/A
3002502SN/Aclass ItbPageFault : public ItbFault
3012090SN/A{
3022147SN/A  private:
3032147SN/A    static FaultName _name;
3042147SN/A    static FaultVect _vect;
3052222SN/A    static FaultStat _count;
3062112SN/A  public:
3072502SN/A    ItbPageFault(Addr pc)
3082502SN/A        : ItbFault(pc)
3092502SN/A    { }
3102502SN/A    FaultName name() {return _name;}
3112502SN/A    FaultVect vect() {return _vect;}
3122502SN/A    FaultStat & countStat() {return _count;}
3132502SN/A};
3142502SN/A
3152502SN/Aclass ItbAcvFault : public ItbFault
3162502SN/A{
3172502SN/A  private:
3182502SN/A    static FaultName _name;
3192502SN/A    static FaultVect _vect;
3202502SN/A    static FaultStat _count;
3212502SN/A  public:
3222502SN/A    ItbAcvFault(Addr pc)
3232502SN/A        : ItbFault(pc)
3242502SN/A    { }
3252147SN/A    FaultName name() {return _name;}
3262147SN/A    FaultVect vect() {return _vect;}
3272222SN/A    FaultStat & countStat() {return _count;}
3282147SN/A};
3292090SN/A
3302147SN/Aclass UnimplementedOpcodeFault : public AlphaFault
3312090SN/A{
3322147SN/A  private:
3332147SN/A    static FaultName _name;
3342147SN/A    static FaultVect _vect;
3352222SN/A    static FaultStat _count;
3362112SN/A  public:
3372147SN/A    FaultName name() {return _name;}
3382147SN/A    FaultVect vect() {return _vect;}
3392222SN/A    FaultStat & countStat() {return _count;}
3402147SN/A};
3412090SN/A
3422147SN/Aclass FloatEnableFault : public AlphaFault
3432090SN/A{
3442147SN/A  private:
3452147SN/A    static FaultName _name;
3462147SN/A    static FaultVect _vect;
3472222SN/A    static FaultStat _count;
3482112SN/A  public:
3492147SN/A    FaultName name() {return _name;}
3502147SN/A    FaultVect vect() {return _vect;}
3512222SN/A    FaultStat & countStat() {return _count;}
3522147SN/A};
3532090SN/A
3542147SN/Aclass PalFault : public AlphaFault
3552090SN/A{
3562201SN/A  protected:
3572201SN/A    bool skipFaultingInstruction() {return true;}
3582147SN/A  private:
3592147SN/A    static FaultName _name;
3602147SN/A    static FaultVect _vect;
3612222SN/A    static FaultStat _count;
3622112SN/A  public:
3632147SN/A    FaultName name() {return _name;}
3642147SN/A    FaultVect vect() {return _vect;}
3652222SN/A    FaultStat & countStat() {return _count;}
3662147SN/A};
3672090SN/A
3682147SN/Aclass IntegerOverflowFault : public AlphaFault
3692090SN/A{
3702147SN/A  private:
3712147SN/A    static FaultName _name;
3722147SN/A    static FaultVect _vect;
3732222SN/A    static FaultStat _count;
3742112SN/A  public:
3752147SN/A    FaultName name() {return _name;}
3762147SN/A    FaultVect vect() {return _vect;}
3772222SN/A    FaultStat & countStat() {return _count;}
3782147SN/A};
3792090SN/A
3802167SN/A} // AlphaISA namespace
3812167SN/A
3822SN/A#endif // __FAULTS_HH__
383