X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/0a7de7458d150b5d4dffc935ba399be265ef0a1a..bca245acd4c03fd752d1a45f011ad495e60fe53d:/bsd/dev/arm/unix_signal.c diff --git a/bsd/dev/arm/unix_signal.c b/bsd/dev/arm/unix_signal.c index 12d7b69f7..1e3bb03f9 100644 --- a/bsd/dev/arm/unix_signal.c +++ b/bsd/dev/arm/unix_signal.c @@ -24,6 +24,7 @@ #include #include +#include #include extern struct arm_saved_state *get_user_regs(thread_t); @@ -264,7 +265,8 @@ sendsig( user_addr_t catcher, int sig, int mask, - __unused uint32_t code + __unused uint32_t code, + sigset_t siginfo ) { union { @@ -300,7 +302,7 @@ sendsig( bzero(&ts, sizeof(ts)); bzero(&user_frame, sizeof(user_frame)); - if (p->p_sigacts->ps_siginfo & sigmask(sig)) { + if (siginfo & sigmask(sig)) { infostyle = UC_FLAVOR; } else { infostyle = UC_TRAD; @@ -409,6 +411,30 @@ sendsig( break; case SIGFPE: + switch (ut->uu_code) { + case EXC_ARM_FP_UF: + sinfo.si_code = FPE_FLTUND; + break; + case EXC_ARM_FP_OF: + sinfo.si_code = FPE_FLTOVF; + break; + case EXC_ARM_FP_IO: + sinfo.si_code = FPE_FLTINV; + break; + case EXC_ARM_FP_DZ: + sinfo.si_code = FPE_FLTDIV; + break; + case EXC_ARM_FP_ID: + sinfo.si_code = FPE_FLTINV; + break; + case EXC_ARM_FP_IX: + sinfo.si_code = FPE_FLTRES; + break; + default: + sinfo.si_code = FPE_NOOP; + break; + } + break; case SIGBUS: @@ -730,6 +756,9 @@ sigreturn( th_act = current_thread(); ut = (struct uthread *) get_bsdthread_info(th_act); + /* see osfmk/kern/restartable.c */ + act_set_ast_reset_pcs(th_act); + if (proc_is64bit_data(p)) { #if defined(__arm64__) error = sigreturn_copyin_ctx64(&uctx.uc64, &mctx.mc64, uap->uctx);