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"
39 // The design of the "name" and "vect" functions is in sim/faults.hh
43 typedef const Addr FaultVect;
45 class MipsFault : public FaultBase
48 virtual bool skipFaultingInstruction() {return false;}
49 virtual bool setRestartAddress() {return true;}
57 void invoke(ThreadContext * tc) {};
58 void setExceptionState(ThreadContext *,uint8_t);
59 void setHandlerPC(Addr,ThreadContext *);
61 virtual FaultVect vect() = 0;
62 virtual FaultStat & countStat() = 0;
65 class MachineCheckFault : public MipsFault
68 static FaultName _name;
69 static FaultVect _vect;
70 static FaultStat _count;
72 FaultName name() const {return _name;}
73 FaultVect vect() {return _vect;}
74 FaultStat & countStat() {return _count;}
75 bool isMachineCheckFault() {return true;}
78 class NonMaskableInterrupt : public MipsFault
81 static FaultName _name;
82 static FaultVect _vect;
83 static FaultStat _count;
85 FaultName name() const {return _name;}
86 FaultVect vect() {return _vect;}
87 FaultStat & countStat() {return _count;}
88 bool isNonMaskableInterrupt() {return true;}
91 class AlignmentFault : public MipsFault
94 static FaultName _name;
95 static FaultVect _vect;
96 static FaultStat _count;
98 FaultName name() const {return _name;}
99 FaultVect vect() {return _vect;}
100 FaultStat & countStat() {return _count;}
101 bool isAlignmentFault() {return true;}
104 class AddressErrorFault : public MipsFault
107 static FaultName _name;
108 static FaultVect _vect;
109 static FaultStat _count;
111 FaultName name() const {return _name;}
112 FaultVect vect() {return _vect;}
113 FaultStat & countStat() {return _count;}
115 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);
160 class TLBInvalidIFetchFault : public MipsFault
164 static FaultName _name;
165 static FaultVect _vect;
166 static FaultStat _count;
168 FaultName name() const {return _name;}
169 FaultVect vect() {return _vect;}
170 FaultStat & countStat() {return _count;}
171 void invoke(ThreadContext * tc);
174 class NDtbMissFault : public MipsFault
177 static FaultName _name;
178 static FaultVect _vect;
179 static FaultStat _count;
181 FaultName name() const {return _name;}
182 FaultVect vect() {return _vect;}
183 FaultStat & countStat() {return _count;}
186 class PDtbMissFault : public MipsFault
189 static FaultName _name;
190 static FaultVect _vect;
191 static FaultStat _count;
193 FaultName name() const {return _name;}
194 FaultVect vect() {return _vect;}
195 FaultStat & countStat() {return _count;}
198 class DtbPageFault : public MipsFault
201 static FaultName _name;
202 static FaultVect _vect;
203 static FaultStat _count;
205 FaultName name() const {return _name;}
206 FaultVect vect() {return _vect;}
207 FaultStat & countStat() {return _count;}
210 class DtbAcvFault : public MipsFault
213 static FaultName _name;
214 static FaultVect _vect;
215 static FaultStat _count;
217 FaultName name() const {return _name;}
218 FaultVect vect() {return _vect;}
219 FaultStat & countStat() {return _count;}
222 class CacheErrorFault : public MipsFault
226 static FaultName _name;
227 static FaultVect _vect;
228 static FaultStat _count;
230 FaultName name() const {return _name;}
231 FaultVect vect() {return _vect;}
232 FaultStat & countStat() {return _count;}
233 void invoke(ThreadContext * tc);
239 static inline Fault genMachineCheckFault()
241 return new MachineCheckFault;
244 static inline Fault genAlignmentFault()
246 return new AlignmentFault;
249 class ResetFault : public MipsFault
252 static FaultName _name;
253 static FaultVect _vect;
254 static FaultStat _count;
256 FaultName name() const {return _name;}
257 FaultVect vect() {return _vect;}
258 FaultStat & countStat() {return _count;}
259 void invoke(ThreadContext * tc);
262 class SystemCallFault : public MipsFault
265 static FaultName _name;
266 static FaultVect _vect;
267 static FaultStat _count;
269 FaultName name() const {return _name;}
270 FaultVect vect() {return _vect;}
271 FaultStat & countStat() {return _count;}
272 void invoke(ThreadContext * tc);
275 class SoftResetFault : public MipsFault
278 static FaultName _name;
279 static FaultVect _vect;
280 static FaultStat _count;
282 FaultName name() const {return _name;}
283 FaultVect vect() {return _vect;}
284 FaultStat & countStat() {return _count;}
285 void invoke(ThreadContext * tc);
287 class DebugSingleStep : public MipsFault
290 static FaultName _name;
291 static FaultVect _vect;
292 static FaultStat _count;
294 FaultName name() const {return _name;}
295 FaultVect vect() {return _vect;}
296 FaultStat & countStat() {return _count;}
297 void invoke(ThreadContext * tc);
299 class DebugInterrupt : public MipsFault
302 static FaultName _name;
303 static FaultVect _vect;
304 static FaultStat _count;
306 FaultName name() const {return _name;}
307 FaultVect vect() {return _vect;}
308 FaultStat & countStat() {return _count;}
309 void invoke(ThreadContext * tc);
312 class CoprocessorUnusableFault : public MipsFault
315 static FaultName _name;
316 static FaultVect _vect;
317 static FaultStat _count;
320 FaultName name() const {return _name;}
321 FaultVect vect() {return _vect;}
322 FaultStat & countStat() {return _count;}
323 void invoke(ThreadContext * tc);
324 CoprocessorUnusableFault(int _procid){ coProcID = _procid;}
327 class ReservedInstructionFault : public MipsFault
330 static FaultName _name;
331 static FaultVect _vect;
332 static FaultStat _count;
334 FaultName name() const {return _name;}
335 FaultVect vect() {return _vect;}
336 FaultStat & countStat() {return _count;}
337 void invoke(ThreadContext * tc);
340 class ThreadFault : public MipsFault
343 static FaultName _name;
344 static FaultVect _vect;
345 static FaultStat _count;
347 FaultName name() const {return _name;}
348 FaultVect vect() {return _vect;}
349 FaultStat & countStat() {return _count;}
350 void invoke(ThreadContext * tc);
354 class ArithmeticFault : public MipsFault
357 bool skipFaultingInstruction() {return true;}
359 static FaultName _name;
360 static FaultVect _vect;
361 static FaultStat _count;
363 FaultName name() const {return _name;}
364 FaultVect vect() {return _vect;}
365 FaultStat & countStat() {return _count;}
367 void invoke(ThreadContext * tc);
371 class InterruptFault : public MipsFault
374 bool setRestartAddress() {return false;}
376 static FaultName _name;
377 static FaultVect _vect;
378 static FaultStat _count;
380 FaultName name() const {return _name;}
381 FaultVect vect() {return _vect;}
382 FaultStat & countStat() {return _count;}
385 void invoke(ThreadContext * tc);
388 //void invoke(ThreadContext * tc);
391 class TrapFault : public MipsFault
394 static FaultName _name;
395 static FaultVect _vect;
396 static FaultStat _count;
398 FaultName name() const {return _name;}
399 FaultVect vect() {return _vect;}
400 FaultStat & countStat() {return _count;}
402 void invoke(ThreadContext * tc);
406 class BreakpointFault : public MipsFault
409 static FaultName _name;
410 static FaultVect _vect;
411 static FaultStat _count;
413 FaultName name() const {return _name;}
414 FaultVect vect() {return _vect;}
415 FaultStat & countStat() {return _count;}
417 void invoke(ThreadContext * tc);
421 class ItbRefillFault : public MipsFault
424 static FaultName _name;
425 static FaultVect _vect;
426 static FaultStat _count;
428 FaultName name() const {return _name;}
429 FaultVect vect() {return _vect;}
430 FaultStat & countStat() {return _count;}
432 void invoke(ThreadContext * tc);
435 class DtbRefillFault : public MipsFault
438 static FaultName _name;
439 static FaultVect _vect;
440 static FaultStat _count;
442 FaultName name() const {return _name;}
443 FaultVect vect() {return _vect;}
444 FaultStat & countStat() {return _count;}
446 void invoke(ThreadContext * tc);
450 class ItbPageFault : public MipsFault
453 static FaultName _name;
454 static FaultVect _vect;
455 static FaultStat _count;
457 FaultName name() const {return _name;}
458 FaultVect vect() {return _vect;}
459 FaultStat & countStat() {return _count;}
461 void invoke(ThreadContext * tc);
465 class ItbInvalidFault : public MipsFault
468 static FaultName _name;
469 static FaultVect _vect;
470 static FaultStat _count;
472 FaultName name() const {return _name;}
473 FaultVect vect() {return _vect;}
474 FaultStat & countStat() {return _count;}
476 void invoke(ThreadContext * tc);
480 class TLBModifiedFault : public MipsFault
483 static FaultName _name;
484 static FaultVect _vect;
485 static FaultStat _count;
487 FaultName name() const {return _name;}
488 FaultVect vect() {return _vect;}
489 FaultStat & countStat() {return _count;}
491 void invoke(ThreadContext * tc);
496 class DtbInvalidFault : public MipsFault
499 static FaultName _name;
500 static FaultVect _vect;
501 static FaultStat _count;
503 FaultName name() const {return _name;}
504 FaultVect vect() {return _vect;}
505 FaultStat & countStat() {return _count;}
507 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__