faults.hh revision 8567
12131SN/A/* 25268Sksewell@umich.edu * Copyright (c) 2003-2005 The Regents of The University of Michigan 35224Sksewell@umich.edu * Copyright (c) 2007 MIPS Technologies, Inc. 45224Sksewell@umich.edu * All rights reserved. 52131SN/A * 65224Sksewell@umich.edu * Redistribution and use in source and binary forms, with or without 75224Sksewell@umich.edu * modification, are permitted provided that the following conditions are 85224Sksewell@umich.edu * met: redistributions of source code must retain the above copyright 95224Sksewell@umich.edu * notice, this list of conditions and the following disclaimer; 105224Sksewell@umich.edu * redistributions in binary form must reproduce the above copyright 115224Sksewell@umich.edu * notice, this list of conditions and the following disclaimer in the 125224Sksewell@umich.edu * documentation and/or other materials provided with the distribution; 135224Sksewell@umich.edu * neither the name of the copyright holders nor the names of its 145224Sksewell@umich.edu * contributors may be used to endorse or promote products derived from 155224Sksewell@umich.edu * this software without specific prior written permission. 162131SN/A * 175224Sksewell@umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 185224Sksewell@umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 195224Sksewell@umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 205224Sksewell@umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 215224Sksewell@umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 225224Sksewell@umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 235224Sksewell@umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 245224Sksewell@umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 255224Sksewell@umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 265224Sksewell@umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 275224Sksewell@umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 282665Ssaidi@eecs.umich.edu * 295224Sksewell@umich.edu * Authors: Gabe Black 305224Sksewell@umich.edu * Korey Sewell 315222Sksewell@umich.edu * Jaidev Patwardhan 322131SN/A */ 332131SN/A 342239SN/A#ifndef __MIPS_FAULTS_HH__ 352239SN/A#define __MIPS_FAULTS_HH__ 362131SN/A 372131SN/A#include "sim/faults.hh" 382447SN/A 392447SN/Anamespace MipsISA 402447SN/A{ 416378Sgblack@eecs.umich.edu 422447SN/Atypedef const Addr FaultVect; 432131SN/A 448566Sgblack@eecs.umich.educlass MipsFaultBase : public FaultBase 452131SN/A{ 462447SN/A protected: 472447SN/A virtual bool skipFaultingInstruction() {return false;} 482447SN/A virtual bool setRestartAddress() {return true;} 492131SN/A public: 508566Sgblack@eecs.umich.edu struct FaultVals 518566Sgblack@eecs.umich.edu { 528566Sgblack@eecs.umich.edu const FaultName name; 538566Sgblack@eecs.umich.edu const FaultVect vect; 548566Sgblack@eecs.umich.edu FaultStat count; 558566Sgblack@eecs.umich.edu }; 568566Sgblack@eecs.umich.edu 576379Sgblack@eecs.umich.edu Addr badVAddr; 586379Sgblack@eecs.umich.edu Addr entryHiAsid; 596379Sgblack@eecs.umich.edu Addr entryHiVPN2; 606379Sgblack@eecs.umich.edu Addr entryHiVPN2X; 616379Sgblack@eecs.umich.edu Addr contextBadVPN2; 622447SN/A#if FULL_SYSTEM 637678Sgblack@eecs.umich.edu void invoke(ThreadContext * tc, 647678Sgblack@eecs.umich.edu StaticInst::StaticInstPtr inst = StaticInst::nullStaticInstPtr) 657678Sgblack@eecs.umich.edu {} 666378Sgblack@eecs.umich.edu void setExceptionState(ThreadContext *, uint8_t); 676378Sgblack@eecs.umich.edu void setHandlerPC(Addr, ThreadContext *); 682447SN/A#endif 692131SN/A}; 702131SN/A 718566Sgblack@eecs.umich.edutemplate <typename T> 728566Sgblack@eecs.umich.educlass MipsFault : public MipsFaultBase 732131SN/A{ 748566Sgblack@eecs.umich.edu protected: 758566Sgblack@eecs.umich.edu static FaultVals vals; 762131SN/A public: 778566Sgblack@eecs.umich.edu FaultName name() const { return vals.name; } 788566Sgblack@eecs.umich.edu FaultVect vect() const { return vals.vect; } 798566Sgblack@eecs.umich.edu FaultStat & countStat() { return vals.count; } 808566Sgblack@eecs.umich.edu}; 818566Sgblack@eecs.umich.edu 828566Sgblack@eecs.umich.educlass MachineCheckFault : public MipsFault<MachineCheckFault> 838566Sgblack@eecs.umich.edu{ 848566Sgblack@eecs.umich.edu public: 855222Sksewell@umich.edu bool isMachineCheckFault() {return true;} 865222Sksewell@umich.edu}; 875222Sksewell@umich.edu 888566Sgblack@eecs.umich.educlass NonMaskableInterrupt : public MipsFault<NonMaskableInterrupt> 895222Sksewell@umich.edu{ 905222Sksewell@umich.edu public: 915222Sksewell@umich.edu bool isNonMaskableInterrupt() {return true;} 922447SN/A}; 932131SN/A 948566Sgblack@eecs.umich.educlass AlignmentFault : public MipsFault<AlignmentFault> 952131SN/A{ 962131SN/A public: 975222Sksewell@umich.edu bool isAlignmentFault() {return true;} 982447SN/A}; 992131SN/A 1008566Sgblack@eecs.umich.educlass AddressErrorFault : public MipsFault<AddressErrorFault> 1015222Sksewell@umich.edu{ 1025222Sksewell@umich.edu public: 1038567Sgblack@eecs.umich.edu AddressErrorFault(Addr vaddr) { badVAddr = vaddr; } 1045222Sksewell@umich.edu#if FULL_SYSTEM 1057678Sgblack@eecs.umich.edu void invoke(ThreadContext * tc, 1067678Sgblack@eecs.umich.edu StaticInstPtr inst = StaticInst::nullStaticInstPtr); 1075222Sksewell@umich.edu#endif 1085222Sksewell@umich.edu 1095222Sksewell@umich.edu}; 1106378Sgblack@eecs.umich.edu 1118566Sgblack@eecs.umich.educlass StoreAddressErrorFault : public MipsFault<StoreAddressErrorFault> 1125222Sksewell@umich.edu{ 1135222Sksewell@umich.edu public: 1148567Sgblack@eecs.umich.edu StoreAddressErrorFault(Addr vaddr) { badVAddr = vaddr; } 1155222Sksewell@umich.edu#if FULL_SYSTEM 1167678Sgblack@eecs.umich.edu void invoke(ThreadContext * tc, 1177678Sgblack@eecs.umich.edu StaticInstPtr inst = StaticInst::nullStaticInstPtr); 1185222Sksewell@umich.edu#endif 1196378Sgblack@eecs.umich.edu}; 1205222Sksewell@umich.edu 1218566Sgblack@eecs.umich.educlass UnimplementedOpcodeFault : public MipsFault<UnimplementedOpcodeFault> {}; 1228566Sgblack@eecs.umich.edu 1238566Sgblack@eecs.umich.educlass TLBRefillIFetchFault : public MipsFault<TLBRefillIFetchFault> 1244661Sksewell@umich.edu{ 1254661Sksewell@umich.edu public: 1267678Sgblack@eecs.umich.edu void invoke(ThreadContext * tc, 1277678Sgblack@eecs.umich.edu StaticInstPtr inst = StaticInst::nullStaticInstPtr); 1282447SN/A}; 1296378Sgblack@eecs.umich.edu 1308566Sgblack@eecs.umich.educlass TLBInvalidIFetchFault : public MipsFault<TLBInvalidIFetchFault> 1314661Sksewell@umich.edu{ 1324661Sksewell@umich.edu public: 1337678Sgblack@eecs.umich.edu void invoke(ThreadContext * tc, 1347678Sgblack@eecs.umich.edu StaticInstPtr inst = StaticInst::nullStaticInstPtr); 1354661Sksewell@umich.edu}; 1364661Sksewell@umich.edu 1378566Sgblack@eecs.umich.educlass NDtbMissFault : public MipsFault<NDtbMissFault> {}; 1388566Sgblack@eecs.umich.educlass PDtbMissFault : public MipsFault<PDtbMissFault> {}; 1398566Sgblack@eecs.umich.educlass DtbPageFault : public MipsFault<DtbPageFault> {}; 1408566Sgblack@eecs.umich.educlass DtbAcvFault : public MipsFault<DtbAcvFault> {}; 1415222Sksewell@umich.edu 1425222Sksewell@umich.edustatic inline Fault genMachineCheckFault() 1435222Sksewell@umich.edu{ 1445222Sksewell@umich.edu return new MachineCheckFault; 1455222Sksewell@umich.edu} 1465222Sksewell@umich.edu 1475222Sksewell@umich.edustatic inline Fault genAlignmentFault() 1485222Sksewell@umich.edu{ 1495222Sksewell@umich.edu return new AlignmentFault; 1505222Sksewell@umich.edu} 1515222Sksewell@umich.edu 1528566Sgblack@eecs.umich.educlass ResetFault : public MipsFault<ResetFault> 1535222Sksewell@umich.edu{ 1545222Sksewell@umich.edu public: 1557678Sgblack@eecs.umich.edu void invoke(ThreadContext * tc, 1567678Sgblack@eecs.umich.edu StaticInstPtr inst = StaticInst::nullStaticInstPtr); 1575222Sksewell@umich.edu 1585222Sksewell@umich.edu}; 1596378Sgblack@eecs.umich.edu 1608566Sgblack@eecs.umich.educlass SystemCallFault : public MipsFault<SystemCallFault> 1615222Sksewell@umich.edu{ 1625222Sksewell@umich.edu public: 1638563Sgblack@eecs.umich.edu#if FULL_SYSTEM 1647678Sgblack@eecs.umich.edu void invoke(ThreadContext * tc, 1657678Sgblack@eecs.umich.edu StaticInstPtr inst = StaticInst::nullStaticInstPtr); 1668563Sgblack@eecs.umich.edu#endif 1675222Sksewell@umich.edu}; 1685222Sksewell@umich.edu 1698566Sgblack@eecs.umich.educlass SoftResetFault : public MipsFault<SoftResetFault> 1705222Sksewell@umich.edu{ 1715222Sksewell@umich.edu public: 1727678Sgblack@eecs.umich.edu void invoke(ThreadContext * tc, 1737678Sgblack@eecs.umich.edu StaticInstPtr inst = StaticInst::nullStaticInstPtr); 1745222Sksewell@umich.edu}; 1756378Sgblack@eecs.umich.edu 1768566Sgblack@eecs.umich.educlass DebugSingleStep : public MipsFault<DebugSingleStep> 1775222Sksewell@umich.edu{ 1785222Sksewell@umich.edu public: 1797678Sgblack@eecs.umich.edu void invoke(ThreadContext * tc, 1807678Sgblack@eecs.umich.edu StaticInstPtr inst = StaticInst::nullStaticInstPtr); 1815222Sksewell@umich.edu}; 1826378Sgblack@eecs.umich.edu 1838566Sgblack@eecs.umich.educlass DebugInterrupt : public MipsFault<DebugInterrupt> 1845222Sksewell@umich.edu{ 1855222Sksewell@umich.edu public: 1867678Sgblack@eecs.umich.edu void invoke(ThreadContext * tc, 1877678Sgblack@eecs.umich.edu StaticInstPtr inst = StaticInst::nullStaticInstPtr); 1885222Sksewell@umich.edu}; 1895222Sksewell@umich.edu 1908566Sgblack@eecs.umich.educlass CoprocessorUnusableFault : public MipsFault<CoprocessorUnusableFault> 1915222Sksewell@umich.edu{ 1928566Sgblack@eecs.umich.edu protected: 1935222Sksewell@umich.edu int coProcID; 1945222Sksewell@umich.edu public: 1958566Sgblack@eecs.umich.edu CoprocessorUnusableFault(int _procid) : coProcID(_procid) 1968566Sgblack@eecs.umich.edu {} 1975222Sksewell@umich.edu 1987678Sgblack@eecs.umich.edu void invoke(ThreadContext * tc, 1997678Sgblack@eecs.umich.edu StaticInstPtr inst = StaticInst::nullStaticInstPtr); 2005222Sksewell@umich.edu}; 2015222Sksewell@umich.edu 2028566Sgblack@eecs.umich.educlass ReservedInstructionFault : public MipsFault<ReservedInstructionFault> 2035222Sksewell@umich.edu{ 2045222Sksewell@umich.edu public: 2057678Sgblack@eecs.umich.edu void invoke(ThreadContext * tc, 2067678Sgblack@eecs.umich.edu StaticInstPtr inst = StaticInst::nullStaticInstPtr); 2075222Sksewell@umich.edu}; 2085222Sksewell@umich.edu 2098566Sgblack@eecs.umich.educlass ThreadFault : public MipsFault<ThreadFault> 2108566Sgblack@eecs.umich.edu{ 2118566Sgblack@eecs.umich.edu public: 2128566Sgblack@eecs.umich.edu void invoke(ThreadContext * tc, 2138566Sgblack@eecs.umich.edu StaticInstPtr inst = StaticInst::nullStaticInstPtr); 2148566Sgblack@eecs.umich.edu}; 2158566Sgblack@eecs.umich.edu 2168566Sgblack@eecs.umich.educlass ArithmeticFault : public MipsFault<ArithmeticFault> 2175222Sksewell@umich.edu{ 2185222Sksewell@umich.edu protected: 2195222Sksewell@umich.edu bool skipFaultingInstruction() {return true;} 2205222Sksewell@umich.edu public: 2215222Sksewell@umich.edu#if FULL_SYSTEM 2227678Sgblack@eecs.umich.edu void invoke(ThreadContext * tc, 2237678Sgblack@eecs.umich.edu StaticInstPtr inst = StaticInst::nullStaticInstPtr); 2245222Sksewell@umich.edu#endif 2255222Sksewell@umich.edu}; 2265222Sksewell@umich.edu 2278566Sgblack@eecs.umich.educlass InterruptFault : public MipsFault<InterruptFault> 2285222Sksewell@umich.edu{ 2295222Sksewell@umich.edu protected: 2305222Sksewell@umich.edu bool setRestartAddress() {return false;} 2315222Sksewell@umich.edu public: 2325222Sksewell@umich.edu#if FULL_SYSTEM 2337678Sgblack@eecs.umich.edu void invoke(ThreadContext * tc, 2347678Sgblack@eecs.umich.edu StaticInstPtr inst = StaticInst::nullStaticInstPtr); 2355222Sksewell@umich.edu#endif 2365222Sksewell@umich.edu}; 2375222Sksewell@umich.edu 2388566Sgblack@eecs.umich.educlass TrapFault : public MipsFault<TrapFault> 2395222Sksewell@umich.edu{ 2405222Sksewell@umich.edu public: 2415222Sksewell@umich.edu#if FULL_SYSTEM 2427678Sgblack@eecs.umich.edu void invoke(ThreadContext * tc, 2437678Sgblack@eecs.umich.edu StaticInstPtr inst = StaticInst::nullStaticInstPtr); 2445222Sksewell@umich.edu#endif 2455222Sksewell@umich.edu}; 2465222Sksewell@umich.edu 2478566Sgblack@eecs.umich.educlass BreakpointFault : public MipsFault<BreakpointFault> 2485222Sksewell@umich.edu{ 2495222Sksewell@umich.edu public: 2505222Sksewell@umich.edu#if FULL_SYSTEM 2517678Sgblack@eecs.umich.edu void invoke(ThreadContext * tc, 2527678Sgblack@eecs.umich.edu StaticInstPtr inst = StaticInst::nullStaticInstPtr); 2535222Sksewell@umich.edu#endif 2545222Sksewell@umich.edu}; 2555222Sksewell@umich.edu 2568566Sgblack@eecs.umich.educlass ItbRefillFault : public MipsFault<ItbRefillFault> 2575222Sksewell@umich.edu{ 2585222Sksewell@umich.edu public: 2598567Sgblack@eecs.umich.edu ItbRefillFault(Addr asid, Addr vaddr, Addr vpn) 2608567Sgblack@eecs.umich.edu { 2618567Sgblack@eecs.umich.edu entryHiAsid = asid; 2628567Sgblack@eecs.umich.edu entryHiVPN2 = vpn >> 2; 2638567Sgblack@eecs.umich.edu entryHiVPN2X = vpn & 0x3; 2648567Sgblack@eecs.umich.edu badVAddr = vaddr; 2658567Sgblack@eecs.umich.edu contextBadVPN2 = vpn >> 2; 2668567Sgblack@eecs.umich.edu } 2675222Sksewell@umich.edu#if FULL_SYSTEM 2687678Sgblack@eecs.umich.edu void invoke(ThreadContext * tc, 2697678Sgblack@eecs.umich.edu StaticInstPtr inst = StaticInst::nullStaticInstPtr); 2705222Sksewell@umich.edu#endif 2715222Sksewell@umich.edu}; 2726378Sgblack@eecs.umich.edu 2738566Sgblack@eecs.umich.educlass DtbRefillFault : public MipsFault<DtbRefillFault> 2745222Sksewell@umich.edu{ 2755222Sksewell@umich.edu public: 2768567Sgblack@eecs.umich.edu DtbRefillFault(Addr asid, Addr vaddr, Addr vpn) 2778567Sgblack@eecs.umich.edu { 2788567Sgblack@eecs.umich.edu entryHiAsid = asid; 2798567Sgblack@eecs.umich.edu entryHiVPN2 = vpn >> 2; 2808567Sgblack@eecs.umich.edu entryHiVPN2X = vpn & 0x3; 2818567Sgblack@eecs.umich.edu badVAddr = vaddr; 2828567Sgblack@eecs.umich.edu contextBadVPN2 = vpn >> 2; 2838567Sgblack@eecs.umich.edu } 2845222Sksewell@umich.edu#if FULL_SYSTEM 2857678Sgblack@eecs.umich.edu void invoke(ThreadContext * tc, 2867678Sgblack@eecs.umich.edu StaticInstPtr inst = StaticInst::nullStaticInstPtr); 2875222Sksewell@umich.edu#endif 2885222Sksewell@umich.edu}; 2895222Sksewell@umich.edu 2908566Sgblack@eecs.umich.educlass ItbPageFault : public MipsFault<ItbPageFault> 2915222Sksewell@umich.edu{ 2925222Sksewell@umich.edu public: 2935222Sksewell@umich.edu#if FULL_SYSTEM 2947678Sgblack@eecs.umich.edu void invoke(ThreadContext * tc, 2957678Sgblack@eecs.umich.edu StaticInstPtr inst = StaticInst::nullStaticInstPtr); 2965222Sksewell@umich.edu#endif 2975222Sksewell@umich.edu}; 2985222Sksewell@umich.edu 2998566Sgblack@eecs.umich.educlass ItbInvalidFault : public MipsFault<ItbInvalidFault> 3005222Sksewell@umich.edu{ 3015222Sksewell@umich.edu public: 3028567Sgblack@eecs.umich.edu ItbInvalidFault(Addr asid, Addr vaddr, Addr vpn) 3038567Sgblack@eecs.umich.edu { 3048567Sgblack@eecs.umich.edu entryHiAsid = asid; 3058567Sgblack@eecs.umich.edu entryHiVPN2 = vpn >> 2; 3068567Sgblack@eecs.umich.edu entryHiVPN2X = vpn & 0x3; 3078567Sgblack@eecs.umich.edu badVAddr = vaddr; 3088567Sgblack@eecs.umich.edu contextBadVPN2 = vpn >> 2; 3098567Sgblack@eecs.umich.edu } 3105222Sksewell@umich.edu#if FULL_SYSTEM 3117678Sgblack@eecs.umich.edu void invoke(ThreadContext * tc, 3127678Sgblack@eecs.umich.edu StaticInstPtr inst = StaticInst::nullStaticInstPtr); 3135222Sksewell@umich.edu#endif 3146378Sgblack@eecs.umich.edu}; 3155222Sksewell@umich.edu 3168566Sgblack@eecs.umich.educlass TLBModifiedFault : public MipsFault<TLBModifiedFault> 3175222Sksewell@umich.edu{ 3185222Sksewell@umich.edu public: 3198567Sgblack@eecs.umich.edu TLBModifiedFault(Addr asid, Addr vaddr, Addr vpn) 3208567Sgblack@eecs.umich.edu { 3218567Sgblack@eecs.umich.edu entryHiAsid = asid; 3228567Sgblack@eecs.umich.edu entryHiVPN2 = vpn >> 2; 3238567Sgblack@eecs.umich.edu entryHiVPN2X = vpn & 0x3; 3248567Sgblack@eecs.umich.edu badVAddr = vaddr; 3258567Sgblack@eecs.umich.edu contextBadVPN2 = vpn >> 2; 3268567Sgblack@eecs.umich.edu } 3275222Sksewell@umich.edu#if FULL_SYSTEM 3287678Sgblack@eecs.umich.edu void invoke(ThreadContext * tc, 3297678Sgblack@eecs.umich.edu StaticInstPtr inst = StaticInst::nullStaticInstPtr); 3305222Sksewell@umich.edu#endif 3315222Sksewell@umich.edu}; 3325222Sksewell@umich.edu 3338566Sgblack@eecs.umich.educlass DtbInvalidFault : public MipsFault<DtbInvalidFault> 3345222Sksewell@umich.edu{ 3355222Sksewell@umich.edu public: 3368567Sgblack@eecs.umich.edu DtbInvalidFault(Addr asid, Addr vaddr, Addr vpn) 3378567Sgblack@eecs.umich.edu { 3388567Sgblack@eecs.umich.edu entryHiAsid = asid; 3398567Sgblack@eecs.umich.edu entryHiVPN2 = vpn >> 2; 3408567Sgblack@eecs.umich.edu entryHiVPN2X = vpn & 0x3; 3418567Sgblack@eecs.umich.edu badVAddr = vaddr; 3428567Sgblack@eecs.umich.edu contextBadVPN2 = vpn >> 2; 3438567Sgblack@eecs.umich.edu } 3445222Sksewell@umich.edu#if FULL_SYSTEM 3457678Sgblack@eecs.umich.edu void invoke(ThreadContext * tc, 3467678Sgblack@eecs.umich.edu StaticInst::StaticInstPtr inst = nullStaticInstPtr); 3475222Sksewell@umich.edu#endif 3485222Sksewell@umich.edu}; 3495222Sksewell@umich.edu 3508566Sgblack@eecs.umich.educlass FloatEnableFault : public MipsFault<FloatEnableFault> {}; 3518566Sgblack@eecs.umich.educlass ItbMissFault : public MipsFault<ItbMissFault> {}; 3528566Sgblack@eecs.umich.educlass ItbAcvFault : public MipsFault<ItbAcvFault> {}; 3538566Sgblack@eecs.umich.educlass IntegerOverflowFault : public MipsFault<IntegerOverflowFault> {}; 3548566Sgblack@eecs.umich.edu 3558566Sgblack@eecs.umich.educlass DspStateDisabledFault : public MipsFault<DspStateDisabledFault> 3565222Sksewell@umich.edu{ 3575222Sksewell@umich.edu public: 3587678Sgblack@eecs.umich.edu void invoke(ThreadContext * tc, 3597678Sgblack@eecs.umich.edu StaticInstPtr inst = StaticInst::nullStaticInstPtr); 3604661Sksewell@umich.edu}; 3614661Sksewell@umich.edu 3627811Ssteve.reinhardt@amd.com} // namespace MipsISA 3632131SN/A 3645222Sksewell@umich.edu#endif // __MIPS_FAULTS_HH__ 365