2 * Copyright (c) 2003-2005 The Regents of The University of Michigan
3 * Copyright (c) 2007-2008 The Florida State University
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.
33 #ifndef __ARM_FAULTS_HH__
34 #define __ARM_FAULTS_HH__
36 #include "sim/faults.hh"
38 // The design of the "name" and "vect" functions is in sim/faults.hh
42 typedef const Addr FaultVect;
44 class ArmFault : 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 ArmFault
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 ArmFault
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 ArmFault
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 ArmFault
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);
118 class StoreAddressErrorFault : public ArmFault
121 static FaultName _name;
122 static FaultVect _vect;
123 static FaultStat _count;
125 FaultName name() const {return _name;}
126 FaultVect vect() {return _vect;}
127 FaultStat & countStat() {return _count;}
129 void invoke(ThreadContext * tc);
133 class UnimplementedOpcodeFault : public ArmFault
136 static FaultName _name;
137 static FaultVect _vect;
138 static FaultStat _count;
140 FaultName name() const {return _name;}
141 FaultVect vect() {return _vect;}
142 FaultStat & countStat() {return _count;}
146 class TLBRefillIFetchFault : public ArmFault
150 static FaultName _name;
151 static FaultVect _vect;
152 static FaultStat _count;
154 FaultName name() const {return _name;}
155 FaultVect vect() {return _vect;}
156 FaultStat & countStat() {return _count;}
157 void invoke(ThreadContext * tc);
159 class TLBInvalidIFetchFault : public ArmFault
163 static FaultName _name;
164 static FaultVect _vect;
165 static FaultStat _count;
167 FaultName name() const {return _name;}
168 FaultVect vect() {return _vect;}
169 FaultStat & countStat() {return _count;}
170 void invoke(ThreadContext * tc);
173 class NDtbMissFault : public ArmFault
176 static FaultName _name;
177 static FaultVect _vect;
178 static FaultStat _count;
180 FaultName name() const {return _name;}
181 FaultVect vect() {return _vect;}
182 FaultStat & countStat() {return _count;}
185 class PDtbMissFault : public ArmFault
188 static FaultName _name;
189 static FaultVect _vect;
190 static FaultStat _count;
192 FaultName name() const {return _name;}
193 FaultVect vect() {return _vect;}
194 FaultStat & countStat() {return _count;}
197 class DtbPageFault : public ArmFault
200 static FaultName _name;
201 static FaultVect _vect;
202 static FaultStat _count;
204 FaultName name() const {return _name;}
205 FaultVect vect() {return _vect;}
206 FaultStat & countStat() {return _count;}
209 class DtbAcvFault : public ArmFault
212 static FaultName _name;
213 static FaultVect _vect;
214 static FaultStat _count;
216 FaultName name() const {return _name;}
217 FaultVect vect() {return _vect;}
218 FaultStat & countStat() {return _count;}
221 class CacheErrorFault : public ArmFault
225 static FaultName _name;
226 static FaultVect _vect;
227 static FaultStat _count;
229 FaultName name() const {return _name;}
230 FaultVect vect() {return _vect;}
231 FaultStat & countStat() {return _count;}
232 void invoke(ThreadContext * tc);
238 static inline Fault genMachineCheckFault()
240 return new MachineCheckFault;
243 static inline Fault genAlignmentFault()
245 return new AlignmentFault;
248 class ResetFault : public ArmFault
251 static FaultName _name;
252 static FaultVect _vect;
253 static FaultStat _count;
255 FaultName name() const {return _name;}
256 FaultVect vect() {return _vect;}
257 FaultStat & countStat() {return _count;}
258 void invoke(ThreadContext * tc);
261 class SystemCallFault : public ArmFault
264 static FaultName _name;
265 static FaultVect _vect;
266 static FaultStat _count;
268 FaultName name() const {return _name;}
269 FaultVect vect() {return _vect;}
270 FaultStat & countStat() {return _count;}
271 void invoke(ThreadContext * tc);
274 class SoftResetFault : public ArmFault
277 static FaultName _name;
278 static FaultVect _vect;
279 static FaultStat _count;
281 FaultName name() const {return _name;}
282 FaultVect vect() {return _vect;}
283 FaultStat & countStat() {return _count;}
284 void invoke(ThreadContext * tc);
286 class DebugSingleStep : public ArmFault
289 static FaultName _name;
290 static FaultVect _vect;
291 static FaultStat _count;
293 FaultName name() const {return _name;}
294 FaultVect vect() {return _vect;}
295 FaultStat & countStat() {return _count;}
296 void invoke(ThreadContext * tc);
298 class DebugInterrupt : public ArmFault
301 static FaultName _name;
302 static FaultVect _vect;
303 static FaultStat _count;
305 FaultName name() const {return _name;}
306 FaultVect vect() {return _vect;}
307 FaultStat & countStat() {return _count;}
308 void invoke(ThreadContext * tc);
311 class CoprocessorUnusableFault : public ArmFault
314 static FaultName _name;
315 static FaultVect _vect;
316 static FaultStat _count;
319 FaultName name() const {return _name;}
320 FaultVect vect() {return _vect;}
321 FaultStat & countStat() {return _count;}
322 void invoke(ThreadContext * tc);
323 CoprocessorUnusableFault(int _procid){ coProcID = _procid;}
326 class ReservedInstructionFault : public ArmFault
329 static FaultName _name;
330 static FaultVect _vect;
331 static FaultStat _count;
333 FaultName name() const {return _name;}
334 FaultVect vect() {return _vect;}
335 FaultStat & countStat() {return _count;}
336 void invoke(ThreadContext * tc);
339 class ThreadFault : public ArmFault
342 static FaultName _name;
343 static FaultVect _vect;
344 static FaultStat _count;
346 FaultName name() const {return _name;}
347 FaultVect vect() {return _vect;}
348 FaultStat & countStat() {return _count;}
349 void invoke(ThreadContext * tc);
353 class ArithmeticFault : public ArmFault
356 bool skipFaultingInstruction() {return true;}
358 static FaultName _name;
359 static FaultVect _vect;
360 static FaultStat _count;
362 FaultName name() const {return _name;}
363 FaultVect vect() {return _vect;}
364 FaultStat & countStat() {return _count;}
366 void invoke(ThreadContext * tc);
370 class InterruptFault : public ArmFault
373 bool setRestartAddress() {return false;}
375 static FaultName _name;
376 static FaultVect _vect;
377 static FaultStat _count;
379 FaultName name() const {return _name;}
380 FaultVect vect() {return _vect;}
381 FaultStat & countStat() {return _count;}
384 void invoke(ThreadContext * tc);
387 //void invoke(ThreadContext * tc);
390 class TrapFault : public ArmFault
393 static FaultName _name;
394 static FaultVect _vect;
395 static FaultStat _count;
397 FaultName name() const {return _name;}
398 FaultVect vect() {return _vect;}
399 FaultStat & countStat() {return _count;}
401 void invoke(ThreadContext * tc);
405 class BreakpointFault : public ArmFault
408 static FaultName _name;
409 static FaultVect _vect;
410 static FaultStat _count;
412 FaultName name() const {return _name;}
413 FaultVect vect() {return _vect;}
414 FaultStat & countStat() {return _count;}
416 void invoke(ThreadContext * tc);
420 class ItbRefillFault : public ArmFault
423 static FaultName _name;
424 static FaultVect _vect;
425 static FaultStat _count;
427 FaultName name() const {return _name;}
428 FaultVect vect() {return _vect;}
429 FaultStat & countStat() {return _count;}
431 void invoke(ThreadContext * tc);
434 class DtbRefillFault : public ArmFault
437 static FaultName _name;
438 static FaultVect _vect;
439 static FaultStat _count;
441 FaultName name() const {return _name;}
442 FaultVect vect() {return _vect;}
443 FaultStat & countStat() {return _count;}
445 void invoke(ThreadContext * tc);
449 class ItbPageFault : public ArmFault
452 static FaultName _name;
453 static FaultVect _vect;
454 static FaultStat _count;
456 FaultName name() const {return _name;}
457 FaultVect vect() {return _vect;}
458 FaultStat & countStat() {return _count;}
460 void invoke(ThreadContext * tc);
464 class ItbInvalidFault : public ArmFault
467 static FaultName _name;
468 static FaultVect _vect;
469 static FaultStat _count;
471 FaultName name() const {return _name;}
472 FaultVect vect() {return _vect;}
473 FaultStat & countStat() {return _count;}
475 void invoke(ThreadContext * tc);
479 class TLBModifiedFault : public ArmFault
482 static FaultName _name;
483 static FaultVect _vect;
484 static FaultStat _count;
486 FaultName name() const {return _name;}
487 FaultVect vect() {return _vect;}
488 FaultStat & countStat() {return _count;}
490 void invoke(ThreadContext * tc);
495 class DtbInvalidFault : public ArmFault
498 static FaultName _name;
499 static FaultVect _vect;
500 static FaultStat _count;
502 FaultName name() const {return _name;}
503 FaultVect vect() {return _vect;}
504 FaultStat & countStat() {return _count;}
506 void invoke(ThreadContext * tc);
511 class FloatEnableFault : public ArmFault
514 static FaultName _name;
515 static FaultVect _vect;
516 static FaultStat _count;
518 FaultName name() const {return _name;}
519 FaultVect vect() {return _vect;}
520 FaultStat & countStat() {return _count;}
523 class ItbMissFault : public ArmFault
526 static FaultName _name;
527 static FaultVect _vect;
528 static FaultStat _count;
530 FaultName name() const {return _name;}
531 FaultVect vect() {return _vect;}
532 FaultStat & countStat() {return _count;}
535 class ItbAcvFault : public ArmFault
538 static FaultName _name;
539 static FaultVect _vect;
540 static FaultStat _count;
542 FaultName name() const {return _name;}
543 FaultVect vect() {return _vect;}
544 FaultStat & countStat() {return _count;}
547 class IntegerOverflowFault : public ArmFault
550 static FaultName _name;
551 static FaultVect _vect;
552 static FaultStat _count;
554 FaultName name() const {return _name;}
555 FaultVect vect() {return _vect;}
556 FaultStat & countStat() {return _count;}
559 class DspStateDisabledFault : public ArmFault
562 static FaultName _name;
563 static FaultVect _vect;
564 static FaultStat _count;
566 FaultName name() const {return _name;}
567 FaultVect vect() {return _vect;}
568 FaultStat & countStat() {return _count;}
569 void invoke(ThreadContext * tc);
572 } // ArmISA namespace
574 #endif // __ARM_FAULTS_HH__