| --- a/include/libunwind-ppc32.h | 
 | +++ b/include/libunwind-ppc32.h | 
 | @@ -81,6 +81,88 @@ typedef int64_t unw_sword_t; | 
 |   | 
 |  typedef long double unw_tdep_fpreg_t; | 
 |   | 
 | +#ifndef __GLIBC__ | 
 | + | 
 | +/* We can't include asm/ptrace.h here, as it conflicts with musl's definitions */ | 
 | + | 
 | +#define PT_R0	0 | 
 | +#define PT_R1	1 | 
 | +#define PT_R2	2 | 
 | +#define PT_R3	3 | 
 | +#define PT_R4	4 | 
 | +#define PT_R5	5 | 
 | +#define PT_R6	6 | 
 | +#define PT_R7	7 | 
 | +#define PT_R8	8 | 
 | +#define PT_R9	9 | 
 | +#define PT_R10	10 | 
 | +#define PT_R11	11 | 
 | +#define PT_R12	12 | 
 | +#define PT_R13	13 | 
 | +#define PT_R14	14 | 
 | +#define PT_R15	15 | 
 | +#define PT_R16	16 | 
 | +#define PT_R17	17 | 
 | +#define PT_R18	18 | 
 | +#define PT_R19	19 | 
 | +#define PT_R20	20 | 
 | +#define PT_R21	21 | 
 | +#define PT_R22	22 | 
 | +#define PT_R23	23 | 
 | +#define PT_R24	24 | 
 | +#define PT_R25	25 | 
 | +#define PT_R26	26 | 
 | +#define PT_R27	27 | 
 | +#define PT_R28	28 | 
 | +#define PT_R29	29 | 
 | +#define PT_R30	30 | 
 | +#define PT_R31	31 | 
 | + | 
 | +#define PT_NIP	32 | 
 | +#define PT_MSR	33 | 
 | +#define PT_ORIG_R3 34 | 
 | +#define PT_CTR	35 | 
 | +#define PT_LNK	36 | 
 | +#define PT_XER	37 | 
 | +#define PT_CCR	38 | 
 | +#ifndef __powerpc64__ | 
 | +#define PT_MQ	39 | 
 | +#else | 
 | +#define PT_SOFTE 39 | 
 | +#endif | 
 | +#define PT_TRAP	40 | 
 | +#define PT_DAR	41 | 
 | +#define PT_DSISR 42 | 
 | +#define PT_RESULT 43 | 
 | +#define PT_DSCR 44 | 
 | +#define PT_REGS_COUNT 44 | 
 | + | 
 | +#define PT_FPR0	48	/* each FP reg occupies 2 slots in this space */ | 
 | + | 
 | +#ifndef __powerpc64__ | 
 | + | 
 | +#define PT_FPR31 (PT_FPR0 + 2*31) | 
 | +#define PT_FPSCR (PT_FPR0 + 2*32 + 1) | 
 | + | 
 | +#else /* __powerpc64__ */ | 
 | + | 
 | +#define PT_FPSCR (PT_FPR0 + 32)	/* each FP reg occupies 1 slot in 64-bit space */ | 
 | + | 
 | + | 
 | +#define PT_VR0 82	/* each Vector reg occupies 2 slots in 64-bit */ | 
 | +#define PT_VSCR (PT_VR0 + 32*2 + 1) | 
 | +#define PT_VRSAVE (PT_VR0 + 33*2) | 
 | + | 
 | + | 
 | +/* | 
 | + * Only store first 32 VSRs here. The second 32 VSRs in VR0-31 | 
 | + */ | 
 | +#define PT_VSR0 150	/* each VSR reg occupies 2 slots in 64-bit */ | 
 | +#define PT_VSR31 (PT_VSR0 + 2*31) | 
 | +#endif /* __powerpc64__ */ | 
 | + | 
 | +#endif /* !__GLIBC__ */ | 
 | + | 
 |  typedef enum | 
 |    { | 
 |      UNW_PPC32_R0, | 
 | --- a/include/libunwind-ppc64.h | 
 | +++ b/include/libunwind-ppc64.h | 
 | @@ -88,6 +88,88 @@ typedef struct { | 
 |      uint64_t halves[2]; | 
 |  } unw_tdep_vreg_t; | 
 |   | 
 | +#ifndef __GLIBC__ | 
 | + | 
 | +/* We can't include asm/ptrace.h here, as it conflicts with musl's definitions */ | 
 | + | 
 | +#define PT_R0	0 | 
 | +#define PT_R1	1 | 
 | +#define PT_R2	2 | 
 | +#define PT_R3	3 | 
 | +#define PT_R4	4 | 
 | +#define PT_R5	5 | 
 | +#define PT_R6	6 | 
 | +#define PT_R7	7 | 
 | +#define PT_R8	8 | 
 | +#define PT_R9	9 | 
 | +#define PT_R10	10 | 
 | +#define PT_R11	11 | 
 | +#define PT_R12	12 | 
 | +#define PT_R13	13 | 
 | +#define PT_R14	14 | 
 | +#define PT_R15	15 | 
 | +#define PT_R16	16 | 
 | +#define PT_R17	17 | 
 | +#define PT_R18	18 | 
 | +#define PT_R19	19 | 
 | +#define PT_R20	20 | 
 | +#define PT_R21	21 | 
 | +#define PT_R22	22 | 
 | +#define PT_R23	23 | 
 | +#define PT_R24	24 | 
 | +#define PT_R25	25 | 
 | +#define PT_R26	26 | 
 | +#define PT_R27	27 | 
 | +#define PT_R28	28 | 
 | +#define PT_R29	29 | 
 | +#define PT_R30	30 | 
 | +#define PT_R31	31 | 
 | + | 
 | +#define PT_NIP	32 | 
 | +#define PT_MSR	33 | 
 | +#define PT_ORIG_R3 34 | 
 | +#define PT_CTR	35 | 
 | +#define PT_LNK	36 | 
 | +#define PT_XER	37 | 
 | +#define PT_CCR	38 | 
 | +#ifndef __powerpc64__ | 
 | +#define PT_MQ	39 | 
 | +#else | 
 | +#define PT_SOFTE 39 | 
 | +#endif | 
 | +#define PT_TRAP	40 | 
 | +#define PT_DAR	41 | 
 | +#define PT_DSISR 42 | 
 | +#define PT_RESULT 43 | 
 | +#define PT_DSCR 44 | 
 | +#define PT_REGS_COUNT 44 | 
 | + | 
 | +#define PT_FPR0	48	/* each FP reg occupies 2 slots in this space */ | 
 | + | 
 | +#ifndef __powerpc64__ | 
 | + | 
 | +#define PT_FPR31 (PT_FPR0 + 2*31) | 
 | +#define PT_FPSCR (PT_FPR0 + 2*32 + 1) | 
 | + | 
 | +#else /* __powerpc64__ */ | 
 | + | 
 | +#define PT_FPSCR (PT_FPR0 + 32)	/* each FP reg occupies 1 slot in 64-bit space */ | 
 | + | 
 | + | 
 | +#define PT_VR0 82	/* each Vector reg occupies 2 slots in 64-bit */ | 
 | +#define PT_VSCR (PT_VR0 + 32*2 + 1) | 
 | +#define PT_VRSAVE (PT_VR0 + 33*2) | 
 | + | 
 | + | 
 | +/* | 
 | + * Only store first 32 VSRs here. The second 32 VSRs in VR0-31 | 
 | + */ | 
 | +#define PT_VSR0 150	/* each VSR reg occupies 2 slots in 64-bit */ | 
 | +#define PT_VSR31 (PT_VSR0 + 2*31) | 
 | +#endif /* __powerpc64__ */ | 
 | + | 
 | +#endif /* !__GLIBC__ */ | 
 | + | 
 |  typedef enum | 
 |    { | 
 |      UNW_PPC64_R0, | 
 | --- a/src/ppc32/Ginit.c | 
 | +++ b/src/ppc32/Ginit.c | 
 | @@ -46,10 +46,15 @@ static void * | 
 |  uc_addr (ucontext_t *uc, int reg) | 
 |  { | 
 |    void *addr; | 
 | +#ifdef __GLIBC__ | 
 | +  mcontext_t *mc = uc->uc_mcontext.uc_regs; | 
 | +#else | 
 | +  mcontext_t *mc = &uc->uc_mcontext; | 
 | +#endif | 
 |   | 
 |    if ((unsigned) (reg - UNW_PPC32_R0) < 32) | 
 |  #if defined(__linux__) | 
 | -    addr = &uc->uc_mcontext.uc_regs->gregs[reg - UNW_PPC32_R0]; | 
 | +    addr = &mc->gregs[reg - UNW_PPC32_R0]; | 
 |  #elif defined(__FreeBSD__) | 
 |      addr = &uc->uc_mcontext.mc_gpr[reg - UNW_PPC32_R0]; | 
 |  #endif | 
 | @@ -58,7 +63,7 @@ uc_addr (ucontext_t *uc, int reg) | 
 |    if ( ((unsigned) (reg - UNW_PPC32_F0) < 32) && | 
 |         ((unsigned) (reg - UNW_PPC32_F0) >= 0) ) | 
 |  #if defined(__linux__) | 
 | -    addr = &uc->uc_mcontext.uc_regs->fpregs.fpregs[reg - UNW_PPC32_F0]; | 
 | +    addr = &mc->fpregs.fpregs[reg - UNW_PPC32_F0]; | 
 |   #elif defined(__FreeBSD__) | 
 |      addr = &uc->uc_mcontext.mc_fpreg[reg - UNW_PPC32_F0]; | 
 |  #endif | 
 | @@ -85,7 +90,7 @@ uc_addr (ucontext_t *uc, int reg) | 
 |            return NULL; | 
 |          } | 
 |  #if defined(__linux__) | 
 | -      addr = &uc->uc_mcontext.uc_regs->gregs[gregs_idx]; | 
 | +      addr = &mc->gregs[gregs_idx]; | 
 |  #elif defined(__FreeBSD__) | 
 |        addr = &uc->uc_mcontext.mc_gpr[gregs_idx]; | 
 |  #endif | 
 | --- a/src/ppc32/ucontext_i.h | 
 | +++ b/src/ppc32/ucontext_i.h | 
 | @@ -44,8 +44,13 @@ WITH THE SOFTWARE OR THE USE OR OTHER DE | 
 |  //#define MQ_IDX                36 | 
 |  #define LINK_IDX        36 | 
 |   | 
 | +#ifdef __GLIBC__ | 
 |  #define _UC_MCONTEXT_GPR(x) ( ((void *)&dmy_ctxt.uc_mcontext.uc_regs->gregs[x] - (void *)&dmy_ctxt) ) | 
 |  #define _UC_MCONTEXT_FPR(x) ( ((void *)&dmy_ctxt.uc_mcontext.uc_regs->fpregs.fpregs[x] - (void *)&dmy_ctxt) ) | 
 | +#else | 
 | +#define _UC_MCONTEXT_GPR(x) ( ((void *)&dmy_ctxt.uc_mcontext.gregs[x] - (void *)&dmy_ctxt) ) | 
 | +#define _UC_MCONTEXT_FPR(x) ( ((void *)&dmy_ctxt.uc_mcontext.fpregs.fpregs[x] - (void *)&dmy_ctxt) ) | 
 | +#endif | 
 |   | 
 |  /* These are dummy structures used only for obtaining the offsets of the | 
 |     various structure members. */ |