- if (ut->uu_code == EXC_I386_DIV) {
- sinfo64.si_code = FPE_INTDIV;
- }
- else if (ut->uu_code == EXC_I386_INTO) {
- sinfo64.si_code = FPE_INTOVF;
- }
- else if (ut->uu_subcode & (1 << FP_ZE)) {
- sinfo64.si_code = FPE_FLTDIV;
- } else if (ut->uu_subcode & (1 << FP_OE)) {
- sinfo64.si_code = FPE_FLTOVF;
- } else if (ut->uu_subcode & (1 << FP_UE)) {
- sinfo64.si_code = FPE_FLTUND;
- } else if (ut->uu_subcode & (1 << FP_PE)) {
- sinfo64.si_code = FPE_FLTRES;
- } else if (ut->uu_subcode & (1 << FP_IE)) {
- sinfo64.si_code = FPE_FLTINV;
- } else {
- sinfo64.si_code = FPE_NOOP;
- }
+ if (ut->uu_code == EXC_I386_DIV) {
+ sinfo64.si_code = FPE_INTDIV;
+ } else if (ut->uu_code == EXC_I386_INTO) {
+ sinfo64.si_code = FPE_INTOVF;
+ } else if (ut->uu_subcode & (1 << FP_ZE)) {
+ sinfo64.si_code = FPE_FLTDIV;
+ } else if (ut->uu_subcode & (1 << FP_OE)) {
+ sinfo64.si_code = FPE_FLTOVF;
+ } else if (ut->uu_subcode & (1 << FP_UE)) {
+ sinfo64.si_code = FPE_FLTUND;
+ } else if (ut->uu_subcode & (1 << FP_PE)) {
+ sinfo64.si_code = FPE_FLTRES;
+ } else if (ut->uu_subcode & (1 << FP_IE)) {
+ sinfo64.si_code = FPE_FLTINV;
+ } else {
+ sinfo64.si_code = FPE_NOOP;
+ }
+ break;
+ case SIGBUS:
+ sinfo64.si_code = BUS_ADRERR;
+ sinfo64.si_addr = ua_cr2;
+ break;
+ case SIGTRAP:
+ sinfo64.si_code = TRAP_BRKPT;
+ break;
+ case SIGSEGV:
+ sinfo64.si_addr = ua_cr2;
+
+ switch (ut->uu_code) {
+ case EXC_I386_GPFLT:
+ /* CR2 is meaningless after GP fault */
+ /* XXX namespace clash! */
+ sinfo64.si_addr = 0ULL;
+ sinfo64.si_code = 0;