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