faults.hh revision 4997
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 382984Sgblack@eecs.umich.edu#include "arch/alpha/pagetable.hh" 392147SN/A 402166SN/A// The design of the "name" and "vect" functions is in sim/faults.hh 412147SN/A 422167SN/Anamespace AlphaISA 432167SN/A{ 442167SN/A 452147SN/Atypedef const Addr FaultVect; 462090SN/A 472222SN/Aclass AlphaFault : public FaultBase 482090SN/A{ 492201SN/A protected: 502201SN/A virtual bool skipFaultingInstruction() {return false;} 512201SN/A virtual bool setRestartAddress() {return true;} 522112SN/A public: 532174SN/A#if FULL_SYSTEM 542680Sktlim@umich.edu void invoke(ThreadContext * tc); 552174SN/A#endif 562175SN/A virtual FaultVect vect() = 0; 572222SN/A virtual FaultStat & countStat() = 0; 582SN/A}; 592SN/A 602203SN/Aclass MachineCheckFault : public AlphaFault 612166SN/A{ 622166SN/A private: 632203SN/A static FaultName _name; 642166SN/A static FaultVect _vect; 652222SN/A static FaultStat _count; 662166SN/A public: 674695Sgblack@eecs.umich.edu FaultName name() const {return _name;} 682166SN/A FaultVect vect() {return _vect;} 692222SN/A FaultStat & countStat() {return _count;} 704695Sgblack@eecs.umich.edu bool isMachineCheckFault() const {return true;} 712166SN/A}; 722166SN/A 732203SN/Aclass AlignmentFault : public AlphaFault 742166SN/A{ 752166SN/A private: 762203SN/A static FaultName _name; 772166SN/A static FaultVect _vect; 782222SN/A static FaultStat _count; 792166SN/A public: 804695Sgblack@eecs.umich.edu FaultName name() const {return _name;} 812166SN/A FaultVect vect() {return _vect;} 822222SN/A FaultStat & countStat() {return _count;} 834695Sgblack@eecs.umich.edu bool isAlignmentFault() const {return true;} 842166SN/A}; 852166SN/A 862166SN/Astatic inline Fault genMachineCheckFault() 872166SN/A{ 882203SN/A return new MachineCheckFault; 892166SN/A} 902166SN/A 912166SN/Astatic inline Fault genAlignmentFault() 922166SN/A{ 932203SN/A return new AlignmentFault; 942166SN/A} 952166SN/A 962147SN/Aclass ResetFault : public AlphaFault 972090SN/A{ 982147SN/A private: 992147SN/A static FaultName _name; 1002147SN/A static FaultVect _vect; 1012222SN/A static FaultStat _count; 1022112SN/A public: 1034695Sgblack@eecs.umich.edu FaultName name() const {return _name;} 1042147SN/A FaultVect vect() {return _vect;} 1052222SN/A FaultStat & countStat() {return _count;} 1062147SN/A}; 1072090SN/A 1082147SN/Aclass ArithmeticFault : public AlphaFault 1092090SN/A{ 1102201SN/A protected: 1112201SN/A bool skipFaultingInstruction() {return true;} 1122147SN/A private: 1132147SN/A static FaultName _name; 1142147SN/A static FaultVect _vect; 1152222SN/A static FaultStat _count; 1162112SN/A public: 1174695Sgblack@eecs.umich.edu FaultName name() const {return _name;} 1182147SN/A FaultVect vect() {return _vect;} 1192222SN/A FaultStat & countStat() {return _count;} 1202203SN/A#if FULL_SYSTEM 1212680Sktlim@umich.edu void invoke(ThreadContext * tc); 1222203SN/A#endif 1232147SN/A}; 1242090SN/A 1252147SN/Aclass InterruptFault : public AlphaFault 1262090SN/A{ 1272201SN/A protected: 1282201SN/A bool setRestartAddress() {return false;} 1292147SN/A private: 1302147SN/A static FaultName _name; 1312147SN/A static FaultVect _vect; 1322222SN/A static FaultStat _count; 1332112SN/A public: 1344695Sgblack@eecs.umich.edu FaultName name() const {return _name;} 1352147SN/A FaultVect vect() {return _vect;} 1362222SN/A FaultStat & countStat() {return _count;} 1372147SN/A}; 1382090SN/A 1392502SN/Aclass DtbFault : public AlphaFault 1402502SN/A{ 1414997Sgblack@eecs.umich.edu protected: 1422502SN/A AlphaISA::VAddr vaddr; 1432502SN/A uint32_t reqFlags; 1442502SN/A uint64_t flags; 1452502SN/A public: 1462502SN/A DtbFault(AlphaISA::VAddr _vaddr, uint32_t _reqFlags, uint64_t _flags) 1472502SN/A : vaddr(_vaddr), reqFlags(_reqFlags), flags(_flags) 1482502SN/A { } 1494695Sgblack@eecs.umich.edu FaultName name() const = 0; 1502502SN/A FaultVect vect() = 0; 1512502SN/A FaultStat & countStat() = 0; 1522502SN/A#if FULL_SYSTEM 1532680Sktlim@umich.edu void invoke(ThreadContext * tc); 1542502SN/A#endif 1552502SN/A}; 1562502SN/A 1572502SN/Aclass NDtbMissFault : public DtbFault 1582090SN/A{ 1592147SN/A private: 1602147SN/A static FaultName _name; 1612147SN/A static FaultVect _vect; 1622222SN/A static FaultStat _count; 1632112SN/A public: 1642502SN/A NDtbMissFault(AlphaISA::VAddr vaddr, uint32_t reqFlags, uint64_t flags) 1652502SN/A : DtbFault(vaddr, reqFlags, flags) 1662502SN/A { } 1674695Sgblack@eecs.umich.edu FaultName name() const {return _name;} 1682147SN/A FaultVect vect() {return _vect;} 1692222SN/A FaultStat & countStat() {return _count;} 1704997Sgblack@eecs.umich.edu#if !FULL_SYSTEM 1714997Sgblack@eecs.umich.edu void invoke(ThreadContext * tc); 1724997Sgblack@eecs.umich.edu#endif 1732147SN/A}; 1742090SN/A 1752502SN/Aclass PDtbMissFault : public DtbFault 1762090SN/A{ 1772147SN/A private: 1782147SN/A static FaultName _name; 1792147SN/A static FaultVect _vect; 1802222SN/A static FaultStat _count; 1812112SN/A public: 1822502SN/A PDtbMissFault(AlphaISA::VAddr vaddr, uint32_t reqFlags, uint64_t flags) 1832502SN/A : DtbFault(vaddr, reqFlags, flags) 1842502SN/A { } 1854695Sgblack@eecs.umich.edu FaultName name() const {return _name;} 1862147SN/A FaultVect vect() {return _vect;} 1872222SN/A FaultStat & countStat() {return _count;} 1882147SN/A}; 1892090SN/A 1902502SN/Aclass DtbPageFault : public DtbFault 1912090SN/A{ 1922147SN/A private: 1932147SN/A static FaultName _name; 1942147SN/A static FaultVect _vect; 1952222SN/A static FaultStat _count; 1962112SN/A public: 1972502SN/A DtbPageFault(AlphaISA::VAddr vaddr, uint32_t reqFlags, uint64_t flags) 1982502SN/A : DtbFault(vaddr, reqFlags, flags) 1992502SN/A { } 2004695Sgblack@eecs.umich.edu FaultName name() const {return _name;} 2012147SN/A FaultVect vect() {return _vect;} 2022222SN/A FaultStat & countStat() {return _count;} 2032147SN/A}; 2042090SN/A 2052502SN/Aclass DtbAcvFault : public DtbFault 2062090SN/A{ 2072147SN/A private: 2082147SN/A static FaultName _name; 2092147SN/A static FaultVect _vect; 2102222SN/A static FaultStat _count; 2112112SN/A public: 2122502SN/A DtbAcvFault(AlphaISA::VAddr vaddr, uint32_t reqFlags, uint64_t flags) 2132502SN/A : DtbFault(vaddr, reqFlags, flags) 2142502SN/A { } 2154695Sgblack@eecs.umich.edu FaultName name() const {return _name;} 2162147SN/A FaultVect vect() {return _vect;} 2172222SN/A FaultStat & countStat() {return _count;} 2182147SN/A}; 2192090SN/A 2202502SN/Aclass DtbAlignmentFault : public DtbFault 2212090SN/A{ 2222147SN/A private: 2232147SN/A static FaultName _name; 2242147SN/A static FaultVect _vect; 2252222SN/A static FaultStat _count; 2262112SN/A public: 2272502SN/A DtbAlignmentFault(AlphaISA::VAddr vaddr, uint32_t reqFlags, uint64_t flags) 2282502SN/A : DtbFault(vaddr, reqFlags, flags) 2292502SN/A { } 2304695Sgblack@eecs.umich.edu FaultName name() const {return _name;} 2312147SN/A FaultVect vect() {return _vect;} 2322222SN/A FaultStat & countStat() {return _count;} 2332147SN/A}; 2342090SN/A 2352502SN/Aclass ItbFault : public AlphaFault 2362502SN/A{ 2374997Sgblack@eecs.umich.edu protected: 2382502SN/A Addr pc; 2392502SN/A public: 2402502SN/A ItbFault(Addr _pc) 2412502SN/A : pc(_pc) 2422502SN/A { } 2434695Sgblack@eecs.umich.edu FaultName name() const = 0; 2442505SN/A FaultVect vect() = 0; 2452505SN/A FaultStat & countStat() = 0; 2462502SN/A#if FULL_SYSTEM 2472680Sktlim@umich.edu void invoke(ThreadContext * tc); 2482502SN/A#endif 2492502SN/A}; 2502502SN/A 2512502SN/Aclass ItbPageFault : public ItbFault 2522090SN/A{ 2532147SN/A private: 2542147SN/A static FaultName _name; 2552147SN/A static FaultVect _vect; 2562222SN/A static FaultStat _count; 2572112SN/A public: 2582502SN/A ItbPageFault(Addr pc) 2592502SN/A : ItbFault(pc) 2602502SN/A { } 2614695Sgblack@eecs.umich.edu FaultName name() const {return _name;} 2622502SN/A FaultVect vect() {return _vect;} 2632502SN/A FaultStat & countStat() {return _count;} 2644997Sgblack@eecs.umich.edu#if !FULL_SYSTEM 2654997Sgblack@eecs.umich.edu void invoke(ThreadContext * tc); 2664997Sgblack@eecs.umich.edu#endif 2672502SN/A}; 2682502SN/A 2692502SN/Aclass ItbAcvFault : public ItbFault 2702502SN/A{ 2712502SN/A private: 2722502SN/A static FaultName _name; 2732502SN/A static FaultVect _vect; 2742502SN/A static FaultStat _count; 2752502SN/A public: 2762502SN/A ItbAcvFault(Addr pc) 2772502SN/A : ItbFault(pc) 2782502SN/A { } 2794695Sgblack@eecs.umich.edu FaultName name() const {return _name;} 2802147SN/A FaultVect vect() {return _vect;} 2812222SN/A FaultStat & countStat() {return _count;} 2822147SN/A}; 2832090SN/A 2842147SN/Aclass UnimplementedOpcodeFault : public AlphaFault 2852090SN/A{ 2862147SN/A private: 2872147SN/A static FaultName _name; 2882147SN/A static FaultVect _vect; 2892222SN/A static FaultStat _count; 2902112SN/A public: 2914695Sgblack@eecs.umich.edu FaultName name() const {return _name;} 2922147SN/A FaultVect vect() {return _vect;} 2932222SN/A FaultStat & countStat() {return _count;} 2942147SN/A}; 2952090SN/A 2962147SN/Aclass FloatEnableFault : public AlphaFault 2972090SN/A{ 2982147SN/A private: 2992147SN/A static FaultName _name; 3002147SN/A static FaultVect _vect; 3012222SN/A static FaultStat _count; 3022112SN/A public: 3034695Sgblack@eecs.umich.edu FaultName name() const {return _name;} 3042147SN/A FaultVect vect() {return _vect;} 3052222SN/A FaultStat & countStat() {return _count;} 3062147SN/A}; 3072090SN/A 3082147SN/Aclass PalFault : public AlphaFault 3092090SN/A{ 3102201SN/A protected: 3112201SN/A bool skipFaultingInstruction() {return true;} 3122147SN/A private: 3132147SN/A static FaultName _name; 3142147SN/A static FaultVect _vect; 3152222SN/A static FaultStat _count; 3162112SN/A public: 3174695Sgblack@eecs.umich.edu FaultName name() const {return _name;} 3182147SN/A FaultVect vect() {return _vect;} 3192222SN/A FaultStat & countStat() {return _count;} 3202147SN/A}; 3212090SN/A 3222147SN/Aclass IntegerOverflowFault : public AlphaFault 3232090SN/A{ 3242147SN/A private: 3252147SN/A static FaultName _name; 3262147SN/A static FaultVect _vect; 3272222SN/A static FaultStat _count; 3282112SN/A public: 3294695Sgblack@eecs.umich.edu FaultName name() const {return _name;} 3302147SN/A FaultVect vect() {return _vect;} 3312222SN/A FaultStat & countStat() {return _count;} 3322147SN/A}; 3332090SN/A 3342167SN/A} // AlphaISA namespace 3352167SN/A 3362SN/A#endif // __FAULTS_HH__ 337