2 * Copyright \eN) 2007 MIPS Technologies, Inc. All Rights Reserved
4 * This software is part of the M5 simulator.
6 * THIS IS A LEGAL AGREEMENT. BY DOWNLOADING, USING, COPYING, CREATING
7 * DERIVATIVE WORKS, AND/OR DISTRIBUTING THIS SOFTWARE YOU ARE AGREEING
8 * TO THESE TERMS AND CONDITIONS.
10 * Permission is granted to use, copy, create derivative works and
11 * distribute this software and such derivative works for any purpose,
12 * so long as (1) the copyright notice above, this grant of permission,
13 * and the disclaimer below appear in all copies and derivative works
14 * made, (2) the copyright notice above is augmented as appropriate to
15 * reflect the addition of any new copyrightable work in a derivative
16 * work (e.g., Copyright \eN) <Publication Year> Copyright Owner), and (3)
17 * the name of MIPS Technologies, Inc. (\e$(B!H\e(BMIPS\e$(B!I\e(B) is not used in any
18 * advertising or publicity pertaining to the use or distribution of
19 * this software without specific, written prior authorization.
21 * THIS SOFTWARE IS PROVIDED \e$(B!H\e(BAS IS.\e$(B!I\e(B MIPS MAKES NO WARRANTIES AND
22 * DISCLAIMS ALL WARRANTIES, WHETHER EXPRESS, STATUTORY, IMPLIED OR
23 * OTHERWISE, INCLUDING BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
24 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND
25 * NON-INFRINGEMENT OF THIRD PARTY RIGHTS, REGARDING THIS SOFTWARE.
26 * IN NO EVENT SHALL MIPS BE LIABLE FOR ANY DAMAGES, INCLUDING DIRECT,
27 * INDIRECT, INCIDENTAL, CONSEQUENTIAL, SPECIAL, OR PUNITIVE DAMAGES OF
28 * ANY KIND OR NATURE, ARISING OUT OF OR IN CONNECTION WITH THIS AGREEMENT,
29 * THIS SOFTWARE AND/OR THE USE OF THIS SOFTWARE, WHETHER SUCH LIABILITY
30 * IS ASSERTED ON THE BASIS OF CONTRACT, TORT (INCLUDING NEGLIGENCE OR
31 * STRICT LIABILITY), OR OTHERWISE, EVEN IF MIPS HAS BEEN WARNED OF THE
32 * POSSIBILITY OF ANY SUCH LOSS OR DAMAGE IN ADVANCE.
34 * Authors: Gabe M. Black
39 #include "arch/mips/faults.hh"
40 #include "cpu/thread_context.hh"
41 #include "cpu/base.hh"
42 #include "base/trace.hh"
43 #include "arch/mips/pra_constants.hh"
45 #include "sim/process.hh"
46 #include "mem/page_table.hh"
52 FaultName
MachineCheckFault::_name
= "Machine Check";
53 FaultVect
MachineCheckFault::_vect
= 0x0401;
54 FaultStat
MachineCheckFault::_count
;
56 FaultName
AlignmentFault::_name
= "Alignment";
57 FaultVect
AlignmentFault::_vect
= 0x0301;
58 FaultStat
AlignmentFault::_count
;
60 FaultName
ResetFault::_name
= "Reset Fault";
62 FaultVect
ResetFault::_vect
= 0xBFC00000;
64 FaultVect
ResetFault::_vect
= 0x001;
66 FaultStat
ResetFault::_count
;
68 FaultName
AddressErrorFault::_name
= "Address Error";
69 FaultVect
AddressErrorFault::_vect
= 0x0180;
70 FaultStat
AddressErrorFault::_count
;
72 FaultName
StoreAddressErrorFault::_name
= "Store Address Error";
73 FaultVect
StoreAddressErrorFault::_vect
= 0x0180;
74 FaultStat
StoreAddressErrorFault::_count
;
77 FaultName
SystemCallFault::_name
= "Syscall";
78 FaultVect
SystemCallFault::_vect
= 0x0180;
79 FaultStat
SystemCallFault::_count
;
81 FaultName
CoprocessorUnusableFault::_name
= "Coprocessor Unusable Fault";
82 FaultVect
CoprocessorUnusableFault::_vect
= 0x180;
83 FaultStat
CoprocessorUnusableFault::_count
;
85 FaultName
ReservedInstructionFault::_name
= "Reserved Instruction Fault";
86 FaultVect
ReservedInstructionFault::_vect
= 0x0180;
87 FaultStat
ReservedInstructionFault::_count
;
89 FaultName
ThreadFault::_name
= "Thread Fault";
90 FaultVect
ThreadFault::_vect
= 0x00F1;
91 FaultStat
ThreadFault::_count
;
94 FaultName
ArithmeticFault::_name
= "Arithmetic Overflow Exception";
95 FaultVect
ArithmeticFault::_vect
= 0x180;
96 FaultStat
ArithmeticFault::_count
;
98 FaultName
UnimplementedOpcodeFault::_name
= "opdec";
99 FaultVect
UnimplementedOpcodeFault::_vect
= 0x0481;
100 FaultStat
UnimplementedOpcodeFault::_count
;
102 FaultName
InterruptFault::_name
= "interrupt";
103 FaultVect
InterruptFault::_vect
= 0x0180;
104 FaultStat
InterruptFault::_count
;
106 FaultName
TrapFault::_name
= "Trap";
107 FaultVect
TrapFault::_vect
= 0x0180;
108 FaultStat
TrapFault::_count
;
110 FaultName
BreakpointFault::_name
= "Breakpoint";
111 FaultVect
BreakpointFault::_vect
= 0x0180;
112 FaultStat
BreakpointFault::_count
;
115 FaultName
ItbInvalidFault::_name
= "Invalid TLB Entry Exception (I-Fetch/LW)";
116 FaultVect
ItbInvalidFault::_vect
= 0x0180;
117 FaultStat
ItbInvalidFault::_count
;
119 FaultName
ItbPageFault::_name
= "itbmiss";
120 FaultVect
ItbPageFault::_vect
= 0x0181;
121 FaultStat
ItbPageFault::_count
;
123 FaultName
ItbMissFault::_name
= "itbmiss";
124 FaultVect
ItbMissFault::_vect
= 0x0181;
125 FaultStat
ItbMissFault::_count
;
127 FaultName
ItbAcvFault::_name
= "iaccvio";
128 FaultVect
ItbAcvFault::_vect
= 0x0081;
129 FaultStat
ItbAcvFault::_count
;
131 FaultName
ItbRefillFault::_name
= "TLB Refill Exception (I-Fetch/LW)";
132 FaultVect
ItbRefillFault::_vect
= 0x0180;
133 FaultStat
ItbRefillFault::_count
;
135 FaultName
NDtbMissFault::_name
= "dtb_miss_single";
136 FaultVect
NDtbMissFault::_vect
= 0x0201;
137 FaultStat
NDtbMissFault::_count
;
139 FaultName
PDtbMissFault::_name
= "dtb_miss_double";
140 FaultVect
PDtbMissFault::_vect
= 0x0281;
141 FaultStat
PDtbMissFault::_count
;
143 FaultName
DtbPageFault::_name
= "dfault";
144 FaultVect
DtbPageFault::_vect
= 0x0381;
145 FaultStat
DtbPageFault::_count
;
147 FaultName
DtbAcvFault::_name
= "dfault";
148 FaultVect
DtbAcvFault::_vect
= 0x0381;
149 FaultStat
DtbAcvFault::_count
;
151 FaultName
DtbInvalidFault::_name
= "Invalid TLB Entry Exception (Store)";
152 FaultVect
DtbInvalidFault::_vect
= 0x0180;
153 FaultStat
DtbInvalidFault::_count
;
155 FaultName
DtbRefillFault::_name
= "TLB Refill Exception (Store)";
156 FaultVect
DtbRefillFault::_vect
= 0x0180;
157 FaultStat
DtbRefillFault::_count
;
159 FaultName
TLBModifiedFault::_name
= "TLB Modified Exception";
160 FaultVect
TLBModifiedFault::_vect
= 0x0180;
161 FaultStat
TLBModifiedFault::_count
;
163 FaultName
FloatEnableFault::_name
= "float_enable_fault";
164 FaultVect
FloatEnableFault::_vect
= 0x0581;
165 FaultStat
FloatEnableFault::_count
;
167 FaultName
IntegerOverflowFault::_name
= "Integer Overflow Fault";
168 FaultVect
IntegerOverflowFault::_vect
= 0x0501;
169 FaultStat
IntegerOverflowFault::_count
;
171 FaultName
DspStateDisabledFault::_name
= "DSP Disabled Fault";
172 FaultVect
DspStateDisabledFault::_vect
= 0x001a;
173 FaultStat
DspStateDisabledFault::_count
;
176 void MipsFault::setHandlerPC(Addr HandlerBase
, ThreadContext
*tc
)
178 tc
->setPC(HandlerBase
);
179 tc
->setNextPC(HandlerBase
+sizeof(MachInst
));
180 tc
->setNextNPC(HandlerBase
+2*sizeof(MachInst
));
183 void MipsFault::setExceptionState(ThreadContext
*tc
,uint8_t ExcCode
)
185 // modify SRS Ctl - Save CSS, put ESS into CSS
186 MiscReg stat
= tc
->readMiscReg(MipsISA::Status
);
187 if(bits(stat
,Status_EXL
) != 1 && bits(stat
,Status_BEV
) != 1)
189 // SRS Ctl is modified only if Status_EXL and Status_BEV are not set
190 MiscReg srs
= tc
->readMiscReg(MipsISA::SRSCtl
);
192 CSS
= bits(srs
,SRSCtl_CSS_HI
,SRSCtl_CSS_LO
);
193 ESS
= bits(srs
,SRSCtl_ESS_HI
,SRSCtl_ESS_LO
);
195 replaceBits(srs
,SRSCtl_PSS_HI
,SRSCtl_PSS_LO
,CSS
);
197 replaceBits(srs
,SRSCtl_CSS_HI
,SRSCtl_CSS_LO
,ESS
);
198 tc
->setMiscRegNoEffect(MipsISA::SRSCtl
,srs
);
199 tc
->setShadowSet(ESS
);
202 // set EXL bit (don't care if it is already set!)
203 replaceBits(stat
,Status_EXL_HI
,Status_EXL_LO
,1);
204 tc
->setMiscRegNoEffect(MipsISA::Status
,stat
);
207 // warn("Set EPC to %x\n",tc->readPC());
208 // CHECK ME or FIXME or FIX ME or POSSIBLE HACK
209 // Check to see if the exception occurred in the branch delay slot
210 DPRINTF(MipsPRA
,"PC: %x, NextPC: %x, NNPC: %x\n",tc
->readPC(),tc
->readNextPC(),tc
->readNextNPC());
212 if(tc
->readPC() + sizeof(MachInst
) != tc
->readNextPC()){
213 tc
->setMiscRegNoEffect(MipsISA::EPC
,tc
->readPC()-sizeof(MachInst
));
214 // In the branch delay slot? set CAUSE_31
217 tc
->setMiscRegNoEffect(MipsISA::EPC
,tc
->readPC());
218 // In the branch delay slot? reset CAUSE_31
222 // Set Cause_EXCCODE field
223 MiscReg cause
= tc
->readMiscReg(MipsISA::Cause
);
224 replaceBits(cause
,Cause_EXCCODE_HI
,Cause_EXCCODE_LO
,ExcCode
);
225 replaceBits(cause
,Cause_BD_HI
,Cause_BD_LO
,C_BD
);
226 replaceBits(cause
,Cause_CE_HI
,Cause_CE_LO
,0);
227 tc
->setMiscRegNoEffect(MipsISA::Cause
,cause
);
231 void ArithmeticFault::invoke(ThreadContext
*tc
)
233 DPRINTF(MipsPRA
,"%s encountered.\n", name());
234 setExceptionState(tc
,0xC);
238 MiscReg stat
= tc
->readMiscReg(MipsISA::Status
);
239 // Here, the handler is dependent on BEV, which is not modified by setExceptionState()
240 if(bits(stat
,Status_BEV
)==0){ // See MIPS ARM Vol 3, Revision 2, Page 38
241 HandlerBase
= vect() + tc
->readMiscReg(MipsISA::EBase
);
243 HandlerBase
= 0xBFC00200;
245 setHandlerPC(HandlerBase
,tc
);
246 // warn("Exception Handler At: %x \n",HandlerBase);
249 void StoreAddressErrorFault::invoke(ThreadContext
*tc
)
251 DPRINTF(MipsPRA
,"%s encountered.\n", name());
252 setExceptionState(tc
,0x5);
253 tc
->setMiscRegNoEffect(MipsISA::BadVAddr
,BadVAddr
);
257 HandlerBase
= vect() + tc
->readMiscReg(MipsISA::EBase
); // Offset 0x180 - General Exception Vector
258 setHandlerPC(HandlerBase
,tc
);
259 // warn("Exception Handler At: %x \n",HandlerBase);
260 // warn("Exception Handler At: %x , EPC set to %x\n",HandlerBase,tc->readMiscReg(MipsISA::EPC));
264 void TrapFault::invoke(ThreadContext
*tc
)
266 DPRINTF(MipsPRA
,"%s encountered.\n", name());
267 // warn("%s encountered.\n", name());
268 setExceptionState(tc
,0xD);
272 HandlerBase
= vect() + tc
->readMiscReg(MipsISA::EBase
); // Offset 0x180 - General Exception Vector
273 setHandlerPC(HandlerBase
,tc
);
274 // warn("Exception Handler At: %x \n",HandlerBase);
275 // warn("Exception Handler At: %x , EPC set to %x\n",HandlerBase,tc->readMiscReg(MipsISA::EPC));
278 void BreakpointFault::invoke(ThreadContext
*tc
)
280 setExceptionState(tc
,0x9);
284 HandlerBase
= vect() + tc
->readMiscReg(MipsISA::EBase
); // Offset 0x180 - General Exception Vector
285 setHandlerPC(HandlerBase
,tc
);
286 // warn("Exception Handler At: %x \n",HandlerBase);
287 // warn("Exception Handler At: %x , EPC set to %x\n",HandlerBase,tc->readMiscReg(MipsISA::EPC));
291 void DtbInvalidFault::invoke(ThreadContext
*tc
)
293 DPRINTF(MipsPRA
,"%s encountered.\n", name());
294 // warn("%s encountered.\n", name());
295 tc
->setMiscRegNoEffect(MipsISA::BadVAddr
,BadVAddr
);
296 MiscReg eh
= tc
->readMiscReg(MipsISA::EntryHi
);
297 replaceBits(eh
,EntryHi_ASID_HI
,EntryHi_ASID_LO
,EntryHi_Asid
);
298 replaceBits(eh
,EntryHi_VPN2_HI
,EntryHi_VPN2_LO
,EntryHi_VPN2
);
299 replaceBits(eh
,EntryHi_VPN2X_HI
,EntryHi_VPN2X_LO
,EntryHi_VPN2X
);
300 tc
->setMiscRegNoEffect(MipsISA::EntryHi
,eh
);
301 MiscReg ctxt
= tc
->readMiscReg(MipsISA::Context
);
302 replaceBits(ctxt
,Context_BadVPN2_HI
,Context_BadVPN2_LO
,Context_BadVPN2
);
303 tc
->setMiscRegNoEffect(MipsISA::Context
,ctxt
);
304 setExceptionState(tc
,0x3);
309 HandlerBase
= vect() + tc
->readMiscReg(MipsISA::EBase
); // Offset 0x180 - General Exception Vector
310 setHandlerPC(HandlerBase
,tc
);
311 // warn("Exception Handler At: %x , EPC set to %x\n",HandlerBase,tc->readMiscReg(MipsISA::EPC));
314 void AddressErrorFault::invoke(ThreadContext
*tc
)
316 DPRINTF(MipsPRA
,"%s encountered.\n", name());
317 setExceptionState(tc
,0x4);
318 tc
->setMiscRegNoEffect(MipsISA::BadVAddr
,BadVAddr
);
322 HandlerBase
= vect() + tc
->readMiscReg(MipsISA::EBase
); // Offset 0x180 - General Exception Vector
323 setHandlerPC(HandlerBase
,tc
);
326 void ItbInvalidFault::invoke(ThreadContext
*tc
)
328 DPRINTF(MipsPRA
,"%s encountered.\n", name());
329 setExceptionState(tc
,0x2);
330 tc
->setMiscRegNoEffect(MipsISA::BadVAddr
,BadVAddr
);
331 MiscReg eh
= tc
->readMiscReg(MipsISA::EntryHi
);
332 replaceBits(eh
,EntryHi_ASID_HI
,EntryHi_ASID_LO
,EntryHi_Asid
);
333 replaceBits(eh
,EntryHi_VPN2_HI
,EntryHi_VPN2_LO
,EntryHi_VPN2
);
334 replaceBits(eh
,EntryHi_VPN2X_HI
,EntryHi_VPN2X_LO
,EntryHi_VPN2X
);
335 tc
->setMiscRegNoEffect(MipsISA::EntryHi
,eh
);
336 MiscReg ctxt
= tc
->readMiscReg(MipsISA::Context
);
337 replaceBits(ctxt
,Context_BadVPN2_HI
,Context_BadVPN2_LO
,Context_BadVPN2
);
338 tc
->setMiscRegNoEffect(MipsISA::Context
,ctxt
);
343 HandlerBase
= vect() + tc
->readMiscReg(MipsISA::EBase
); // Offset 0x180 - General Exception Vector
344 setHandlerPC(HandlerBase
,tc
);
345 DPRINTF(MipsPRA
,"Exception Handler At: %x , EPC set to %x\n",HandlerBase
,tc
->readMiscReg(MipsISA::EPC
));
348 void ItbRefillFault::invoke(ThreadContext
*tc
)
350 DPRINTF(MipsPRA
,"%s encountered (%x).\n", name(),BadVAddr
);
352 tc
->setMiscRegNoEffect(MipsISA::BadVAddr
,BadVAddr
);
353 MiscReg eh
= tc
->readMiscReg(MipsISA::EntryHi
);
354 replaceBits(eh
,EntryHi_ASID_HI
,EntryHi_ASID_LO
,EntryHi_Asid
);
355 replaceBits(eh
,EntryHi_VPN2_HI
,EntryHi_VPN2_LO
,EntryHi_VPN2
);
356 replaceBits(eh
,EntryHi_VPN2X_HI
,EntryHi_VPN2X_LO
,EntryHi_VPN2X
);
357 tc
->setMiscRegNoEffect(MipsISA::EntryHi
,eh
);
358 MiscReg ctxt
= tc
->readMiscReg(MipsISA::Context
);
359 replaceBits(ctxt
,Context_BadVPN2_HI
,Context_BadVPN2_LO
,Context_BadVPN2
);
360 tc
->setMiscRegNoEffect(MipsISA::Context
,ctxt
);
362 MiscReg stat
= tc
->readMiscReg(MipsISA::Status
);
363 // Since handler depends on EXL bit, must check EXL bit before setting it!!
364 if(bits(stat
,Status_EXL
)==1){ // See MIPS ARM Vol 3, Revision 2, Page 38
365 HandlerBase
= vect() + tc
->readMiscReg(MipsISA::EBase
); // Offset 0x180 - General Exception Vector
367 HandlerBase
= tc
->readMiscReg(MipsISA::EBase
); // Offset 0x000
370 setExceptionState(tc
,0x2);
371 setHandlerPC(HandlerBase
,tc
);
374 void DtbRefillFault::invoke(ThreadContext
*tc
)
377 DPRINTF(MipsPRA
,"%s encountered.\n", name());
379 tc
->setMiscRegNoEffect(MipsISA::BadVAddr
,BadVAddr
);
380 MiscReg eh
= tc
->readMiscReg(MipsISA::EntryHi
);
381 replaceBits(eh
,EntryHi_ASID_HI
,EntryHi_ASID_LO
,EntryHi_Asid
);
382 replaceBits(eh
,EntryHi_VPN2_HI
,EntryHi_VPN2_LO
,EntryHi_VPN2
);
383 replaceBits(eh
,EntryHi_VPN2X_HI
,EntryHi_VPN2X_LO
,EntryHi_VPN2X
);
384 tc
->setMiscRegNoEffect(MipsISA::EntryHi
,eh
);
385 MiscReg ctxt
= tc
->readMiscReg(MipsISA::Context
);
386 replaceBits(ctxt
,Context_BadVPN2_HI
,Context_BadVPN2_LO
,Context_BadVPN2
);
387 tc
->setMiscRegNoEffect(MipsISA::Context
,ctxt
);
389 MiscReg stat
= tc
->readMiscReg(MipsISA::Status
);
390 // Since handler depends on EXL bit, must check EXL bit before setting it!!
391 if(bits(stat
,Status_EXL
)==1){ // See MIPS ARM Vol 3, Revision 2, Page 38
392 HandlerBase
= vect() + tc
->readMiscReg(MipsISA::EBase
); // Offset 0x180 - General Exception Vector
394 HandlerBase
= tc
->readMiscReg(MipsISA::EBase
); // Offset 0x000
398 setExceptionState(tc
,0x3);
400 setHandlerPC(HandlerBase
,tc
);
403 void TLBModifiedFault::invoke(ThreadContext
*tc
)
405 DPRINTF(MipsPRA
,"%s encountered.\n", name());
406 tc
->setMiscRegNoEffect(MipsISA::BadVAddr
,BadVAddr
);
407 MiscReg eh
= tc
->readMiscReg(MipsISA::EntryHi
);
408 replaceBits(eh
,EntryHi_ASID_HI
,EntryHi_ASID_LO
,EntryHi_Asid
);
409 replaceBits(eh
,EntryHi_VPN2_HI
,EntryHi_VPN2_LO
,EntryHi_VPN2
);
410 replaceBits(eh
,EntryHi_VPN2X_HI
,EntryHi_VPN2X_LO
,EntryHi_VPN2X
);
411 tc
->setMiscRegNoEffect(MipsISA::EntryHi
,eh
);
412 MiscReg ctxt
= tc
->readMiscReg(MipsISA::Context
);
413 replaceBits(ctxt
,Context_BadVPN2_HI
,Context_BadVPN2_LO
,Context_BadVPN2
);
414 tc
->setMiscRegNoEffect(MipsISA::Context
,ctxt
);
418 HandlerBase
= vect() + tc
->readMiscReg(MipsISA::EBase
); // Offset 0x180 - General Exception Vector
419 setExceptionState(tc
,0x1);
420 setHandlerPC(HandlerBase
,tc
);
421 // warn("Exception Handler At: %x , EPC set to %x\n",HandlerBase,tc->readMiscReg(MipsISA::EPC));
425 void SystemCallFault::invoke(ThreadContext
*tc
)
427 DPRINTF(MipsPRA
,"%s encountered.\n", name());
428 setExceptionState(tc
,0x8);
432 HandlerBase
= vect() + tc
->readMiscReg(MipsISA::EBase
); // Offset 0x180 - General Exception Vector
433 setHandlerPC(HandlerBase
,tc
);
434 // warn("Exception Handler At: %x \n",HandlerBase);
435 // warn("Exception Handler At: %x , EPC set to %x\n",HandlerBase,tc->readMiscReg(MipsISA::EPC));
439 void InterruptFault::invoke(ThreadContext
*tc
)
442 DPRINTF(MipsPRA
,"%s encountered.\n", name());
443 //RegFile *Reg = tc->getRegFilePtr(); // Get pointer to the register fil
444 setExceptionState(tc
,0x0A);
448 uint8_t IV
= bits(tc
->readMiscRegNoEffect(MipsISA::Cause
),Cause_IV
);
449 if (IV
)// Offset 200 for release 2
450 HandlerBase
= 0x20 + vect() + tc
->readMiscRegNoEffect(MipsISA::EBase
);
451 else//Ofset at 180 for release 1
452 HandlerBase
= vect() + tc
->readMiscRegNoEffect(MipsISA::EBase
);
454 setHandlerPC(HandlerBase
,tc
);
458 #endif // FULL_SYSTEM
460 void ResetFault::invoke(ThreadContext
*tc
)
463 DPRINTF(MipsPRA
,"%s encountered.\n", name());
464 /* All reset activity must be invoked from here */
466 tc
->setNextPC(vect()+sizeof(MachInst
));
467 tc
->setNextNPC(vect()+sizeof(MachInst
)+sizeof(MachInst
));
468 DPRINTF(MipsPRA
,"(%x) - ResetFault::invoke : PC set to %x",(unsigned)tc
,(unsigned)tc
->readPC());
471 // Set Coprocessor 1 (Floating Point) To Usable
472 tc
->setMiscReg(MipsISA::Status
, MipsISA::Status
| 0x20000000);
475 void ReservedInstructionFault::invoke(ThreadContext
*tc
)
478 DPRINTF(MipsPRA
,"%s encountered.\n", name());
479 //RegFile *Reg = tc->getRegFilePtr(); // Get pointer to the register fil
480 setExceptionState(tc
,0x0A);
482 HandlerBase
= vect() + tc
->readMiscRegNoEffect(MipsISA::EBase
); // Offset 0x180 - General Exception Vector
483 setHandlerPC(HandlerBase
,tc
);
485 panic("%s encountered.\n", name());
489 void ThreadFault::invoke(ThreadContext
*tc
)
491 DPRINTF(MipsPRA
,"%s encountered.\n", name());
492 panic("%s encountered.\n", name());
495 void DspStateDisabledFault::invoke(ThreadContext
*tc
)
497 DPRINTF(MipsPRA
,"%s encountered.\n", name());
498 panic("%s encountered.\n", name());
501 void CoprocessorUnusableFault::invoke(ThreadContext
*tc
)
504 DPRINTF(MipsPRA
,"%s encountered.\n", name());
505 setExceptionState(tc
,0xb);
506 /* The ID of the coprocessor causing the exception is stored in CoprocessorUnusableFault::coProcID */
507 MiscReg cause
= tc
->readMiscReg(MipsISA::Cause
);
508 replaceBits(cause
,Cause_CE_HI
,Cause_CE_LO
,coProcID
);
509 tc
->setMiscRegNoEffect(MipsISA::Cause
,cause
);
512 HandlerBase
= vect() + tc
->readMiscReg(MipsISA::EBase
); // Offset 0x180 - General Exception Vector
513 setHandlerPC(HandlerBase
,tc
);
515 // warn("Status: %x, Cause: %x\n",tc->readMiscReg(MipsISA::Status),tc->readMiscReg(MipsISA::Cause));
517 warn("%s (CP%d) encountered.\n", name(), coProcID
);
521 } // namespace MipsISA