faults.hh revision 2680
114184Sgabeblack@google.com/* 214184Sgabeblack@google.com * Copyright (c) 2003-2005 The Regents of The University of Michigan 314184Sgabeblack@google.com * All rights reserved. 414184Sgabeblack@google.com * 514184Sgabeblack@google.com * Redistribution and use in source and binary forms, with or without 614184Sgabeblack@google.com * modification, are permitted provided that the following conditions are 714184Sgabeblack@google.com * met: redistributions of source code must retain the above copyright 814184Sgabeblack@google.com * notice, this list of conditions and the following disclaimer; 914184Sgabeblack@google.com * redistributions in binary form must reproduce the above copyright 1014184Sgabeblack@google.com * notice, this list of conditions and the following disclaimer in the 1114184Sgabeblack@google.com * documentation and/or other materials provided with the distribution; 1214184Sgabeblack@google.com * neither the name of the copyright holders nor the names of its 1314184Sgabeblack@google.com * contributors may be used to endorse or promote products derived from 1414184Sgabeblack@google.com * this software without specific prior written permission. 1514184Sgabeblack@google.com * 1614184Sgabeblack@google.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1714184Sgabeblack@google.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1814184Sgabeblack@google.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1914184Sgabeblack@google.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2014184Sgabeblack@google.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2114184Sgabeblack@google.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2214184Sgabeblack@google.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2314184Sgabeblack@google.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2414184Sgabeblack@google.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2514184Sgabeblack@google.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2614184Sgabeblack@google.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2714184Sgabeblack@google.com * 2814184Sgabeblack@google.com * Authors: Gabe Black 2914184Sgabeblack@google.com * Kevin Lim 3014184Sgabeblack@google.com */ 3114184Sgabeblack@google.com 3214184Sgabeblack@google.com#ifndef __ALPHA_FAULTS_HH__ 3314184Sgabeblack@google.com#define __ALPHA_FAULTS_HH__ 3414184Sgabeblack@google.com 3514184Sgabeblack@google.com#include "arch/alpha/isa_traits.hh" 3614184Sgabeblack@google.com#include "sim/faults.hh" 3714184Sgabeblack@google.com 3814184Sgabeblack@google.com// The design of the "name" and "vect" functions is in sim/faults.hh 3914184Sgabeblack@google.com 4014184Sgabeblack@google.comnamespace AlphaISA 4114184Sgabeblack@google.com{ 4214184Sgabeblack@google.com 4314184Sgabeblack@google.comtypedef const Addr FaultVect; 4414184Sgabeblack@google.com 4514184Sgabeblack@google.comclass AlphaFault : public FaultBase 4614184Sgabeblack@google.com{ 4714184Sgabeblack@google.com protected: 4814184Sgabeblack@google.com virtual bool skipFaultingInstruction() {return false;} 4914184Sgabeblack@google.com virtual bool setRestartAddress() {return true;} 5014184Sgabeblack@google.com public: 5114184Sgabeblack@google.com#if FULL_SYSTEM 5214184Sgabeblack@google.com void invoke(ThreadContext * tc); 5314184Sgabeblack@google.com#endif 5414184Sgabeblack@google.com virtual FaultVect vect() = 0; 5514184Sgabeblack@google.com virtual FaultStat & countStat() = 0; 5614184Sgabeblack@google.com}; 5714184Sgabeblack@google.com 5814184Sgabeblack@google.comclass MachineCheckFault : public AlphaFault 5914184Sgabeblack@google.com{ 6014184Sgabeblack@google.com private: 6114184Sgabeblack@google.com static FaultName _name; 6214184Sgabeblack@google.com static FaultVect _vect; 6314184Sgabeblack@google.com static FaultStat _count; 6414184Sgabeblack@google.com public: 6514184Sgabeblack@google.com FaultName name() {return _name;} 6614184Sgabeblack@google.com FaultVect vect() {return _vect;} 6714184Sgabeblack@google.com FaultStat & countStat() {return _count;} 6814184Sgabeblack@google.com bool isMachineCheckFault() {return true;} 6914184Sgabeblack@google.com}; 7014184Sgabeblack@google.com 7114184Sgabeblack@google.comclass AlignmentFault : public AlphaFault 7214184Sgabeblack@google.com{ 7314184Sgabeblack@google.com private: 7414184Sgabeblack@google.com static FaultName _name; 7514184Sgabeblack@google.com static FaultVect _vect; 7614184Sgabeblack@google.com static FaultStat _count; 7714184Sgabeblack@google.com public: 7814184Sgabeblack@google.com FaultName name() {return _name;} 7914184Sgabeblack@google.com FaultVect vect() {return _vect;} 8014184Sgabeblack@google.com FaultStat & countStat() {return _count;} 8114184Sgabeblack@google.com bool isAlignmentFault() {return true;} 8214184Sgabeblack@google.com}; 8314184Sgabeblack@google.com 8414184Sgabeblack@google.comstatic inline Fault genMachineCheckFault() 8514184Sgabeblack@google.com{ 8614184Sgabeblack@google.com return new MachineCheckFault; 8714184Sgabeblack@google.com} 8814184Sgabeblack@google.com 8914184Sgabeblack@google.comstatic inline Fault genAlignmentFault() 9014184Sgabeblack@google.com{ 9114184Sgabeblack@google.com return new AlignmentFault; 9214184Sgabeblack@google.com} 9314184Sgabeblack@google.com 9414184Sgabeblack@google.comclass ResetFault : public AlphaFault 9514184Sgabeblack@google.com{ 9614184Sgabeblack@google.com private: 9714184Sgabeblack@google.com static FaultName _name; 9814184Sgabeblack@google.com static FaultVect _vect; 9914184Sgabeblack@google.com static FaultStat _count; 10014184Sgabeblack@google.com public: 10114184Sgabeblack@google.com FaultName name() {return _name;} 10214184Sgabeblack@google.com FaultVect vect() {return _vect;} 10314184Sgabeblack@google.com FaultStat & countStat() {return _count;} 10414184Sgabeblack@google.com}; 10514184Sgabeblack@google.com 10614184Sgabeblack@google.comclass ArithmeticFault : public AlphaFault 10714184Sgabeblack@google.com{ 10814184Sgabeblack@google.com protected: 10914184Sgabeblack@google.com bool skipFaultingInstruction() {return true;} 11014184Sgabeblack@google.com private: 11114184Sgabeblack@google.com static FaultName _name; 11214184Sgabeblack@google.com static FaultVect _vect; 11314184Sgabeblack@google.com static FaultStat _count; 11414184Sgabeblack@google.com public: 11514184Sgabeblack@google.com FaultName name() {return _name;} 11614184Sgabeblack@google.com FaultVect vect() {return _vect;} 11714184Sgabeblack@google.com FaultStat & countStat() {return _count;} 11814184Sgabeblack@google.com#if FULL_SYSTEM 11914184Sgabeblack@google.com void invoke(ThreadContext * tc); 12014184Sgabeblack@google.com#endif 12114184Sgabeblack@google.com}; 12214184Sgabeblack@google.com 12314184Sgabeblack@google.comclass InterruptFault : public AlphaFault 12414184Sgabeblack@google.com{ 12514184Sgabeblack@google.com protected: 12614184Sgabeblack@google.com bool setRestartAddress() {return false;} 12714184Sgabeblack@google.com private: 12814184Sgabeblack@google.com static FaultName _name; 12914184Sgabeblack@google.com static FaultVect _vect; 13014184Sgabeblack@google.com static FaultStat _count; 13114184Sgabeblack@google.com public: 13214184Sgabeblack@google.com FaultName name() {return _name;} 13314184Sgabeblack@google.com FaultVect vect() {return _vect;} 13414184Sgabeblack@google.com FaultStat & countStat() {return _count;} 13514184Sgabeblack@google.com}; 13614184Sgabeblack@google.com 13714184Sgabeblack@google.comclass DtbFault : public AlphaFault 13814184Sgabeblack@google.com{ 13914184Sgabeblack@google.com#if FULL_SYSTEM 14014184Sgabeblack@google.com private: 14114184Sgabeblack@google.com AlphaISA::VAddr vaddr; 14214184Sgabeblack@google.com uint32_t reqFlags; 14314184Sgabeblack@google.com uint64_t flags; 14414184Sgabeblack@google.com public: 14514184Sgabeblack@google.com DtbFault(AlphaISA::VAddr _vaddr, uint32_t _reqFlags, uint64_t _flags) 14614184Sgabeblack@google.com : vaddr(_vaddr), reqFlags(_reqFlags), flags(_flags) 14714184Sgabeblack@google.com { } 14814184Sgabeblack@google.com#endif 14914184Sgabeblack@google.com FaultName name() = 0; 15014184Sgabeblack@google.com FaultVect vect() = 0; 15114184Sgabeblack@google.com FaultStat & countStat() = 0; 15214184Sgabeblack@google.com#if FULL_SYSTEM 15314184Sgabeblack@google.com void invoke(ThreadContext * tc); 15414184Sgabeblack@google.com#endif 15514184Sgabeblack@google.com}; 15614184Sgabeblack@google.com 15714184Sgabeblack@google.comclass NDtbMissFault : public DtbFault 15814184Sgabeblack@google.com{ 15914184Sgabeblack@google.com private: 16014184Sgabeblack@google.com static FaultName _name; 16114184Sgabeblack@google.com static FaultVect _vect; 16214184Sgabeblack@google.com static FaultStat _count; 16314184Sgabeblack@google.com public: 16414184Sgabeblack@google.com#if FULL_SYSTEM 16514184Sgabeblack@google.com NDtbMissFault(AlphaISA::VAddr vaddr, uint32_t reqFlags, uint64_t flags) 16614184Sgabeblack@google.com : DtbFault(vaddr, reqFlags, flags) 16714184Sgabeblack@google.com { } 16814184Sgabeblack@google.com#endif 16914184Sgabeblack@google.com FaultName name() {return _name;} 17014184Sgabeblack@google.com FaultVect vect() {return _vect;} 17114184Sgabeblack@google.com FaultStat & countStat() {return _count;} 17214184Sgabeblack@google.com}; 17314184Sgabeblack@google.com 17414184Sgabeblack@google.comclass PDtbMissFault : public DtbFault 17514184Sgabeblack@google.com{ 17614184Sgabeblack@google.com private: 17714184Sgabeblack@google.com static FaultName _name; 17814184Sgabeblack@google.com static FaultVect _vect; 17914184Sgabeblack@google.com static FaultStat _count; 18014184Sgabeblack@google.com public: 18114184Sgabeblack@google.com#if FULL_SYSTEM 18214184Sgabeblack@google.com PDtbMissFault(AlphaISA::VAddr vaddr, uint32_t reqFlags, uint64_t flags) 18314184Sgabeblack@google.com : DtbFault(vaddr, reqFlags, flags) 18414184Sgabeblack@google.com { } 18514184Sgabeblack@google.com#endif 18614184Sgabeblack@google.com FaultName name() {return _name;} 18714184Sgabeblack@google.com FaultVect vect() {return _vect;} 18814184Sgabeblack@google.com FaultStat & countStat() {return _count;} 18914184Sgabeblack@google.com}; 19014184Sgabeblack@google.com 19114184Sgabeblack@google.comclass DtbPageFault : public DtbFault 19214184Sgabeblack@google.com{ 19314184Sgabeblack@google.com private: 19414184Sgabeblack@google.com static FaultName _name; 19514184Sgabeblack@google.com static FaultVect _vect; 19614184Sgabeblack@google.com static FaultStat _count; 19714184Sgabeblack@google.com public: 19814184Sgabeblack@google.com#if FULL_SYSTEM 19914184Sgabeblack@google.com DtbPageFault(AlphaISA::VAddr vaddr, uint32_t reqFlags, uint64_t flags) 20014184Sgabeblack@google.com : DtbFault(vaddr, reqFlags, flags) 20114184Sgabeblack@google.com { } 20214184Sgabeblack@google.com#endif 20314184Sgabeblack@google.com FaultName name() {return _name;} 20414184Sgabeblack@google.com FaultVect vect() {return _vect;} 20514184Sgabeblack@google.com FaultStat & countStat() {return _count;} 20614184Sgabeblack@google.com}; 20714184Sgabeblack@google.com 20814184Sgabeblack@google.comclass DtbAcvFault : public DtbFault 20914184Sgabeblack@google.com{ 21014184Sgabeblack@google.com private: 21114184Sgabeblack@google.com static FaultName _name; 21214184Sgabeblack@google.com static FaultVect _vect; 21314184Sgabeblack@google.com static FaultStat _count; 21414184Sgabeblack@google.com public: 21514184Sgabeblack@google.com#if FULL_SYSTEM 21614184Sgabeblack@google.com DtbAcvFault(AlphaISA::VAddr vaddr, uint32_t reqFlags, uint64_t flags) 21714184Sgabeblack@google.com : DtbFault(vaddr, reqFlags, flags) 21814184Sgabeblack@google.com { } 21914184Sgabeblack@google.com#endif 22014184Sgabeblack@google.com FaultName name() {return _name;} 22114184Sgabeblack@google.com FaultVect vect() {return _vect;} 22214184Sgabeblack@google.com FaultStat & countStat() {return _count;} 22314184Sgabeblack@google.com}; 22414184Sgabeblack@google.com 22514184Sgabeblack@google.comclass DtbAlignmentFault : public DtbFault 22614184Sgabeblack@google.com{ 22714184Sgabeblack@google.com private: 22814184Sgabeblack@google.com static FaultName _name; 22914184Sgabeblack@google.com static FaultVect _vect; 23014184Sgabeblack@google.com static FaultStat _count; 23114184Sgabeblack@google.com public: 23214184Sgabeblack@google.com#if FULL_SYSTEM 23314184Sgabeblack@google.com DtbAlignmentFault(AlphaISA::VAddr vaddr, uint32_t reqFlags, uint64_t flags) 23414184Sgabeblack@google.com : DtbFault(vaddr, reqFlags, flags) 23514184Sgabeblack@google.com { } 23614184Sgabeblack@google.com#endif 23714184Sgabeblack@google.com FaultName name() {return _name;} 23814184Sgabeblack@google.com FaultVect vect() {return _vect;} 23914184Sgabeblack@google.com FaultStat & countStat() {return _count;} 24014184Sgabeblack@google.com}; 24114184Sgabeblack@google.com 24214184Sgabeblack@google.comclass ItbFault : public AlphaFault 24314184Sgabeblack@google.com{ 24414184Sgabeblack@google.com private: 24514184Sgabeblack@google.com Addr pc; 24614184Sgabeblack@google.com public: 24714184Sgabeblack@google.com ItbFault(Addr _pc) 24814184Sgabeblack@google.com : pc(_pc) 24914184Sgabeblack@google.com { } 25014184Sgabeblack@google.com FaultName name() = 0; 25114184Sgabeblack@google.com FaultVect vect() = 0; 25214184Sgabeblack@google.com FaultStat & countStat() = 0; 25314184Sgabeblack@google.com#if FULL_SYSTEM 25414184Sgabeblack@google.com void invoke(ThreadContext * tc); 25514184Sgabeblack@google.com#endif 25614184Sgabeblack@google.com}; 25714184Sgabeblack@google.com 25814184Sgabeblack@google.comclass ItbMissFault : public ItbFault 25914184Sgabeblack@google.com{ 26014184Sgabeblack@google.com private: 26114184Sgabeblack@google.com static FaultName _name; 26214184Sgabeblack@google.com static FaultVect _vect; 26314184Sgabeblack@google.com static FaultStat _count; 26414184Sgabeblack@google.com public: 26514184Sgabeblack@google.com ItbMissFault(Addr pc) 26614184Sgabeblack@google.com : ItbFault(pc) 26714184Sgabeblack@google.com { } 26814184Sgabeblack@google.com FaultName name() {return _name;} 26914184Sgabeblack@google.com FaultVect vect() {return _vect;} 27014184Sgabeblack@google.com FaultStat & countStat() {return _count;} 27114184Sgabeblack@google.com}; 27214184Sgabeblack@google.com 27314184Sgabeblack@google.comclass ItbPageFault : public ItbFault 27414184Sgabeblack@google.com{ 27514184Sgabeblack@google.com private: 27614184Sgabeblack@google.com static FaultName _name; 27714184Sgabeblack@google.com static FaultVect _vect; 27814184Sgabeblack@google.com static FaultStat _count; 27914184Sgabeblack@google.com public: 28014184Sgabeblack@google.com ItbPageFault(Addr pc) 28114184Sgabeblack@google.com : ItbFault(pc) 28214184Sgabeblack@google.com { } 28314184Sgabeblack@google.com FaultName name() {return _name;} 28414184Sgabeblack@google.com FaultVect vect() {return _vect;} 28514184Sgabeblack@google.com FaultStat & countStat() {return _count;} 28614184Sgabeblack@google.com}; 28714184Sgabeblack@google.com 28814184Sgabeblack@google.comclass ItbAcvFault : public ItbFault 28914184Sgabeblack@google.com{ 29014184Sgabeblack@google.com private: 29114184Sgabeblack@google.com static FaultName _name; 29214184Sgabeblack@google.com static FaultVect _vect; 29314184Sgabeblack@google.com static FaultStat _count; 29414184Sgabeblack@google.com public: 29514184Sgabeblack@google.com ItbAcvFault(Addr pc) 29614184Sgabeblack@google.com : ItbFault(pc) 29714184Sgabeblack@google.com { } 29814184Sgabeblack@google.com FaultName name() {return _name;} 29914184Sgabeblack@google.com FaultVect vect() {return _vect;} 30014184Sgabeblack@google.com FaultStat & countStat() {return _count;} 30114184Sgabeblack@google.com}; 30214184Sgabeblack@google.com 30314184Sgabeblack@google.comclass UnimplementedOpcodeFault : public AlphaFault 30414184Sgabeblack@google.com{ 30514184Sgabeblack@google.com private: 30614184Sgabeblack@google.com static FaultName _name; 30714184Sgabeblack@google.com static FaultVect _vect; 30814184Sgabeblack@google.com static FaultStat _count; 30914184Sgabeblack@google.com public: 31014184Sgabeblack@google.com FaultName name() {return _name;} 31114184Sgabeblack@google.com FaultVect vect() {return _vect;} 31214184Sgabeblack@google.com FaultStat & countStat() {return _count;} 31314184Sgabeblack@google.com}; 31414184Sgabeblack@google.com 31514184Sgabeblack@google.comclass FloatEnableFault : public AlphaFault 31614184Sgabeblack@google.com{ 31714184Sgabeblack@google.com private: 31814184Sgabeblack@google.com static FaultName _name; 31914184Sgabeblack@google.com static FaultVect _vect; 32014184Sgabeblack@google.com static FaultStat _count; 32114184Sgabeblack@google.com public: 32214184Sgabeblack@google.com FaultName name() {return _name;} 32314184Sgabeblack@google.com FaultVect vect() {return _vect;} 32414184Sgabeblack@google.com FaultStat & countStat() {return _count;} 32514184Sgabeblack@google.com}; 32614184Sgabeblack@google.com 32714184Sgabeblack@google.comclass PalFault : public AlphaFault 32814184Sgabeblack@google.com{ 32914184Sgabeblack@google.com protected: 33014184Sgabeblack@google.com bool skipFaultingInstruction() {return true;} 33114184Sgabeblack@google.com private: 33214184Sgabeblack@google.com static FaultName _name; 33314184Sgabeblack@google.com static FaultVect _vect; 33414184Sgabeblack@google.com static FaultStat _count; 33514184Sgabeblack@google.com public: 33614184Sgabeblack@google.com FaultName name() {return _name;} 33714184Sgabeblack@google.com FaultVect vect() {return _vect;} 33814184Sgabeblack@google.com FaultStat & countStat() {return _count;} 33914184Sgabeblack@google.com}; 34014184Sgabeblack@google.com 34114184Sgabeblack@google.comclass IntegerOverflowFault : public AlphaFault 34214184Sgabeblack@google.com{ 34314184Sgabeblack@google.com private: 34414184Sgabeblack@google.com static FaultName _name; 34514184Sgabeblack@google.com static FaultVect _vect; 34614184Sgabeblack@google.com static FaultStat _count; 34714184Sgabeblack@google.com public: 34814184Sgabeblack@google.com FaultName name() {return _name;} 34914184Sgabeblack@google.com FaultVect vect() {return _vect;} 35014184Sgabeblack@google.com FaultStat & countStat() {return _count;} 35114184Sgabeblack@google.com}; 35214184Sgabeblack@google.com 35314184Sgabeblack@google.com} // AlphaISA namespace 35414184Sgabeblack@google.com 35514184Sgabeblack@google.com#endif // __FAULTS_HH__ 35614184Sgabeblack@google.com