diff --git a/libgloss/ChangeLog b/libgloss/ChangeLog index b426f32ae..aa1f44508 100644 --- a/libgloss/ChangeLog +++ b/libgloss/ChangeLog @@ -1,3 +1,8 @@ +2008-04-25 Nick Clifton + + * arm/crt0.S: Allow assembly under ARMv7 ISA. Support for + initializing stack pointers for interrupt modes is still pending. + 2008-04-14 Patrick Mansfield * spu/sbrk.c: Remove "extern int errno", use whatever is supplied diff --git a/libgloss/arm/crt0.S b/libgloss/arm/crt0.S index 573f426d1..bbde5892c 100644 --- a/libgloss/arm/crt0.S +++ b/libgloss/arm/crt0.S @@ -82,12 +82,18 @@ ldr r3, .Lstack cmp r3, #0 +#ifdef __thumb2__ + it eq +#endif ldreq r3, .LC0 /* Note: This 'mov' is essential when starting in User, and ensures we always get *some* sp value for the initial mode, even if we have somehow missed it below (in which case it gets the same value as FIQ - not ideal, but better than nothing.) */ mov sp, r3 +#ifdef __thumb2__ + /* XXX Fill in stack assignments for interrupt modes. */ +#else mrs r2, CPSR tst r2, #0x0F /* Test mode bits - in User of all are 0 */ beq .LC23 /* "eq" means r2 AND #0x0F is 0 */ @@ -109,6 +115,7 @@ sub r3, r3, #0x2000 msr CPSR_c, #0xD3 /* Supervisory mode, interrupts disabled */ + mov sp, r3 sub r3, r3, #0x8000 /* Min size 32k */ bic r3, r3, #0x00FF /* Align with current 64k block */ @@ -116,9 +123,9 @@ str r3, [r3, #-4] /* Move value into user mode sp without */ ldmdb r3, {sp}^ /* changing modes, via '^' form of ldm */ - orr r2, r2, #0xC0 /* Back to original mode, presumably SVC, */ msr CPSR_c, r2 /* with FIQ/IRQ disable bits forced to 1 */ +#endif .LC23: /* Setup a default stack-limit in-case the code has been compiled with "-mapcs-stack-check". Hard-wiring this value diff --git a/newlib/ChangeLog b/newlib/ChangeLog index 8ce345e28..1dcaa51ef 100644 --- a/newlib/ChangeLog +++ b/newlib/ChangeLog @@ -1,3 +1,7 @@ +2008-04-25 Nick Clifton + + * libc/machine/arm/setjmp.S: Fix thumb2 support. + 2008-04-24 Nick Clifton * libc/include/machine/ieeefp.h: Fix typo: _DOUBLE_IS_32_BITS diff --git a/newlib/libc/machine/arm/setjmp.S b/newlib/libc/machine/arm/setjmp.S index 84e7cd70b..4bb2a46a7 100644 --- a/newlib/libc/machine/arm/setjmp.S +++ b/newlib/libc/machine/arm/setjmp.S @@ -120,7 +120,12 @@ SYM (\name): FUNC_START setjmp /* Save all the callee-preserved registers into the jump buffer. */ +#ifdef __thumb2__ + stmea a1!, { v1-v7, fp, ip, lr } + str sp, [a1],#+4 +#else stmea a1!, { v1-v7, fp, ip, sp, lr } +#endif #if 0 /* Simulator does not cope with FP instructions yet. */ #ifndef __SOFTFP__ @@ -142,7 +147,12 @@ SYM (\name): /* If we have stack extension code it ought to be handled here. */ /* Restore the registers, retrieving the state when setjmp() was called. */ +#ifdef __thumb2__ + ldmfd a1!, { v1-v7, fp, ip, lr } + ldr sp, [a1],#+4 +#else ldmfd a1!, { v1-v7, fp, ip, sp, lr } +#endif #if 0 /* Simulator does not cope with FP instructions yet. */ #ifndef __SOFTFP__