faults.hh revision 2800
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 352502SN/A#include "arch/alpha/isa_traits.hh" 362090SN/A#include "sim/faults.hh" 372147SN/A 382166SN/A// The design of the "name" and "vect" functions is in sim/faults.hh 392147SN/A 402167SN/Anamespace AlphaISA 412167SN/A{ 422167SN/A 432147SN/Atypedef const 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: 512174SN/A#if FULL_SYSTEM 522680Sktlim@umich.edu void invoke(ThreadContext * tc); 532174SN/A#endif 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; 642166SN/A public: 652203SN/A FaultName name() {return _name;} 662166SN/A FaultVect vect() {return _vect;} 672222SN/A FaultStat & countStat() {return _count;} 682203SN/A bool isMachineCheckFault() {return true;} 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; 772166SN/A public: 782203SN/A FaultName name() {return _name;} 792166SN/A FaultVect vect() {return _vect;} 802222SN/A FaultStat & countStat() {return _count;} 812203SN/A bool isAlignmentFault() {return true;} 822166SN/A}; 832166SN/A 842800Ssaidi@eecs.umich.edu#if !FULL_SYSTEM 852800Ssaidi@eecs.umich.educlass PageTableFault : public AlphaFault 862800Ssaidi@eecs.umich.edu{ 872800Ssaidi@eecs.umich.edu private: 882800Ssaidi@eecs.umich.edu Addr vaddr; 892800Ssaidi@eecs.umich.edu static FaultName _name; 902800Ssaidi@eecs.umich.edu static FaultVect _vect; 912800Ssaidi@eecs.umich.edu static FaultStat _count; 922800Ssaidi@eecs.umich.edu public: 932800Ssaidi@eecs.umich.edu PageTableFault(Addr va) 942800Ssaidi@eecs.umich.edu : vaddr(va) {} 952800Ssaidi@eecs.umich.edu FaultName name() {return _name;} 962800Ssaidi@eecs.umich.edu FaultVect vect() {return _vect;} 972800Ssaidi@eecs.umich.edu FaultStat & countStat() {return _count;} 982800Ssaidi@eecs.umich.edu void invoke(ThreadContext * tc); 992800Ssaidi@eecs.umich.edu}; 1002800Ssaidi@eecs.umich.edu 1012800Ssaidi@eecs.umich.edustatic inline Fault genPageTableFault(Addr va) 1022800Ssaidi@eecs.umich.edu{ 1032800Ssaidi@eecs.umich.edu return new PageTableFault(va); 1042800Ssaidi@eecs.umich.edu} 1052800Ssaidi@eecs.umich.edu#endif 1062800Ssaidi@eecs.umich.edu 1072166SN/Astatic inline Fault genMachineCheckFault() 1082166SN/A{ 1092203SN/A return new MachineCheckFault; 1102166SN/A} 1112166SN/A 1122166SN/Astatic inline Fault genAlignmentFault() 1132166SN/A{ 1142203SN/A return new AlignmentFault; 1152166SN/A} 1162166SN/A 1172147SN/Aclass ResetFault : public AlphaFault 1182090SN/A{ 1192147SN/A private: 1202147SN/A static FaultName _name; 1212147SN/A static FaultVect _vect; 1222222SN/A static FaultStat _count; 1232112SN/A public: 1242147SN/A FaultName name() {return _name;} 1252147SN/A FaultVect vect() {return _vect;} 1262222SN/A FaultStat & countStat() {return _count;} 1272147SN/A}; 1282090SN/A 1292147SN/Aclass ArithmeticFault : public AlphaFault 1302090SN/A{ 1312201SN/A protected: 1322201SN/A bool skipFaultingInstruction() {return true;} 1332147SN/A private: 1342147SN/A static FaultName _name; 1352147SN/A static FaultVect _vect; 1362222SN/A static FaultStat _count; 1372112SN/A public: 1382147SN/A FaultName name() {return _name;} 1392147SN/A FaultVect vect() {return _vect;} 1402222SN/A FaultStat & countStat() {return _count;} 1412203SN/A#if FULL_SYSTEM 1422680Sktlim@umich.edu void invoke(ThreadContext * tc); 1432203SN/A#endif 1442147SN/A}; 1452090SN/A 1462147SN/Aclass InterruptFault : public AlphaFault 1472090SN/A{ 1482201SN/A protected: 1492201SN/A bool setRestartAddress() {return false;} 1502147SN/A private: 1512147SN/A static FaultName _name; 1522147SN/A static FaultVect _vect; 1532222SN/A static FaultStat _count; 1542112SN/A public: 1552147SN/A FaultName name() {return _name;} 1562147SN/A FaultVect vect() {return _vect;} 1572222SN/A FaultStat & countStat() {return _count;} 1582147SN/A}; 1592090SN/A 1602502SN/Aclass DtbFault : public AlphaFault 1612502SN/A{ 1622502SN/A#if FULL_SYSTEM 1632502SN/A private: 1642502SN/A AlphaISA::VAddr vaddr; 1652502SN/A uint32_t reqFlags; 1662502SN/A uint64_t flags; 1672502SN/A public: 1682502SN/A DtbFault(AlphaISA::VAddr _vaddr, uint32_t _reqFlags, uint64_t _flags) 1692502SN/A : vaddr(_vaddr), reqFlags(_reqFlags), flags(_flags) 1702502SN/A { } 1712502SN/A#endif 1722502SN/A FaultName name() = 0; 1732502SN/A FaultVect vect() = 0; 1742502SN/A FaultStat & countStat() = 0; 1752502SN/A#if FULL_SYSTEM 1762680Sktlim@umich.edu void invoke(ThreadContext * tc); 1772502SN/A#endif 1782502SN/A}; 1792502SN/A 1802502SN/Aclass NDtbMissFault : public DtbFault 1812090SN/A{ 1822147SN/A private: 1832147SN/A static FaultName _name; 1842147SN/A static FaultVect _vect; 1852222SN/A static FaultStat _count; 1862112SN/A public: 1872502SN/A#if FULL_SYSTEM 1882502SN/A NDtbMissFault(AlphaISA::VAddr vaddr, uint32_t reqFlags, uint64_t flags) 1892502SN/A : DtbFault(vaddr, reqFlags, flags) 1902502SN/A { } 1912502SN/A#endif 1922147SN/A FaultName name() {return _name;} 1932147SN/A FaultVect vect() {return _vect;} 1942222SN/A FaultStat & countStat() {return _count;} 1952147SN/A}; 1962090SN/A 1972502SN/Aclass PDtbMissFault : public DtbFault 1982090SN/A{ 1992147SN/A private: 2002147SN/A static FaultName _name; 2012147SN/A static FaultVect _vect; 2022222SN/A static FaultStat _count; 2032112SN/A public: 2042502SN/A#if FULL_SYSTEM 2052502SN/A PDtbMissFault(AlphaISA::VAddr vaddr, uint32_t reqFlags, uint64_t flags) 2062502SN/A : DtbFault(vaddr, reqFlags, flags) 2072502SN/A { } 2082502SN/A#endif 2092147SN/A FaultName name() {return _name;} 2102147SN/A FaultVect vect() {return _vect;} 2112222SN/A FaultStat & countStat() {return _count;} 2122147SN/A}; 2132090SN/A 2142502SN/Aclass DtbPageFault : public DtbFault 2152090SN/A{ 2162147SN/A private: 2172147SN/A static FaultName _name; 2182147SN/A static FaultVect _vect; 2192222SN/A static FaultStat _count; 2202112SN/A public: 2212502SN/A#if FULL_SYSTEM 2222502SN/A DtbPageFault(AlphaISA::VAddr vaddr, uint32_t reqFlags, uint64_t flags) 2232502SN/A : DtbFault(vaddr, reqFlags, flags) 2242502SN/A { } 2252502SN/A#endif 2262147SN/A FaultName name() {return _name;} 2272147SN/A FaultVect vect() {return _vect;} 2282222SN/A FaultStat & countStat() {return _count;} 2292147SN/A}; 2302090SN/A 2312502SN/Aclass DtbAcvFault : public DtbFault 2322090SN/A{ 2332147SN/A private: 2342147SN/A static FaultName _name; 2352147SN/A static FaultVect _vect; 2362222SN/A static FaultStat _count; 2372112SN/A public: 2382502SN/A#if FULL_SYSTEM 2392502SN/A DtbAcvFault(AlphaISA::VAddr vaddr, uint32_t reqFlags, uint64_t flags) 2402502SN/A : DtbFault(vaddr, reqFlags, flags) 2412502SN/A { } 2422502SN/A#endif 2432147SN/A FaultName name() {return _name;} 2442147SN/A FaultVect vect() {return _vect;} 2452222SN/A FaultStat & countStat() {return _count;} 2462147SN/A}; 2472090SN/A 2482502SN/Aclass DtbAlignmentFault : public DtbFault 2492090SN/A{ 2502147SN/A private: 2512147SN/A static FaultName _name; 2522147SN/A static FaultVect _vect; 2532222SN/A static FaultStat _count; 2542112SN/A public: 2552502SN/A#if FULL_SYSTEM 2562502SN/A DtbAlignmentFault(AlphaISA::VAddr vaddr, uint32_t reqFlags, uint64_t flags) 2572502SN/A : DtbFault(vaddr, reqFlags, flags) 2582502SN/A { } 2592502SN/A#endif 2602147SN/A FaultName name() {return _name;} 2612147SN/A FaultVect vect() {return _vect;} 2622222SN/A FaultStat & countStat() {return _count;} 2632147SN/A}; 2642090SN/A 2652502SN/Aclass ItbFault : public AlphaFault 2662502SN/A{ 2672502SN/A private: 2682502SN/A Addr pc; 2692502SN/A public: 2702502SN/A ItbFault(Addr _pc) 2712502SN/A : pc(_pc) 2722502SN/A { } 2732505SN/A FaultName name() = 0; 2742505SN/A FaultVect vect() = 0; 2752505SN/A FaultStat & countStat() = 0; 2762502SN/A#if FULL_SYSTEM 2772680Sktlim@umich.edu void invoke(ThreadContext * tc); 2782502SN/A#endif 2792502SN/A}; 2802502SN/A 2812502SN/Aclass ItbMissFault : public ItbFault 2822090SN/A{ 2832147SN/A private: 2842147SN/A static FaultName _name; 2852147SN/A static FaultVect _vect; 2862222SN/A static FaultStat _count; 2872112SN/A public: 2882502SN/A ItbMissFault(Addr pc) 2892502SN/A : ItbFault(pc) 2902502SN/A { } 2912147SN/A FaultName name() {return _name;} 2922147SN/A FaultVect vect() {return _vect;} 2932222SN/A FaultStat & countStat() {return _count;} 2942147SN/A}; 2952090SN/A 2962502SN/Aclass ItbPageFault : public ItbFault 2972090SN/A{ 2982147SN/A private: 2992147SN/A static FaultName _name; 3002147SN/A static FaultVect _vect; 3012222SN/A static FaultStat _count; 3022112SN/A public: 3032502SN/A ItbPageFault(Addr pc) 3042502SN/A : ItbFault(pc) 3052502SN/A { } 3062502SN/A FaultName name() {return _name;} 3072502SN/A FaultVect vect() {return _vect;} 3082502SN/A FaultStat & countStat() {return _count;} 3092502SN/A}; 3102502SN/A 3112502SN/Aclass ItbAcvFault : public ItbFault 3122502SN/A{ 3132502SN/A private: 3142502SN/A static FaultName _name; 3152502SN/A static FaultVect _vect; 3162502SN/A static FaultStat _count; 3172502SN/A public: 3182502SN/A ItbAcvFault(Addr pc) 3192502SN/A : ItbFault(pc) 3202502SN/A { } 3212147SN/A FaultName name() {return _name;} 3222147SN/A FaultVect vect() {return _vect;} 3232222SN/A FaultStat & countStat() {return _count;} 3242147SN/A}; 3252090SN/A 3262147SN/Aclass UnimplementedOpcodeFault : public AlphaFault 3272090SN/A{ 3282147SN/A private: 3292147SN/A static FaultName _name; 3302147SN/A static FaultVect _vect; 3312222SN/A static FaultStat _count; 3322112SN/A public: 3332147SN/A FaultName name() {return _name;} 3342147SN/A FaultVect vect() {return _vect;} 3352222SN/A FaultStat & countStat() {return _count;} 3362147SN/A}; 3372090SN/A 3382147SN/Aclass FloatEnableFault : public AlphaFault 3392090SN/A{ 3402147SN/A private: 3412147SN/A static FaultName _name; 3422147SN/A static FaultVect _vect; 3432222SN/A static FaultStat _count; 3442112SN/A public: 3452147SN/A FaultName name() {return _name;} 3462147SN/A FaultVect vect() {return _vect;} 3472222SN/A FaultStat & countStat() {return _count;} 3482147SN/A}; 3492090SN/A 3502147SN/Aclass PalFault : public AlphaFault 3512090SN/A{ 3522201SN/A protected: 3532201SN/A bool skipFaultingInstruction() {return true;} 3542147SN/A private: 3552147SN/A static FaultName _name; 3562147SN/A static FaultVect _vect; 3572222SN/A static FaultStat _count; 3582112SN/A public: 3592147SN/A FaultName name() {return _name;} 3602147SN/A FaultVect vect() {return _vect;} 3612222SN/A FaultStat & countStat() {return _count;} 3622147SN/A}; 3632090SN/A 3642147SN/Aclass IntegerOverflowFault : public AlphaFault 3652090SN/A{ 3662147SN/A private: 3672147SN/A static FaultName _name; 3682147SN/A static FaultVect _vect; 3692222SN/A static FaultStat _count; 3702112SN/A public: 3712147SN/A FaultName name() {return _name;} 3722147SN/A FaultVect vect() {return _vect;} 3732222SN/A FaultStat & countStat() {return _count;} 3742147SN/A}; 3752090SN/A 3762167SN/A} // AlphaISA namespace 3772167SN/A 3782SN/A#endif // __FAULTS_HH__ 379