faults.hh revision 8562:1b0bc57e9cbe
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 "sim/faults.hh"
38
39namespace MipsISA
40{
41
42typedef const Addr FaultVect;
43
44class MipsFault : public FaultBase
45{
46  protected:
47    virtual bool skipFaultingInstruction() {return false;}
48    virtual bool setRestartAddress() {return true;}
49  public:
50    Addr badVAddr;
51    Addr entryHiAsid;
52    Addr entryHiVPN2;
53    Addr entryHiVPN2X;
54    Addr contextBadVPN2;
55#if FULL_SYSTEM
56    void invoke(ThreadContext * tc,
57            StaticInst::StaticInstPtr inst = StaticInst::nullStaticInstPtr)
58    {}
59    void setExceptionState(ThreadContext *, uint8_t);
60    void setHandlerPC(Addr, ThreadContext *);
61#endif
62    virtual FaultVect vect() = 0;
63    virtual FaultStat & countStat() = 0;
64};
65
66class MachineCheckFault : public MipsFault
67{
68  private:
69    static FaultName _name;
70    static FaultVect _vect;
71    static FaultStat _count;
72  public:
73    FaultName name() const {return _name;}
74    FaultVect vect() {return _vect;}
75    FaultStat & countStat() {return _count;}
76    bool isMachineCheckFault() {return true;}
77};
78
79class NonMaskableInterrupt : public MipsFault
80{
81  private:
82    static FaultName _name;
83    static FaultVect _vect;
84    static FaultStat _count;
85  public:
86    FaultName name() const {return _name;}
87    FaultVect vect() {return _vect;}
88    FaultStat & countStat() {return _count;}
89    bool isNonMaskableInterrupt() {return true;}
90};
91
92class AlignmentFault : public MipsFault
93{
94  private:
95    static FaultName _name;
96    static FaultVect _vect;
97    static FaultStat _count;
98  public:
99    FaultName name() const {return _name;}
100    FaultVect vect() {return _vect;}
101    FaultStat & countStat() {return _count;}
102    bool isAlignmentFault() {return true;}
103};
104
105class AddressErrorFault : public MipsFault
106{
107  private:
108    static FaultName _name;
109    static FaultVect _vect;
110    static FaultStat _count;
111  public:
112    FaultName name() const {return _name;}
113    FaultVect vect() {return _vect;}
114    FaultStat & countStat() {return _count;}
115#if FULL_SYSTEM
116    void invoke(ThreadContext * tc,
117            StaticInstPtr inst = StaticInst::nullStaticInstPtr);
118#endif
119
120};
121
122class StoreAddressErrorFault : public MipsFault
123{
124  private:
125    static FaultName _name;
126    static FaultVect _vect;
127    static FaultStat _count;
128  public:
129    FaultName name() const {return _name;}
130    FaultVect vect() {return _vect;}
131    FaultStat & countStat() {return _count;}
132#if FULL_SYSTEM
133    void invoke(ThreadContext * tc,
134            StaticInstPtr inst = StaticInst::nullStaticInstPtr);
135#endif
136};
137
138class UnimplementedOpcodeFault : public MipsFault
139{
140  private:
141    static FaultName _name;
142    static FaultVect _vect;
143    static FaultStat _count;
144  public:
145    FaultName name() const {return _name;}
146    FaultVect vect() {return _vect;}
147    FaultStat & countStat() {return _count;}
148};
149
150
151class TLBRefillIFetchFault : public MipsFault
152{
153  private:
154    Addr vaddr;
155    static FaultName _name;
156    static FaultVect _vect;
157    static FaultStat _count;
158  public:
159    FaultName name() const {return _name;}
160    FaultVect vect() {return _vect;}
161    FaultStat & countStat() {return _count;}
162    void invoke(ThreadContext * tc,
163            StaticInstPtr inst = StaticInst::nullStaticInstPtr);
164};
165
166class TLBInvalidIFetchFault : public MipsFault
167{
168  private:
169    Addr vaddr;
170    static FaultName _name;
171    static FaultVect _vect;
172    static FaultStat _count;
173  public:
174    FaultName name() const {return _name;}
175    FaultVect vect() {return _vect;}
176    FaultStat & countStat() {return _count;}
177    void invoke(ThreadContext * tc,
178            StaticInstPtr inst = StaticInst::nullStaticInstPtr);
179};
180
181class NDtbMissFault : public MipsFault
182{
183  private:
184    static FaultName _name;
185    static FaultVect _vect;
186    static FaultStat _count;
187  public:
188    FaultName name() const {return _name;}
189    FaultVect vect() {return _vect;}
190    FaultStat & countStat() {return _count;}
191};
192
193class PDtbMissFault : public MipsFault
194{
195  private:
196    static FaultName _name;
197    static FaultVect _vect;
198    static FaultStat _count;
199  public:
200    FaultName name() const {return _name;}
201    FaultVect vect() {return _vect;}
202    FaultStat & countStat() {return _count;}
203};
204
205class DtbPageFault : public MipsFault
206{
207  private:
208    static FaultName _name;
209    static FaultVect _vect;
210    static FaultStat _count;
211  public:
212    FaultName name() const {return _name;}
213    FaultVect vect() {return _vect;}
214    FaultStat & countStat() {return _count;}
215};
216
217class DtbAcvFault : public MipsFault
218{
219  private:
220    static FaultName _name;
221    static FaultVect _vect;
222    static FaultStat _count;
223  public:
224    FaultName name() const {return _name;}
225    FaultVect vect() {return _vect;}
226    FaultStat & countStat() {return _count;}
227};
228
229
230static inline Fault genMachineCheckFault()
231{
232    return new MachineCheckFault;
233}
234
235static inline Fault genAlignmentFault()
236{
237    return new AlignmentFault;
238}
239
240class ResetFault : public MipsFault
241{
242  private:
243    static FaultName _name;
244    static FaultVect _vect;
245    static FaultStat _count;
246  public:
247    FaultName name() const {return _name;}
248    FaultVect vect() {return _vect;}
249    FaultStat & countStat() {return _count;}
250    void invoke(ThreadContext * tc,
251            StaticInstPtr inst = StaticInst::nullStaticInstPtr);
252
253};
254
255class SystemCallFault : public MipsFault
256{
257  private:
258    static FaultName _name;
259    static FaultVect _vect;
260    static FaultStat _count;
261  public:
262    FaultName name() const {return _name;}
263    FaultVect vect() {return _vect;}
264    FaultStat & countStat() {return _count;}
265    void invoke(ThreadContext * tc,
266            StaticInstPtr inst = StaticInst::nullStaticInstPtr);
267};
268
269class SoftResetFault : public MipsFault
270{
271  private:
272    static FaultName _name;
273    static FaultVect _vect;
274    static FaultStat _count;
275  public:
276    FaultName name() const {return _name;}
277    FaultVect vect() {return _vect;}
278    FaultStat & countStat() {return _count;}
279    void invoke(ThreadContext * tc,
280            StaticInstPtr inst = StaticInst::nullStaticInstPtr);
281};
282
283class DebugSingleStep : public MipsFault
284{
285  private:
286    static FaultName _name;
287    static FaultVect _vect;
288    static FaultStat _count;
289  public:
290    FaultName name() const {return _name;}
291    FaultVect vect() {return _vect;}
292    FaultStat & countStat() {return _count;}
293    void invoke(ThreadContext * tc,
294            StaticInstPtr inst = StaticInst::nullStaticInstPtr);
295};
296
297class DebugInterrupt : public MipsFault
298{
299  private:
300    static FaultName _name;
301    static FaultVect _vect;
302    static FaultStat _count;
303  public:
304    FaultName name() const {return _name;}
305    FaultVect vect() {return _vect;}
306    FaultStat & countStat() {return _count;}
307    void invoke(ThreadContext * tc,
308            StaticInstPtr inst = StaticInst::nullStaticInstPtr);
309};
310
311class CoprocessorUnusableFault : public MipsFault
312{
313  private:
314    static FaultName _name;
315    static FaultVect _vect;
316    static FaultStat _count;
317    int coProcID;
318  public:
319    FaultName name() const {return _name;}
320    FaultVect vect() {return _vect;}
321    FaultStat & countStat() {return _count;}
322    void invoke(ThreadContext * tc,
323            StaticInstPtr inst = StaticInst::nullStaticInstPtr);
324    CoprocessorUnusableFault(int _procid){ coProcID = _procid;}
325};
326
327class ReservedInstructionFault : public MipsFault
328{
329  private:
330    static FaultName _name;
331    static FaultVect _vect;
332    static FaultStat _count;
333  public:
334    FaultName name() const {return _name;}
335    FaultVect vect() {return _vect;}
336    FaultStat & countStat() {return _count;}
337    void invoke(ThreadContext * tc,
338            StaticInstPtr inst = StaticInst::nullStaticInstPtr);
339};
340
341class ThreadFault : public MipsFault
342{
343  private:
344    static FaultName _name;
345    static FaultVect _vect;
346    static FaultStat _count;
347  public:
348    FaultName name() const {return _name;}
349    FaultVect vect() {return _vect;}
350    FaultStat & countStat() {return _count;}
351    void invoke(ThreadContext * tc,
352            StaticInstPtr inst = StaticInst::nullStaticInstPtr);
353};
354
355class ArithmeticFault : public MipsFault
356{
357  protected:
358    bool skipFaultingInstruction() {return true;}
359  private:
360    static FaultName _name;
361    static FaultVect _vect;
362    static FaultStat _count;
363  public:
364    FaultName name() const {return _name;}
365    FaultVect vect() {return _vect;}
366    FaultStat & countStat() {return _count;}
367#if FULL_SYSTEM
368    void invoke(ThreadContext * tc,
369            StaticInstPtr inst = StaticInst::nullStaticInstPtr);
370#endif
371};
372
373class InterruptFault : public MipsFault
374{
375  protected:
376    bool setRestartAddress() {return false;}
377  private:
378    static FaultName _name;
379    static FaultVect _vect;
380    static FaultStat _count;
381  public:
382    FaultName name() const {return _name;}
383    FaultVect vect() {return _vect;}
384    FaultStat & countStat() {return _count;}
385
386#if FULL_SYSTEM
387    void invoke(ThreadContext * tc,
388            StaticInstPtr inst = StaticInst::nullStaticInstPtr);
389#endif
390};
391
392class TrapFault : public MipsFault
393{
394  private:
395    static FaultName _name;
396    static FaultVect _vect;
397    static FaultStat _count;
398  public:
399    FaultName name() const {return _name;}
400    FaultVect vect() {return _vect;}
401    FaultStat & countStat() {return _count;}
402#if FULL_SYSTEM
403    void invoke(ThreadContext * tc,
404            StaticInstPtr inst = StaticInst::nullStaticInstPtr);
405#endif
406};
407
408class BreakpointFault : public MipsFault
409{
410  private:
411    static FaultName _name;
412    static FaultVect _vect;
413    static FaultStat _count;
414  public:
415    FaultName name() const {return _name;}
416    FaultVect vect() {return _vect;}
417    FaultStat & countStat() {return _count;}
418#if FULL_SYSTEM
419    void invoke(ThreadContext * tc,
420            StaticInstPtr inst = StaticInst::nullStaticInstPtr);
421#endif
422};
423
424class ItbRefillFault : public MipsFault
425{
426  private:
427    static FaultName _name;
428    static FaultVect _vect;
429    static FaultStat _count;
430  public:
431    FaultName name() const {return _name;}
432    FaultVect vect() {return _vect;}
433    FaultStat & countStat() {return _count;}
434#if FULL_SYSTEM
435    void invoke(ThreadContext * tc,
436            StaticInstPtr inst = StaticInst::nullStaticInstPtr);
437#endif
438};
439
440class DtbRefillFault : public MipsFault
441{
442  private:
443    static FaultName _name;
444    static FaultVect _vect;
445    static FaultStat _count;
446  public:
447    FaultName name() const {return _name;}
448    FaultVect vect() {return _vect;}
449    FaultStat & countStat() {return _count;}
450#if FULL_SYSTEM
451    void invoke(ThreadContext * tc,
452            StaticInstPtr inst = StaticInst::nullStaticInstPtr);
453#endif
454};
455
456class ItbPageFault : public MipsFault
457{
458  private:
459    static FaultName _name;
460    static FaultVect _vect;
461    static FaultStat _count;
462  public:
463    FaultName name() const {return _name;}
464    FaultVect vect() {return _vect;}
465    FaultStat & countStat() {return _count;}
466#if FULL_SYSTEM
467    void invoke(ThreadContext * tc,
468            StaticInstPtr inst = StaticInst::nullStaticInstPtr);
469#endif
470};
471
472class ItbInvalidFault : public MipsFault
473{
474  private:
475    static FaultName _name;
476    static FaultVect _vect;
477    static FaultStat _count;
478  public:
479    FaultName name() const {return _name;}
480    FaultVect vect() {return _vect;}
481    FaultStat & countStat() {return _count;}
482#if FULL_SYSTEM
483    void invoke(ThreadContext * tc,
484            StaticInstPtr inst = StaticInst::nullStaticInstPtr);
485#endif
486};
487
488class TLBModifiedFault : public MipsFault
489{
490  private:
491    static FaultName _name;
492    static FaultVect _vect;
493    static FaultStat _count;
494  public:
495    FaultName name() const {return _name;}
496    FaultVect vect() {return _vect;}
497    FaultStat & countStat() {return _count;}
498#if FULL_SYSTEM
499    void invoke(ThreadContext * tc,
500            StaticInstPtr inst = StaticInst::nullStaticInstPtr);
501#endif
502};
503
504class DtbInvalidFault : public MipsFault
505{
506  private:
507    static FaultName _name;
508    static FaultVect _vect;
509    static FaultStat _count;
510  public:
511    FaultName name() const {return _name;}
512    FaultVect vect() {return _vect;}
513    FaultStat & countStat() {return _count;}
514#if FULL_SYSTEM
515    void invoke(ThreadContext * tc,
516            StaticInst::StaticInstPtr inst = nullStaticInstPtr);
517#endif
518};
519
520class FloatEnableFault : public MipsFault
521{
522  private:
523    static FaultName _name;
524    static FaultVect _vect;
525    static FaultStat _count;
526  public:
527    FaultName name() const {return _name;}
528    FaultVect vect() {return _vect;}
529    FaultStat & countStat() {return _count;}
530};
531
532class ItbMissFault : public MipsFault
533{
534  private:
535    static FaultName _name;
536    static FaultVect _vect;
537    static FaultStat _count;
538  public:
539    FaultName name() const {return _name;}
540    FaultVect vect() {return _vect;}
541    FaultStat & countStat() {return _count;}
542};
543
544class ItbAcvFault : public MipsFault
545{
546  private:
547    static FaultName _name;
548    static FaultVect _vect;
549    static FaultStat _count;
550  public:
551    FaultName name() const {return _name;}
552    FaultVect vect() {return _vect;}
553    FaultStat & countStat() {return _count;}
554};
555
556class IntegerOverflowFault : public MipsFault
557{
558  private:
559    static FaultName _name;
560    static FaultVect _vect;
561    static FaultStat _count;
562  public:
563    FaultName name() const {return _name;}
564    FaultVect vect() {return _vect;}
565    FaultStat & countStat() {return _count;}
566};
567
568class DspStateDisabledFault : public MipsFault
569{
570  private:
571    static FaultName _name;
572    static FaultVect _vect;
573    static FaultStat _count;
574  public:
575    FaultName name() const {return _name;}
576    FaultVect vect() {return _vect;}
577    FaultStat & countStat() {return _count;}
578    void invoke(ThreadContext * tc,
579            StaticInstPtr inst = StaticInst::nullStaticInstPtr);
580};
581
582} // namespace MipsISA
583
584#endif // __MIPS_FAULTS_HH__
585