Deleted Added
sdiff udiff text old ( 8563:58cf8f4a7c33 ) new ( 8566:812d279f7b51 )
full compact
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

--- 27 unchanged lines hidden (view full) ---

36
37#include "sim/faults.hh"
38
39namespace MipsISA
40{
41
42typedef const Addr FaultVect;
43
44class MipsFaultBase : public FaultBase
45{
46 protected:
47 virtual bool skipFaultingInstruction() {return false;}
48 virtual bool setRestartAddress() {return true;}
49 public:
50 struct FaultVals
51 {
52 const FaultName name;
53 const FaultVect vect;
54 FaultStat count;
55 };
56
57 Addr badVAddr;
58 Addr entryHiAsid;
59 Addr entryHiVPN2;
60 Addr entryHiVPN2X;
61 Addr contextBadVPN2;
62#if FULL_SYSTEM
63 void invoke(ThreadContext * tc,
64 StaticInst::StaticInstPtr inst = StaticInst::nullStaticInstPtr)
65 {}
66 void setExceptionState(ThreadContext *, uint8_t);
67 void setHandlerPC(Addr, ThreadContext *);
68#endif
69};
70
71template <typename T>
72class MipsFault : public MipsFaultBase
73{
74 protected:
75 static FaultVals vals;
76 public:
77 FaultName name() const { return vals.name; }
78 FaultVect vect() const { return vals.vect; }
79 FaultStat & countStat() { return vals.count; }
80};
81
82class MachineCheckFault : public MipsFault<MachineCheckFault>
83{
84 public:
85 bool isMachineCheckFault() {return true;}
86};
87
88class NonMaskableInterrupt : public MipsFault<NonMaskableInterrupt>
89{
90 public:
91 bool isNonMaskableInterrupt() {return true;}
92};
93
94class AlignmentFault : public MipsFault<AlignmentFault>
95{
96 public:
97 bool isAlignmentFault() {return true;}
98};
99
100class AddressErrorFault : public MipsFault<AddressErrorFault>
101{
102 public:
103#if FULL_SYSTEM
104 void invoke(ThreadContext * tc,
105 StaticInstPtr inst = StaticInst::nullStaticInstPtr);
106#endif
107
108};
109
110class StoreAddressErrorFault : public MipsFault<StoreAddressErrorFault>
111{
112 public:
113#if FULL_SYSTEM
114 void invoke(ThreadContext * tc,
115 StaticInstPtr inst = StaticInst::nullStaticInstPtr);
116#endif
117};
118
119class UnimplementedOpcodeFault : public MipsFault<UnimplementedOpcodeFault> {};
120
121class TLBRefillIFetchFault : public MipsFault<TLBRefillIFetchFault>
122{
123 public:
124 void invoke(ThreadContext * tc,
125 StaticInstPtr inst = StaticInst::nullStaticInstPtr);
126};
127
128class TLBInvalidIFetchFault : public MipsFault<TLBInvalidIFetchFault>
129{
130 public:
131 void invoke(ThreadContext * tc,
132 StaticInstPtr inst = StaticInst::nullStaticInstPtr);
133};
134
135class NDtbMissFault : public MipsFault<NDtbMissFault> {};
136class PDtbMissFault : public MipsFault<PDtbMissFault> {};
137class DtbPageFault : public MipsFault<DtbPageFault> {};
138class DtbAcvFault : public MipsFault<DtbAcvFault> {};
139
140static inline Fault genMachineCheckFault()
141{
142 return new MachineCheckFault;
143}
144
145static inline Fault genAlignmentFault()
146{
147 return new AlignmentFault;
148}
149
150class ResetFault : public MipsFault<ResetFault>
151{
152 public:
153 void invoke(ThreadContext * tc,
154 StaticInstPtr inst = StaticInst::nullStaticInstPtr);
155
156};
157
158class SystemCallFault : public MipsFault<SystemCallFault>
159{
160 public:
161#if FULL_SYSTEM
162 void invoke(ThreadContext * tc,
163 StaticInstPtr inst = StaticInst::nullStaticInstPtr);
164#endif
165};
166
167class SoftResetFault : public MipsFault<SoftResetFault>
168{
169 public:
170 void invoke(ThreadContext * tc,
171 StaticInstPtr inst = StaticInst::nullStaticInstPtr);
172};
173
174class DebugSingleStep : public MipsFault<DebugSingleStep>
175{
176 public:
177 void invoke(ThreadContext * tc,
178 StaticInstPtr inst = StaticInst::nullStaticInstPtr);
179};
180
181class DebugInterrupt : public MipsFault<DebugInterrupt>
182{
183 public:
184 void invoke(ThreadContext * tc,
185 StaticInstPtr inst = StaticInst::nullStaticInstPtr);
186};
187
188class CoprocessorUnusableFault : public MipsFault<CoprocessorUnusableFault>
189{
190 protected:
191 int coProcID;
192 public:
193 CoprocessorUnusableFault(int _procid) : coProcID(_procid)
194 {}
195
196 void invoke(ThreadContext * tc,
197 StaticInstPtr inst = StaticInst::nullStaticInstPtr);
198};
199
200class ReservedInstructionFault : public MipsFault<ReservedInstructionFault>
201{
202 public:
203 void invoke(ThreadContext * tc,
204 StaticInstPtr inst = StaticInst::nullStaticInstPtr);
205};
206
207class ThreadFault : public MipsFault<ThreadFault>
208{
209 public:
210 void invoke(ThreadContext * tc,
211 StaticInstPtr inst = StaticInst::nullStaticInstPtr);
212};
213
214class ArithmeticFault : public MipsFault<ArithmeticFault>
215{
216 protected:
217 bool skipFaultingInstruction() {return true;}
218 public:
219#if FULL_SYSTEM
220 void invoke(ThreadContext * tc,
221 StaticInstPtr inst = StaticInst::nullStaticInstPtr);
222#endif
223};
224
225class InterruptFault : public MipsFault<InterruptFault>
226{
227 protected:
228 bool setRestartAddress() {return false;}
229 public:
230#if FULL_SYSTEM
231 void invoke(ThreadContext * tc,
232 StaticInstPtr inst = StaticInst::nullStaticInstPtr);
233#endif
234};
235
236class TrapFault : public MipsFault<TrapFault>
237{
238 public:
239#if FULL_SYSTEM
240 void invoke(ThreadContext * tc,
241 StaticInstPtr inst = StaticInst::nullStaticInstPtr);
242#endif
243};
244
245class BreakpointFault : public MipsFault<BreakpointFault>
246{
247 public:
248#if FULL_SYSTEM
249 void invoke(ThreadContext * tc,
250 StaticInstPtr inst = StaticInst::nullStaticInstPtr);
251#endif
252};
253
254class ItbRefillFault : public MipsFault<ItbRefillFault>
255{
256 public:
257#if FULL_SYSTEM
258 void invoke(ThreadContext * tc,
259 StaticInstPtr inst = StaticInst::nullStaticInstPtr);
260#endif
261};
262
263class DtbRefillFault : public MipsFault<DtbRefillFault>
264{
265 public:
266#if FULL_SYSTEM
267 void invoke(ThreadContext * tc,
268 StaticInstPtr inst = StaticInst::nullStaticInstPtr);
269#endif
270};
271
272class ItbPageFault : public MipsFault<ItbPageFault>
273{
274 public:
275#if FULL_SYSTEM
276 void invoke(ThreadContext * tc,
277 StaticInstPtr inst = StaticInst::nullStaticInstPtr);
278#endif
279};
280
281class ItbInvalidFault : public MipsFault<ItbInvalidFault>
282{
283 public:
284#if FULL_SYSTEM
285 void invoke(ThreadContext * tc,
286 StaticInstPtr inst = StaticInst::nullStaticInstPtr);
287#endif
288};
289
290class TLBModifiedFault : public MipsFault<TLBModifiedFault>
291{
292 public:
293#if FULL_SYSTEM
294 void invoke(ThreadContext * tc,
295 StaticInstPtr inst = StaticInst::nullStaticInstPtr);
296#endif
297};
298
299class DtbInvalidFault : public MipsFault<DtbInvalidFault>
300{
301 public:
302#if FULL_SYSTEM
303 void invoke(ThreadContext * tc,
304 StaticInst::StaticInstPtr inst = nullStaticInstPtr);
305#endif
306};
307
308class FloatEnableFault : public MipsFault<FloatEnableFault> {};
309class ItbMissFault : public MipsFault<ItbMissFault> {};
310class ItbAcvFault : public MipsFault<ItbAcvFault> {};
311class IntegerOverflowFault : public MipsFault<IntegerOverflowFault> {};
312
313class DspStateDisabledFault : public MipsFault<DspStateDisabledFault>
314{
315 public:
316 void invoke(ThreadContext * tc,
317 StaticInstPtr inst = StaticInst::nullStaticInstPtr);
318};
319
320} // namespace MipsISA
321
322#endif // __MIPS_FAULTS_HH__