diff options
author | Adeel <3840695+am11@users.noreply.github.com> | 2022-08-25 22:35:01 +0300 |
---|---|---|
committer | Dave Watson <dade.watson@gmail.com> | 2022-09-02 14:58:23 -0700 |
commit | 612ebb80368ef69f713de06eaa3d924403ba9288 (patch) | |
tree | 023a56489d735343fbcb8f1ac1de0ad9bea337c0 /src | |
parent | 3188ad1369c4df2785c017d876f02f727ed326ce (diff) | |
download | libunwind-612ebb80368ef69f713de06eaa3d924403ba9288.tar.gz |
Fix undefined behavior issues in aarch64
Diffstat (limited to 'src')
-rw-r--r-- | src/aarch64/Ginit.c | 25 |
1 files changed, 17 insertions, 8 deletions
diff --git a/src/aarch64/Ginit.c b/src/aarch64/Ginit.c index e466467f..1aa68b22 100644 --- a/src/aarch64/Ginit.c +++ b/src/aarch64/Ginit.c @@ -46,20 +46,29 @@ unw_addr_space_t unw_local_addr_space = &local_addr_space; static inline void * uc_addr (unw_tdep_context_t *uc, int reg) { - if (reg >= UNW_AARCH64_X0 && reg < UNW_AARCH64_V0) -#if defined(__FreeBSD__) +#ifdef __FreeBSD__ + if (reg >= UNW_AARCH64_X0 && reg < UNW_AARCH64_X30) return &uc->uc_mcontext.mc_gpregs.gp_x[reg]; -#else - return &uc->uc_mcontext.regs[reg]; -#endif + else if (reg == UNW_AARCH64_SP) + return &uc->uc_mcontext.sp; + else if (reg == UNW_AARCH64_PC) + return &uc->uc_mcontext.gp_elr; else if (reg >= UNW_AARCH64_V0 && reg <= UNW_AARCH64_V31) -#if defined(__FreeBSD__) return &GET_FPCTX(uc)->uc_mcontext.mc_fpregs.fp_q[reg - UNW_AARCH64_V0]; -#else + else + return NULL; +#else /* __FreeBSD__ */ + if (reg >= UNW_AARCH64_X0 && reg < UNW_AARCH64_X30) + return &uc->uc_mcontext.regs[reg]; + else if (reg == UNW_AARCH64_SP) + return &uc->uc_mcontext.sp; + else if (reg == UNW_AARCH64_PC) + return &uc->uc_mcontext.pc; + else if (reg >= UNW_AARCH64_V0 && reg <= UNW_AARCH64_V31) return &GET_FPCTX(uc)->vregs[reg - UNW_AARCH64_V0]; -#endif else return NULL; +#endif /* __FreeBSD__ */ } # ifdef UNW_LOCAL_ONLY |