This is the mail archive of the newlib@sourceware.org mailing list for the newlib project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[patch] Arm Thumb-2 support


The attached patch allows building Arm newlib/libgloss in Thumb-2 mode. Future 
Arm CPUs will implement Thumb-2 only and not Arm mode, so the existing Thumb 
support is not sufficient. The patch makes two changes:

- Add pure Thumb-2 startup code.
- Use the BKPT instruction instead of SWI for semihosted syscalls.

Tested with cross to arm-none-eabi.
Ok?

Paul

2006-02-07  Paul Brook  <paul@codesourcery.com>

libgloss/
	* arm/crt0.S: Add Thumb-2 startup code.
	* arm/redboot-crt0.S: Ditto.
	* arm/libcfunc.c (do_AngelSWI): Use AngelSWIInsn.
	* arm/swi.h (AngelSWIInsn, AngelSWIAsm): Define.
	* arm/trap.S: Disable for Thumb-2.
newlib/
	* libc/machine/arm/setjmp.S: Add Thumb-2 support.
	* libc/sys/arm/crt0.S: Add Thumb-2 startup code.
	* libc/sys/arm/libcfunc.c (do_AngelSWI): Use AngelSWIInsn.
	* libc/sys/arm/swi.h (AngelSWIInsn, AngelSWIAsm): Define.
	* libc/sys/arm/trap.S: Disable for Thumb-2.
Index: libgloss/arm/crt0.S
===================================================================
RCS file: /var/cvsroot/src-cvs/src/libgloss/arm/crt0.S,v
retrieving revision 1.4
diff -u -p -r1.4 crt0.S
--- libgloss/arm/crt0.S	19 Jul 2005 15:15:25 -0000	1.4
+++ libgloss/arm/crt0.S	7 Feb 2006 16:44:11 -0000
@@ -18,15 +18,26 @@
 
 /* .text is used instead of .section .text so it works with arm-aout too.  */
 	.text
+#if defined(__thumb2__)
+	.syntax unified
+	.thumb
+.macro FUNC_START name
+	.global \name
+	.thumb_func
+\name:
+.endm
+#else
 	.code 32
+.macro FUNC_START name
+	.global \name
+\name:
+.endm
+#endif
 	.align 	0
 
-	.global	_mainCRTStartup
-	.global	_start
-	.global	start
-start:
-_start:
-_mainCRTStartup:
+	FUNC_START	_mainCRTStartup
+	FUNC_START	_start
+	FUNC_START	start
 #if defined(__ELF__) && !defined(__USING_SJLJ_EXCEPTIONS__)
 	/* Annotation for EABI unwinding tables.  */
 	.fnstart
@@ -45,7 +56,12 @@ _mainCRTStartup:
 	/*  Issue Angel SWI to read stack info */
 	mov	r0, #AngelSWI_Reason_HeapInfo
 	adr	r1, .LC0	/*  point at ptr to 4 words to receive data */
-	swi	AngelSWI_ARM	/*  We are always in ARM mode for startup */
+#if defined(__thumb2__)
+	bkpt	AngelSWI
+#else
+	/*  We are always in ARM mode for startup */
+	AngelSWIAsm	AngelSWI_ARM
+#endif
 	ldr	r0, .LC0	/*  point at values read */
 	ldr	sp, [r0, #8]
 	ldr	sl, [r0, #12]
@@ -124,8 +140,8 @@ _mainCRTStartup:
 	sub	a3, a3, a1		/* Third arg: length of block */
 	
 
-#ifdef __thumb__		/* Enter Thumb mode.... */
-
+#if defined(__thumb__) && !defined(__thumb2__)
+	/* Enter Thumb mode.... */
 	add	a4, pc, #1	/* Get the address of the Thumb block */
 	bx	a4		/* Go there and start Thumb decoding  */
 
@@ -165,7 +181,7 @@ __change_mode:	
 #else
 	mov	r0, #AngelSWI_Reason_GetCmdLine
 	adr	r1, .LC30	/*  Space for command line */
-	swi	AngelSWI
+	AngelSWIAsm	AngelSWI
 	ldr	r1, .LC30
 #endif
 	/*  Parse string at r1 */
@@ -287,7 +303,7 @@ __change_mode:	
 
 	bl	FUNCTION (exit)		/* Should not return.  */
 
-#ifdef __thumb__
+#if defined(__thumb__) && !defined(__thumb2__)
 	/* Come out of Thumb mode.  This code should be redundant.  */
 
 	mov	a4, pc
Index: libgloss/arm/libcfunc.c
===================================================================
RCS file: /var/cvsroot/src-cvs/src/libgloss/arm/libcfunc.c,v
retrieving revision 1.6
diff -u -p -r1.6 libcfunc.c
--- libgloss/arm/libcfunc.c	30 Nov 2005 23:37:14 -0000	1.6
+++ libgloss/arm/libcfunc.c	7 Feb 2006 16:04:27 -0000
@@ -15,7 +15,7 @@ static inline int
 do_AngelSWI (int reason, void * arg)
 {
   int value;
-  asm volatile ("mov r0, %1; mov r1, %2; swi %a3; mov %0, r0"
+  asm volatile ("mov r0, %1; mov r1, %2; " AngelSWIInsn " %a3; mov %0, r0"
        : "=r" (value) /* Outputs */
        : "r" (reason), "r" (arg), "i" (AngelSWI) /* Inputs */
        : "r0", "r1", "lr"
Index: libgloss/arm/redboot-crt0.S
===================================================================
RCS file: /var/cvsroot/src-cvs/src/libgloss/arm/redboot-crt0.S,v
retrieving revision 1.4
diff -u -p -r1.4 redboot-crt0.S
--- libgloss/arm/redboot-crt0.S	7 Nov 2002 00:25:57 -0000	1.4
+++ libgloss/arm/redboot-crt0.S	2 Feb 2006 17:13:54 -0000
@@ -12,11 +12,23 @@
 
     .text
      /* Setup the assembly entry point.  */
-    .code 32
-    .globl SYM_NAME(start)
-    .globl SYM_NAME(_start)
-SYM_NAME(start):
-SYM_NAME(_start):
+#ifdef __thumb2__
+.macro FUNC_START name
+	.global \name
+	.thumb_func
+\name:
+.endm
+	.syntax unified
+	.thumb
+#else
+.macro FUNC_START name
+	.global \name
+\name:
+.endm
+	.code 32
+#endif
+	FUNC_START SYM_NAME(start)
+	FUNC_START SYM_NAME(_start)
 	mov	fp, #0	/* Null frame pointer.  */
 	mov	r7, #0	/* Null frame pointer for Thumb.  */
 
@@ -46,7 +58,7 @@ SYM_NAME(_start):
 	/* Nothing to left to clear.  */
 #endif
 
-#ifdef __thumb__		/* Enter Thumb mode. */
+#if defined(__thumb__) && !defined(__thumb2__)	/* Enter Thumb mode. */
 	add	a4, pc, #1	/* Get the address of the Thumb block.  */
 	bx	a4		/* Go there and start Thumb decoding.   */
 
Index: libgloss/arm/swi.h
===================================================================
RCS file: /var/cvsroot/src-cvs/src/libgloss/arm/swi.h,v
retrieving revision 1.1
diff -u -p -r1.1 swi.h
--- libgloss/arm/swi.h	9 Jun 2004 19:06:50 -0000	1.1
+++ libgloss/arm/swi.h	7 Feb 2006 16:44:39 -0000
@@ -33,6 +33,14 @@
 #else
 #define AngelSWI 			AngelSWI_ARM
 #endif
+/* For Thumb-2 code use the BKPT instruction instead of SWI.  */
+#ifdef __thumb2__
+#define AngelSWIInsn			"bkpt"
+#define AngelSWIAsm			bkpt
+#else
+#define AngelSWIInsn			"swi"
+#define AngelSWIAsm			swi
+#endif
 
 /* The reason codes:  */
 #define AngelSWI_Reason_Open		0x01
Index: libgloss/arm/syscalls.c
===================================================================
RCS file: /var/cvsroot/src-cvs/src/libgloss/arm/syscalls.c,v
retrieving revision 1.8
diff -u -p -r1.8 syscalls.c
--- libgloss/arm/syscalls.c	30 Nov 2005 23:37:14 -0000	1.8
+++ libgloss/arm/syscalls.c	7 Feb 2006 16:34:58 -0000
@@ -99,7 +99,7 @@ static inline int
 do_AngelSWI (int reason, void * arg)
 {
   int value;
-  asm volatile ("mov r0, %1; mov r1, %2; swi %a3; mov %0, r0"
+  asm volatile ("mov r0, %1; mov r1, %2; " AngelSWIInsn " %a3; mov %0, r0"
        : "=r" (value) /* Outputs */
        : "r" (reason), "r" (arg), "i" (AngelSWI) /* Inputs */
        : "r0", "r1", "r2", "r3", "ip", "lr", "memory", "cc"
Index: libgloss/arm/trap.S
===================================================================
RCS file: /var/cvsroot/src-cvs/src/libgloss/arm/trap.S,v
retrieving revision 1.1
diff -u -p -r1.1 trap.S
--- libgloss/arm/trap.S	9 Jun 2004 19:06:50 -0000	1.1
+++ libgloss/arm/trap.S	3 Feb 2006 17:42:28 -0000
@@ -1,4 +1,5 @@
         /* Run-time exception support */
+#if !defined(__thumb2__)
 #include "swi.h"
 
 /* .text is used instead of .section .text so it works with arm-aout too.  */
@@ -91,3 +92,4 @@ __rt_stkovf_split_big:
         @ We now know how much extra stack the function requires.
         @ Terminate the program for the moment:
         swi     SWI_Exit
+#endif
Index: newlib/libc/machine/arm/setjmp.S
===================================================================
RCS file: /var/cvsroot/src-cvs/src/newlib/libc/machine/arm/setjmp.S,v
retrieving revision 1.1
diff -u -p -r1.1 setjmp.S
--- newlib/libc/machine/arm/setjmp.S	9 Jun 2004 19:05:09 -0000	1.1
+++ newlib/libc/machine/arm/setjmp.S	2 Feb 2006 16:52:52 -0000
@@ -51,17 +51,39 @@
    Function entry is much simpler.  If we are compiling for the Thumb we 
    just switch into ARM mode and then drop through into the rest of the
    function.  The function exit code will take care of the restore to
-   Thumb mode.  */
+   Thumb mode.
+   
+   For Thumb-2 do everything in Thumb mode.  */
 
 #ifdef __APCS_26__
 #define RET	movs		pc, lr
+#elif defined(__thumb2__)
+#define RET	bx lr
 #else
 #define RET	tst		lr, #1; \
 	        moveq		pc, lr ; \
 .word           0xe12fff1e	/* bx lr */
 #endif
 
-#ifdef __thumb__
+#ifdef __thumb2__
+.macro COND where when 
+	i\where	\when
+.endm
+#else
+.macro COND where when 
+.endm
+#endif
+
+#if defined(__thumb2__)
+.syntax unified
+.macro MODE
+	.thumb
+	.thumb_func
+.endm
+.macro PROLOGUE name
+.endm
+
+#elif defined(__thumb__)
 #define	MODE		.thumb_func
 .macro PROLOGUE name
 	.code 16
@@ -70,7 +92,7 @@
 	.code 32
 SYM (.arm_start_of.\name):
 .endm
-#else
+#else /* Arm */
 #define	MODE		.code 32
 .macro PROLOGUE name
 .endm
@@ -131,6 +153,9 @@ SYM (\name):
 	/* Put the return value into the integer result register.
 	   But if it is zero then return 1 instead.  */	
 	movs		a1, a2
+#ifdef __thumb2__
+	it		eq
+#endif
 	moveq		a1, #1
 
 	FUNC_END longjmp
Index: newlib/libc/sys/arm/crt0.S
===================================================================
RCS file: /var/cvsroot/src-cvs/src/newlib/libc/sys/arm/crt0.S,v
retrieving revision 1.11
diff -u -p -r1.11 crt0.S
--- newlib/libc/sys/arm/crt0.S	19 Jul 2005 15:14:16 -0000	1.11
+++ newlib/libc/sys/arm/crt0.S	7 Feb 2006 16:43:32 -0000
@@ -18,15 +18,26 @@
 
 /* .text is used instead of .section .text so it works with arm-aout too.  */
 	.text
+#if defined(__thumb2__)
+	.syntax unified
+	.thumb
+.macro FUNC_START name
+	.global	\name
+	.thumb_func
+\name:
+.endm	
+#else
 	.code 32
+.macro FUNC_START name
+	.global	\name
+\name:
+.endm	
+#endif
 	.align 	0
 
-	.global	_mainCRTStartup
-	.global	_start
-	.global	start
-start:
-_start:
-_mainCRTStartup:
+	FUNC_START	_mainCRTStartup
+	FUNC_START	_start
+	FUNC_START	start
 #if defined(__ELF__) && !defined(__USING_SJLJ_EXCEPTIONS__)
 	/* Annotation for EABI unwinding tables.  */
 	.fnstart
@@ -45,7 +56,12 @@ _mainCRTStartup:
 	/*  Issue Angel SWI to read stack info */
 	mov	r0, #AngelSWI_Reason_HeapInfo
 	adr	r1, .LC0	/*  point at ptr to 4 words to receive data */
-	swi	AngelSWI_ARM	/*  We are always in ARM mode for startup */
+#if defined(__thumb2__)
+	bkpt	AngelSWI
+#else
+	/*  We are always in ARM mode for startup */
+	AngelSWIAsm	AngelSWI_ARM
+#endif
 	ldr	r0, .LC0	/*  point at values read */
 	ldr	sp, [r0, #8]
 	ldr	sl, [r0, #12]
@@ -75,8 +91,8 @@ _mainCRTStartup:
 	sub	a3, a3, a1		/* Third arg: length of block */
 	
 
-#ifdef __thumb__		/* Enter Thumb mode.... */
-
+#if defined(__thumb__) && !defined(__thumb2__)
+	/* Enter Thumb mode.... */
 	add	a4, pc, #1	/* Get the address of the Thumb block */
 	bx	a4		/* Go there and start Thumb decoding  */
 
@@ -100,7 +116,7 @@ __change_mode:	
 #else
 	mov	r0, #AngelSWI_Reason_GetCmdLine
 	adr	r1, .LC30	/*  Space for command line */
-	swi	AngelSWI
+	AngelSWIAsm	AngelSWI
 	ldr	r1, .LC30
 #endif
 	/*  Parse string at r1 */
@@ -222,7 +238,7 @@ __change_mode:	
 
 	bl	FUNCTION (exit)		/* Should not return.  */
 
-#ifdef __thumb__
+#if defined(__thumb__) && !defined(__thumb2__)
 	/* Come out of Thumb mode.  This code should be redundant.  */
 
 	mov	a4, pc
Index: newlib/libc/sys/arm/libcfunc.c
===================================================================
RCS file: /var/cvsroot/src-cvs/src/newlib/libc/sys/arm/libcfunc.c,v
retrieving revision 1.1.1.1
diff -u -p -r1.1.1.1 libcfunc.c
--- newlib/libc/sys/arm/libcfunc.c	17 Feb 2000 19:39:49 -0000	1.1.1.1
+++ newlib/libc/sys/arm/libcfunc.c	7 Feb 2006 16:03:37 -0000
@@ -13,7 +13,7 @@ static inline int
 do_AngelSWI (int reason, void * arg)
 {
   int value;
-  asm volatile ("mov r0, %1; mov r1, %2; swi %a3; mov %0, r0"
+  asm volatile ("mov r0, %1; mov r1, %2; " AngelSWIInsn " %a3; mov %0, r0"
        : "=r" (value) /* Outputs */
        : "r" (reason), "r" (arg), "i" (AngelSWI) /* Inputs */
        : "r0", "r1", "lr"
Index: newlib/libc/sys/arm/swi.h
===================================================================
RCS file: /var/cvsroot/src-cvs/src/newlib/libc/sys/arm/swi.h,v
retrieving revision 1.2
diff -u -p -r1.2 swi.h
--- newlib/libc/sys/arm/swi.h	21 Jun 2002 06:55:37 -0000	1.2
+++ newlib/libc/sys/arm/swi.h	7 Feb 2006 16:46:54 -0000
@@ -33,6 +33,14 @@
 #else
 #define AngelSWI 			AngelSWI_ARM
 #endif
+/* For Thumb-2 code use the BKPT instruction instead of SWI.  */
+#ifdef __thumb2__
+#define AngelSWIInsn			"bkpt"
+#define AngelSWIAsm			bkpt
+#else
+#define AngelSWIInsn			"swi"
+#define AngelSWIAsm			swi
+#endif
 
 /* The reason codes:  */
 #define AngelSWI_Reason_Open		0x01
Index: newlib/libc/sys/arm/syscalls.c
===================================================================
RCS file: /var/cvsroot/src-cvs/src/newlib/libc/sys/arm/syscalls.c,v
retrieving revision 1.10
diff -u -p -r1.10 syscalls.c
--- newlib/libc/sys/arm/syscalls.c	8 Feb 2005 01:33:19 -0000	1.10
+++ newlib/libc/sys/arm/syscalls.c	7 Feb 2006 15:56:02 -0000
@@ -98,7 +98,7 @@ static inline int
 do_AngelSWI (int reason, void * arg)
 {
   int value;
-  asm volatile ("mov r0, %1; mov r1, %2; swi %a3; mov %0, r0"
+  asm volatile ("mov r0, %1; mov r1, %2; " AngelSWIInsn " %a3; mov %0, r0"
        : "=r" (value) /* Outputs */
        : "r" (reason), "r" (arg), "i" (AngelSWI) /* Inputs */
        : "r0", "r1", "r2", "r3", "ip", "lr", "memory", "cc"
Index: newlib/libc/sys/arm/trap.S
===================================================================
RCS file: /var/cvsroot/src-cvs/src/newlib/libc/sys/arm/trap.S,v
retrieving revision 1.1.1.1
diff -u -p -r1.1.1.1 trap.S
--- newlib/libc/sys/arm/trap.S	17 Feb 2000 19:39:49 -0000	1.1.1.1
+++ newlib/libc/sys/arm/trap.S	2 Feb 2006 15:31:27 -0000
@@ -1,4 +1,5 @@
         /* Run-time exception support */
+#if !defined(__thumb2__)
 #include "swi.h"
 
 /* .text is used instead of .section .text so it works with arm-aout too.  */
@@ -91,3 +92,4 @@ __rt_stkovf_split_big:
         @ We now know how much extra stack the function requires.
         @ Terminate the program for the moment:
         swi     SWI_Exit
+#endif

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]