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