faults.hh revision 4695
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: 694695Sgblack@eecs.umich.edu FaultName name() const {return _name;} 702166SN/A FaultVect vect() {return _vect;} 712222SN/A FaultStat & countStat() {return _count;} 724695Sgblack@eecs.umich.edu bool isMachineCheckFault() const {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: 824695Sgblack@eecs.umich.edu FaultName name() const {return _name;} 832166SN/A FaultVect vect() {return _vect;} 842222SN/A FaultStat & countStat() {return _count;} 854695Sgblack@eecs.umich.edu bool isAlignmentFault() const {return true;} 862166SN/A}; 872166SN/A 882166SN/Astatic inline Fault genMachineCheckFault() 892166SN/A{ 902203SN/A return new MachineCheckFault; 912166SN/A} 922166SN/A 932166SN/Astatic inline Fault genAlignmentFault() 942166SN/A{ 952203SN/A return new AlignmentFault; 962166SN/A} 972166SN/A 982147SN/Aclass ResetFault : public AlphaFault 992090SN/A{ 1002147SN/A private: 1012147SN/A static FaultName _name; 1022147SN/A static FaultVect _vect; 1032222SN/A static FaultStat _count; 1042112SN/A public: 1054695Sgblack@eecs.umich.edu FaultName name() const {return _name;} 1062147SN/A FaultVect vect() {return _vect;} 1072222SN/A FaultStat & countStat() {return _count;} 1082147SN/A}; 1092090SN/A 1102147SN/Aclass ArithmeticFault : public AlphaFault 1112090SN/A{ 1122201SN/A protected: 1132201SN/A bool skipFaultingInstruction() {return true;} 1142147SN/A private: 1152147SN/A static FaultName _name; 1162147SN/A static FaultVect _vect; 1172222SN/A static FaultStat _count; 1182112SN/A public: 1194695Sgblack@eecs.umich.edu FaultName name() const {return _name;} 1202147SN/A FaultVect vect() {return _vect;} 1212222SN/A FaultStat & countStat() {return _count;} 1222203SN/A#if FULL_SYSTEM 1232680Sktlim@umich.edu void invoke(ThreadContext * tc); 1242203SN/A#endif 1252147SN/A}; 1262090SN/A 1272147SN/Aclass InterruptFault : public AlphaFault 1282090SN/A{ 1292201SN/A protected: 1302201SN/A bool setRestartAddress() {return false;} 1312147SN/A private: 1322147SN/A static FaultName _name; 1332147SN/A static FaultVect _vect; 1342222SN/A static FaultStat _count; 1352112SN/A public: 1364695Sgblack@eecs.umich.edu FaultName name() const {return _name;} 1372147SN/A FaultVect vect() {return _vect;} 1382222SN/A FaultStat & countStat() {return _count;} 1392147SN/A}; 1402090SN/A 1412502SN/Aclass DtbFault : public AlphaFault 1422502SN/A{ 1432502SN/A#if FULL_SYSTEM 1442502SN/A private: 1452502SN/A AlphaISA::VAddr vaddr; 1462502SN/A uint32_t reqFlags; 1472502SN/A uint64_t flags; 1482502SN/A public: 1492502SN/A DtbFault(AlphaISA::VAddr _vaddr, uint32_t _reqFlags, uint64_t _flags) 1502502SN/A : vaddr(_vaddr), reqFlags(_reqFlags), flags(_flags) 1512502SN/A { } 1522502SN/A#endif 1534695Sgblack@eecs.umich.edu FaultName name() const = 0; 1542502SN/A FaultVect vect() = 0; 1552502SN/A FaultStat & countStat() = 0; 1562502SN/A#if FULL_SYSTEM 1572680Sktlim@umich.edu void invoke(ThreadContext * tc); 1582502SN/A#endif 1592502SN/A}; 1602502SN/A 1612502SN/Aclass NDtbMissFault : public DtbFault 1622090SN/A{ 1632147SN/A private: 1642147SN/A static FaultName _name; 1652147SN/A static FaultVect _vect; 1662222SN/A static FaultStat _count; 1672112SN/A public: 1682502SN/A#if FULL_SYSTEM 1692502SN/A NDtbMissFault(AlphaISA::VAddr vaddr, uint32_t reqFlags, uint64_t flags) 1702502SN/A : DtbFault(vaddr, reqFlags, flags) 1712502SN/A { } 1722502SN/A#endif 1734695Sgblack@eecs.umich.edu FaultName name() const {return _name;} 1742147SN/A FaultVect vect() {return _vect;} 1752222SN/A FaultStat & countStat() {return _count;} 1762147SN/A}; 1772090SN/A 1782502SN/Aclass PDtbMissFault : public DtbFault 1792090SN/A{ 1802147SN/A private: 1812147SN/A static FaultName _name; 1822147SN/A static FaultVect _vect; 1832222SN/A static FaultStat _count; 1842112SN/A public: 1852502SN/A#if FULL_SYSTEM 1862502SN/A PDtbMissFault(AlphaISA::VAddr vaddr, uint32_t reqFlags, uint64_t flags) 1872502SN/A : DtbFault(vaddr, reqFlags, flags) 1882502SN/A { } 1892502SN/A#endif 1904695Sgblack@eecs.umich.edu FaultName name() const {return _name;} 1912147SN/A FaultVect vect() {return _vect;} 1922222SN/A FaultStat & countStat() {return _count;} 1932147SN/A}; 1942090SN/A 1952502SN/Aclass DtbPageFault : public DtbFault 1962090SN/A{ 1972147SN/A private: 1982147SN/A static FaultName _name; 1992147SN/A static FaultVect _vect; 2002222SN/A static FaultStat _count; 2012112SN/A public: 2022502SN/A#if FULL_SYSTEM 2032502SN/A DtbPageFault(AlphaISA::VAddr vaddr, uint32_t reqFlags, uint64_t flags) 2042502SN/A : DtbFault(vaddr, reqFlags, flags) 2052502SN/A { } 2062502SN/A#endif 2074695Sgblack@eecs.umich.edu FaultName name() const {return _name;} 2082147SN/A FaultVect vect() {return _vect;} 2092222SN/A FaultStat & countStat() {return _count;} 2102147SN/A}; 2112090SN/A 2122502SN/Aclass DtbAcvFault : public DtbFault 2132090SN/A{ 2142147SN/A private: 2152147SN/A static FaultName _name; 2162147SN/A static FaultVect _vect; 2172222SN/A static FaultStat _count; 2182112SN/A public: 2192502SN/A#if FULL_SYSTEM 2202502SN/A DtbAcvFault(AlphaISA::VAddr vaddr, uint32_t reqFlags, uint64_t flags) 2212502SN/A : DtbFault(vaddr, reqFlags, flags) 2222502SN/A { } 2232502SN/A#endif 2244695Sgblack@eecs.umich.edu FaultName name() const {return _name;} 2252147SN/A FaultVect vect() {return _vect;} 2262222SN/A FaultStat & countStat() {return _count;} 2272147SN/A}; 2282090SN/A 2292502SN/Aclass DtbAlignmentFault : public DtbFault 2302090SN/A{ 2312147SN/A private: 2322147SN/A static FaultName _name; 2332147SN/A static FaultVect _vect; 2342222SN/A static FaultStat _count; 2352112SN/A public: 2362502SN/A#if FULL_SYSTEM 2372502SN/A DtbAlignmentFault(AlphaISA::VAddr vaddr, uint32_t reqFlags, uint64_t flags) 2382502SN/A : DtbFault(vaddr, reqFlags, flags) 2392502SN/A { } 2402502SN/A#endif 2414695Sgblack@eecs.umich.edu FaultName name() const {return _name;} 2422147SN/A FaultVect vect() {return _vect;} 2432222SN/A FaultStat & countStat() {return _count;} 2442147SN/A}; 2452090SN/A 2462502SN/Aclass ItbFault : public AlphaFault 2472502SN/A{ 2482502SN/A private: 2492502SN/A Addr pc; 2502502SN/A public: 2512502SN/A ItbFault(Addr _pc) 2522502SN/A : pc(_pc) 2532502SN/A { } 2544695Sgblack@eecs.umich.edu FaultName name() const = 0; 2552505SN/A FaultVect vect() = 0; 2562505SN/A FaultStat & countStat() = 0; 2572502SN/A#if FULL_SYSTEM 2582680Sktlim@umich.edu void invoke(ThreadContext * tc); 2592502SN/A#endif 2602502SN/A}; 2612502SN/A 2622502SN/Aclass ItbMissFault : public ItbFault 2632090SN/A{ 2642147SN/A private: 2652147SN/A static FaultName _name; 2662147SN/A static FaultVect _vect; 2672222SN/A static FaultStat _count; 2682112SN/A public: 2692502SN/A ItbMissFault(Addr pc) 2702502SN/A : ItbFault(pc) 2712502SN/A { } 2724695Sgblack@eecs.umich.edu FaultName name() const {return _name;} 2732147SN/A FaultVect vect() {return _vect;} 2742222SN/A FaultStat & countStat() {return _count;} 2752147SN/A}; 2762090SN/A 2772502SN/Aclass ItbPageFault : public ItbFault 2782090SN/A{ 2792147SN/A private: 2802147SN/A static FaultName _name; 2812147SN/A static FaultVect _vect; 2822222SN/A static FaultStat _count; 2832112SN/A public: 2842502SN/A ItbPageFault(Addr pc) 2852502SN/A : ItbFault(pc) 2862502SN/A { } 2874695Sgblack@eecs.umich.edu FaultName name() const {return _name;} 2882502SN/A FaultVect vect() {return _vect;} 2892502SN/A FaultStat & countStat() {return _count;} 2902502SN/A}; 2912502SN/A 2922502SN/Aclass ItbAcvFault : public ItbFault 2932502SN/A{ 2942502SN/A private: 2952502SN/A static FaultName _name; 2962502SN/A static FaultVect _vect; 2972502SN/A static FaultStat _count; 2982502SN/A public: 2992502SN/A ItbAcvFault(Addr pc) 3002502SN/A : ItbFault(pc) 3012502SN/A { } 3024695Sgblack@eecs.umich.edu FaultName name() const {return _name;} 3032147SN/A FaultVect vect() {return _vect;} 3042222SN/A FaultStat & countStat() {return _count;} 3052147SN/A}; 3062090SN/A 3072147SN/Aclass UnimplementedOpcodeFault : public AlphaFault 3082090SN/A{ 3092147SN/A private: 3102147SN/A static FaultName _name; 3112147SN/A static FaultVect _vect; 3122222SN/A static FaultStat _count; 3132112SN/A public: 3144695Sgblack@eecs.umich.edu FaultName name() const {return _name;} 3152147SN/A FaultVect vect() {return _vect;} 3162222SN/A FaultStat & countStat() {return _count;} 3172147SN/A}; 3182090SN/A 3192147SN/Aclass FloatEnableFault : public AlphaFault 3202090SN/A{ 3212147SN/A private: 3222147SN/A static FaultName _name; 3232147SN/A static FaultVect _vect; 3242222SN/A static FaultStat _count; 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 PalFault : public AlphaFault 3322090SN/A{ 3332201SN/A protected: 3342201SN/A bool skipFaultingInstruction() {return true;} 3352147SN/A private: 3362147SN/A static FaultName _name; 3372147SN/A static FaultVect _vect; 3382222SN/A static FaultStat _count; 3392112SN/A public: 3404695Sgblack@eecs.umich.edu FaultName name() const {return _name;} 3412147SN/A FaultVect vect() {return _vect;} 3422222SN/A FaultStat & countStat() {return _count;} 3432147SN/A}; 3442090SN/A 3452147SN/Aclass IntegerOverflowFault : public AlphaFault 3462090SN/A{ 3472147SN/A private: 3482147SN/A static FaultName _name; 3492147SN/A static FaultVect _vect; 3502222SN/A static FaultStat _count; 3512112SN/A public: 3524695Sgblack@eecs.umich.edu FaultName name() const {return _name;} 3532147SN/A FaultVect vect() {return _vect;} 3542222SN/A FaultStat & countStat() {return _count;} 3552147SN/A}; 3562090SN/A 3572167SN/A} // AlphaISA namespace 3582167SN/A 3592SN/A#endif // __FAULTS_HH__ 360