faults.hh (2632:1bb2f91485ea) faults.hh (2665:a124942bacb8)
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.
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
27 */
28
29#ifndef __ALPHA_FAULTS_HH__
30#define __ALPHA_FAULTS_HH__
31
32#include "arch/alpha/isa_traits.hh"
33#include "sim/faults.hh"
34
35// The design of the "name" and "vect" functions is in sim/faults.hh
36
37namespace AlphaISA
38{
39
40typedef const Addr FaultVect;
41
42class AlphaFault : public FaultBase
43{
44 protected:
45 virtual bool skipFaultingInstruction() {return false;}
46 virtual bool setRestartAddress() {return true;}
47 public:
48#if FULL_SYSTEM
49 void invoke(ExecContext * xc);
50#endif
51 virtual FaultVect vect() = 0;
52 virtual FaultStat & countStat() = 0;
53};
54
55class MachineCheckFault : public AlphaFault
56{
57 private:
58 static FaultName _name;
59 static FaultVect _vect;
60 static FaultStat _count;
61 public:
62 FaultName name() {return _name;}
63 FaultVect vect() {return _vect;}
64 FaultStat & countStat() {return _count;}
65 bool isMachineCheckFault() {return true;}
66};
67
68class AlignmentFault : public AlphaFault
69{
70 private:
71 static FaultName _name;
72 static FaultVect _vect;
73 static FaultStat _count;
74 public:
75 FaultName name() {return _name;}
76 FaultVect vect() {return _vect;}
77 FaultStat & countStat() {return _count;}
78 bool isAlignmentFault() {return true;}
79};
80
81static inline Fault genMachineCheckFault()
82{
83 return new MachineCheckFault;
84}
85
86static inline Fault genAlignmentFault()
87{
88 return new AlignmentFault;
89}
90
91class ResetFault : public AlphaFault
92{
93 private:
94 static FaultName _name;
95 static FaultVect _vect;
96 static FaultStat _count;
97 public:
98 FaultName name() {return _name;}
99 FaultVect vect() {return _vect;}
100 FaultStat & countStat() {return _count;}
101};
102
103class ArithmeticFault : public AlphaFault
104{
105 protected:
106 bool skipFaultingInstruction() {return true;}
107 private:
108 static FaultName _name;
109 static FaultVect _vect;
110 static FaultStat _count;
111 public:
112 FaultName name() {return _name;}
113 FaultVect vect() {return _vect;}
114 FaultStat & countStat() {return _count;}
115#if FULL_SYSTEM
116 void invoke(ExecContext * xc);
117#endif
118};
119
120class InterruptFault : public AlphaFault
121{
122 protected:
123 bool setRestartAddress() {return false;}
124 private:
125 static FaultName _name;
126 static FaultVect _vect;
127 static FaultStat _count;
128 public:
129 FaultName name() {return _name;}
130 FaultVect vect() {return _vect;}
131 FaultStat & countStat() {return _count;}
132};
133
134class DtbFault : public AlphaFault
135{
136#if FULL_SYSTEM
137 private:
138 AlphaISA::VAddr vaddr;
139 uint32_t reqFlags;
140 uint64_t flags;
141 public:
142 DtbFault(AlphaISA::VAddr _vaddr, uint32_t _reqFlags, uint64_t _flags)
143 : vaddr(_vaddr), reqFlags(_reqFlags), flags(_flags)
144 { }
145#endif
146 FaultName name() = 0;
147 FaultVect vect() = 0;
148 FaultStat & countStat() = 0;
149#if FULL_SYSTEM
150 void invoke(ExecContext * xc);
151#endif
152};
153
154class NDtbMissFault : public DtbFault
155{
156 private:
157 static FaultName _name;
158 static FaultVect _vect;
159 static FaultStat _count;
160 public:
161#if FULL_SYSTEM
162 NDtbMissFault(AlphaISA::VAddr vaddr, uint32_t reqFlags, uint64_t flags)
163 : DtbFault(vaddr, reqFlags, flags)
164 { }
165#endif
166 FaultName name() {return _name;}
167 FaultVect vect() {return _vect;}
168 FaultStat & countStat() {return _count;}
169};
170
171class PDtbMissFault : public DtbFault
172{
173 private:
174 static FaultName _name;
175 static FaultVect _vect;
176 static FaultStat _count;
177 public:
178#if FULL_SYSTEM
179 PDtbMissFault(AlphaISA::VAddr vaddr, uint32_t reqFlags, uint64_t flags)
180 : DtbFault(vaddr, reqFlags, flags)
181 { }
182#endif
183 FaultName name() {return _name;}
184 FaultVect vect() {return _vect;}
185 FaultStat & countStat() {return _count;}
186};
187
188class DtbPageFault : public DtbFault
189{
190 private:
191 static FaultName _name;
192 static FaultVect _vect;
193 static FaultStat _count;
194 public:
195#if FULL_SYSTEM
196 DtbPageFault(AlphaISA::VAddr vaddr, uint32_t reqFlags, uint64_t flags)
197 : DtbFault(vaddr, reqFlags, flags)
198 { }
199#endif
200 FaultName name() {return _name;}
201 FaultVect vect() {return _vect;}
202 FaultStat & countStat() {return _count;}
203};
204
205class DtbAcvFault : public DtbFault
206{
207 private:
208 static FaultName _name;
209 static FaultVect _vect;
210 static FaultStat _count;
211 public:
212#if FULL_SYSTEM
213 DtbAcvFault(AlphaISA::VAddr vaddr, uint32_t reqFlags, uint64_t flags)
214 : DtbFault(vaddr, reqFlags, flags)
215 { }
216#endif
217 FaultName name() {return _name;}
218 FaultVect vect() {return _vect;}
219 FaultStat & countStat() {return _count;}
220};
221
222class DtbAlignmentFault : public DtbFault
223{
224 private:
225 static FaultName _name;
226 static FaultVect _vect;
227 static FaultStat _count;
228 public:
229#if FULL_SYSTEM
230 DtbAlignmentFault(AlphaISA::VAddr vaddr, uint32_t reqFlags, uint64_t flags)
231 : DtbFault(vaddr, reqFlags, flags)
232 { }
233#endif
234 FaultName name() {return _name;}
235 FaultVect vect() {return _vect;}
236 FaultStat & countStat() {return _count;}
237};
238
239class ItbFault : public AlphaFault
240{
241 private:
242 Addr pc;
243 public:
244 ItbFault(Addr _pc)
245 : pc(_pc)
246 { }
247 FaultName name() = 0;
248 FaultVect vect() = 0;
249 FaultStat & countStat() = 0;
250#if FULL_SYSTEM
251 void invoke(ExecContext * xc);
252#endif
253};
254
255class ItbMissFault : public ItbFault
256{
257 private:
258 static FaultName _name;
259 static FaultVect _vect;
260 static FaultStat _count;
261 public:
262 ItbMissFault(Addr pc)
263 : ItbFault(pc)
264 { }
265 FaultName name() {return _name;}
266 FaultVect vect() {return _vect;}
267 FaultStat & countStat() {return _count;}
268};
269
270class ItbPageFault : public ItbFault
271{
272 private:
273 static FaultName _name;
274 static FaultVect _vect;
275 static FaultStat _count;
276 public:
277 ItbPageFault(Addr pc)
278 : ItbFault(pc)
279 { }
280 FaultName name() {return _name;}
281 FaultVect vect() {return _vect;}
282 FaultStat & countStat() {return _count;}
283};
284
285class ItbAcvFault : public ItbFault
286{
287 private:
288 static FaultName _name;
289 static FaultVect _vect;
290 static FaultStat _count;
291 public:
292 ItbAcvFault(Addr pc)
293 : ItbFault(pc)
294 { }
295 FaultName name() {return _name;}
296 FaultVect vect() {return _vect;}
297 FaultStat & countStat() {return _count;}
298};
299
300class UnimplementedOpcodeFault : public AlphaFault
301{
302 private:
303 static FaultName _name;
304 static FaultVect _vect;
305 static FaultStat _count;
306 public:
307 FaultName name() {return _name;}
308 FaultVect vect() {return _vect;}
309 FaultStat & countStat() {return _count;}
310};
311
312class FloatEnableFault : public AlphaFault
313{
314 private:
315 static FaultName _name;
316 static FaultVect _vect;
317 static FaultStat _count;
318 public:
319 FaultName name() {return _name;}
320 FaultVect vect() {return _vect;}
321 FaultStat & countStat() {return _count;}
322};
323
324class PalFault : public AlphaFault
325{
326 protected:
327 bool skipFaultingInstruction() {return true;}
328 private:
329 static FaultName _name;
330 static FaultVect _vect;
331 static FaultStat _count;
332 public:
333 FaultName name() {return _name;}
334 FaultVect vect() {return _vect;}
335 FaultStat & countStat() {return _count;}
336};
337
338class IntegerOverflowFault : public AlphaFault
339{
340 private:
341 static FaultName _name;
342 static FaultVect _vect;
343 static FaultStat _count;
344 public:
345 FaultName name() {return _name;}
346 FaultVect vect() {return _vect;}
347 FaultStat & countStat() {return _count;}
348};
349
350} // AlphaISA namespace
351
352#endif // __FAULTS_HH__
30 */
31
32#ifndef __ALPHA_FAULTS_HH__
33#define __ALPHA_FAULTS_HH__
34
35#include "arch/alpha/isa_traits.hh"
36#include "sim/faults.hh"
37
38// The design of the "name" and "vect" functions is in sim/faults.hh
39
40namespace AlphaISA
41{
42
43typedef const Addr FaultVect;
44
45class AlphaFault : public FaultBase
46{
47 protected:
48 virtual bool skipFaultingInstruction() {return false;}
49 virtual bool setRestartAddress() {return true;}
50 public:
51#if FULL_SYSTEM
52 void invoke(ExecContext * xc);
53#endif
54 virtual FaultVect vect() = 0;
55 virtual FaultStat & countStat() = 0;
56};
57
58class MachineCheckFault : public AlphaFault
59{
60 private:
61 static FaultName _name;
62 static FaultVect _vect;
63 static FaultStat _count;
64 public:
65 FaultName name() {return _name;}
66 FaultVect vect() {return _vect;}
67 FaultStat & countStat() {return _count;}
68 bool isMachineCheckFault() {return true;}
69};
70
71class AlignmentFault : public AlphaFault
72{
73 private:
74 static FaultName _name;
75 static FaultVect _vect;
76 static FaultStat _count;
77 public:
78 FaultName name() {return _name;}
79 FaultVect vect() {return _vect;}
80 FaultStat & countStat() {return _count;}
81 bool isAlignmentFault() {return true;}
82};
83
84static inline Fault genMachineCheckFault()
85{
86 return new MachineCheckFault;
87}
88
89static inline Fault genAlignmentFault()
90{
91 return new AlignmentFault;
92}
93
94class ResetFault : public AlphaFault
95{
96 private:
97 static FaultName _name;
98 static FaultVect _vect;
99 static FaultStat _count;
100 public:
101 FaultName name() {return _name;}
102 FaultVect vect() {return _vect;}
103 FaultStat & countStat() {return _count;}
104};
105
106class ArithmeticFault : public AlphaFault
107{
108 protected:
109 bool skipFaultingInstruction() {return true;}
110 private:
111 static FaultName _name;
112 static FaultVect _vect;
113 static FaultStat _count;
114 public:
115 FaultName name() {return _name;}
116 FaultVect vect() {return _vect;}
117 FaultStat & countStat() {return _count;}
118#if FULL_SYSTEM
119 void invoke(ExecContext * xc);
120#endif
121};
122
123class InterruptFault : public AlphaFault
124{
125 protected:
126 bool setRestartAddress() {return false;}
127 private:
128 static FaultName _name;
129 static FaultVect _vect;
130 static FaultStat _count;
131 public:
132 FaultName name() {return _name;}
133 FaultVect vect() {return _vect;}
134 FaultStat & countStat() {return _count;}
135};
136
137class DtbFault : public AlphaFault
138{
139#if FULL_SYSTEM
140 private:
141 AlphaISA::VAddr vaddr;
142 uint32_t reqFlags;
143 uint64_t flags;
144 public:
145 DtbFault(AlphaISA::VAddr _vaddr, uint32_t _reqFlags, uint64_t _flags)
146 : vaddr(_vaddr), reqFlags(_reqFlags), flags(_flags)
147 { }
148#endif
149 FaultName name() = 0;
150 FaultVect vect() = 0;
151 FaultStat & countStat() = 0;
152#if FULL_SYSTEM
153 void invoke(ExecContext * xc);
154#endif
155};
156
157class NDtbMissFault : public DtbFault
158{
159 private:
160 static FaultName _name;
161 static FaultVect _vect;
162 static FaultStat _count;
163 public:
164#if FULL_SYSTEM
165 NDtbMissFault(AlphaISA::VAddr vaddr, uint32_t reqFlags, uint64_t flags)
166 : DtbFault(vaddr, reqFlags, flags)
167 { }
168#endif
169 FaultName name() {return _name;}
170 FaultVect vect() {return _vect;}
171 FaultStat & countStat() {return _count;}
172};
173
174class PDtbMissFault : public DtbFault
175{
176 private:
177 static FaultName _name;
178 static FaultVect _vect;
179 static FaultStat _count;
180 public:
181#if FULL_SYSTEM
182 PDtbMissFault(AlphaISA::VAddr vaddr, uint32_t reqFlags, uint64_t flags)
183 : DtbFault(vaddr, reqFlags, flags)
184 { }
185#endif
186 FaultName name() {return _name;}
187 FaultVect vect() {return _vect;}
188 FaultStat & countStat() {return _count;}
189};
190
191class DtbPageFault : public DtbFault
192{
193 private:
194 static FaultName _name;
195 static FaultVect _vect;
196 static FaultStat _count;
197 public:
198#if FULL_SYSTEM
199 DtbPageFault(AlphaISA::VAddr vaddr, uint32_t reqFlags, uint64_t flags)
200 : DtbFault(vaddr, reqFlags, flags)
201 { }
202#endif
203 FaultName name() {return _name;}
204 FaultVect vect() {return _vect;}
205 FaultStat & countStat() {return _count;}
206};
207
208class DtbAcvFault : public DtbFault
209{
210 private:
211 static FaultName _name;
212 static FaultVect _vect;
213 static FaultStat _count;
214 public:
215#if FULL_SYSTEM
216 DtbAcvFault(AlphaISA::VAddr vaddr, uint32_t reqFlags, uint64_t flags)
217 : DtbFault(vaddr, reqFlags, flags)
218 { }
219#endif
220 FaultName name() {return _name;}
221 FaultVect vect() {return _vect;}
222 FaultStat & countStat() {return _count;}
223};
224
225class DtbAlignmentFault : public DtbFault
226{
227 private:
228 static FaultName _name;
229 static FaultVect _vect;
230 static FaultStat _count;
231 public:
232#if FULL_SYSTEM
233 DtbAlignmentFault(AlphaISA::VAddr vaddr, uint32_t reqFlags, uint64_t flags)
234 : DtbFault(vaddr, reqFlags, flags)
235 { }
236#endif
237 FaultName name() {return _name;}
238 FaultVect vect() {return _vect;}
239 FaultStat & countStat() {return _count;}
240};
241
242class ItbFault : public AlphaFault
243{
244 private:
245 Addr pc;
246 public:
247 ItbFault(Addr _pc)
248 : pc(_pc)
249 { }
250 FaultName name() = 0;
251 FaultVect vect() = 0;
252 FaultStat & countStat() = 0;
253#if FULL_SYSTEM
254 void invoke(ExecContext * xc);
255#endif
256};
257
258class ItbMissFault : public ItbFault
259{
260 private:
261 static FaultName _name;
262 static FaultVect _vect;
263 static FaultStat _count;
264 public:
265 ItbMissFault(Addr pc)
266 : ItbFault(pc)
267 { }
268 FaultName name() {return _name;}
269 FaultVect vect() {return _vect;}
270 FaultStat & countStat() {return _count;}
271};
272
273class ItbPageFault : public ItbFault
274{
275 private:
276 static FaultName _name;
277 static FaultVect _vect;
278 static FaultStat _count;
279 public:
280 ItbPageFault(Addr pc)
281 : ItbFault(pc)
282 { }
283 FaultName name() {return _name;}
284 FaultVect vect() {return _vect;}
285 FaultStat & countStat() {return _count;}
286};
287
288class ItbAcvFault : public ItbFault
289{
290 private:
291 static FaultName _name;
292 static FaultVect _vect;
293 static FaultStat _count;
294 public:
295 ItbAcvFault(Addr pc)
296 : ItbFault(pc)
297 { }
298 FaultName name() {return _name;}
299 FaultVect vect() {return _vect;}
300 FaultStat & countStat() {return _count;}
301};
302
303class UnimplementedOpcodeFault : public AlphaFault
304{
305 private:
306 static FaultName _name;
307 static FaultVect _vect;
308 static FaultStat _count;
309 public:
310 FaultName name() {return _name;}
311 FaultVect vect() {return _vect;}
312 FaultStat & countStat() {return _count;}
313};
314
315class FloatEnableFault : public AlphaFault
316{
317 private:
318 static FaultName _name;
319 static FaultVect _vect;
320 static FaultStat _count;
321 public:
322 FaultName name() {return _name;}
323 FaultVect vect() {return _vect;}
324 FaultStat & countStat() {return _count;}
325};
326
327class PalFault : public AlphaFault
328{
329 protected:
330 bool skipFaultingInstruction() {return true;}
331 private:
332 static FaultName _name;
333 static FaultVect _vect;
334 static FaultStat _count;
335 public:
336 FaultName name() {return _name;}
337 FaultVect vect() {return _vect;}
338 FaultStat & countStat() {return _count;}
339};
340
341class IntegerOverflowFault : public AlphaFault
342{
343 private:
344 static FaultName _name;
345 static FaultVect _vect;
346 static FaultStat _count;
347 public:
348 FaultName name() {return _name;}
349 FaultVect vect() {return _vect;}
350 FaultStat & countStat() {return _count;}
351};
352
353} // AlphaISA namespace
354
355#endif // __FAULTS_HH__