faults.hh revision 11294:a368064a2ab5
114039Sstacze01@arm.com/* 214039Sstacze01@arm.com * Copyright (c) 2003-2005 The Regents of The University of Michigan 314039Sstacze01@arm.com * All rights reserved. 414039Sstacze01@arm.com * 514039Sstacze01@arm.com * Redistribution and use in source and binary forms, with or without 614039Sstacze01@arm.com * modification, are permitted provided that the following conditions are 714039Sstacze01@arm.com * met: redistributions of source code must retain the above copyright 814039Sstacze01@arm.com * notice, this list of conditions and the following disclaimer; 914039Sstacze01@arm.com * redistributions in binary form must reproduce the above copyright 1014039Sstacze01@arm.com * notice, this list of conditions and the following disclaimer in the 1114039Sstacze01@arm.com * documentation and/or other materials provided with the distribution; 1214039Sstacze01@arm.com * neither the name of the copyright holders nor the names of its 1314039Sstacze01@arm.com * contributors may be used to endorse or promote products derived from 1414039Sstacze01@arm.com * this software without specific prior written permission. 1514039Sstacze01@arm.com * 1614039Sstacze01@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1714039Sstacze01@arm.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1814039Sstacze01@arm.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1914039Sstacze01@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2014039Sstacze01@arm.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2114039Sstacze01@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2214039Sstacze01@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2314039Sstacze01@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2414039Sstacze01@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2514039Sstacze01@arm.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2614039Sstacze01@arm.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2714039Sstacze01@arm.com * 2814039Sstacze01@arm.com * Authors: Gabe Black 2914039Sstacze01@arm.com * Kevin Lim 3014039Sstacze01@arm.com */ 3114039Sstacze01@arm.com 3214039Sstacze01@arm.com#ifndef __ARCH_ALPHA_FAULTS_HH__ 3314039Sstacze01@arm.com#define __ARCH_ALPHA_FAULTS_HH__ 3414039Sstacze01@arm.com 3514039Sstacze01@arm.com#include "arch/alpha/pagetable.hh" 3614039Sstacze01@arm.com#include "mem/request.hh" 3714039Sstacze01@arm.com#include "sim/faults.hh" 3814039Sstacze01@arm.com 3914039Sstacze01@arm.com// The design of the "name" and "vect" functions is in sim/faults.hh 4014039Sstacze01@arm.com 4114039Sstacze01@arm.comnamespace AlphaISA { 4214039Sstacze01@arm.com 4314039Sstacze01@arm.comtypedef Addr FaultVect; 4414039Sstacze01@arm.com 4514039Sstacze01@arm.comclass AlphaFault : public FaultBase 4614039Sstacze01@arm.com{ 4714039Sstacze01@arm.com protected: 4814039Sstacze01@arm.com virtual bool skipFaultingInstruction() {return false;} 4914039Sstacze01@arm.com virtual bool setRestartAddress() {return true;} 5014039Sstacze01@arm.com public: 5114039Sstacze01@arm.com virtual ~AlphaFault() {} 5214039Sstacze01@arm.com void invoke(ThreadContext * tc, const StaticInstPtr &inst = 5314039Sstacze01@arm.com StaticInst::nullStaticInstPtr); 5414039Sstacze01@arm.com virtual FaultVect vect() = 0; 5514039Sstacze01@arm.com virtual FaultStat & countStat() = 0; 5614039Sstacze01@arm.com}; 5714039Sstacze01@arm.com 5814039Sstacze01@arm.comclass MachineCheckFault : public AlphaFault 5914039Sstacze01@arm.com{ 6014039Sstacze01@arm.com private: 6114039Sstacze01@arm.com static FaultName _name; 6214039Sstacze01@arm.com static FaultVect _vect; 6314039Sstacze01@arm.com static FaultStat _count; 6414039Sstacze01@arm.com 6514039Sstacze01@arm.com public: 6614039Sstacze01@arm.com FaultName name() const {return _name;} 6714039Sstacze01@arm.com FaultVect vect() {return _vect;} 6814039Sstacze01@arm.com FaultStat & countStat() {return _count;} 6914039Sstacze01@arm.com}; 7014039Sstacze01@arm.com 7114039Sstacze01@arm.comclass AlignmentFault : public AlphaFault 7214039Sstacze01@arm.com{ 7314039Sstacze01@arm.com private: 7414039Sstacze01@arm.com static FaultName _name; 7514039Sstacze01@arm.com static FaultVect _vect; 7614039Sstacze01@arm.com static FaultStat _count; 7714039Sstacze01@arm.com 7814039Sstacze01@arm.com public: 7914039Sstacze01@arm.com FaultName name() const {return _name;} 8014039Sstacze01@arm.com FaultVect vect() {return _vect;} 8114039Sstacze01@arm.com FaultStat & countStat() {return _count;} 8214039Sstacze01@arm.com bool isAlignmentFault() const {return true;} 8314039Sstacze01@arm.com}; 8414039Sstacze01@arm.com 8514039Sstacze01@arm.comclass ResetFault : public AlphaFault 8614039Sstacze01@arm.com{ 8714039Sstacze01@arm.com private: 8814039Sstacze01@arm.com static FaultName _name; 8914039Sstacze01@arm.com static FaultVect _vect; 9014039Sstacze01@arm.com static FaultStat _count; 9114039Sstacze01@arm.com 9214039Sstacze01@arm.com public: 9314039Sstacze01@arm.com FaultName name() const {return _name;} 9414039Sstacze01@arm.com FaultVect vect() {return _vect;} 9514039Sstacze01@arm.com FaultStat & countStat() {return _count;} 9614039Sstacze01@arm.com}; 9714039Sstacze01@arm.com 9814039Sstacze01@arm.comclass ArithmeticFault : public AlphaFault 9914039Sstacze01@arm.com{ 10014039Sstacze01@arm.com private: 10114039Sstacze01@arm.com static FaultName _name; 10214039Sstacze01@arm.com static FaultVect _vect; 10314039Sstacze01@arm.com static FaultStat _count; 10414039Sstacze01@arm.com 10514039Sstacze01@arm.com protected: 10614039Sstacze01@arm.com bool skipFaultingInstruction() {return true;} 10714039Sstacze01@arm.com 10814039Sstacze01@arm.com public: 10914039Sstacze01@arm.com FaultName name() const {return _name;} 11014039Sstacze01@arm.com FaultVect vect() {return _vect;} 11114039Sstacze01@arm.com FaultStat & countStat() {return _count;} 11214039Sstacze01@arm.com void invoke(ThreadContext * tc, const StaticInstPtr &inst = 11314039Sstacze01@arm.com StaticInst::nullStaticInstPtr); 11414039Sstacze01@arm.com}; 11514039Sstacze01@arm.com 11614039Sstacze01@arm.comclass InterruptFault : public AlphaFault 11714039Sstacze01@arm.com{ 11814039Sstacze01@arm.com private: 11914039Sstacze01@arm.com static FaultName _name; 12014039Sstacze01@arm.com static FaultVect _vect; 12114039Sstacze01@arm.com static FaultStat _count; 12214039Sstacze01@arm.com 12314039Sstacze01@arm.com protected: 12414039Sstacze01@arm.com bool setRestartAddress() {return false;} 12514039Sstacze01@arm.com 12614039Sstacze01@arm.com public: 12714039Sstacze01@arm.com FaultName name() const {return _name;} 12814039Sstacze01@arm.com FaultVect vect() {return _vect;} 12914039Sstacze01@arm.com FaultStat & countStat() {return _count;} 13014039Sstacze01@arm.com}; 13114039Sstacze01@arm.com 13214039Sstacze01@arm.comclass DtbFault : public AlphaFault 13314039Sstacze01@arm.com{ 13414039Sstacze01@arm.com protected: 13514039Sstacze01@arm.com VAddr vaddr; 13614039Sstacze01@arm.com Request::Flags reqFlags; 13714039Sstacze01@arm.com uint64_t flags; 13814039Sstacze01@arm.com 13914039Sstacze01@arm.com public: 14014039Sstacze01@arm.com DtbFault(VAddr _vaddr, Request::Flags _reqFlags, uint64_t _flags) 14114039Sstacze01@arm.com : vaddr(_vaddr), reqFlags(_reqFlags), flags(_flags) 14214039Sstacze01@arm.com { } 14314039Sstacze01@arm.com FaultName name() const = 0; 14414039Sstacze01@arm.com FaultVect vect() = 0; 14514039Sstacze01@arm.com FaultStat & countStat() = 0; 14614039Sstacze01@arm.com void invoke(ThreadContext * tc, const StaticInstPtr &inst = 14714039Sstacze01@arm.com StaticInst::nullStaticInstPtr); 14814039Sstacze01@arm.com}; 14914039Sstacze01@arm.com 15014039Sstacze01@arm.comclass NDtbMissFault : public DtbFault 15114039Sstacze01@arm.com{ 15214039Sstacze01@arm.com private: 15314039Sstacze01@arm.com static FaultName _name; 15414039Sstacze01@arm.com static FaultVect _vect; 15514039Sstacze01@arm.com static FaultStat _count; 15614039Sstacze01@arm.com 15714039Sstacze01@arm.com public: 15814039Sstacze01@arm.com NDtbMissFault(VAddr vaddr, Request::Flags reqFlags, uint64_t flags) 15914039Sstacze01@arm.com : DtbFault(vaddr, reqFlags, flags) 16014039Sstacze01@arm.com { } 16114039Sstacze01@arm.com FaultName name() const {return _name;} 16214039Sstacze01@arm.com FaultVect vect() {return _vect;} 16314039Sstacze01@arm.com FaultStat & countStat() {return _count;} 16414039Sstacze01@arm.com void invoke(ThreadContext * tc, const StaticInstPtr &inst = 16514039Sstacze01@arm.com StaticInst::nullStaticInstPtr); 16614039Sstacze01@arm.com}; 16714039Sstacze01@arm.com 16814039Sstacze01@arm.comclass PDtbMissFault : public DtbFault 16914039Sstacze01@arm.com{ 17014039Sstacze01@arm.com private: 17114039Sstacze01@arm.com static FaultName _name; 17214039Sstacze01@arm.com static FaultVect _vect; 17314039Sstacze01@arm.com static FaultStat _count; 17414039Sstacze01@arm.com 17514039Sstacze01@arm.com public: 17614039Sstacze01@arm.com PDtbMissFault(VAddr vaddr, Request::Flags reqFlags, uint64_t flags) 17714039Sstacze01@arm.com : DtbFault(vaddr, reqFlags, flags) 17814039Sstacze01@arm.com { } 17914039Sstacze01@arm.com FaultName name() const {return _name;} 18014039Sstacze01@arm.com FaultVect vect() {return _vect;} 18114039Sstacze01@arm.com FaultStat & countStat() {return _count;} 18214039Sstacze01@arm.com}; 18314039Sstacze01@arm.com 18414039Sstacze01@arm.comclass DtbPageFault : public DtbFault 18514039Sstacze01@arm.com{ 18614039Sstacze01@arm.com private: 18714039Sstacze01@arm.com static FaultName _name; 18814039Sstacze01@arm.com static FaultVect _vect; 18914039Sstacze01@arm.com static FaultStat _count; 19014039Sstacze01@arm.com 19114039Sstacze01@arm.com public: 19214039Sstacze01@arm.com DtbPageFault(VAddr vaddr, Request::Flags reqFlags, uint64_t flags) 19314039Sstacze01@arm.com : DtbFault(vaddr, reqFlags, flags) 19414039Sstacze01@arm.com { } 19514039Sstacze01@arm.com FaultName name() const {return _name;} 19614039Sstacze01@arm.com FaultVect vect() {return _vect;} 19714039Sstacze01@arm.com FaultStat & countStat() {return _count;} 19814039Sstacze01@arm.com}; 19914039Sstacze01@arm.com 20014039Sstacze01@arm.comclass DtbAcvFault : public DtbFault 20114039Sstacze01@arm.com{ 20214039Sstacze01@arm.com private: 20314039Sstacze01@arm.com static FaultName _name; 20414039Sstacze01@arm.com static FaultVect _vect; 20514039Sstacze01@arm.com static FaultStat _count; 20614039Sstacze01@arm.com 20714039Sstacze01@arm.com public: 20814039Sstacze01@arm.com DtbAcvFault(VAddr vaddr, Request::Flags reqFlags, uint64_t flags) 20914039Sstacze01@arm.com : DtbFault(vaddr, reqFlags, flags) 21014039Sstacze01@arm.com { } 21114039Sstacze01@arm.com FaultName name() const {return _name;} 21214039Sstacze01@arm.com FaultVect vect() {return _vect;} 21314039Sstacze01@arm.com FaultStat & countStat() {return _count;} 21414039Sstacze01@arm.com}; 21514039Sstacze01@arm.com 21614039Sstacze01@arm.comclass DtbAlignmentFault : public DtbFault 21714039Sstacze01@arm.com{ 21814039Sstacze01@arm.com private: 21914039Sstacze01@arm.com static FaultName _name; 22014039Sstacze01@arm.com static FaultVect _vect; 22114039Sstacze01@arm.com static FaultStat _count; 22214039Sstacze01@arm.com 22314039Sstacze01@arm.com public: 22414039Sstacze01@arm.com DtbAlignmentFault(VAddr vaddr, Request::Flags reqFlags, uint64_t flags) 22514039Sstacze01@arm.com : DtbFault(vaddr, reqFlags, flags) 22614039Sstacze01@arm.com { } 22714039Sstacze01@arm.com FaultName name() const {return _name;} 22814039Sstacze01@arm.com FaultVect vect() {return _vect;} 22914039Sstacze01@arm.com FaultStat & countStat() {return _count;} 23014039Sstacze01@arm.com}; 23114039Sstacze01@arm.com 23214039Sstacze01@arm.comclass ItbFault : public AlphaFault 23314039Sstacze01@arm.com{ 23414039Sstacze01@arm.com protected: 23514039Sstacze01@arm.com Addr pc; 23614039Sstacze01@arm.com 23714039Sstacze01@arm.com public: 23814039Sstacze01@arm.com ItbFault(Addr _pc) : pc(_pc) { } 23914039Sstacze01@arm.com FaultName name() const = 0; 24014039Sstacze01@arm.com FaultVect vect() = 0; 24114039Sstacze01@arm.com FaultStat & countStat() = 0; 24214039Sstacze01@arm.com void invoke(ThreadContext * tc, const StaticInstPtr &inst = 24314039Sstacze01@arm.com StaticInst::nullStaticInstPtr); 24414039Sstacze01@arm.com}; 24514039Sstacze01@arm.com 24614039Sstacze01@arm.comclass ItbPageFault : public ItbFault 24714039Sstacze01@arm.com{ 24814039Sstacze01@arm.com private: 24914039Sstacze01@arm.com static FaultName _name; 25014039Sstacze01@arm.com static FaultVect _vect; 25114039Sstacze01@arm.com static FaultStat _count; 25214039Sstacze01@arm.com 25314039Sstacze01@arm.com public: 25414039Sstacze01@arm.com ItbPageFault(Addr pc) : ItbFault(pc) { } 25514039Sstacze01@arm.com FaultName name() const {return _name;} 25614039Sstacze01@arm.com FaultVect vect() {return _vect;} 25714039Sstacze01@arm.com FaultStat & countStat() {return _count;} 25814039Sstacze01@arm.com void invoke(ThreadContext * tc, const StaticInstPtr &inst = 25914039Sstacze01@arm.com StaticInst::nullStaticInstPtr); 26014039Sstacze01@arm.com}; 26114039Sstacze01@arm.com 26214039Sstacze01@arm.comclass ItbAcvFault : public ItbFault 26314039Sstacze01@arm.com{ 26414039Sstacze01@arm.com private: 26514039Sstacze01@arm.com static FaultName _name; 26614039Sstacze01@arm.com static FaultVect _vect; 26714039Sstacze01@arm.com static FaultStat _count; 26814039Sstacze01@arm.com 26914039Sstacze01@arm.com public: 27014039Sstacze01@arm.com ItbAcvFault(Addr pc) : ItbFault(pc) { } 27114039Sstacze01@arm.com FaultName name() const {return _name;} 27214039Sstacze01@arm.com FaultVect vect() {return _vect;} 27314039Sstacze01@arm.com FaultStat & countStat() {return _count;} 27414039Sstacze01@arm.com}; 27514039Sstacze01@arm.com 27614039Sstacze01@arm.comclass UnimplementedOpcodeFault : public AlphaFault 27714039Sstacze01@arm.com{ 27814039Sstacze01@arm.com private: 27914039Sstacze01@arm.com static FaultName _name; 28014039Sstacze01@arm.com static FaultVect _vect; 28114039Sstacze01@arm.com static FaultStat _count; 28214039Sstacze01@arm.com 28314039Sstacze01@arm.com public: 28414039Sstacze01@arm.com FaultName name() const {return _name;} 28514039Sstacze01@arm.com FaultVect vect() {return _vect;} 28614039Sstacze01@arm.com FaultStat & countStat() {return _count;} 28714039Sstacze01@arm.com}; 28814039Sstacze01@arm.com 28914039Sstacze01@arm.comclass FloatEnableFault : public AlphaFault 29014039Sstacze01@arm.com{ 29114039Sstacze01@arm.com private: 29214039Sstacze01@arm.com static FaultName _name; 29314039Sstacze01@arm.com static FaultVect _vect; 29414039Sstacze01@arm.com static FaultStat _count; 29514039Sstacze01@arm.com 29614039Sstacze01@arm.com public: 29714039Sstacze01@arm.com FaultName name() const {return _name;} 29814039Sstacze01@arm.com FaultVect vect() {return _vect;} 29914039Sstacze01@arm.com FaultStat & countStat() {return _count;} 30014039Sstacze01@arm.com}; 30114039Sstacze01@arm.com 30214039Sstacze01@arm.comclass PalFault : public AlphaFault 30314039Sstacze01@arm.com{ 30414039Sstacze01@arm.com private: 30514039Sstacze01@arm.com static FaultName _name; 30614039Sstacze01@arm.com static FaultVect _vect; 30714039Sstacze01@arm.com static FaultStat _count; 30814039Sstacze01@arm.com 30914039Sstacze01@arm.com protected: 31014039Sstacze01@arm.com bool skipFaultingInstruction() {return true;} 31114039Sstacze01@arm.com 31214039Sstacze01@arm.com public: 31314039Sstacze01@arm.com FaultName name() const {return _name;} 31414039Sstacze01@arm.com FaultVect vect() {return _vect;} 31514039Sstacze01@arm.com FaultStat & countStat() {return _count;} 31614039Sstacze01@arm.com}; 317 318class IntegerOverflowFault : public AlphaFault 319{ 320 private: 321 static FaultName _name; 322 static FaultVect _vect; 323 static FaultStat _count; 324 325 public: 326 FaultName name() const {return _name;} 327 FaultVect vect() {return _vect;} 328 FaultStat & countStat() {return _count;} 329}; 330 331} // namespace AlphaISA 332 333#endif // __ARCH_ALPHA_FAULTS_HH__ 334