faults.hh revision 3552:186aa07d5fa1
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 uint32_t TrapType;
43typedef 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    void invoke(ThreadContext * tc);
134};
135
136class WatchDogReset : public SparcFault
137{
138  private:
139    static FaultName _name;
140    static TrapType _trapType;
141    static FaultPriority _priority;
142    static FaultStat _count;
143  public:
144    FaultName name() {return _name;}
145    TrapType trapType() {return _trapType;}
146    FaultPriority priority() {return _priority;}
147    FaultStat & countStat() {return _count;}
148};
149
150class ExternallyInitiatedReset : public SparcFault
151{
152  private:
153    static FaultName _name;
154    static TrapType _trapType;
155    static FaultPriority _priority;
156    static FaultStat _count;
157  public:
158    FaultName name() {return _name;}
159    TrapType trapType() {return _trapType;}
160    FaultPriority priority() {return _priority;}
161    FaultStat & countStat() {return _count;}
162};
163
164class SoftwareInitiatedReset : public SparcFault
165{
166  private:
167    static FaultName _name;
168    static TrapType _trapType;
169    static FaultPriority _priority;
170    static FaultStat _count;
171  public:
172    FaultName name() {return _name;}
173    TrapType trapType() {return _trapType;}
174    FaultPriority priority() {return _priority;}
175    FaultStat & countStat() {return _count;}
176};
177
178class REDStateException : public SparcFault
179{
180  private:
181    static FaultName _name;
182    static TrapType _trapType;
183    static FaultPriority _priority;
184    static FaultStat _count;
185  public:
186    FaultName name() {return _name;}
187    TrapType trapType() {return _trapType;}
188    FaultPriority priority() {return _priority;}
189    FaultStat & countStat() {return _count;}
190};
191
192class InstructionAccessException : public SparcFault
193{
194  private:
195    static FaultName _name;
196    static TrapType _trapType;
197    static FaultPriority _priority;
198    static FaultStat _count;
199  public:
200    FaultName name() {return _name;}
201    TrapType trapType() {return _trapType;}
202    FaultPriority priority() {return _priority;}
203    FaultStat & countStat() {return _count;}
204};
205
206class InstructionAccessMMUMiss : public SparcFault
207{
208  private:
209    static FaultName _name;
210    static TrapType _trapType;
211    static FaultPriority _priority;
212    static FaultStat _count;
213  public:
214    FaultName name() {return _name;}
215    TrapType trapType() {return _trapType;}
216    FaultPriority priority() {return _priority;}
217    FaultStat & countStat() {return _count;}
218};
219
220class InstructionAccessError : public SparcFault
221{
222  private:
223    static FaultName _name;
224    static TrapType _trapType;
225    static FaultPriority _priority;
226    static FaultStat _count;
227  public:
228    FaultName name() {return _name;}
229    TrapType trapType() {return _trapType;}
230    FaultPriority priority() {return _priority;}
231    FaultStat & countStat() {return _count;}
232};
233
234class IllegalInstruction : public SparcFault
235{
236  private:
237    static FaultName _name;
238    static TrapType _trapType;
239    static FaultPriority _priority;
240    static FaultStat _count;
241  public:
242    FaultName name() {return _name;}
243    TrapType trapType() {return _trapType;}
244    FaultPriority priority() {return _priority;}
245    FaultStat & countStat() {return _count;}
246};
247
248class PrivilegedOpcode : public SparcFault
249{
250  private:
251    static FaultName _name;
252    static TrapType _trapType;
253    static FaultPriority _priority;
254    static FaultStat _count;
255  public:
256    FaultName name() {return _name;}
257    TrapType trapType() {return _trapType;}
258    FaultPriority priority() {return _priority;}
259    FaultStat & countStat() {return _count;}
260};
261
262class UnimplementedLDD : public SparcFault
263{
264  private:
265    static FaultName _name;
266    static TrapType _trapType;
267    static FaultPriority _priority;
268    static FaultStat _count;
269  public:
270    FaultName name() {return _name;}
271    TrapType trapType() {return _trapType;}
272    FaultPriority priority() {return _priority;}
273    FaultStat & countStat() {return _count;}
274};
275
276class UnimplementedSTD : public SparcFault
277{
278  private:
279    static FaultName _name;
280    static TrapType _trapType;
281    static FaultPriority _priority;
282    static FaultStat _count;
283  public:
284    FaultName name() {return _name;}
285    TrapType trapType() {return _trapType;}
286    FaultPriority priority() {return _priority;}
287    FaultStat & countStat() {return _count;}
288};
289
290class FpDisabled : public SparcFault
291{
292  private:
293    static FaultName _name;
294    static TrapType _trapType;
295    static FaultPriority _priority;
296    static FaultStat _count;
297  public:
298    FaultName name() {return _name;}
299    TrapType trapType() {return _trapType;}
300    FaultPriority priority() {return _priority;}
301    FaultStat & countStat() {return _count;}
302};
303
304class FpExceptionIEEE754 : public SparcFault
305{
306  private:
307    static FaultName _name;
308    static TrapType _trapType;
309    static FaultPriority _priority;
310    static FaultStat _count;
311  public:
312    FaultName name() {return _name;}
313    TrapType trapType() {return _trapType;}
314    FaultPriority priority() {return _priority;}
315    FaultStat & countStat() {return _count;}
316};
317
318class FpExceptionOther : public SparcFault
319{
320  private:
321    static FaultName _name;
322    static TrapType _trapType;
323    static FaultPriority _priority;
324    static FaultStat _count;
325  public:
326    FaultName name() {return _name;}
327    TrapType trapType() {return _trapType;}
328    FaultPriority priority() {return _priority;}
329    FaultStat & countStat() {return _count;}
330};
331
332class TagOverflow : public SparcFault
333{
334  private:
335    static FaultName _name;
336    static TrapType _trapType;
337    static FaultPriority _priority;
338    static FaultStat _count;
339  public:
340    FaultName name() {return _name;}
341    TrapType trapType() {return _trapType;}
342    FaultPriority priority() {return _priority;}
343    FaultStat & countStat() {return _count;}
344};
345
346class DivisionByZero : public SparcFault
347{
348  private:
349    static FaultName _name;
350    static TrapType _trapType;
351    static FaultPriority _priority;
352    static FaultStat _count;
353  public:
354    FaultName name() {return _name;}
355    TrapType trapType() {return _trapType;}
356    FaultPriority priority() {return _priority;}
357    FaultStat & countStat() {return _count;}
358};
359
360class DataAccessException : public SparcFault
361{
362  private:
363    static FaultName _name;
364    static TrapType _trapType;
365    static FaultPriority _priority;
366    static FaultStat _count;
367  public:
368    FaultName name() {return _name;}
369    TrapType trapType() {return _trapType;}
370    FaultPriority priority() {return _priority;}
371    FaultStat & countStat() {return _count;}
372};
373
374class DataAccessMMUMiss : public SparcFault
375{
376  private:
377    static FaultName _name;
378    static TrapType _trapType;
379    static FaultPriority _priority;
380    static FaultStat _count;
381  public:
382    FaultName name() {return _name;}
383    TrapType trapType() {return _trapType;}
384    FaultPriority priority() {return _priority;}
385    FaultStat & countStat() {return _count;}
386};
387
388class DataAccessError : public SparcFault
389{
390  private:
391    static FaultName _name;
392    static TrapType _trapType;
393    static FaultPriority _priority;
394    static FaultStat _count;
395  public:
396    FaultName name() {return _name;}
397    TrapType trapType() {return _trapType;}
398    FaultPriority priority() {return _priority;}
399    FaultStat & countStat() {return _count;}
400};
401
402class DataAccessProtection : public SparcFault
403{
404  private:
405    static FaultName _name;
406    static TrapType _trapType;
407    static FaultPriority _priority;
408    static FaultStat _count;
409  public:
410    FaultName name() {return _name;}
411    TrapType trapType() {return _trapType;}
412    FaultPriority priority() {return _priority;}
413    FaultStat & countStat() {return _count;}
414};
415
416class LDDFMemAddressNotAligned : public SparcFault
417{
418  private:
419    static FaultName _name;
420    static TrapType _trapType;
421    static FaultPriority _priority;
422    static FaultStat _count;
423  public:
424    FaultName name() {return _name;}
425    TrapType trapType() {return _trapType;}
426    FaultPriority priority() {return _priority;}
427    FaultStat & countStat() {return _count;}
428};
429
430class STDFMemAddressNotAligned : public SparcFault
431{
432  private:
433    static FaultName _name;
434    static TrapType _trapType;
435    static FaultPriority _priority;
436    static FaultStat _count;
437  public:
438    FaultName name() {return _name;}
439    TrapType trapType() {return _trapType;}
440    FaultPriority priority() {return _priority;}
441    FaultStat & countStat() {return _count;}
442};
443
444class PrivilegedAction : public SparcFault
445{
446  private:
447    static FaultName _name;
448    static TrapType _trapType;
449    static FaultPriority _priority;
450    static FaultStat _count;
451  public:
452    FaultName name() {return _name;}
453    TrapType trapType() {return _trapType;}
454    FaultPriority priority() {return _priority;}
455    FaultStat & countStat() {return _count;}
456};
457
458class LDQFMemAddressNotAligned : public SparcFault
459{
460  private:
461    static FaultName _name;
462    static TrapType _trapType;
463    static FaultPriority _priority;
464    static FaultStat _count;
465  public:
466    FaultName name() {return _name;}
467    TrapType trapType() {return _trapType;}
468    FaultPriority priority() {return _priority;}
469    FaultStat & countStat() {return _count;}
470};
471
472class STQFMemAddressNotAligned : public SparcFault
473{
474  private:
475    static FaultName _name;
476    static TrapType _trapType;
477    static FaultPriority _priority;
478    static FaultStat _count;
479  public:
480    FaultName name() {return _name;}
481    TrapType trapType() {return _trapType;}
482    FaultPriority priority() {return _priority;}
483    FaultStat & countStat() {return _count;}
484};
485
486class AsyncDataError : public SparcFault
487{
488  private:
489    static FaultName _name;
490    static TrapType _trapType;
491    static FaultPriority _priority;
492    static FaultStat _count;
493  public:
494    FaultName name() {return _name;}
495    TrapType trapType() {return _trapType;}
496    FaultPriority priority() {return _priority;}
497    FaultStat & countStat() {return _count;}
498};
499
500class CleanWindow : public SparcFault
501{
502  private:
503    static FaultName _name;
504    static TrapType _trapType;
505    static FaultPriority _priority;
506    static FaultStat _count;
507  public:
508    FaultName name() {return _name;}
509    TrapType trapType() {return _trapType;}
510    FaultPriority priority() {return _priority;}
511    FaultStat & countStat() {return _count;}
512};
513
514class EnumeratedFault : public SparcFault
515{
516  protected:
517    uint32_t _n;
518    virtual TrapType baseTrapType() = 0;
519  public:
520    EnumeratedFault(uint32_t n) : SparcFault() {_n = n;}
521    TrapType trapType() {return baseTrapType() + _n;}
522};
523
524class InterruptLevelN : public EnumeratedFault
525{
526  private:
527    static FaultName _name;
528    static TrapType _baseTrapType;
529    static FaultStat _count;
530    TrapType baseTrapType() {return _baseTrapType;}
531  public:
532    InterruptLevelN(uint32_t n) : EnumeratedFault(n) {;}
533    FaultName name() {return _name;}
534    FaultPriority priority() {return 32 - _n;}
535    FaultStat & countStat() {return _count;}
536};
537
538class SpillNNormal : public EnumeratedFault
539{
540  private:
541    static FaultName _name;
542    static TrapType _baseTrapType;
543    static FaultPriority _priority;
544    static FaultStat _count;
545    TrapType baseTrapType() {return _baseTrapType;}
546  public:
547    SpillNNormal(uint32_t n) : EnumeratedFault(n) {;}
548    FaultName name() {return _name;}
549    FaultPriority priority() {return _priority;}
550    FaultStat & countStat() {return _count;}
551    //These need to be handled specially to enable spill traps in SE
552#if !FULL_SYSTEM
553    void invoke(ThreadContext * tc);
554#endif
555};
556
557class SpillNOther : public EnumeratedFault
558{
559  private:
560    static FaultName _name;
561    static TrapType _baseTrapType;
562    static FaultPriority _priority;
563    static FaultStat _count;
564    TrapType baseTrapType() {return _baseTrapType;}
565  public:
566    SpillNOther(uint32_t n) : EnumeratedFault(n) {;}
567    FaultName name() {return _name;}
568    FaultPriority priority() {return _priority;}
569    FaultStat & countStat() {return _count;}
570};
571
572class FillNNormal : public EnumeratedFault
573{
574  private:
575    static FaultName _name;
576    static TrapType _baseTrapType;
577    static FaultPriority _priority;
578    static FaultStat _count;
579    TrapType baseTrapType() {return _baseTrapType;}
580  public:
581    FillNNormal(uint32_t n) : EnumeratedFault(n) {;}
582    FaultName name() {return _name;}
583    FaultPriority priority() {return _priority;}
584    FaultStat & countStat() {return _count;}
585    //These need to be handled specially to enable fill traps in SE
586#if !FULL_SYSTEM
587    void invoke(ThreadContext * tc);
588#endif
589};
590
591class FillNOther : public EnumeratedFault
592{
593  private:
594    static FaultName _name;
595    static TrapType _baseTrapType;
596    static FaultPriority _priority;
597    static FaultStat _count;
598    TrapType baseTrapType() {return _baseTrapType;}
599  public:
600    FillNOther(uint32_t n) : EnumeratedFault(n) {;}
601    FaultName name() {return _name;}
602    FaultPriority priority() {return _priority;}
603    FaultStat & countStat() {return _count;}
604};
605
606class TrapInstruction : public EnumeratedFault
607{
608  private:
609    static FaultName _name;
610    static TrapType _baseTrapType;
611    static FaultPriority _priority;
612    static FaultStat _count;
613    TrapType baseTrapType() {return _baseTrapType;}
614  public:
615    TrapInstruction(int32_t n) : EnumeratedFault(n) {;}
616    FaultName name() {return _name;}
617    FaultPriority priority() {return _priority;}
618    FaultStat & countStat() {return _count;}
619};
620
621
622} // SparcISA namespace
623
624#endif // __FAULTS_HH__
625