* libc/machine/arm/setjmp.S: Fix thumb2 support.

* arm/crt0.S: Allow assembly under ARMv7 ISA.  Support for
            initializing stack pointers for interrupt modes is still pending.
This commit is contained in:
Nick Clifton 2008-04-25 09:02:40 +00:00
parent 4214d0c04c
commit 026f9d290f
4 changed files with 27 additions and 1 deletions

View File

@ -1,3 +1,8 @@
2008-04-25 Nick Clifton <nickc@redhat.com>
* arm/crt0.S: Allow assembly under ARMv7 ISA. Support for
initializing stack pointers for interrupt modes is still pending.
2008-04-14 Patrick Mansfield <patmans@us.ibm.com> 2008-04-14 Patrick Mansfield <patmans@us.ibm.com>
* spu/sbrk.c: Remove "extern int errno", use whatever is supplied * spu/sbrk.c: Remove "extern int errno", use whatever is supplied

View File

@ -82,12 +82,18 @@
ldr r3, .Lstack ldr r3, .Lstack
cmp r3, #0 cmp r3, #0
#ifdef __thumb2__
it eq
#endif
ldreq r3, .LC0 ldreq r3, .LC0
/* Note: This 'mov' is essential when starting in User, and ensures we /* Note: This 'mov' is essential when starting in User, and ensures we
always get *some* sp value for the initial mode, even if 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 have somehow missed it below (in which case it gets the same
value as FIQ - not ideal, but better than nothing.) */ value as FIQ - not ideal, but better than nothing.) */
mov sp, r3 mov sp, r3
#ifdef __thumb2__
/* XXX Fill in stack assignments for interrupt modes. */
#else
mrs r2, CPSR mrs r2, CPSR
tst r2, #0x0F /* Test mode bits - in User of all are 0 */ tst r2, #0x0F /* Test mode bits - in User of all are 0 */
beq .LC23 /* "eq" means r2 AND #0x0F is 0 */ beq .LC23 /* "eq" means r2 AND #0x0F is 0 */
@ -109,6 +115,7 @@
sub r3, r3, #0x2000 sub r3, r3, #0x2000
msr CPSR_c, #0xD3 /* Supervisory mode, interrupts disabled */ msr CPSR_c, #0xD3 /* Supervisory mode, interrupts disabled */
mov sp, r3 mov sp, r3
sub r3, r3, #0x8000 /* Min size 32k */ sub r3, r3, #0x8000 /* Min size 32k */
bic r3, r3, #0x00FF /* Align with current 64k block */ bic r3, r3, #0x00FF /* Align with current 64k block */
@ -116,9 +123,9 @@
str r3, [r3, #-4] /* Move value into user mode sp without */ str r3, [r3, #-4] /* Move value into user mode sp without */
ldmdb r3, {sp}^ /* changing modes, via '^' form of ldm */ ldmdb r3, {sp}^ /* changing modes, via '^' form of ldm */
orr r2, r2, #0xC0 /* Back to original mode, presumably SVC, */ orr r2, r2, #0xC0 /* Back to original mode, presumably SVC, */
msr CPSR_c, r2 /* with FIQ/IRQ disable bits forced to 1 */ msr CPSR_c, r2 /* with FIQ/IRQ disable bits forced to 1 */
#endif
.LC23: .LC23:
/* Setup a default stack-limit in-case the code has been /* Setup a default stack-limit in-case the code has been
compiled with "-mapcs-stack-check". Hard-wiring this value compiled with "-mapcs-stack-check". Hard-wiring this value

View File

@ -1,3 +1,7 @@
2008-04-25 Nick Clifton <nickc@redhat.com>
* libc/machine/arm/setjmp.S: Fix thumb2 support.
2008-04-24 Nick Clifton <nickc@redhat.com> 2008-04-24 Nick Clifton <nickc@redhat.com>
* libc/include/machine/ieeefp.h: Fix typo: _DOUBLE_IS_32_BITS * libc/include/machine/ieeefp.h: Fix typo: _DOUBLE_IS_32_BITS

View File

@ -120,7 +120,12 @@ SYM (\name):
FUNC_START setjmp FUNC_START setjmp
/* Save all the callee-preserved registers into the jump buffer. */ /* 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 } stmea a1!, { v1-v7, fp, ip, sp, lr }
#endif
#if 0 /* Simulator does not cope with FP instructions yet. */ #if 0 /* Simulator does not cope with FP instructions yet. */
#ifndef __SOFTFP__ #ifndef __SOFTFP__
@ -142,7 +147,12 @@ SYM (\name):
/* If we have stack extension code it ought to be handled here. */ /* If we have stack extension code it ought to be handled here. */
/* Restore the registers, retrieving the state when setjmp() was called. */ /* 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 } ldmfd a1!, { v1-v7, fp, ip, sp, lr }
#endif
#if 0 /* Simulator does not cope with FP instructions yet. */ #if 0 /* Simulator does not cope with FP instructions yet. */
#ifndef __SOFTFP__ #ifndef __SOFTFP__