faults.hh revision 2800
1/*
2 * Copyright (c) 2003-2005 The Regents of The University of Michigan
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are
7 * met: redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer;
9 * redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution;
12 * neither the name of the copyright holders nor the names of its
13 * contributors may be used to endorse or promote products derived from
14 * this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 *
28 * Authors: Gabe Black
29 *          Kevin Lim
30 */
31
32#ifndef __ALPHA_FAULTS_HH__
33#define __ALPHA_FAULTS_HH__
34
35#include "sim/faults.hh"
36
37// The design of the "name" and "vect" functions is in sim/faults.hh
38
39namespace SparcISA
40{
41
42typedef const uint32_t TrapType;
43typedef const uint32_t FaultPriority;
44
45class SparcFault : public FaultBase
46{
47  public:
48#if FULL_SYSTEM
49    void invoke(ThreadContext * tc);
50#endif
51    virtual TrapType trapType() = 0;
52    virtual FaultPriority priority() = 0;
53    virtual FaultStat & countStat() = 0;
54};
55
56class InternalProcessorError : public SparcFault
57{
58  private:
59    static FaultName _name;
60    static TrapType _trapType;
61    static FaultPriority _priority;
62    static FaultStat _count;
63  public:
64    FaultName name() {return _name;}
65    TrapType trapType() {return _trapType;}
66    FaultPriority priority() {return _priority;}
67    FaultStat & countStat() {return _count;}
68    bool isMachineCheckFault() {return true;}
69};
70
71class MemAddressNotAligned : public SparcFault
72{
73  private:
74    static FaultName _name;
75    static TrapType _trapType;
76    static FaultPriority _priority;
77    static FaultStat _count;
78  public:
79    FaultName name() {return _name;}
80    TrapType trapType() {return _trapType;}
81    FaultPriority priority() {return _priority;}
82    FaultStat & countStat() {return _count;}
83    bool isAlignmentFault() {return true;}
84};
85
86#if !FULL_SYSTEM
87class PageTableFault : public SparcFault
88{
89  private:
90    Addr vaddr;
91    static FaultName _name;
92    static TrapType _trapType;
93    static FaultPriority _priority;
94    static FaultStat _count;
95  public:
96    PageTableFault(Addr va)
97        : vaddr(va) {}
98    FaultName name() {return _name;}
99    TrapType trapType() {return _trapType;}
100    FaultPriority priority() {return _priority;}
101    FaultStat & countStat() {return _count;}
102    void invoke(ThreadContext * tc);
103};
104
105static inline Fault genPageTableFault(Addr va)
106{
107    return new PageTableFault(va);
108}
109#endif
110
111static inline Fault genMachineCheckFault()
112{
113    return new InternalProcessorError;
114}
115
116static inline Fault genAlignmentFault()
117{
118    return new MemAddressNotAligned;
119}
120
121class PowerOnReset : public SparcFault
122{
123  private:
124    static FaultName _name;
125    static TrapType _trapType;
126    static FaultPriority _priority;
127    static FaultStat _count;
128  public:
129    FaultName name() {return _name;}
130    TrapType trapType() {return _trapType;}
131    FaultPriority priority() {return _priority;}
132    FaultStat & countStat() {return _count;}
133};
134
135class WatchDogReset : public SparcFault
136{
137  private:
138    static FaultName _name;
139    static TrapType _trapType;
140    static FaultPriority _priority;
141    static FaultStat _count;
142  public:
143    FaultName name() {return _name;}
144    TrapType trapType() {return _trapType;}
145    FaultPriority priority() {return _priority;}
146    FaultStat & countStat() {return _count;}
147};
148
149class ExternallyInitiatedReset : public SparcFault
150{
151  private:
152    static FaultName _name;
153    static TrapType _trapType;
154    static FaultPriority _priority;
155    static FaultStat _count;
156  public:
157    FaultName name() {return _name;}
158    TrapType trapType() {return _trapType;}
159    FaultPriority priority() {return _priority;}
160    FaultStat & countStat() {return _count;}
161};
162
163class SoftwareInitiatedReset : public SparcFault
164{
165  private:
166    static FaultName _name;
167    static TrapType _trapType;
168    static FaultPriority _priority;
169    static FaultStat _count;
170  public:
171    FaultName name() {return _name;}
172    TrapType trapType() {return _trapType;}
173    FaultPriority priority() {return _priority;}
174    FaultStat & countStat() {return _count;}
175};
176
177class REDStateException : public SparcFault
178{
179  private:
180    static FaultName _name;
181    static TrapType _trapType;
182    static FaultPriority _priority;
183    static FaultStat _count;
184  public:
185    FaultName name() {return _name;}
186    TrapType trapType() {return _trapType;}
187    FaultPriority priority() {return _priority;}
188    FaultStat & countStat() {return _count;}
189};
190
191class InstructionAccessException : public SparcFault
192{
193  private:
194    static FaultName _name;
195    static TrapType _trapType;
196    static FaultPriority _priority;
197    static FaultStat _count;
198  public:
199    FaultName name() {return _name;}
200    TrapType trapType() {return _trapType;}
201    FaultPriority priority() {return _priority;}
202    FaultStat & countStat() {return _count;}
203};
204
205class InstructionAccessMMUMiss : public SparcFault
206{
207  private:
208    static FaultName _name;
209    static TrapType _trapType;
210    static FaultPriority _priority;
211    static FaultStat _count;
212  public:
213    FaultName name() {return _name;}
214    TrapType trapType() {return _trapType;}
215    FaultPriority priority() {return _priority;}
216    FaultStat & countStat() {return _count;}
217};
218
219class InstructionAccessError : public SparcFault
220{
221  private:
222    static FaultName _name;
223    static TrapType _trapType;
224    static FaultPriority _priority;
225    static FaultStat _count;
226  public:
227    FaultName name() {return _name;}
228    TrapType trapType() {return _trapType;}
229    FaultPriority priority() {return _priority;}
230    FaultStat & countStat() {return _count;}
231};
232
233class IllegalInstruction : public SparcFault
234{
235  private:
236    static FaultName _name;
237    static TrapType _trapType;
238    static FaultPriority _priority;
239    static FaultStat _count;
240  public:
241    FaultName name() {return _name;}
242    TrapType trapType() {return _trapType;}
243    FaultPriority priority() {return _priority;}
244    FaultStat & countStat() {return _count;}
245};
246
247class PrivilegedOpcode : public SparcFault
248{
249  private:
250    static FaultName _name;
251    static TrapType _trapType;
252    static FaultPriority _priority;
253    static FaultStat _count;
254  public:
255    FaultName name() {return _name;}
256    TrapType trapType() {return _trapType;}
257    FaultPriority priority() {return _priority;}
258    FaultStat & countStat() {return _count;}
259};
260
261class UnimplementedLDD : public SparcFault
262{
263  private:
264    static FaultName _name;
265    static TrapType _trapType;
266    static FaultPriority _priority;
267    static FaultStat _count;
268  public:
269    FaultName name() {return _name;}
270    TrapType trapType() {return _trapType;}
271    FaultPriority priority() {return _priority;}
272    FaultStat & countStat() {return _count;}
273};
274
275class UnimplementedSTD : public SparcFault
276{
277  private:
278    static FaultName _name;
279    static TrapType _trapType;
280    static FaultPriority _priority;
281    static FaultStat _count;
282  public:
283    FaultName name() {return _name;}
284    TrapType trapType() {return _trapType;}
285    FaultPriority priority() {return _priority;}
286    FaultStat & countStat() {return _count;}
287};
288
289class FpDisabled : public SparcFault
290{
291  private:
292    static FaultName _name;
293    static TrapType _trapType;
294    static FaultPriority _priority;
295    static FaultStat _count;
296  public:
297    FaultName name() {return _name;}
298    TrapType trapType() {return _trapType;}
299    FaultPriority priority() {return _priority;}
300    FaultStat & countStat() {return _count;}
301};
302
303class FpExceptionIEEE754 : public SparcFault
304{
305  private:
306    static FaultName _name;
307    static TrapType _trapType;
308    static FaultPriority _priority;
309    static FaultStat _count;
310  public:
311    FaultName name() {return _name;}
312    TrapType trapType() {return _trapType;}
313    FaultPriority priority() {return _priority;}
314    FaultStat & countStat() {return _count;}
315};
316
317class FpExceptionOther : public SparcFault
318{
319  private:
320    static FaultName _name;
321    static TrapType _trapType;
322    static FaultPriority _priority;
323    static FaultStat _count;
324  public:
325    FaultName name() {return _name;}
326    TrapType trapType() {return _trapType;}
327    FaultPriority priority() {return _priority;}
328    FaultStat & countStat() {return _count;}
329};
330
331class TagOverflow : public SparcFault
332{
333  private:
334    static FaultName _name;
335    static TrapType _trapType;
336    static FaultPriority _priority;
337    static FaultStat _count;
338  public:
339    FaultName name() {return _name;}
340    TrapType trapType() {return _trapType;}
341    FaultPriority priority() {return _priority;}
342    FaultStat & countStat() {return _count;}
343};
344
345class DivisionByZero : public SparcFault
346{
347  private:
348    static FaultName _name;
349    static TrapType _trapType;
350    static FaultPriority _priority;
351    static FaultStat _count;
352  public:
353    FaultName name() {return _name;}
354    TrapType trapType() {return _trapType;}
355    FaultPriority priority() {return _priority;}
356    FaultStat & countStat() {return _count;}
357};
358
359class DataAccessException : public SparcFault
360{
361  private:
362    static FaultName _name;
363    static TrapType _trapType;
364    static FaultPriority _priority;
365    static FaultStat _count;
366  public:
367    FaultName name() {return _name;}
368    TrapType trapType() {return _trapType;}
369    FaultPriority priority() {return _priority;}
370    FaultStat & countStat() {return _count;}
371};
372
373class DataAccessMMUMiss : public SparcFault
374{
375  private:
376    static FaultName _name;
377    static TrapType _trapType;
378    static FaultPriority _priority;
379    static FaultStat _count;
380  public:
381    FaultName name() {return _name;}
382    TrapType trapType() {return _trapType;}
383    FaultPriority priority() {return _priority;}
384    FaultStat & countStat() {return _count;}
385};
386
387class DataAccessError : public SparcFault
388{
389  private:
390    static FaultName _name;
391    static TrapType _trapType;
392    static FaultPriority _priority;
393    static FaultStat _count;
394  public:
395    FaultName name() {return _name;}
396    TrapType trapType() {return _trapType;}
397    FaultPriority priority() {return _priority;}
398    FaultStat & countStat() {return _count;}
399};
400
401class DataAccessProtection : public SparcFault
402{
403  private:
404    static FaultName _name;
405    static TrapType _trapType;
406    static FaultPriority _priority;
407    static FaultStat _count;
408  public:
409    FaultName name() {return _name;}
410    TrapType trapType() {return _trapType;}
411    FaultPriority priority() {return _priority;}
412    FaultStat & countStat() {return _count;}
413};
414
415class LDDFMemAddressNotAligned : public SparcFault
416{
417  private:
418    static FaultName _name;
419    static TrapType _trapType;
420    static FaultPriority _priority;
421    static FaultStat _count;
422  public:
423    FaultName name() {return _name;}
424    TrapType trapType() {return _trapType;}
425    FaultPriority priority() {return _priority;}
426    FaultStat & countStat() {return _count;}
427};
428
429class STDFMemAddressNotAligned : public SparcFault
430{
431  private:
432    static FaultName _name;
433    static TrapType _trapType;
434    static FaultPriority _priority;
435    static FaultStat _count;
436  public:
437    FaultName name() {return _name;}
438    TrapType trapType() {return _trapType;}
439    FaultPriority priority() {return _priority;}
440    FaultStat & countStat() {return _count;}
441};
442
443class PrivilegedAction : public SparcFault
444{
445  private:
446    static FaultName _name;
447    static TrapType _trapType;
448    static FaultPriority _priority;
449    static FaultStat _count;
450  public:
451    FaultName name() {return _name;}
452    TrapType trapType() {return _trapType;}
453    FaultPriority priority() {return _priority;}
454    FaultStat & countStat() {return _count;}
455};
456
457class LDQFMemAddressNotAligned : public SparcFault
458{
459  private:
460    static FaultName _name;
461    static TrapType _trapType;
462    static FaultPriority _priority;
463    static FaultStat _count;
464  public:
465    FaultName name() {return _name;}
466    TrapType trapType() {return _trapType;}
467    FaultPriority priority() {return _priority;}
468    FaultStat & countStat() {return _count;}
469};
470
471class STQFMemAddressNotAligned : public SparcFault
472{
473  private:
474    static FaultName _name;
475    static TrapType _trapType;
476    static FaultPriority _priority;
477    static FaultStat _count;
478  public:
479    FaultName name() {return _name;}
480    TrapType trapType() {return _trapType;}
481    FaultPriority priority() {return _priority;}
482    FaultStat & countStat() {return _count;}
483};
484
485class AsyncDataError : public SparcFault
486{
487  private:
488    static FaultName _name;
489    static TrapType _trapType;
490    static FaultPriority _priority;
491    static FaultStat _count;
492  public:
493    FaultName name() {return _name;}
494    TrapType trapType() {return _trapType;}
495    FaultPriority priority() {return _priority;}
496    FaultStat & countStat() {return _count;}
497};
498
499class CleanWindow : public SparcFault
500{
501  private:
502    static FaultName _name;
503    static TrapType _trapType;
504    static FaultPriority _priority;
505    static FaultStat _count;
506  public:
507    FaultName name() {return _name;}
508    TrapType trapType() {return _trapType;}
509    FaultPriority priority() {return _priority;}
510    FaultStat & countStat() {return _count;}
511};
512
513class EnumeratedFault : public SparcFault
514{
515  protected:
516    uint32_t _n;
517    virtual TrapType baseTrapType() = 0;
518  public:
519    EnumeratedFault(uint32_t n) : SparcFault() {_n = n;}
520    TrapType trapType() {return baseTrapType() + _n;}
521};
522
523class InterruptLevelN : public EnumeratedFault
524{
525  private:
526    static FaultName _name;
527    static TrapType _baseTrapType;
528    static FaultStat _count;
529    TrapType baseTrapType() {return _baseTrapType;}
530  public:
531    InterruptLevelN(uint32_t n) : EnumeratedFault(n) {;}
532    FaultName name() {return _name;}
533    FaultPriority priority() {return 32 - _n;}
534    FaultStat & countStat() {return _count;}
535};
536
537class SpillNNormal : public EnumeratedFault
538{
539  private:
540    static FaultName _name;
541    static TrapType _baseTrapType;
542    static FaultPriority _priority;
543    static FaultStat _count;
544    TrapType baseTrapType() {return _baseTrapType;}
545  public:
546    SpillNNormal(uint32_t n) : EnumeratedFault(n) {;}
547    FaultName name() {return _name;}
548    FaultPriority priority() {return _priority;}
549    FaultStat & countStat() {return _count;}
550};
551
552class SpillNOther : public EnumeratedFault
553{
554  private:
555    static FaultName _name;
556    static TrapType _baseTrapType;
557    static FaultPriority _priority;
558    static FaultStat _count;
559    TrapType baseTrapType() {return _baseTrapType;}
560  public:
561    SpillNOther(uint32_t n) : EnumeratedFault(n) {;}
562    FaultName name() {return _name;}
563    FaultPriority priority() {return _priority;}
564    FaultStat & countStat() {return _count;}
565};
566
567class FillNNormal : public EnumeratedFault
568{
569  private:
570    static FaultName _name;
571    static TrapType _baseTrapType;
572    static FaultPriority _priority;
573    static FaultStat _count;
574    TrapType baseTrapType() {return _baseTrapType;}
575  public:
576    FillNNormal(uint32_t n) : EnumeratedFault(n) {;}
577    FaultName name() {return _name;}
578    FaultPriority priority() {return _priority;}
579    FaultStat & countStat() {return _count;}
580};
581
582class FillNOther : public EnumeratedFault
583{
584  private:
585    static FaultName _name;
586    static TrapType _baseTrapType;
587    static FaultPriority _priority;
588    static FaultStat _count;
589    TrapType baseTrapType() {return _baseTrapType;}
590  public:
591    FillNOther(uint32_t n) : EnumeratedFault(n) {;}
592    FaultName name() {return _name;}
593    FaultPriority priority() {return _priority;}
594    FaultStat & countStat() {return _count;}
595};
596
597class TrapInstruction : public EnumeratedFault
598{
599  private:
600    static FaultName _name;
601    static TrapType _baseTrapType;
602    static FaultPriority _priority;
603    static FaultStat _count;
604    uint64_t syscall_num;
605    TrapType baseTrapType() {return _baseTrapType;}
606  public:
607    TrapInstruction(uint32_t n, uint64_t syscall) :
608        EnumeratedFault(n), syscall_num(syscall) {;}
609    FaultName name() {return _name;}
610    FaultPriority priority() {return _priority;}
611    FaultStat & countStat() {return _count;}
612#if !FULL_SYSTEM
613    void invoke(ThreadContext * tc);
614#endif
615};
616
617
618} // SparcISA namespace
619
620#endif // __FAULTS_HH__
621