2 * Copyright (c) 2003-2005 The Regents of The University of Michigan
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.
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.
32 #ifndef __ALPHA_FAULTS_HH__
33 #define __ALPHA_FAULTS_HH__
35 #include "config/full_system.hh"
36 #include "sim/faults.hh"
38 #include "arch/alpha/pagetable.hh"
40 // The design of the "name" and "vect" functions is in sim/faults.hh
45 typedef const Addr FaultVect;
47 class AlphaFault : public FaultBase
50 virtual bool skipFaultingInstruction() {return false;}
51 virtual bool setRestartAddress() {return true;}
54 void invoke(ThreadContext * tc);
56 virtual FaultVect vect() = 0;
57 virtual FaultStat & countStat() = 0;
60 class MachineCheckFault : public AlphaFault
63 static FaultName _name;
64 static FaultVect _vect;
65 static FaultStat _count;
67 FaultName name() const {return _name;}
68 FaultVect vect() {return _vect;}
69 FaultStat & countStat() {return _count;}
70 bool isMachineCheckFault() const {return true;}
73 class AlignmentFault : public AlphaFault
76 static FaultName _name;
77 static FaultVect _vect;
78 static FaultStat _count;
80 FaultName name() const {return _name;}
81 FaultVect vect() {return _vect;}
82 FaultStat & countStat() {return _count;}
83 bool isAlignmentFault() const {return true;}
86 static inline Fault genMachineCheckFault()
88 return new MachineCheckFault;
91 class ResetFault : public AlphaFault
94 static FaultName _name;
95 static FaultVect _vect;
96 static FaultStat _count;
98 FaultName name() const {return _name;}
99 FaultVect vect() {return _vect;}
100 FaultStat & countStat() {return _count;}
103 class ArithmeticFault : public AlphaFault
106 bool skipFaultingInstruction() {return true;}
108 static FaultName _name;
109 static FaultVect _vect;
110 static FaultStat _count;
112 FaultName name() const {return _name;}
113 FaultVect vect() {return _vect;}
114 FaultStat & countStat() {return _count;}
116 void invoke(ThreadContext * tc);
120 class InterruptFault : public AlphaFault
123 bool setRestartAddress() {return false;}
125 static FaultName _name;
126 static FaultVect _vect;
127 static FaultStat _count;
129 FaultName name() const {return _name;}
130 FaultVect vect() {return _vect;}
131 FaultStat & countStat() {return _count;}
134 class DtbFault : public AlphaFault
141 DtbFault(VAddr _vaddr, uint32_t _reqFlags, uint64_t _flags)
142 : vaddr(_vaddr), reqFlags(_reqFlags), flags(_flags)
144 FaultName name() const = 0;
145 FaultVect vect() = 0;
146 FaultStat & countStat() = 0;
148 void invoke(ThreadContext * tc);
152 class NDtbMissFault : public DtbFault
155 static FaultName _name;
156 static FaultVect _vect;
157 static FaultStat _count;
159 NDtbMissFault(VAddr vaddr, uint32_t reqFlags, uint64_t flags)
160 : DtbFault(vaddr, reqFlags, flags)
162 FaultName name() const {return _name;}
163 FaultVect vect() {return _vect;}
164 FaultStat & countStat() {return _count;}
166 void invoke(ThreadContext * tc);
170 class PDtbMissFault : public DtbFault
173 static FaultName _name;
174 static FaultVect _vect;
175 static FaultStat _count;
177 PDtbMissFault(VAddr vaddr, uint32_t reqFlags, uint64_t flags)
178 : DtbFault(vaddr, reqFlags, flags)
180 FaultName name() const {return _name;}
181 FaultVect vect() {return _vect;}
182 FaultStat & countStat() {return _count;}
185 class DtbPageFault : public DtbFault
188 static FaultName _name;
189 static FaultVect _vect;
190 static FaultStat _count;
192 DtbPageFault(VAddr vaddr, uint32_t reqFlags, uint64_t flags)
193 : DtbFault(vaddr, reqFlags, flags)
195 FaultName name() const {return _name;}
196 FaultVect vect() {return _vect;}
197 FaultStat & countStat() {return _count;}
200 class DtbAcvFault : public DtbFault
203 static FaultName _name;
204 static FaultVect _vect;
205 static FaultStat _count;
207 DtbAcvFault(VAddr vaddr, uint32_t reqFlags, uint64_t flags)
208 : DtbFault(vaddr, reqFlags, flags)
210 FaultName name() const {return _name;}
211 FaultVect vect() {return _vect;}
212 FaultStat & countStat() {return _count;}
215 class DtbAlignmentFault : public DtbFault
218 static FaultName _name;
219 static FaultVect _vect;
220 static FaultStat _count;
222 DtbAlignmentFault(VAddr vaddr, uint32_t reqFlags, uint64_t flags)
223 : DtbFault(vaddr, reqFlags, flags)
225 FaultName name() const {return _name;}
226 FaultVect vect() {return _vect;}
227 FaultStat & countStat() {return _count;}
230 class ItbFault : public AlphaFault
238 FaultName name() const = 0;
239 FaultVect vect() = 0;
240 FaultStat & countStat() = 0;
242 void invoke(ThreadContext * tc);
246 class ItbPageFault : public ItbFault
249 static FaultName _name;
250 static FaultVect _vect;
251 static FaultStat _count;
253 ItbPageFault(Addr pc)
256 FaultName name() const {return _name;}
257 FaultVect vect() {return _vect;}
258 FaultStat & countStat() {return _count;}
260 void invoke(ThreadContext * tc);
264 class ItbAcvFault : public ItbFault
267 static FaultName _name;
268 static FaultVect _vect;
269 static FaultStat _count;
274 FaultName name() const {return _name;}
275 FaultVect vect() {return _vect;}
276 FaultStat & countStat() {return _count;}
279 class UnimplementedOpcodeFault : public AlphaFault
282 static FaultName _name;
283 static FaultVect _vect;
284 static FaultStat _count;
286 FaultName name() const {return _name;}
287 FaultVect vect() {return _vect;}
288 FaultStat & countStat() {return _count;}
291 class FloatEnableFault : public AlphaFault
294 static FaultName _name;
295 static FaultVect _vect;
296 static FaultStat _count;
298 FaultName name() const {return _name;}
299 FaultVect vect() {return _vect;}
300 FaultStat & countStat() {return _count;}
303 class PalFault : public AlphaFault
306 bool skipFaultingInstruction() {return true;}
308 static FaultName _name;
309 static FaultVect _vect;
310 static FaultStat _count;
312 FaultName name() const {return _name;}
313 FaultVect vect() {return _vect;}
314 FaultStat & countStat() {return _count;}
317 class IntegerOverflowFault : public AlphaFault
320 static FaultName _name;
321 static FaultVect _vect;
322 static FaultStat _count;
324 FaultName name() const {return _name;}
325 FaultVect vect() {return _vect;}
326 FaultStat & countStat() {return _count;}
329 } // AlphaISA namespace
331 #endif // __FAULTS_HH__