2 * Copyright
\eN) 2007 MIPS Technologies, Inc. All Rights Reserved
4 * This software is part of the M5 simulator.
6 * THIS IS A LEGAL AGREEMENT. BY DOWNLOADING, USING, COPYING, CREATING
7 * DERIVATIVE WORKS, AND/OR DISTRIBUTING THIS SOFTWARE YOU ARE AGREEING
8 * TO THESE TERMS AND CONDITIONS.
10 * Permission is granted to use, copy, create derivative works and
11 * distribute this software and such derivative works for any purpose,
12 * so long as (1) the copyright notice above, this grant of permission,
13 * and the disclaimer below appear in all copies and derivative works
14 * made, (2) the copyright notice above is augmented as appropriate to
15 * reflect the addition of any new copyrightable work in a derivative
16 * work (e.g., Copyright
\eN) <Publication Year> Copyright Owner), and (3)
17 * the name of MIPS Technologies, Inc. (
\e$(B!H
\e(BMIPS
\e$(B!I
\e(B) is not used in any
18 * advertising or publicity pertaining to the use or distribution of
19 * this software without specific, written prior authorization.
21 * THIS SOFTWARE IS PROVIDED
\e$(B!H
\e(BAS IS.
\e$(B!I
\e(B MIPS MAKES NO WARRANTIES AND
22 * DISCLAIMS ALL WARRANTIES, WHETHER EXPRESS, STATUTORY, IMPLIED OR
23 * OTHERWISE, INCLUDING BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
24 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND
25 * NON-INFRINGEMENT OF THIRD PARTY RIGHTS, REGARDING THIS SOFTWARE.
26 * IN NO EVENT SHALL MIPS BE LIABLE FOR ANY DAMAGES, INCLUDING DIRECT,
27 * INDIRECT, INCIDENTAL, CONSEQUENTIAL, SPECIAL, OR PUNITIVE DAMAGES OF
28 * ANY KIND OR NATURE, ARISING OUT OF OR IN CONNECTION WITH THIS AGREEMENT,
29 * THIS SOFTWARE AND/OR THE USE OF THIS SOFTWARE, WHETHER SUCH LIABILITY
30 * IS ASSERTED ON THE BASIS OF CONTRACT, TORT (INCLUDING NEGLIGENCE OR
31 * STRICT LIABILITY), OR OTHERWISE, EVEN IF MIPS HAS BEEN WARNED OF THE
32 * POSSIBILITY OF ANY SUCH LOSS OR DAMAGE IN ADVANCE.
34 * Authors: Gabe M. Black
39 #ifndef __MIPS_FAULTS_HH__
40 #define __MIPS_FAULTS_HH__
42 #include "sim/faults.hh"
44 // The design of the "name" and "vect" functions is in sim/faults.hh
48 typedef const Addr FaultVect;
50 class MipsFault : public FaultBase
53 virtual bool skipFaultingInstruction() {return false;}
54 virtual bool setRestartAddress() {return true;}
62 void invoke(ThreadContext * tc) {};
63 void setExceptionState(ThreadContext *,uint8_t);
64 void setHandlerPC(Addr,ThreadContext *);
66 virtual FaultVect vect() = 0;
67 virtual FaultStat & countStat() = 0;
70 class MachineCheckFault : public MipsFault
73 static FaultName _name;
74 static FaultVect _vect;
75 static FaultStat _count;
77 FaultName name() const {return _name;}
78 FaultVect vect() {return _vect;}
79 FaultStat & countStat() {return _count;}
80 bool isMachineCheckFault() {return true;}
83 class NonMaskableInterrupt : public MipsFault
86 static FaultName _name;
87 static FaultVect _vect;
88 static FaultStat _count;
90 FaultName name() const {return _name;}
91 FaultVect vect() {return _vect;}
92 FaultStat & countStat() {return _count;}
93 bool isNonMaskableInterrupt() {return true;}
96 class AlignmentFault : public MipsFault
99 static FaultName _name;
100 static FaultVect _vect;
101 static FaultStat _count;
103 FaultName name() const {return _name;}
104 FaultVect vect() {return _vect;}
105 FaultStat & countStat() {return _count;}
106 bool isAlignmentFault() {return true;}
109 class AddressErrorFault : public MipsFault
112 static FaultName _name;
113 static FaultVect _vect;
114 static FaultStat _count;
116 FaultName name() const {return _name;}
117 FaultVect vect() {return _vect;}
118 FaultStat & countStat() {return _count;}
120 void invoke(ThreadContext * tc);
124 class StoreAddressErrorFault : public MipsFault
127 static FaultName _name;
128 static FaultVect _vect;
129 static FaultStat _count;
131 FaultName name() const {return _name;}
132 FaultVect vect() {return _vect;}
133 FaultStat & countStat() {return _count;}
135 void invoke(ThreadContext * tc);
139 class UnimplementedOpcodeFault : public MipsFault
142 static FaultName _name;
143 static FaultVect _vect;
144 static FaultStat _count;
146 FaultName name() const {return _name;}
147 FaultVect vect() {return _vect;}
148 FaultStat & countStat() {return _count;}
152 class TLBRefillIFetchFault : public MipsFault
156 static FaultName _name;
157 static FaultVect _vect;
158 static FaultStat _count;
160 FaultName name() const {return _name;}
161 FaultVect vect() {return _vect;}
162 FaultStat & countStat() {return _count;}
163 void invoke(ThreadContext * tc);
165 class TLBInvalidIFetchFault : public MipsFault
169 static FaultName _name;
170 static FaultVect _vect;
171 static FaultStat _count;
173 FaultName name() const {return _name;}
174 FaultVect vect() {return _vect;}
175 FaultStat & countStat() {return _count;}
176 void invoke(ThreadContext * tc);
179 class NDtbMissFault : public MipsFault
182 static FaultName _name;
183 static FaultVect _vect;
184 static FaultStat _count;
186 FaultName name() const {return _name;}
187 FaultVect vect() {return _vect;}
188 FaultStat & countStat() {return _count;}
191 class PDtbMissFault : public MipsFault
194 static FaultName _name;
195 static FaultVect _vect;
196 static FaultStat _count;
198 FaultName name() const {return _name;}
199 FaultVect vect() {return _vect;}
200 FaultStat & countStat() {return _count;}
203 class DtbPageFault : public MipsFault
206 static FaultName _name;
207 static FaultVect _vect;
208 static FaultStat _count;
210 FaultName name() const {return _name;}
211 FaultVect vect() {return _vect;}
212 FaultStat & countStat() {return _count;}
215 class DtbAcvFault : public MipsFault
218 static FaultName _name;
219 static FaultVect _vect;
220 static FaultStat _count;
222 FaultName name() const {return _name;}
223 FaultVect vect() {return _vect;}
224 FaultStat & countStat() {return _count;}
227 class CacheErrorFault : public MipsFault
231 static FaultName _name;
232 static FaultVect _vect;
233 static FaultStat _count;
235 FaultName name() const {return _name;}
236 FaultVect vect() {return _vect;}
237 FaultStat & countStat() {return _count;}
238 void invoke(ThreadContext * tc);
244 static inline Fault genMachineCheckFault()
246 return new MachineCheckFault;
249 static inline Fault genAlignmentFault()
251 return new AlignmentFault;
254 class ResetFault : public MipsFault
257 static FaultName _name;
258 static FaultVect _vect;
259 static FaultStat _count;
261 FaultName name() const {return _name;}
262 FaultVect vect() {return _vect;}
263 FaultStat & countStat() {return _count;}
264 void invoke(ThreadContext * tc);
267 class SystemCallFault : public MipsFault
270 static FaultName _name;
271 static FaultVect _vect;
272 static FaultStat _count;
274 FaultName name() const {return _name;}
275 FaultVect vect() {return _vect;}
276 FaultStat & countStat() {return _count;}
277 void invoke(ThreadContext * tc);
280 class SoftResetFault : public MipsFault
283 static FaultName _name;
284 static FaultVect _vect;
285 static FaultStat _count;
287 FaultName name() const {return _name;}
288 FaultVect vect() {return _vect;}
289 FaultStat & countStat() {return _count;}
290 void invoke(ThreadContext * tc);
292 class DebugSingleStep : public MipsFault
295 static FaultName _name;
296 static FaultVect _vect;
297 static FaultStat _count;
299 FaultName name() const {return _name;}
300 FaultVect vect() {return _vect;}
301 FaultStat & countStat() {return _count;}
302 void invoke(ThreadContext * tc);
304 class DebugInterrupt : public MipsFault
307 static FaultName _name;
308 static FaultVect _vect;
309 static FaultStat _count;
311 FaultName name() const {return _name;}
312 FaultVect vect() {return _vect;}
313 FaultStat & countStat() {return _count;}
314 void invoke(ThreadContext * tc);
317 class CoprocessorUnusableFault : public MipsFault
320 static FaultName _name;
321 static FaultVect _vect;
322 static FaultStat _count;
325 FaultName name() const {return _name;}
326 FaultVect vect() {return _vect;}
327 FaultStat & countStat() {return _count;}
328 void invoke(ThreadContext * tc);
329 CoprocessorUnusableFault(int _procid){ coProcID = _procid;}
332 class ReservedInstructionFault : public MipsFault
335 static FaultName _name;
336 static FaultVect _vect;
337 static FaultStat _count;
339 FaultName name() const {return _name;}
340 FaultVect vect() {return _vect;}
341 FaultStat & countStat() {return _count;}
342 void invoke(ThreadContext * tc);
345 class ThreadFault : public MipsFault
348 static FaultName _name;
349 static FaultVect _vect;
350 static FaultStat _count;
352 FaultName name() const {return _name;}
353 FaultVect vect() {return _vect;}
354 FaultStat & countStat() {return _count;}
355 void invoke(ThreadContext * tc);
359 class ArithmeticFault : public MipsFault
362 bool skipFaultingInstruction() {return true;}
364 static FaultName _name;
365 static FaultVect _vect;
366 static FaultStat _count;
368 FaultName name() const {return _name;}
369 FaultVect vect() {return _vect;}
370 FaultStat & countStat() {return _count;}
372 void invoke(ThreadContext * tc);
376 class InterruptFault : public MipsFault
379 bool setRestartAddress() {return false;}
381 static FaultName _name;
382 static FaultVect _vect;
383 static FaultStat _count;
385 FaultName name() const {return _name;}
386 FaultVect vect() {return _vect;}
387 FaultStat & countStat() {return _count;}
390 void invoke(ThreadContext * tc);
393 //void invoke(ThreadContext * tc);
396 class TrapFault : public MipsFault
399 static FaultName _name;
400 static FaultVect _vect;
401 static FaultStat _count;
403 FaultName name() const {return _name;}
404 FaultVect vect() {return _vect;}
405 FaultStat & countStat() {return _count;}
407 void invoke(ThreadContext * tc);
411 class BreakpointFault : public MipsFault
414 static FaultName _name;
415 static FaultVect _vect;
416 static FaultStat _count;
418 FaultName name() const {return _name;}
419 FaultVect vect() {return _vect;}
420 FaultStat & countStat() {return _count;}
422 void invoke(ThreadContext * tc);
426 class ItbRefillFault : public MipsFault
429 static FaultName _name;
430 static FaultVect _vect;
431 static FaultStat _count;
433 FaultName name() const {return _name;}
434 FaultVect vect() {return _vect;}
435 FaultStat & countStat() {return _count;}
437 void invoke(ThreadContext * tc);
440 class DtbRefillFault : public MipsFault
443 static FaultName _name;
444 static FaultVect _vect;
445 static FaultStat _count;
447 FaultName name() const {return _name;}
448 FaultVect vect() {return _vect;}
449 FaultStat & countStat() {return _count;}
451 void invoke(ThreadContext * tc);
455 class ItbPageFault : public MipsFault
458 static FaultName _name;
459 static FaultVect _vect;
460 static FaultStat _count;
462 FaultName name() const {return _name;}
463 FaultVect vect() {return _vect;}
464 FaultStat & countStat() {return _count;}
466 void invoke(ThreadContext * tc);
470 class ItbInvalidFault : public MipsFault
473 static FaultName _name;
474 static FaultVect _vect;
475 static FaultStat _count;
477 FaultName name() const {return _name;}
478 FaultVect vect() {return _vect;}
479 FaultStat & countStat() {return _count;}
481 void invoke(ThreadContext * tc);
485 class TLBModifiedFault : public MipsFault
488 static FaultName _name;
489 static FaultVect _vect;
490 static FaultStat _count;
492 FaultName name() const {return _name;}
493 FaultVect vect() {return _vect;}
494 FaultStat & countStat() {return _count;}
496 void invoke(ThreadContext * tc);
501 class DtbInvalidFault : public MipsFault
504 static FaultName _name;
505 static FaultVect _vect;
506 static FaultStat _count;
508 FaultName name() const {return _name;}
509 FaultVect vect() {return _vect;}
510 FaultStat & countStat() {return _count;}
512 void invoke(ThreadContext * tc);
517 class FloatEnableFault : public MipsFault
520 static FaultName _name;
521 static FaultVect _vect;
522 static FaultStat _count;
524 FaultName name() const {return _name;}
525 FaultVect vect() {return _vect;}
526 FaultStat & countStat() {return _count;}
529 class ItbMissFault : public MipsFault
532 static FaultName _name;
533 static FaultVect _vect;
534 static FaultStat _count;
536 FaultName name() const {return _name;}
537 FaultVect vect() {return _vect;}
538 FaultStat & countStat() {return _count;}
541 class ItbAcvFault : public MipsFault
544 static FaultName _name;
545 static FaultVect _vect;
546 static FaultStat _count;
548 FaultName name() const {return _name;}
549 FaultVect vect() {return _vect;}
550 FaultStat & countStat() {return _count;}
553 class IntegerOverflowFault : public MipsFault
556 static FaultName _name;
557 static FaultVect _vect;
558 static FaultStat _count;
560 FaultName name() const {return _name;}
561 FaultVect vect() {return _vect;}
562 FaultStat & countStat() {return _count;}
565 class DspStateDisabledFault : public MipsFault
568 static FaultName _name;
569 static FaultVect _vect;
570 static FaultStat _count;
572 FaultName name() const {return _name;}
573 FaultVect vect() {return _vect;}
574 FaultStat & countStat() {return _count;}
575 void invoke(ThreadContext * tc);
578 } // MipsISA namespace
580 #endif // __MIPS_FAULTS_HH__