faults.hh revision 8576:d8cca7565744
1/* 2 * Copyright (c) 2003-2005 The Regents of The University of Michigan 3 * Copyright (c) 2007 MIPS Technologies, Inc. 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions are 8 * met: redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer; 10 * redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution; 13 * neither the name of the copyright holders nor the names of its 14 * contributors may be used to endorse or promote products derived from 15 * this software without specific prior written permission. 16 * 17 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 18 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 19 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 20 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 21 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 22 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 23 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 24 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 27 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 * 29 * Authors: Gabe Black 30 * Korey Sewell 31 * Jaidev Patwardhan 32 */ 33 34#ifndef __MIPS_FAULTS_HH__ 35#define __MIPS_FAULTS_HH__ 36 37#include "arch/mips/pra_constants.hh" 38#include "cpu/thread_context.hh" 39#include "debug/MipsPRA.hh" 40#include "sim/faults.hh" 41 42namespace MipsISA 43{ 44 45typedef const Addr FaultVect; 46 47class MipsFaultBase : public FaultBase 48{ 49 public: 50 struct FaultVals 51 { 52 const FaultName name; 53 const FaultVect vect; 54 }; 55 56#if FULL_SYSTEM 57 void invoke(ThreadContext * tc, 58 StaticInst::StaticInstPtr inst = StaticInst::nullStaticInstPtr) 59 {} 60 void setHandlerPC(Addr, ThreadContext *); 61#endif 62 void setExceptionState(ThreadContext *, uint8_t); 63}; 64 65template <typename T> 66class MipsFault : public MipsFaultBase 67{ 68 protected: 69 static FaultVals vals; 70 public: 71 FaultName name() const { return vals.name; } 72 FaultVect vect() const { return vals.vect; } 73}; 74 75template <typename T> 76class AddressFault : public MipsFault<T> 77{ 78 protected: 79 Addr vaddr; 80 bool store; 81 82 AddressFault(Addr _vaddr, bool _store) : vaddr(_vaddr), store(_store) 83 {} 84}; 85 86template <typename T> 87class TlbFault : public AddressFault<T> 88{ 89 protected: 90 Addr asid; 91 Addr vpn; 92 93 TlbFault(Addr _asid, Addr _vaddr, Addr _vpn, bool _store) : 94 AddressFault<T>(_vaddr, _store), asid(_asid), vpn(_vpn) 95 {} 96 97 void 98 setTlbExceptionState(ThreadContext *tc, uint8_t excCode) 99 { 100 DPRINTF(MipsPRA, "%s encountered.\n", name()); 101 this->setExceptionState(tc, excCode); 102 103 tc->setMiscRegNoEffect(MISCREG_BADVADDR, this->vaddr); 104 EntryHiReg entryHi = tc->readMiscReg(MISCREG_ENTRYHI); 105 entryHi.asid = this->asid; 106 entryHi.vpn2 = this->vpn >> 2; 107 entryHi.vpn2x = this->vpn & 0x3; 108 tc->setMiscRegNoEffect(MISCREG_ENTRYHI, entryHi); 109 110 ContextReg context = tc->readMiscReg(MISCREG_CONTEXT); 111 context.badVPN2 = this->vpn >> 2; 112 tc->setMiscRegNoEffect(MISCREG_CONTEXT, context); 113 } 114}; 115 116class MachineCheckFault : public MipsFault<MachineCheckFault> 117{ 118 public: 119 bool isMachineCheckFault() {return true;} 120}; 121 122static inline Fault genMachineCheckFault() 123{ 124 return new MachineCheckFault; 125} 126 127class NonMaskableInterrupt : public MipsFault<NonMaskableInterrupt> 128{ 129 public: 130 bool isNonMaskableInterrupt() {return true;} 131}; 132 133class AddressErrorFault : public AddressFault<AddressErrorFault> 134{ 135 public: 136 AddressErrorFault(Addr _vaddr, bool _store) : 137 AddressFault<AddressErrorFault>(_vaddr, _store) 138 {} 139#if FULL_SYSTEM 140 void invoke(ThreadContext * tc, 141 StaticInstPtr inst = StaticInst::nullStaticInstPtr); 142#endif 143 144}; 145 146class ResetFault : public MipsFault<ResetFault> 147{ 148 public: 149 void invoke(ThreadContext * tc, 150 StaticInstPtr inst = StaticInst::nullStaticInstPtr); 151 152}; 153 154class SystemCallFault : public MipsFault<SystemCallFault> 155{ 156 public: 157#if FULL_SYSTEM 158 void invoke(ThreadContext * tc, 159 StaticInstPtr inst = StaticInst::nullStaticInstPtr); 160#endif 161}; 162 163class SoftResetFault : public MipsFault<SoftResetFault> 164{ 165 public: 166 void invoke(ThreadContext * tc, 167 StaticInstPtr inst = StaticInst::nullStaticInstPtr); 168}; 169 170class CoprocessorUnusableFault : public MipsFault<CoprocessorUnusableFault> 171{ 172 protected: 173 int coProcID; 174 public: 175 CoprocessorUnusableFault(int _procid) : coProcID(_procid) 176 {} 177 178 void invoke(ThreadContext * tc, 179 StaticInstPtr inst = StaticInst::nullStaticInstPtr); 180}; 181 182class ReservedInstructionFault : public MipsFault<ReservedInstructionFault> 183{ 184 public: 185 void invoke(ThreadContext * tc, 186 StaticInstPtr inst = StaticInst::nullStaticInstPtr); 187}; 188 189class ThreadFault : public MipsFault<ThreadFault> 190{ 191 public: 192 void invoke(ThreadContext * tc, 193 StaticInstPtr inst = StaticInst::nullStaticInstPtr); 194}; 195 196class IntegerOverflowFault : public MipsFault<IntegerOverflowFault> 197{ 198 public: 199#if FULL_SYSTEM 200 void invoke(ThreadContext * tc, 201 StaticInstPtr inst = StaticInst::nullStaticInstPtr); 202#endif 203}; 204 205class InterruptFault : public MipsFault<InterruptFault> 206{ 207 public: 208#if FULL_SYSTEM 209 void invoke(ThreadContext * tc, 210 StaticInstPtr inst = StaticInst::nullStaticInstPtr); 211#endif 212}; 213 214class TrapFault : public MipsFault<TrapFault> 215{ 216 public: 217#if FULL_SYSTEM 218 void invoke(ThreadContext * tc, 219 StaticInstPtr inst = StaticInst::nullStaticInstPtr); 220#endif 221}; 222 223class BreakpointFault : public MipsFault<BreakpointFault> 224{ 225 public: 226#if FULL_SYSTEM 227 void invoke(ThreadContext * tc, 228 StaticInstPtr inst = StaticInst::nullStaticInstPtr); 229#endif 230}; 231 232class TlbRefillFault : public TlbFault<TlbRefillFault> 233{ 234 public: 235 TlbRefillFault(Addr asid, Addr vaddr, Addr vpn, bool store) : 236 TlbFault<TlbRefillFault>(asid, vaddr, vpn, store) 237 {} 238#if FULL_SYSTEM 239 void invoke(ThreadContext * tc, 240 StaticInstPtr inst = StaticInst::nullStaticInstPtr); 241#endif 242}; 243 244class TlbInvalidFault : public TlbFault<TlbInvalidFault> 245{ 246 public: 247 TlbInvalidFault(Addr asid, Addr vaddr, Addr vpn, bool store) : 248 TlbFault<TlbInvalidFault>(asid, vaddr, vpn, store) 249 {} 250#if FULL_SYSTEM 251 void invoke(ThreadContext * tc, 252 StaticInstPtr inst = StaticInst::nullStaticInstPtr); 253#endif 254}; 255 256class TlbModifiedFault : public TlbFault<TlbModifiedFault> 257{ 258 public: 259 TlbModifiedFault(Addr asid, Addr vaddr, Addr vpn) : 260 TlbFault<TlbModifiedFault>(asid, vaddr, vpn, false) 261 {} 262#if FULL_SYSTEM 263 void invoke(ThreadContext * tc, 264 StaticInstPtr inst = StaticInst::nullStaticInstPtr); 265#endif 266}; 267 268class DspStateDisabledFault : public MipsFault<DspStateDisabledFault> 269{ 270 public: 271 void invoke(ThreadContext * tc, 272 StaticInstPtr inst = StaticInst::nullStaticInstPtr); 273}; 274 275} // namespace MipsISA 276 277#endif // __MIPS_FAULTS_HH__ 278