2 * Copyright (c) 2003-2005 The Regents of The University of Michigan
3 * Copyright (c) 2007 MIPS Technologies, Inc.
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.
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.
34 #ifndef __MIPS_FAULTS_HH__
35 #define __MIPS_FAULTS_HH__
37 #include "sim/faults.hh"
42 typedef const Addr FaultVect;
44 class MipsFault : public FaultBase
47 virtual bool skipFaultingInstruction() {return false;}
48 virtual bool setRestartAddress() {return true;}
56 void invoke(ThreadContext * tc) {};
57 void setExceptionState(ThreadContext *, uint8_t);
58 void setHandlerPC(Addr, ThreadContext *);
60 virtual FaultVect vect() = 0;
61 virtual FaultStat & countStat() = 0;
64 class MachineCheckFault : public MipsFault
67 static FaultName _name;
68 static FaultVect _vect;
69 static FaultStat _count;
71 FaultName name() const {return _name;}
72 FaultVect vect() {return _vect;}
73 FaultStat & countStat() {return _count;}
74 bool isMachineCheckFault() {return true;}
77 class NonMaskableInterrupt : public MipsFault
80 static FaultName _name;
81 static FaultVect _vect;
82 static FaultStat _count;
84 FaultName name() const {return _name;}
85 FaultVect vect() {return _vect;}
86 FaultStat & countStat() {return _count;}
87 bool isNonMaskableInterrupt() {return true;}
90 class AlignmentFault : public MipsFault
93 static FaultName _name;
94 static FaultVect _vect;
95 static FaultStat _count;
97 FaultName name() const {return _name;}
98 FaultVect vect() {return _vect;}
99 FaultStat & countStat() {return _count;}
100 bool isAlignmentFault() {return true;}
103 class AddressErrorFault : public MipsFault
106 static FaultName _name;
107 static FaultVect _vect;
108 static FaultStat _count;
110 FaultName name() const {return _name;}
111 FaultVect vect() {return _vect;}
112 FaultStat & countStat() {return _count;}
114 void invoke(ThreadContext * tc);
119 class StoreAddressErrorFault : public MipsFault
122 static FaultName _name;
123 static FaultVect _vect;
124 static FaultStat _count;
126 FaultName name() const {return _name;}
127 FaultVect vect() {return _vect;}
128 FaultStat & countStat() {return _count;}
130 void invoke(ThreadContext * tc);
134 class UnimplementedOpcodeFault : public MipsFault
137 static FaultName _name;
138 static FaultVect _vect;
139 static FaultStat _count;
141 FaultName name() const {return _name;}
142 FaultVect vect() {return _vect;}
143 FaultStat & countStat() {return _count;}
147 class TLBRefillIFetchFault : public MipsFault
151 static FaultName _name;
152 static FaultVect _vect;
153 static FaultStat _count;
155 FaultName name() const {return _name;}
156 FaultVect vect() {return _vect;}
157 FaultStat & countStat() {return _count;}
158 void invoke(ThreadContext * tc);
161 class TLBInvalidIFetchFault : public MipsFault
165 static FaultName _name;
166 static FaultVect _vect;
167 static FaultStat _count;
169 FaultName name() const {return _name;}
170 FaultVect vect() {return _vect;}
171 FaultStat & countStat() {return _count;}
172 void invoke(ThreadContext * tc);
175 class NDtbMissFault : public MipsFault
178 static FaultName _name;
179 static FaultVect _vect;
180 static FaultStat _count;
182 FaultName name() const {return _name;}
183 FaultVect vect() {return _vect;}
184 FaultStat & countStat() {return _count;}
187 class PDtbMissFault : public MipsFault
190 static FaultName _name;
191 static FaultVect _vect;
192 static FaultStat _count;
194 FaultName name() const {return _name;}
195 FaultVect vect() {return _vect;}
196 FaultStat & countStat() {return _count;}
199 class DtbPageFault : public MipsFault
202 static FaultName _name;
203 static FaultVect _vect;
204 static FaultStat _count;
206 FaultName name() const {return _name;}
207 FaultVect vect() {return _vect;}
208 FaultStat & countStat() {return _count;}
211 class DtbAcvFault : public MipsFault
214 static FaultName _name;
215 static FaultVect _vect;
216 static FaultStat _count;
218 FaultName name() const {return _name;}
219 FaultVect vect() {return _vect;}
220 FaultStat & countStat() {return _count;}
223 class CacheErrorFault : public MipsFault
227 static FaultName _name;
228 static FaultVect _vect;
229 static FaultStat _count;
231 FaultName name() const {return _name;}
232 FaultVect vect() {return _vect;}
233 FaultStat & countStat() {return _count;}
234 void invoke(ThreadContext * tc);
240 static inline Fault genMachineCheckFault()
242 return new MachineCheckFault;
245 static inline Fault genAlignmentFault()
247 return new AlignmentFault;
250 class ResetFault : public MipsFault
253 static FaultName _name;
254 static FaultVect _vect;
255 static FaultStat _count;
257 FaultName name() const {return _name;}
258 FaultVect vect() {return _vect;}
259 FaultStat & countStat() {return _count;}
260 void invoke(ThreadContext * tc);
264 class SystemCallFault : public MipsFault
267 static FaultName _name;
268 static FaultVect _vect;
269 static FaultStat _count;
271 FaultName name() const {return _name;}
272 FaultVect vect() {return _vect;}
273 FaultStat & countStat() {return _count;}
274 void invoke(ThreadContext * tc);
277 class SoftResetFault : public MipsFault
280 static FaultName _name;
281 static FaultVect _vect;
282 static FaultStat _count;
284 FaultName name() const {return _name;}
285 FaultVect vect() {return _vect;}
286 FaultStat & countStat() {return _count;}
287 void invoke(ThreadContext * tc);
290 class DebugSingleStep : public MipsFault
293 static FaultName _name;
294 static FaultVect _vect;
295 static FaultStat _count;
297 FaultName name() const {return _name;}
298 FaultVect vect() {return _vect;}
299 FaultStat & countStat() {return _count;}
300 void invoke(ThreadContext * tc);
303 class DebugInterrupt : public MipsFault
306 static FaultName _name;
307 static FaultVect _vect;
308 static FaultStat _count;
310 FaultName name() const {return _name;}
311 FaultVect vect() {return _vect;}
312 FaultStat & countStat() {return _count;}
313 void invoke(ThreadContext * tc);
316 class CoprocessorUnusableFault : public MipsFault
319 static FaultName _name;
320 static FaultVect _vect;
321 static FaultStat _count;
324 FaultName name() const {return _name;}
325 FaultVect vect() {return _vect;}
326 FaultStat & countStat() {return _count;}
327 void invoke(ThreadContext * tc);
328 CoprocessorUnusableFault(int _procid){ coProcID = _procid;}
331 class ReservedInstructionFault : public MipsFault
334 static FaultName _name;
335 static FaultVect _vect;
336 static FaultStat _count;
338 FaultName name() const {return _name;}
339 FaultVect vect() {return _vect;}
340 FaultStat & countStat() {return _count;}
341 void invoke(ThreadContext * tc);
344 class ThreadFault : public MipsFault
347 static FaultName _name;
348 static FaultVect _vect;
349 static FaultStat _count;
351 FaultName name() const {return _name;}
352 FaultVect vect() {return _vect;}
353 FaultStat & countStat() {return _count;}
354 void invoke(ThreadContext * tc);
357 class ArithmeticFault : public MipsFault
360 bool skipFaultingInstruction() {return true;}
362 static FaultName _name;
363 static FaultVect _vect;
364 static FaultStat _count;
366 FaultName name() const {return _name;}
367 FaultVect vect() {return _vect;}
368 FaultStat & countStat() {return _count;}
370 void invoke(ThreadContext * tc);
374 class InterruptFault : public MipsFault
377 bool setRestartAddress() {return false;}
379 static FaultName _name;
380 static FaultVect _vect;
381 static FaultStat _count;
383 FaultName name() const {return _name;}
384 FaultVect vect() {return _vect;}
385 FaultStat & countStat() {return _count;}
388 void invoke(ThreadContext * tc);
392 class TrapFault : public MipsFault
395 static FaultName _name;
396 static FaultVect _vect;
397 static FaultStat _count;
399 FaultName name() const {return _name;}
400 FaultVect vect() {return _vect;}
401 FaultStat & countStat() {return _count;}
403 void invoke(ThreadContext * tc);
407 class BreakpointFault : public MipsFault
410 static FaultName _name;
411 static FaultVect _vect;
412 static FaultStat _count;
414 FaultName name() const {return _name;}
415 FaultVect vect() {return _vect;}
416 FaultStat & countStat() {return _count;}
418 void invoke(ThreadContext * tc);
422 class ItbRefillFault : public MipsFault
425 static FaultName _name;
426 static FaultVect _vect;
427 static FaultStat _count;
429 FaultName name() const {return _name;}
430 FaultVect vect() {return _vect;}
431 FaultStat & countStat() {return _count;}
433 void invoke(ThreadContext * tc);
437 class DtbRefillFault : public MipsFault
440 static FaultName _name;
441 static FaultVect _vect;
442 static FaultStat _count;
444 FaultName name() const {return _name;}
445 FaultVect vect() {return _vect;}
446 FaultStat & countStat() {return _count;}
448 void invoke(ThreadContext * tc);
452 class ItbPageFault : public MipsFault
455 static FaultName _name;
456 static FaultVect _vect;
457 static FaultStat _count;
459 FaultName name() const {return _name;}
460 FaultVect vect() {return _vect;}
461 FaultStat & countStat() {return _count;}
463 void invoke(ThreadContext * tc);
467 class ItbInvalidFault : public MipsFault
470 static FaultName _name;
471 static FaultVect _vect;
472 static FaultStat _count;
474 FaultName name() const {return _name;}
475 FaultVect vect() {return _vect;}
476 FaultStat & countStat() {return _count;}
478 void invoke(ThreadContext * tc);
482 class TLBModifiedFault : public MipsFault
485 static FaultName _name;
486 static FaultVect _vect;
487 static FaultStat _count;
489 FaultName name() const {return _name;}
490 FaultVect vect() {return _vect;}
491 FaultStat & countStat() {return _count;}
493 void invoke(ThreadContext * tc);
497 class DtbInvalidFault : public MipsFault
500 static FaultName _name;
501 static FaultVect _vect;
502 static FaultStat _count;
504 FaultName name() const {return _name;}
505 FaultVect vect() {return _vect;}
506 FaultStat & countStat() {return _count;}
508 void invoke(ThreadContext * tc);
512 class FloatEnableFault : public MipsFault
515 static FaultName _name;
516 static FaultVect _vect;
517 static FaultStat _count;
519 FaultName name() const {return _name;}
520 FaultVect vect() {return _vect;}
521 FaultStat & countStat() {return _count;}
524 class ItbMissFault : public MipsFault
527 static FaultName _name;
528 static FaultVect _vect;
529 static FaultStat _count;
531 FaultName name() const {return _name;}
532 FaultVect vect() {return _vect;}
533 FaultStat & countStat() {return _count;}
536 class ItbAcvFault : public MipsFault
539 static FaultName _name;
540 static FaultVect _vect;
541 static FaultStat _count;
543 FaultName name() const {return _name;}
544 FaultVect vect() {return _vect;}
545 FaultStat & countStat() {return _count;}
548 class IntegerOverflowFault : public MipsFault
551 static FaultName _name;
552 static FaultVect _vect;
553 static FaultStat _count;
555 FaultName name() const {return _name;}
556 FaultVect vect() {return _vect;}
557 FaultStat & countStat() {return _count;}
560 class DspStateDisabledFault : public MipsFault
563 static FaultName _name;
564 static FaultVect _vect;
565 static FaultStat _count;
567 FaultName name() const {return _name;}
568 FaultVect vect() {return _vect;}
569 FaultStat & countStat() {return _count;}
570 void invoke(ThreadContext * tc);
573 } // MipsISA namespace
575 #endif // __MIPS_FAULTS_HH__