mirror of
				git://git.openwrt.org/openwrt/openwrt.git
				synced 2025-10-30 13:34:27 -04:00 
			
		
		
		
	Rebased patches: - 003-fix-missing-ef_reg-defs-with-musl.patch - 004-ppc-musl.patch Signed-off-by: Weijie Gao <hackpascal@gmail.com>
		
			
				
	
	
		
			236 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			236 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| --- 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. */
 |