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