706 |
fprintf(logfile, "Invalid data memory access: 0x%08x\n", |
fprintf(logfile, "Invalid data memory access: 0x%08x\n", |
707 |
env->spr[SPR_DAR]); |
env->spr[SPR_DAR]); |
708 |
} |
} |
709 |
switch (env->error_code & 0xF) { |
switch (env->error_code & 0xFF000000) { |
710 |
case EXCP_DSI_TRANSLATE: |
case 0x40000000: |
711 |
info.si_signo = TARGET_SIGSEGV; |
info.si_signo = TARGET_SIGSEGV; |
712 |
info.si_errno = 0; |
info.si_errno = 0; |
713 |
info.si_code = TARGET_SEGV_MAPERR; |
info.si_code = TARGET_SEGV_MAPERR; |
714 |
break; |
break; |
715 |
case EXCP_DSI_NOTSUP: |
case 0x04000000: |
|
case EXCP_DSI_EXTERNAL: |
|
716 |
info.si_signo = TARGET_SIGILL; |
info.si_signo = TARGET_SIGILL; |
717 |
info.si_errno = 0; |
info.si_errno = 0; |
718 |
info.si_code = TARGET_ILL_ILLADR; |
info.si_code = TARGET_ILL_ILLADR; |
719 |
break; |
break; |
720 |
case EXCP_DSI_PROT: |
case 0x08000000: |
721 |
info.si_signo = TARGET_SIGSEGV; |
info.si_signo = TARGET_SIGSEGV; |
722 |
info.si_errno = 0; |
info.si_errno = 0; |
723 |
info.si_code = TARGET_SEGV_ACCERR; |
info.si_code = TARGET_SEGV_ACCERR; |
724 |
break; |
break; |
|
case EXCP_DSI_DABR: |
|
|
info.si_signo = TARGET_SIGTRAP; |
|
|
info.si_errno = 0; |
|
|
info.si_code = TARGET_TRAP_BRKPT; |
|
|
break; |
|
725 |
default: |
default: |
726 |
/* Let's send a regular segfault... */ |
/* Let's send a regular segfault... */ |
727 |
fprintf(stderr, "Invalid segfault errno (%02x)\n", |
fprintf(stderr, "Invalid segfault errno (%02x)\n", |
742 |
fprintf(stderr, "Invalid instruction fetch\n"); |
fprintf(stderr, "Invalid instruction fetch\n"); |
743 |
if (loglevel) |
if (loglevel) |
744 |
fprintf(logfile, "Invalid instruction fetch\n"); |
fprintf(logfile, "Invalid instruction fetch\n"); |
745 |
switch (env->error_code) { |
switch (env->error_code & 0xFF000000) { |
746 |
case EXCP_ISI_TRANSLATE: |
case 0x40000000: |
747 |
info.si_signo = TARGET_SIGSEGV; |
info.si_signo = TARGET_SIGSEGV; |
748 |
info.si_errno = 0; |
info.si_errno = 0; |
749 |
info.si_code = TARGET_SEGV_MAPERR; |
info.si_code = TARGET_SEGV_MAPERR; |
750 |
break; |
break; |
751 |
case EXCP_ISI_GUARD: |
case 0x10000000: |
752 |
info.si_signo = TARGET_SIGILL; |
case 0x08000000: |
|
info.si_errno = 0; |
|
|
info.si_code = TARGET_ILL_ILLADR; |
|
|
break; |
|
|
case EXCP_ISI_NOEXEC: |
|
|
case EXCP_ISI_PROT: |
|
753 |
info.si_signo = TARGET_SIGSEGV; |
info.si_signo = TARGET_SIGSEGV; |
754 |
info.si_errno = 0; |
info.si_errno = 0; |
755 |
info.si_code = TARGET_SEGV_ACCERR; |
info.si_code = TARGET_SEGV_ACCERR; |
919 |
if (loglevel) |
if (loglevel) |
920 |
fprintf(logfile, "Decrementer exception\n"); |
fprintf(logfile, "Decrementer exception\n"); |
921 |
abort(); |
abort(); |
|
case EXCP_RESA: /* Implementation specific */ |
|
|
/* Should not happen ! */ |
|
|
fprintf(stderr, "RESA exception should never happen !\n"); |
|
|
if (loglevel) |
|
|
fprintf(logfile, "RESA exception should never happen !\n"); |
|
|
abort(); |
|
|
case EXCP_RESB: /* Implementation specific */ |
|
|
/* Should not happen ! */ |
|
|
fprintf(stderr, "RESB exception should never happen !\n"); |
|
|
if (loglevel) |
|
|
fprintf(logfile, "RESB exception should never happen !\n"); |
|
|
abort(); |
|
922 |
case EXCP_TRACE: |
case EXCP_TRACE: |
923 |
/* Do nothing: we use this to trace execution */ |
/* Do nothing: we use this to trace execution */ |
924 |
break; |
break; |
940 |
case EXCP_BRANCH: |
case EXCP_BRANCH: |
941 |
/* We stopped because of a jump... */ |
/* We stopped because of a jump... */ |
942 |
break; |
break; |
|
case EXCP_RFI: |
|
|
/* Should not occur: we always are in user mode */ |
|
|
fprintf(stderr, "Return from interrupt ?\n"); |
|
|
if (loglevel) |
|
|
fprintf(logfile, "Return from interrupt ?\n"); |
|
|
abort(); |
|
943 |
case EXCP_INTERRUPT: |
case EXCP_INTERRUPT: |
944 |
/* Don't know why this should ever happen... */ |
/* Don't know why this should ever happen... */ |
945 |
break; |
break; |