9e552f1ec4caf8ee44508622a9d19030073f446c
2 * Copyright (c) 2007 MIPS Technologies, Inc.
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.
33 #include "arch/mips/faults.hh"
34 #include "cpu/thread_context.hh"
35 #include "cpu/base.hh"
36 #include "base/trace.hh"
37 #include "arch/mips/pra_constants.hh"
39 #include "sim/process.hh"
40 #include "mem/page_table.hh"
46 FaultName
MachineCheckFault::_name
= "Machine Check";
47 FaultVect
MachineCheckFault::_vect
= 0x0401;
48 FaultStat
MachineCheckFault::_count
;
50 FaultName
AlignmentFault::_name
= "Alignment";
51 FaultVect
AlignmentFault::_vect
= 0x0301;
52 FaultStat
AlignmentFault::_count
;
54 FaultName
ResetFault::_name
= "Reset Fault";
56 FaultVect
ResetFault::_vect
= 0xBFC00000;
58 FaultVect
ResetFault::_vect
= 0x001;
60 FaultStat
ResetFault::_count
;
62 FaultName
AddressErrorFault::_name
= "Address Error";
63 FaultVect
AddressErrorFault::_vect
= 0x0180;
64 FaultStat
AddressErrorFault::_count
;
66 FaultName
StoreAddressErrorFault::_name
= "Store Address Error";
67 FaultVect
StoreAddressErrorFault::_vect
= 0x0180;
68 FaultStat
StoreAddressErrorFault::_count
;
71 FaultName
SystemCallFault::_name
= "Syscall";
72 FaultVect
SystemCallFault::_vect
= 0x0180;
73 FaultStat
SystemCallFault::_count
;
75 FaultName
CoprocessorUnusableFault::_name
= "Coprocessor Unusable Fault";
76 FaultVect
CoprocessorUnusableFault::_vect
= 0x180;
77 FaultStat
CoprocessorUnusableFault::_count
;
79 FaultName
ReservedInstructionFault::_name
= "Reserved Instruction Fault";
80 FaultVect
ReservedInstructionFault::_vect
= 0x0180;
81 FaultStat
ReservedInstructionFault::_count
;
83 FaultName
ThreadFault::_name
= "Thread Fault";
84 FaultVect
ThreadFault::_vect
= 0x00F1;
85 FaultStat
ThreadFault::_count
;
88 FaultName
ArithmeticFault::_name
= "Arithmetic Overflow Exception";
89 FaultVect
ArithmeticFault::_vect
= 0x180;
90 FaultStat
ArithmeticFault::_count
;
92 FaultName
UnimplementedOpcodeFault::_name
= "opdec";
93 FaultVect
UnimplementedOpcodeFault::_vect
= 0x0481;
94 FaultStat
UnimplementedOpcodeFault::_count
;
96 FaultName
InterruptFault::_name
= "interrupt";
97 FaultVect
InterruptFault::_vect
= 0x0180;
98 FaultStat
InterruptFault::_count
;
100 FaultName
TrapFault::_name
= "Trap";
101 FaultVect
TrapFault::_vect
= 0x0180;
102 FaultStat
TrapFault::_count
;
104 FaultName
BreakpointFault::_name
= "Breakpoint";
105 FaultVect
BreakpointFault::_vect
= 0x0180;
106 FaultStat
BreakpointFault::_count
;
109 FaultName
ItbInvalidFault::_name
= "Invalid TLB Entry Exception (I-Fetch/LW)";
110 FaultVect
ItbInvalidFault::_vect
= 0x0180;
111 FaultStat
ItbInvalidFault::_count
;
113 FaultName
ItbPageFault::_name
= "itbmiss";
114 FaultVect
ItbPageFault::_vect
= 0x0181;
115 FaultStat
ItbPageFault::_count
;
117 FaultName
ItbMissFault::_name
= "itbmiss";
118 FaultVect
ItbMissFault::_vect
= 0x0181;
119 FaultStat
ItbMissFault::_count
;
121 FaultName
ItbAcvFault::_name
= "iaccvio";
122 FaultVect
ItbAcvFault::_vect
= 0x0081;
123 FaultStat
ItbAcvFault::_count
;
125 FaultName
ItbRefillFault::_name
= "TLB Refill Exception (I-Fetch/LW)";
126 FaultVect
ItbRefillFault::_vect
= 0x0180;
127 FaultStat
ItbRefillFault::_count
;
129 FaultName
NDtbMissFault::_name
= "dtb_miss_single";
130 FaultVect
NDtbMissFault::_vect
= 0x0201;
131 FaultStat
NDtbMissFault::_count
;
133 FaultName
PDtbMissFault::_name
= "dtb_miss_double";
134 FaultVect
PDtbMissFault::_vect
= 0x0281;
135 FaultStat
PDtbMissFault::_count
;
137 FaultName
DtbPageFault::_name
= "dfault";
138 FaultVect
DtbPageFault::_vect
= 0x0381;
139 FaultStat
DtbPageFault::_count
;
141 FaultName
DtbAcvFault::_name
= "dfault";
142 FaultVect
DtbAcvFault::_vect
= 0x0381;
143 FaultStat
DtbAcvFault::_count
;
145 FaultName
DtbInvalidFault::_name
= "Invalid TLB Entry Exception (Store)";
146 FaultVect
DtbInvalidFault::_vect
= 0x0180;
147 FaultStat
DtbInvalidFault::_count
;
149 FaultName
DtbRefillFault::_name
= "TLB Refill Exception (Store)";
150 FaultVect
DtbRefillFault::_vect
= 0x0180;
151 FaultStat
DtbRefillFault::_count
;
153 FaultName
TLBModifiedFault::_name
= "TLB Modified Exception";
154 FaultVect
TLBModifiedFault::_vect
= 0x0180;
155 FaultStat
TLBModifiedFault::_count
;
157 FaultName
FloatEnableFault::_name
= "float_enable_fault";
158 FaultVect
FloatEnableFault::_vect
= 0x0581;
159 FaultStat
FloatEnableFault::_count
;
161 FaultName
IntegerOverflowFault::_name
= "Integer Overflow Fault";
162 FaultVect
IntegerOverflowFault::_vect
= 0x0501;
163 FaultStat
IntegerOverflowFault::_count
;
165 FaultName
DspStateDisabledFault::_name
= "DSP Disabled Fault";
166 FaultVect
DspStateDisabledFault::_vect
= 0x001a;
167 FaultStat
DspStateDisabledFault::_count
;
170 void MipsFault::setHandlerPC(Addr HandlerBase
, ThreadContext
*tc
)
172 tc
->setPC(HandlerBase
);
173 tc
->setNextPC(HandlerBase
+sizeof(MachInst
));
174 tc
->setNextNPC(HandlerBase
+2*sizeof(MachInst
));
177 void MipsFault::setExceptionState(ThreadContext
*tc
,uint8_t ExcCode
)
179 // modify SRS Ctl - Save CSS, put ESS into CSS
180 MiscReg stat
= tc
->readMiscReg(MipsISA::Status
);
181 if(bits(stat
,Status_EXL
) != 1 && bits(stat
,Status_BEV
) != 1)
183 // SRS Ctl is modified only if Status_EXL and Status_BEV are not set
184 MiscReg srs
= tc
->readMiscReg(MipsISA::SRSCtl
);
186 CSS
= bits(srs
,SRSCtl_CSS_HI
,SRSCtl_CSS_LO
);
187 ESS
= bits(srs
,SRSCtl_ESS_HI
,SRSCtl_ESS_LO
);
189 replaceBits(srs
,SRSCtl_PSS_HI
,SRSCtl_PSS_LO
,CSS
);
191 replaceBits(srs
,SRSCtl_CSS_HI
,SRSCtl_CSS_LO
,ESS
);
192 tc
->setMiscRegNoEffect(MipsISA::SRSCtl
,srs
);
193 //tc->setShadowSet(ESS);
196 // set EXL bit (don't care if it is already set!)
197 replaceBits(stat
,Status_EXL_HI
,Status_EXL_LO
,1);
198 tc
->setMiscRegNoEffect(MipsISA::Status
,stat
);
201 // warn("Set EPC to %x\n",tc->readPC());
202 // CHECK ME or FIXME or FIX ME or POSSIBLE HACK
203 // Check to see if the exception occurred in the branch delay slot
204 DPRINTF(MipsPRA
,"PC: %x, NextPC: %x, NNPC: %x\n",tc
->readPC(),tc
->readNextPC(),tc
->readNextNPC());
206 if(tc
->readPC() + sizeof(MachInst
) != tc
->readNextPC()){
207 tc
->setMiscRegNoEffect(MipsISA::EPC
,tc
->readPC()-sizeof(MachInst
));
208 // In the branch delay slot? set CAUSE_31
211 tc
->setMiscRegNoEffect(MipsISA::EPC
,tc
->readPC());
212 // In the branch delay slot? reset CAUSE_31
216 // Set Cause_EXCCODE field
217 MiscReg cause
= tc
->readMiscReg(MipsISA::Cause
);
218 replaceBits(cause
,Cause_EXCCODE_HI
,Cause_EXCCODE_LO
,ExcCode
);
219 replaceBits(cause
,Cause_BD_HI
,Cause_BD_LO
,C_BD
);
220 replaceBits(cause
,Cause_CE_HI
,Cause_CE_LO
,0);
221 tc
->setMiscRegNoEffect(MipsISA::Cause
,cause
);
225 void ArithmeticFault::invoke(ThreadContext
*tc
)
227 DPRINTF(MipsPRA
,"%s encountered.\n", name());
228 setExceptionState(tc
,0xC);
232 MiscReg stat
= tc
->readMiscReg(MipsISA::Status
);
233 // Here, the handler is dependent on BEV, which is not modified by setExceptionState()
234 if(bits(stat
,Status_BEV
)==0){ // See MIPS ARM Vol 3, Revision 2, Page 38
235 HandlerBase
= vect() + tc
->readMiscReg(MipsISA::EBase
);
237 HandlerBase
= 0xBFC00200;
239 setHandlerPC(HandlerBase
,tc
);
240 // warn("Exception Handler At: %x \n",HandlerBase);
243 void StoreAddressErrorFault::invoke(ThreadContext
*tc
)
245 DPRINTF(MipsPRA
,"%s encountered.\n", name());
246 setExceptionState(tc
,0x5);
247 tc
->setMiscRegNoEffect(MipsISA::BadVAddr
,BadVAddr
);
251 HandlerBase
= vect() + tc
->readMiscReg(MipsISA::EBase
); // Offset 0x180 - General Exception Vector
252 setHandlerPC(HandlerBase
,tc
);
253 // warn("Exception Handler At: %x \n",HandlerBase);
254 // warn("Exception Handler At: %x , EPC set to %x\n",HandlerBase,tc->readMiscReg(MipsISA::EPC));
258 void TrapFault::invoke(ThreadContext
*tc
)
260 DPRINTF(MipsPRA
,"%s encountered.\n", name());
261 // warn("%s encountered.\n", name());
262 setExceptionState(tc
,0xD);
266 HandlerBase
= vect() + tc
->readMiscReg(MipsISA::EBase
); // Offset 0x180 - General Exception Vector
267 setHandlerPC(HandlerBase
,tc
);
268 // warn("Exception Handler At: %x \n",HandlerBase);
269 // warn("Exception Handler At: %x , EPC set to %x\n",HandlerBase,tc->readMiscReg(MipsISA::EPC));
272 void BreakpointFault::invoke(ThreadContext
*tc
)
274 setExceptionState(tc
,0x9);
278 HandlerBase
= vect() + tc
->readMiscReg(MipsISA::EBase
); // Offset 0x180 - General Exception Vector
279 setHandlerPC(HandlerBase
,tc
);
280 // warn("Exception Handler At: %x \n",HandlerBase);
281 // warn("Exception Handler At: %x , EPC set to %x\n",HandlerBase,tc->readMiscReg(MipsISA::EPC));
285 void DtbInvalidFault::invoke(ThreadContext
*tc
)
287 DPRINTF(MipsPRA
,"%s encountered.\n", name());
288 // warn("%s encountered.\n", name());
289 tc
->setMiscRegNoEffect(MipsISA::BadVAddr
,BadVAddr
);
290 MiscReg eh
= tc
->readMiscReg(MipsISA::EntryHi
);
291 replaceBits(eh
,EntryHi_ASID_HI
,EntryHi_ASID_LO
,EntryHi_Asid
);
292 replaceBits(eh
,EntryHi_VPN2_HI
,EntryHi_VPN2_LO
,EntryHi_VPN2
);
293 replaceBits(eh
,EntryHi_VPN2X_HI
,EntryHi_VPN2X_LO
,EntryHi_VPN2X
);
294 tc
->setMiscRegNoEffect(MipsISA::EntryHi
,eh
);
295 MiscReg ctxt
= tc
->readMiscReg(MipsISA::Context
);
296 replaceBits(ctxt
,Context_BadVPN2_HI
,Context_BadVPN2_LO
,Context_BadVPN2
);
297 tc
->setMiscRegNoEffect(MipsISA::Context
,ctxt
);
298 setExceptionState(tc
,0x3);
303 HandlerBase
= vect() + tc
->readMiscReg(MipsISA::EBase
); // Offset 0x180 - General Exception Vector
304 setHandlerPC(HandlerBase
,tc
);
305 // warn("Exception Handler At: %x , EPC set to %x\n",HandlerBase,tc->readMiscReg(MipsISA::EPC));
308 void AddressErrorFault::invoke(ThreadContext
*tc
)
310 DPRINTF(MipsPRA
,"%s encountered.\n", name());
311 setExceptionState(tc
,0x4);
312 tc
->setMiscRegNoEffect(MipsISA::BadVAddr
,BadVAddr
);
316 HandlerBase
= vect() + tc
->readMiscReg(MipsISA::EBase
); // Offset 0x180 - General Exception Vector
317 setHandlerPC(HandlerBase
,tc
);
320 void ItbInvalidFault::invoke(ThreadContext
*tc
)
322 DPRINTF(MipsPRA
,"%s encountered.\n", name());
323 setExceptionState(tc
,0x2);
324 tc
->setMiscRegNoEffect(MipsISA::BadVAddr
,BadVAddr
);
325 MiscReg eh
= tc
->readMiscReg(MipsISA::EntryHi
);
326 replaceBits(eh
,EntryHi_ASID_HI
,EntryHi_ASID_LO
,EntryHi_Asid
);
327 replaceBits(eh
,EntryHi_VPN2_HI
,EntryHi_VPN2_LO
,EntryHi_VPN2
);
328 replaceBits(eh
,EntryHi_VPN2X_HI
,EntryHi_VPN2X_LO
,EntryHi_VPN2X
);
329 tc
->setMiscRegNoEffect(MipsISA::EntryHi
,eh
);
330 MiscReg ctxt
= tc
->readMiscReg(MipsISA::Context
);
331 replaceBits(ctxt
,Context_BadVPN2_HI
,Context_BadVPN2_LO
,Context_BadVPN2
);
332 tc
->setMiscRegNoEffect(MipsISA::Context
,ctxt
);
337 HandlerBase
= vect() + tc
->readMiscReg(MipsISA::EBase
); // Offset 0x180 - General Exception Vector
338 setHandlerPC(HandlerBase
,tc
);
339 DPRINTF(MipsPRA
,"Exception Handler At: %x , EPC set to %x\n",HandlerBase
,tc
->readMiscReg(MipsISA::EPC
));
342 void ItbRefillFault::invoke(ThreadContext
*tc
)
344 DPRINTF(MipsPRA
,"%s encountered (%x).\n", name(),BadVAddr
);
346 tc
->setMiscRegNoEffect(MipsISA::BadVAddr
,BadVAddr
);
347 MiscReg eh
= tc
->readMiscReg(MipsISA::EntryHi
);
348 replaceBits(eh
,EntryHi_ASID_HI
,EntryHi_ASID_LO
,EntryHi_Asid
);
349 replaceBits(eh
,EntryHi_VPN2_HI
,EntryHi_VPN2_LO
,EntryHi_VPN2
);
350 replaceBits(eh
,EntryHi_VPN2X_HI
,EntryHi_VPN2X_LO
,EntryHi_VPN2X
);
351 tc
->setMiscRegNoEffect(MipsISA::EntryHi
,eh
);
352 MiscReg ctxt
= tc
->readMiscReg(MipsISA::Context
);
353 replaceBits(ctxt
,Context_BadVPN2_HI
,Context_BadVPN2_LO
,Context_BadVPN2
);
354 tc
->setMiscRegNoEffect(MipsISA::Context
,ctxt
);
356 MiscReg stat
= tc
->readMiscReg(MipsISA::Status
);
357 // Since handler depends on EXL bit, must check EXL bit before setting it!!
358 if(bits(stat
,Status_EXL
)==1){ // See MIPS ARM Vol 3, Revision 2, Page 38
359 HandlerBase
= vect() + tc
->readMiscReg(MipsISA::EBase
); // Offset 0x180 - General Exception Vector
361 HandlerBase
= tc
->readMiscReg(MipsISA::EBase
); // Offset 0x000
364 setExceptionState(tc
,0x2);
365 setHandlerPC(HandlerBase
,tc
);
368 void DtbRefillFault::invoke(ThreadContext
*tc
)
371 DPRINTF(MipsPRA
,"%s encountered.\n", name());
373 tc
->setMiscRegNoEffect(MipsISA::BadVAddr
,BadVAddr
);
374 MiscReg eh
= tc
->readMiscReg(MipsISA::EntryHi
);
375 replaceBits(eh
,EntryHi_ASID_HI
,EntryHi_ASID_LO
,EntryHi_Asid
);
376 replaceBits(eh
,EntryHi_VPN2_HI
,EntryHi_VPN2_LO
,EntryHi_VPN2
);
377 replaceBits(eh
,EntryHi_VPN2X_HI
,EntryHi_VPN2X_LO
,EntryHi_VPN2X
);
378 tc
->setMiscRegNoEffect(MipsISA::EntryHi
,eh
);
379 MiscReg ctxt
= tc
->readMiscReg(MipsISA::Context
);
380 replaceBits(ctxt
,Context_BadVPN2_HI
,Context_BadVPN2_LO
,Context_BadVPN2
);
381 tc
->setMiscRegNoEffect(MipsISA::Context
,ctxt
);
383 MiscReg stat
= tc
->readMiscReg(MipsISA::Status
);
384 // Since handler depends on EXL bit, must check EXL bit before setting it!!
385 if(bits(stat
,Status_EXL
)==1){ // See MIPS ARM Vol 3, Revision 2, Page 38
386 HandlerBase
= vect() + tc
->readMiscReg(MipsISA::EBase
); // Offset 0x180 - General Exception Vector
388 HandlerBase
= tc
->readMiscReg(MipsISA::EBase
); // Offset 0x000
392 setExceptionState(tc
,0x3);
394 setHandlerPC(HandlerBase
,tc
);
397 void TLBModifiedFault::invoke(ThreadContext
*tc
)
399 DPRINTF(MipsPRA
,"%s encountered.\n", name());
400 tc
->setMiscRegNoEffect(MipsISA::BadVAddr
,BadVAddr
);
401 MiscReg eh
= tc
->readMiscReg(MipsISA::EntryHi
);
402 replaceBits(eh
,EntryHi_ASID_HI
,EntryHi_ASID_LO
,EntryHi_Asid
);
403 replaceBits(eh
,EntryHi_VPN2_HI
,EntryHi_VPN2_LO
,EntryHi_VPN2
);
404 replaceBits(eh
,EntryHi_VPN2X_HI
,EntryHi_VPN2X_LO
,EntryHi_VPN2X
);
405 tc
->setMiscRegNoEffect(MipsISA::EntryHi
,eh
);
406 MiscReg ctxt
= tc
->readMiscReg(MipsISA::Context
);
407 replaceBits(ctxt
,Context_BadVPN2_HI
,Context_BadVPN2_LO
,Context_BadVPN2
);
408 tc
->setMiscRegNoEffect(MipsISA::Context
,ctxt
);
412 HandlerBase
= vect() + tc
->readMiscReg(MipsISA::EBase
); // Offset 0x180 - General Exception Vector
413 setExceptionState(tc
,0x1);
414 setHandlerPC(HandlerBase
,tc
);
415 // warn("Exception Handler At: %x , EPC set to %x\n",HandlerBase,tc->readMiscReg(MipsISA::EPC));
419 void SystemCallFault::invoke(ThreadContext
*tc
)
421 DPRINTF(MipsPRA
,"%s encountered.\n", name());
422 setExceptionState(tc
,0x8);
426 HandlerBase
= vect() + tc
->readMiscReg(MipsISA::EBase
); // Offset 0x180 - General Exception Vector
427 setHandlerPC(HandlerBase
,tc
);
428 // warn("Exception Handler At: %x \n",HandlerBase);
429 // warn("Exception Handler At: %x , EPC set to %x\n",HandlerBase,tc->readMiscReg(MipsISA::EPC));
433 void InterruptFault::invoke(ThreadContext
*tc
)
436 DPRINTF(MipsPRA
,"%s encountered.\n", name());
437 //RegFile *Reg = tc->getRegFilePtr(); // Get pointer to the register fil
438 setExceptionState(tc
,0x0A);
442 uint8_t IV
= bits(tc
->readMiscRegNoEffect(MipsISA::Cause
),Cause_IV
);
443 if (IV
)// Offset 200 for release 2
444 HandlerBase
= 0x20 + vect() + tc
->readMiscRegNoEffect(MipsISA::EBase
);
445 else//Ofset at 180 for release 1
446 HandlerBase
= vect() + tc
->readMiscRegNoEffect(MipsISA::EBase
);
448 setHandlerPC(HandlerBase
,tc
);
452 #endif // FULL_SYSTEM
454 void ResetFault::invoke(ThreadContext
*tc
)
457 DPRINTF(MipsPRA
,"%s encountered.\n", name());
458 /* All reset activity must be invoked from here */
460 tc
->setNextPC(vect()+sizeof(MachInst
));
461 tc
->setNextNPC(vect()+sizeof(MachInst
)+sizeof(MachInst
));
462 DPRINTF(MipsPRA
,"(%x) - ResetFault::invoke : PC set to %x",(unsigned)tc
,(unsigned)tc
->readPC());
465 // Set Coprocessor 1 (Floating Point) To Usable
466 tc
->setMiscReg(MipsISA::Status
, MipsISA::Status
| 0x20000000);
469 void ReservedInstructionFault::invoke(ThreadContext
*tc
)
472 DPRINTF(MipsPRA
,"%s encountered.\n", name());
473 //RegFile *Reg = tc->getRegFilePtr(); // Get pointer to the register fil
474 setExceptionState(tc
,0x0A);
476 HandlerBase
= vect() + tc
->readMiscRegNoEffect(MipsISA::EBase
); // Offset 0x180 - General Exception Vector
477 setHandlerPC(HandlerBase
,tc
);
479 panic("%s encountered.\n", name());
483 void ThreadFault::invoke(ThreadContext
*tc
)
485 DPRINTF(MipsPRA
,"%s encountered.\n", name());
486 panic("%s encountered.\n", name());
489 void DspStateDisabledFault::invoke(ThreadContext
*tc
)
491 DPRINTF(MipsPRA
,"%s encountered.\n", name());
492 panic("%s encountered.\n", name());
495 void CoprocessorUnusableFault::invoke(ThreadContext
*tc
)
498 DPRINTF(MipsPRA
,"%s encountered.\n", name());
499 setExceptionState(tc
,0xb);
500 /* The ID of the coprocessor causing the exception is stored in CoprocessorUnusableFault::coProcID */
501 MiscReg cause
= tc
->readMiscReg(MipsISA::Cause
);
502 replaceBits(cause
,Cause_CE_HI
,Cause_CE_LO
,coProcID
);
503 tc
->setMiscRegNoEffect(MipsISA::Cause
,cause
);
506 HandlerBase
= vect() + tc
->readMiscReg(MipsISA::EBase
); // Offset 0x180 - General Exception Vector
507 setHandlerPC(HandlerBase
,tc
);
509 // warn("Status: %x, Cause: %x\n",tc->readMiscReg(MipsISA::Status),tc->readMiscReg(MipsISA::Cause));
511 warn("%s (CP%d) encountered.\n", name(), coProcID
);
515 } // namespace MipsISA