summaryrefslogtreecommitdiffstats
path: root/patches/newlib-1.16.0/generic/newlib-1.16.0-thumb2.diff
blob: cd78c9942fec009a809c3ab351c77c2f6a4bfc1f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
From: Nick Clifton <nickc at redhat dot com>
To: info dot gnu at rt-labs dot com
Cc: newlib at sources dot redhat dot com
Date: Fri, 25 Apr 2008 10:01:35 +0100
Subject: Re: arm-elf thumb-2 issue in newlib or gas?

[...]
http://sourceware.org/ml/newlib/2008/msg00222.html
[...]

OK, well the crt0.S will work if used in User mode, so I am going to check in
these patches for now. At some point in the future I will look at how we should
be initializing the interrupt stack pointers.

Cheers
  Nick

newlib/ChangeLog
2008-04-25  Nick Clifton  <nickc@redhat.com>


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

libgloss/ChangeLog
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.

---
 libgloss/arm/crt0.S              |    7 +++++++
 newlib/libc/machine/arm/setjmp.S |   10 ++++++++++
 2 files changed, 17 insertions(+)

Index: newlib-1.16.0/libgloss/arm/crt0.S
===================================================================
--- newlib-1.16.0.orig/libgloss/arm/crt0.S
+++ newlib-1.16.0/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 */
@@ -119,6 +125,7 @@
 	
 	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
Index: newlib-1.16.0/newlib/libc/machine/arm/setjmp.S
===================================================================
--- newlib-1.16.0.orig/newlib/libc/machine/arm/setjmp.S
+++ newlib-1.16.0/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__