faults.cc (7676:92274350b953) faults.cc (7678:f19b6a3a8cec)
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

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

212 CauseReg cause = tc->readMiscReg(MISCREG_CAUSE);
213 cause.excCode = excCode;
214 cause.bd = bd;
215 cause.ce = 0;
216 tc->setMiscRegNoEffect(MISCREG_CAUSE, cause);
217}
218
219void
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

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

212 CauseReg cause = tc->readMiscReg(MISCREG_CAUSE);
213 cause.excCode = excCode;
214 cause.bd = bd;
215 cause.ce = 0;
216 tc->setMiscRegNoEffect(MISCREG_CAUSE, cause);
217}
218
219void
220ArithmeticFault::invoke(ThreadContext *tc)
220ArithmeticFault::invoke(ThreadContext *tc, StaticInstPtr inst)
221{
222 DPRINTF(MipsPRA, "%s encountered.\n", name());
223 setExceptionState(tc, 0xC);
224
225 // Set new PC
226 Addr HandlerBase;
227 StatusReg status = tc->readMiscReg(MISCREG_STATUS);
228 // Here, the handler is dependent on BEV, which is not modified by
229 // setExceptionState()
230 if (!status.bev) {
231 // See MIPS ARM Vol 3, Revision 2, Page 38
232 HandlerBase = vect() + tc->readMiscReg(MISCREG_EBASE);
233 } else {
234 HandlerBase = 0xBFC00200;
235 }
236 setHandlerPC(HandlerBase, tc);
237}
238
239void
221{
222 DPRINTF(MipsPRA, "%s encountered.\n", name());
223 setExceptionState(tc, 0xC);
224
225 // Set new PC
226 Addr HandlerBase;
227 StatusReg status = tc->readMiscReg(MISCREG_STATUS);
228 // Here, the handler is dependent on BEV, which is not modified by
229 // setExceptionState()
230 if (!status.bev) {
231 // See MIPS ARM Vol 3, Revision 2, Page 38
232 HandlerBase = vect() + tc->readMiscReg(MISCREG_EBASE);
233 } else {
234 HandlerBase = 0xBFC00200;
235 }
236 setHandlerPC(HandlerBase, tc);
237}
238
239void
240StoreAddressErrorFault::invoke(ThreadContext *tc)
240StoreAddressErrorFault::invoke(ThreadContext *tc, StaticInstPtr inst)
241{
242 DPRINTF(MipsPRA, "%s encountered.\n", name());
243 setExceptionState(tc, 0x5);
244 tc->setMiscRegNoEffect(MISCREG_BADVADDR, badVAddr);
245
246 // Set new PC
247 Addr HandlerBase;
248 // Offset 0x180 - General Exception Vector
249 HandlerBase = vect() + tc->readMiscReg(MISCREG_EBASE);
250 setHandlerPC(HandlerBase, tc);
251}
252
253void
241{
242 DPRINTF(MipsPRA, "%s encountered.\n", name());
243 setExceptionState(tc, 0x5);
244 tc->setMiscRegNoEffect(MISCREG_BADVADDR, badVAddr);
245
246 // Set new PC
247 Addr HandlerBase;
248 // Offset 0x180 - General Exception Vector
249 HandlerBase = vect() + tc->readMiscReg(MISCREG_EBASE);
250 setHandlerPC(HandlerBase, tc);
251}
252
253void
254TrapFault::invoke(ThreadContext *tc)
254TrapFault::invoke(ThreadContext *tc, StaticInstPtr inst)
255{
256 DPRINTF(MipsPRA, "%s encountered.\n", name());
257 setExceptionState(tc, 0xD);
258
259 // Set new PC
260 Addr HandlerBase;
261 // Offset 0x180 - General Exception Vector
262 HandlerBase = vect() + tc->readMiscReg(MISCREG_EBASE);
263 setHandlerPC(HandlerBase, tc);
264}
265
266void
255{
256 DPRINTF(MipsPRA, "%s encountered.\n", name());
257 setExceptionState(tc, 0xD);
258
259 // Set new PC
260 Addr HandlerBase;
261 // Offset 0x180 - General Exception Vector
262 HandlerBase = vect() + tc->readMiscReg(MISCREG_EBASE);
263 setHandlerPC(HandlerBase, tc);
264}
265
266void
267BreakpointFault::invoke(ThreadContext *tc)
267BreakpointFault::invoke(ThreadContext *tc, StaticInstPtr inst)
268{
269 setExceptionState(tc, 0x9);
270
271 // Set new PC
272 Addr HandlerBase;
273 // Offset 0x180 - General Exception Vector
274 HandlerBase = vect() + tc->readMiscReg(MISCREG_EBASE);
275 setHandlerPC(HandlerBase, tc);
276}
277
278void
268{
269 setExceptionState(tc, 0x9);
270
271 // Set new PC
272 Addr HandlerBase;
273 // Offset 0x180 - General Exception Vector
274 HandlerBase = vect() + tc->readMiscReg(MISCREG_EBASE);
275 setHandlerPC(HandlerBase, tc);
276}
277
278void
279DtbInvalidFault::invoke(ThreadContext *tc)
279DtbInvalidFault::invoke(ThreadContext *tc, StaticInstPtr inst)
280{
281 DPRINTF(MipsPRA, "%s encountered.\n", name());
282
283 tc->setMiscRegNoEffect(MISCREG_BADVADDR, badVAddr);
284 EntryHiReg entryHi = tc->readMiscReg(MISCREG_ENTRYHI);
285 entryHi.asid = entryHiAsid;
286 entryHi.vpn2 = entryHiVPN2;
287 entryHi.vpn2x = entryHiVPN2X;

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

296 // Set new PC
297 Addr HandlerBase;
298 // Offset 0x180 - General Exception Vector
299 HandlerBase = vect() + tc->readMiscReg(MISCREG_EBASE);
300 setHandlerPC(HandlerBase, tc);
301}
302
303void
280{
281 DPRINTF(MipsPRA, "%s encountered.\n", name());
282
283 tc->setMiscRegNoEffect(MISCREG_BADVADDR, badVAddr);
284 EntryHiReg entryHi = tc->readMiscReg(MISCREG_ENTRYHI);
285 entryHi.asid = entryHiAsid;
286 entryHi.vpn2 = entryHiVPN2;
287 entryHi.vpn2x = entryHiVPN2X;

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

296 // Set new PC
297 Addr HandlerBase;
298 // Offset 0x180 - General Exception Vector
299 HandlerBase = vect() + tc->readMiscReg(MISCREG_EBASE);
300 setHandlerPC(HandlerBase, tc);
301}
302
303void
304AddressErrorFault::invoke(ThreadContext *tc)
304AddressErrorFault::invoke(ThreadContext *tc, StaticInstPtr inst)
305{
306 DPRINTF(MipsPRA, "%s encountered.\n", name());
307 setExceptionState(tc, 0x4);
308 tc->setMiscRegNoEffect(MISCREG_BADVADDR, badVAddr);
309
310 // Set new PC
311 Addr HandlerBase;
312 // Offset 0x180 - General Exception Vector
313 HandlerBase = vect() + tc->readMiscReg(MISCREG_EBASE);
314 setHandlerPC(HandlerBase, tc);
315}
316
317void
305{
306 DPRINTF(MipsPRA, "%s encountered.\n", name());
307 setExceptionState(tc, 0x4);
308 tc->setMiscRegNoEffect(MISCREG_BADVADDR, badVAddr);
309
310 // Set new PC
311 Addr HandlerBase;
312 // Offset 0x180 - General Exception Vector
313 HandlerBase = vect() + tc->readMiscReg(MISCREG_EBASE);
314 setHandlerPC(HandlerBase, tc);
315}
316
317void
318ItbInvalidFault::invoke(ThreadContext *tc)
318ItbInvalidFault::invoke(ThreadContext *tc, StaticInstPtr inst)
319{
320 DPRINTF(MipsPRA, "%s encountered.\n", name());
321 setExceptionState(tc, 0x2);
322 tc->setMiscRegNoEffect(MISCREG_BADVADDR, badVAddr);
323 EntryHiReg entryHi = tc->readMiscReg(MISCREG_ENTRYHI);
324 entryHi.asid = entryHiAsid;
325 entryHi.vpn2 = entryHiVPN2;
326 entryHi.vpn2x = entryHiVPN2X;

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

336 // Offset 0x180 - General Exception Vector
337 HandlerBase = vect() + tc->readMiscReg(MISCREG_EBASE);
338 setHandlerPC(HandlerBase,tc);
339 DPRINTF(MipsPRA, "Exception Handler At: %x , EPC set to %x\n",
340 HandlerBase, tc->readMiscReg(MISCREG_EPC));
341}
342
343void
319{
320 DPRINTF(MipsPRA, "%s encountered.\n", name());
321 setExceptionState(tc, 0x2);
322 tc->setMiscRegNoEffect(MISCREG_BADVADDR, badVAddr);
323 EntryHiReg entryHi = tc->readMiscReg(MISCREG_ENTRYHI);
324 entryHi.asid = entryHiAsid;
325 entryHi.vpn2 = entryHiVPN2;
326 entryHi.vpn2x = entryHiVPN2X;

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

336 // Offset 0x180 - General Exception Vector
337 HandlerBase = vect() + tc->readMiscReg(MISCREG_EBASE);
338 setHandlerPC(HandlerBase,tc);
339 DPRINTF(MipsPRA, "Exception Handler At: %x , EPC set to %x\n",
340 HandlerBase, tc->readMiscReg(MISCREG_EPC));
341}
342
343void
344ItbRefillFault::invoke(ThreadContext *tc)
344ItbRefillFault::invoke(ThreadContext *tc, StaticInstPtr inst)
345{
346 DPRINTF(MipsPRA, "%s encountered (%x).\n", name(), MISCREG_BADVADDR);
347 Addr HandlerBase;
348 tc->setMiscRegNoEffect(MISCREG_BADVADDR, badVAddr);
349 EntryHiReg entryHi = tc->readMiscReg(MISCREG_ENTRYHI);
350 entryHi.asid = entryHiAsid;
351 entryHi.vpn2 = entryHiVPN2;
352 entryHi.vpn2x = entryHiVPN2X;

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

366 HandlerBase = tc->readMiscReg(MISCREG_EBASE);
367 }
368
369 setExceptionState(tc, 0x2);
370 setHandlerPC(HandlerBase, tc);
371}
372
373void
345{
346 DPRINTF(MipsPRA, "%s encountered (%x).\n", name(), MISCREG_BADVADDR);
347 Addr HandlerBase;
348 tc->setMiscRegNoEffect(MISCREG_BADVADDR, badVAddr);
349 EntryHiReg entryHi = tc->readMiscReg(MISCREG_ENTRYHI);
350 entryHi.asid = entryHiAsid;
351 entryHi.vpn2 = entryHiVPN2;
352 entryHi.vpn2x = entryHiVPN2X;

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

366 HandlerBase = tc->readMiscReg(MISCREG_EBASE);
367 }
368
369 setExceptionState(tc, 0x2);
370 setHandlerPC(HandlerBase, tc);
371}
372
373void
374DtbRefillFault::invoke(ThreadContext *tc)
374DtbRefillFault::invoke(ThreadContext *tc, StaticInstPtr inst)
375{
376 // Set new PC
377 DPRINTF(MipsPRA, "%s encountered.\n", name());
378 Addr HandlerBase;
379 tc->setMiscRegNoEffect(MISCREG_BADVADDR, badVAddr);
380 EntryHiReg entryHi = tc->readMiscReg(MISCREG_ENTRYHI);
381 entryHi.asid = entryHiAsid;
382 entryHi.vpn2 = entryHiVPN2;

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

399 }
400
401 setExceptionState(tc, 0x3);
402
403 setHandlerPC(HandlerBase, tc);
404}
405
406void
375{
376 // Set new PC
377 DPRINTF(MipsPRA, "%s encountered.\n", name());
378 Addr HandlerBase;
379 tc->setMiscRegNoEffect(MISCREG_BADVADDR, badVAddr);
380 EntryHiReg entryHi = tc->readMiscReg(MISCREG_ENTRYHI);
381 entryHi.asid = entryHiAsid;
382 entryHi.vpn2 = entryHiVPN2;

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

399 }
400
401 setExceptionState(tc, 0x3);
402
403 setHandlerPC(HandlerBase, tc);
404}
405
406void
407TLBModifiedFault::invoke(ThreadContext *tc)
407TLBModifiedFault::invoke(ThreadContext *tc, StaticInstPtr inst)
408{
409 DPRINTF(MipsPRA, "%s encountered.\n", name());
410 tc->setMiscRegNoEffect(MISCREG_BADVADDR, badVAddr);
411 EntryHiReg entryHi = tc->readMiscReg(MISCREG_ENTRYHI);
412 entryHi.asid = entryHiAsid;
413 entryHi.vpn2 = entryHiVPN2;
414 entryHi.vpn2x = entryHiVPN2X;
415 tc->setMiscRegNoEffect(MISCREG_ENTRYHI, entryHi);

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

423 // Offset 0x180 - General Exception Vector
424 HandlerBase = vect() + tc->readMiscReg(MISCREG_EBASE);
425 setExceptionState(tc, 0x1);
426 setHandlerPC(HandlerBase, tc);
427
428}
429
430void
408{
409 DPRINTF(MipsPRA, "%s encountered.\n", name());
410 tc->setMiscRegNoEffect(MISCREG_BADVADDR, badVAddr);
411 EntryHiReg entryHi = tc->readMiscReg(MISCREG_ENTRYHI);
412 entryHi.asid = entryHiAsid;
413 entryHi.vpn2 = entryHiVPN2;
414 entryHi.vpn2x = entryHiVPN2X;
415 tc->setMiscRegNoEffect(MISCREG_ENTRYHI, entryHi);

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

423 // Offset 0x180 - General Exception Vector
424 HandlerBase = vect() + tc->readMiscReg(MISCREG_EBASE);
425 setExceptionState(tc, 0x1);
426 setHandlerPC(HandlerBase, tc);
427
428}
429
430void
431SystemCallFault::invoke(ThreadContext *tc)
431SystemCallFault::invoke(ThreadContext *tc, StaticInstPtr inst)
432{
433 DPRINTF(MipsPRA, "%s encountered.\n", name());
434 setExceptionState(tc, 0x8);
435
436 // Set new PC
437 Addr HandlerBase;
438 // Offset 0x180 - General Exception Vector
439 HandlerBase = vect() + tc->readMiscReg(MISCREG_EBASE);
440 setHandlerPC(HandlerBase, tc);
441}
442
443void
432{
433 DPRINTF(MipsPRA, "%s encountered.\n", name());
434 setExceptionState(tc, 0x8);
435
436 // Set new PC
437 Addr HandlerBase;
438 // Offset 0x180 - General Exception Vector
439 HandlerBase = vect() + tc->readMiscReg(MISCREG_EBASE);
440 setHandlerPC(HandlerBase, tc);
441}
442
443void
444InterruptFault::invoke(ThreadContext *tc)
444InterruptFault::invoke(ThreadContext *tc, StaticInstPtr inst)
445{
446#if FULL_SYSTEM
447 DPRINTF(MipsPRA, "%s encountered.\n", name());
448 setExceptionState(tc, 0x0A);
449 Addr HandlerBase;
450
451 CauseReg cause = tc->readMiscRegNoEffect(MISCREG_CAUSE);
452 if (cause.iv) {

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

459
460 setHandlerPC(HandlerBase, tc);
461#endif
462}
463
464#endif // FULL_SYSTEM
465
466void
445{
446#if FULL_SYSTEM
447 DPRINTF(MipsPRA, "%s encountered.\n", name());
448 setExceptionState(tc, 0x0A);
449 Addr HandlerBase;
450
451 CauseReg cause = tc->readMiscRegNoEffect(MISCREG_CAUSE);
452 if (cause.iv) {

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

459
460 setHandlerPC(HandlerBase, tc);
461#endif
462}
463
464#endif // FULL_SYSTEM
465
466void
467ResetFault::invoke(ThreadContext *tc)
467ResetFault::invoke(ThreadContext *tc, StaticInstPtr inst)
468{
469#if FULL_SYSTEM
470 DPRINTF(MipsPRA, "%s encountered.\n", name());
471 /* All reset activity must be invoked from here */
472 tc->setPC(vect());
473 tc->setNextPC(vect() + sizeof(MachInst));
474 tc->setNextNPC(vect() + sizeof(MachInst) + sizeof(MachInst));
475 DPRINTF(MipsPRA, "ResetFault::invoke : PC set to %x", tc->readPC());
476#endif
477
478 // Set Coprocessor 1 (Floating Point) To Usable
479 StatusReg status = tc->readMiscRegNoEffect(MISCREG_STATUS);
480 status.cu.cu1 = 1;
481 tc->setMiscReg(MISCREG_STATUS, status);
482}
483
484void
468{
469#if FULL_SYSTEM
470 DPRINTF(MipsPRA, "%s encountered.\n", name());
471 /* All reset activity must be invoked from here */
472 tc->setPC(vect());
473 tc->setNextPC(vect() + sizeof(MachInst));
474 tc->setNextNPC(vect() + sizeof(MachInst) + sizeof(MachInst));
475 DPRINTF(MipsPRA, "ResetFault::invoke : PC set to %x", tc->readPC());
476#endif
477
478 // Set Coprocessor 1 (Floating Point) To Usable
479 StatusReg status = tc->readMiscRegNoEffect(MISCREG_STATUS);
480 status.cu.cu1 = 1;
481 tc->setMiscReg(MISCREG_STATUS, status);
482}
483
484void
485ReservedInstructionFault::invoke(ThreadContext *tc)
485ReservedInstructionFault::invoke(ThreadContext *tc, StaticInstPtr inst)
486{
487#if FULL_SYSTEM
488 DPRINTF(MipsPRA, "%s encountered.\n", name());
489 setExceptionState(tc, 0x0A);
490 Addr HandlerBase;
491 // Offset 0x180 - General Exception Vector
492 HandlerBase = vect() + tc->readMiscRegNoEffect(MISCREG_EBASE);
493 setHandlerPC(HandlerBase, tc);
494#else
495 panic("%s encountered.\n", name());
496#endif
497}
498
499void
486{
487#if FULL_SYSTEM
488 DPRINTF(MipsPRA, "%s encountered.\n", name());
489 setExceptionState(tc, 0x0A);
490 Addr HandlerBase;
491 // Offset 0x180 - General Exception Vector
492 HandlerBase = vect() + tc->readMiscRegNoEffect(MISCREG_EBASE);
493 setHandlerPC(HandlerBase, tc);
494#else
495 panic("%s encountered.\n", name());
496#endif
497}
498
499void
500ThreadFault::invoke(ThreadContext *tc)
500ThreadFault::invoke(ThreadContext *tc, StaticInstPtr inst)
501{
502 DPRINTF(MipsPRA, "%s encountered.\n", name());
503 panic("%s encountered.\n", name());
504}
505
506void
501{
502 DPRINTF(MipsPRA, "%s encountered.\n", name());
503 panic("%s encountered.\n", name());
504}
505
506void
507DspStateDisabledFault::invoke(ThreadContext *tc)
507DspStateDisabledFault::invoke(ThreadContext *tc, StaticInstPtr inst)
508{
509 DPRINTF(MipsPRA, "%s encountered.\n", name());
510 panic("%s encountered.\n", name());
511}
512
513void
508{
509 DPRINTF(MipsPRA, "%s encountered.\n", name());
510 panic("%s encountered.\n", name());
511}
512
513void
514CoprocessorUnusableFault::invoke(ThreadContext *tc)
514CoprocessorUnusableFault::invoke(ThreadContext *tc, StaticInstPtr inst)
515{
516#if FULL_SYSTEM
517 DPRINTF(MipsPRA, "%s encountered.\n", name());
518 setExceptionState(tc, 0xb);
519 // The ID of the coprocessor causing the exception is stored in
520 // CoprocessorUnusableFault::coProcID
521 CauseReg cause = tc->readMiscReg(MISCREG_CAUSE);
522 cause.ce = coProcID;

--- 14 unchanged lines hidden ---
515{
516#if FULL_SYSTEM
517 DPRINTF(MipsPRA, "%s encountered.\n", name());
518 setExceptionState(tc, 0xb);
519 // The ID of the coprocessor causing the exception is stored in
520 // CoprocessorUnusableFault::coProcID
521 CauseReg cause = tc->readMiscReg(MISCREG_CAUSE);
522 cause.ce = coProcID;

--- 14 unchanged lines hidden ---