Module Name:    src
Committed By:   matt
Date:           Tue Sep  3 00:30:20 UTC 2013

Modified Files:
        src/lib/libc/arch/arm: Makefile.inc
        src/lib/libc/arch/arm/gen: _setjmp.S setjmp.S sigsetjmp.S swapcontext.S
        src/lib/libc/arch/arm/sys: __clone.S __vfork14.S brk.S cerror.S
            getcontext.S ptrace.S sbrk.S

Log Message:
Use less got, add END(), make thumb tolerant.


To generate a diff of this commit:
cvs rdiff -u -r1.24 -r1.25 src/lib/libc/arch/arm/Makefile.inc
cvs rdiff -u -r1.12 -r1.13 src/lib/libc/arch/arm/gen/_setjmp.S
cvs rdiff -u -r1.14 -r1.15 src/lib/libc/arch/arm/gen/setjmp.S
cvs rdiff -u -r1.6 -r1.7 src/lib/libc/arch/arm/gen/sigsetjmp.S
cvs rdiff -u -r1.9 -r1.10 src/lib/libc/arch/arm/gen/swapcontext.S
cvs rdiff -u -r1.7 -r1.8 src/lib/libc/arch/arm/sys/__clone.S
cvs rdiff -u -r1.9 -r1.10 src/lib/libc/arch/arm/sys/__vfork14.S \
    src/lib/libc/arch/arm/sys/cerror.S src/lib/libc/arch/arm/sys/getcontext.S \
    src/lib/libc/arch/arm/sys/ptrace.S
cvs rdiff -u -r1.11 -r1.12 src/lib/libc/arch/arm/sys/brk.S
cvs rdiff -u -r1.10 -r1.11 src/lib/libc/arch/arm/sys/sbrk.S

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/lib/libc/arch/arm/Makefile.inc
diff -u src/lib/libc/arch/arm/Makefile.inc:1.24 src/lib/libc/arch/arm/Makefile.inc:1.25
--- src/lib/libc/arch/arm/Makefile.inc:1.24	Wed Aug 21 03:09:08 2013
+++ src/lib/libc/arch/arm/Makefile.inc	Tue Sep  3 00:30:19 2013
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile.inc,v 1.24 2013/08/21 03:09:08 matt Exp $
+# $NetBSD: Makefile.inc,v 1.25 2013/09/03 00:30:19 matt Exp $
 
 .include <bsd.own.mk>
 
@@ -24,6 +24,7 @@ CPPFLAGS += -DSOFTFLOAT
 # for earm, use the 64-bit softfloat
 .if ${LIBC_MACHINE_ARCH} == "arm" || ${LIBC_MACHINE_ARCH} == "armeb"
 SOFTFLOAT_BITS=32
+#SRCS+=	floatunsidf_ieee754.c floatunsisf_ieee754.c
 .endif
 
 .include <softfloat/Makefile.inc>

Index: src/lib/libc/arch/arm/gen/_setjmp.S
diff -u src/lib/libc/arch/arm/gen/_setjmp.S:1.12 src/lib/libc/arch/arm/gen/_setjmp.S:1.13
--- src/lib/libc/arch/arm/gen/_setjmp.S:1.12	Fri Apr 19 13:45:45 2013
+++ src/lib/libc/arch/arm/gen/_setjmp.S	Tue Sep  3 00:30:19 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: _setjmp.S,v 1.12 2013/04/19 13:45:45 matt Exp $	*/
+/*	$NetBSD: _setjmp.S,v 1.13 2013/09/03 00:30:19 matt Exp $	*/
 
 /*
  * Copyright (c) 1997 Mark Brinicombe
@@ -36,7 +36,7 @@
 #error FPA is not supported anymore
 #endif
 
-#ifdef __ARM_EABI__
+#if defined(__ARM_EABI__) && !defined(__ARM_PCS_VFP)
 	.fpu	vfp
 #endif
 
@@ -59,77 +59,135 @@
 ENTRY(_setjmp)
 	ldr	r1, .L_setjmp_magic
 
-#ifdef __ARM_EABI__
+#if defined(__ARM_EABI__) && (!defined(__thumb__) || defined(_ARM_ARCH_T2))
 	ldr	r2, .Lfpu_present
 #ifdef PIC
-	GOT_INIT(r3, .L_setjmp_got, .L_setjmp_gotinit)
-	ldr	r2, [r2, r3]
-#else
-	ldr	r2, [r2]
+	add	r2, r2, pc	/* pc = &.LPIC0 */
 #endif
-	teq	r2, #0		/* do we have a FPU? */
+	ldr	r2, [r2]
+.LPIC0:
+#if defined(__thumb__) && defined(_ARM_ARCH_T2)
+	cbz	r2, 1f
+#else
+	cmp	r2, #0		/* do we have a FPU? */
 	beq	1f		/*   no, don't save VFP registers */
+#endif
 
-	orr	r1, r1, #(_JB_MAGIC__SETJMP ^ _JB_MAGIC__SETJMP_VFP)
+	orrs	r1, r1, #(_JB_MAGIC__SETJMP ^ _JB_MAGIC__SETJMP_VFP)
 				/* change magic to VFP magic */
-	add	r2, r0, #(_JB_REG_D8 * 4)
+	adds	r2, r0, #(_JB_REG_D8 * 4)
 	vstmia	r2, {d8-d15}
 	vmrs	r2, fpscr
 	str	r2, [r0, #(_JB_REG_FPSCR * 4)]
 1:
-#endif /* __ARM_EABI__ */
+#endif /* __ARM_EABI__ && (_ARM_ARCH_T2 || !__thumb__) */
 
 	str	r1, [r0]
 
-	add	r0, r0, #(_JB_REG_R4 * 4)
+	adds	r0, r0, #(_JB_REG_R4 * 4)
 	/* Store integer registers */
+#if !defined(__thumb__) || defined(_ARCH_ARCH_T2)
         stmia	r0, {r4-r14}
+#else
+        stmia	r0!, {r4-r7}
+	mov	r1, r8
+	mov	r2, r9
+	mov	r3, r10
+	stmia	r0!, {r1-r3}
+	mov	r2, r11
+	mov	r3, r12
+	stmia	r0!, {r2-r3}
+	mov	r2, sp
+	mov	r3, lr
+	stmia	r0!, {r2-r3}
+#endif
 
-        mov	r0, #0x00000000
+        movs	r0, #0
         RET
 
-.L_setjmp_magic:
-	.word	_JB_MAGIC__SETJMP
-#ifdef __ARM_EABI__
-	GOT_INITSYM(.L_setjmp_got, .L_setjmp_gotinit)
+#if defined(__ARM_EABI__) && (!defined(__thumb__) || defined(_ARM_ARCH_T2))
+	.align	0
 .Lfpu_present:
-	.word	PIC_SYM(_libc_arm_fpu_present, GOTOFF)
-#endif /* __ARM_EABI__ */
+	.word	REL_SYM(_libc_arm_fpu_present, .LPIC0)
+#endif /* __ARM_EABI__ && (_ARM_ARCH_T2 || !__thumb__) */
+END(_setjmp)
 
 ENTRY(_longjmp)
 	ldr	r2, [r0]			/* get magic from jmp_buf */
-	bic	r3, r2, #(_JB_MAGIC__SETJMP ^ _JB_MAGIC__SETJMP_VFP)
+#if !defined(__thumb__) || defined(_ARM_ARCH_T2)
+	bics	r3, r2, #(_JB_MAGIC__SETJMP ^ _JB_MAGIC__SETJMP_VFP)
 						/* ignore VFP-ness of magic */
 	ldr	ip, .L_setjmp_magic		/* load magic */
-	teq	ip, r3				/* magic correct? */
+#else
+	ldr	r3, .L_setjmp_magic		/* load magic */
+	mov	ip, r3
+	movs	r3, #(_JB_MAGIC__SETJMP ^ _JB_MAGIC__SETJMP_VFP)
+	ands	r3, r3, r2
+	eors	r3, r3, r2			/* ignore VFP-ness of magic */
+#endif
+	cmp	ip, r3				/* magic correct? */
 	bne	botch				/*   no, botch */
 
-#ifdef __ARM_EABI__
-	teq	r3, r2				/* did magic change? */
+#if defined(__ARM_EABI__) && (!defined(__thumb__) || defined(_ARM_ARCH_T2))
+	cmp	r3, r2				/* did magic change? */
 	beq	1f				/*   no, don't restore VFP */
-	add	ip, r0, #(_JB_REG_D8 * 4)
-	vldmia	ip, {d8-d15}
-	ldr	ip, [r0, #(_JB_REG_FPSCR * 4)]
-	vmsr	fpscr, ip
-1:
-#endif /* __ARM_EABI__ */
+	adds	r3, r0, #(_JB_REG_D8 * 4)
+	vldmia	r3, {d8-d15}
+	ldr	r3, [r0, #(_JB_REG_FPSCR * 4)]
+	vmsr	fpscr, r3
+#endif /* __ARM_EABI__ && (_ARM_ARCH_T2 || !__thumb__) */
 
-	add	r0, r0, #(_JB_REG_R4 * 4)
+	adds	r0, r0, #(_JB_REG_R4 * 4)
        	/* Restore integer registers */
-        ldmia	r0, {r4-r14}
+#if !defined(__thumb__) || defined(_ARM_ARCH_T2)
+        ldmia	r0!, {r4-r12}
+#else
+	ldmia	r0!, {r4-r7}
+	ldmia	r0!, {r2-r3}
+	mov	r8, r2
+	mov	r9, r3
+	ldmia	r0!, {r2-r3}
+	mov	r10, r2
+	mov	r1, r3
+	adds	r0, r0, #4		/* skip r12 */
+#endif
+	ldmia	r0!, {r2-r3}		/* r2 = sp, r3 = lr */
 
 	/* Validate sp and r14 */
-	teq	sp, #0
-	teqne	r14, #0
+#if defined(__thumb__) && defined(_ARM_ARCH_T2)
+	cbz	r2, botch
+#else
+	cmp	r2, #0
 	beq	botch
+#endif
+	mov	sp, r2
+
+#if defined(__thumb__) && defined(_ARM_ARCH_T2)
+	cbz	r3, botch
+#else
+	cmp	r3, #0
+	beq	botch
+#endif
+	mov	lr, r3
 
 	/* Set return value */
 	movs	r0, r1
-	moveq	r0, #0x00000001
+#ifdef __thumb__
+	bne	1f
+	movs	r0, #1
+1:
+#else
+	moveq	r0, #1
+#endif
 	RET
 
 	/* validation failed, die die die. */
 botch:
 	bl	PIC_SYM(_C_LABEL(longjmperror), PLT)
 	bl	PIC_SYM(_C_LABEL(abort), PLT)
-	b	. - 8		/* Cannot get here */
+1:	b	1b		/* Cannot get here */
+
+	.align	0
+.L_setjmp_magic:
+	.word	_JB_MAGIC__SETJMP
+END(_longjmp)

Index: src/lib/libc/arch/arm/gen/setjmp.S
diff -u src/lib/libc/arch/arm/gen/setjmp.S:1.14 src/lib/libc/arch/arm/gen/setjmp.S:1.15
--- src/lib/libc/arch/arm/gen/setjmp.S:1.14	Fri Apr 19 13:45:45 2013
+++ src/lib/libc/arch/arm/gen/setjmp.S	Tue Sep  3 00:30:19 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: setjmp.S,v 1.14 2013/04/19 13:45:45 matt Exp $	*/
+/*	$NetBSD: setjmp.S,v 1.15 2013/09/03 00:30:19 matt Exp $	*/
 
 /*
  * Copyright (c) 1997 Mark Brinicombe
@@ -36,7 +36,7 @@
 #error FPA is not supported anymore
 #endif
 
-#ifdef __ARM_EABI__
+#if defined(__ARM_EABI__) && !defined(__ARM_PCS_VFP)
 	.fpu	vfp
 #endif
 
@@ -55,93 +55,174 @@
 
 ENTRY(__setjmp14)
 	/* Get the signal mask. */
-	stmfd	sp!, {r0-r2, r14}
-	add	r2, r0, #(_JB_SIGMASK * 4)
-	mov	r1, #0x00000000
-	mov	r0, #0x00000000
+	push	{r0-r2, lr}
+#if !defined(__thumb__)
+	adds	r2, r0, #(_JB_SIGMASK * 4)
+#else
+	mov	r2, r0
+	adds	r2, r2, #(_JB_SIGMASK * 4)
+#endif
+	movs	r1, #0
+	movs	r0, #0
 	bl	PIC_SYM(_C_LABEL(__sigprocmask14), PLT)
-	ldmfd	sp!, {r0-r2, r14}
+#if !defined(__thumb__) || defined(_ARM_ARCH_T2)
+	pop	{r0-r2, lr}
+#else
+	pop	{r0-r3}
+	mov	lr, r3
+#endif
 
 	ldr	r1, .Lsetjmp_magic
 
-#ifdef __ARM_EABI__
+#if defined(__ARM_EABI__) && (!defined(__thumb__) || defined(_ARM_ARCH_T2))
 	ldr	r2, .Lfpu_present
 #ifdef PIC
-	GOT_INIT(r3, .Lsetjmp_got, .Lsetjmp_gotinit)
-	ldr	r2, [r2, r3]
-#else
-	ldr	r2, [r2]
+	add	r2, r2, pc	/* pc = &.LPIC0 */
 #endif
-	teq	r2, #0		/* do we have a FPU? */
+	ldr	r2, [r2]
+.LPIC0:
+#if defined(__thumb__) && defined(_ARM_ARCH_T2)
+	cbz	r2, 1f		/* don't save if we don't have a FPU */
+#else
+	cmp	r2, #0		/* do we have a FPU? */
 	beq	1f		/*   no, don't save VFP registers */
+#endif
 
-	orr	r1, r1, #(_JB_MAGIC_SETJMP ^ _JB_MAGIC_SETJMP_VFP)
+	orrs	r1, r1, #(_JB_MAGIC_SETJMP ^ _JB_MAGIC_SETJMP_VFP)
 				/* change magic to VFP magic */
-	add	r2, r0, #(_JB_REG_D8 * 4)
+	adds	r2, r0, #(_JB_REG_D8 * 4)
 	vstmia	r2, {d8-d15}
 	vmrs	r2, fpscr
 	str	r2, [r0, #(_JB_REG_FPSCR * 4)]
 1:
-#endif /* __ARM_EABI__ */
+#endif /* __ARM_EABI__ && (!__thumb__ || _ARM_ARCH_T2) */
 
 	str	r1, [r0]		/* store magic */
 
 	/* Store integer registers */
-	add	r0, r0, #(_JB_REG_R4 * 4)
-        stmia	r0, {r4-r14}
-        mov	r0, #0x00000000
-        RET
+	adds	r0, r0, #(_JB_REG_R4 * 4)
+#if !defined(__thumb__)
+	stmia	r0!, {r4-lr}
+#else
+	stmia	r0!, {r4-r7}
+	mov	r2, r8
+	mov	r3, r9
+	stmia	r0!, {r2-r3}
+	mov	r2, r10
+	mov	r3, r11
+	stmia	r0!, {r2-r3}
+	mov	r2, sp
+	mov	r3, lr
+	str	r2, [r0, #4]
+	str	r3, [r0, #8]
+#endif
+	movs	r0, #0
+	RET
 
-.Lsetjmp_magic:
-	.word	_JB_MAGIC_SETJMP
-#ifdef __ARM_EABI__
-	GOT_INITSYM(.Lsetjmp_got, .Lsetjmp_gotinit)
+#if defined(__ARM_EABI__) && (!defined(__thumb__) || defined(_ARM_ARCH_T2))
+	.align	0
 .Lfpu_present:
-	.word	PIC_SYM(_libc_arm_fpu_present, GOTOFF)
-#endif /* __ARM_EABI__ */
+	.word	REL_SYM(_libc_arm_fpu_present, .LPIC0)
+#endif /* __ARM_EABI__ && (!__thumb__ || _ARM_ARCH_T2) */
+END(__setjmp14)
 
 ENTRY(__longjmp14)
+#if !defined(__thumb__) || defined(_ARM_ARCH_T2)
 	ldr	r2, [r0]
 	ldr	ip, .Lsetjmp_magic
 	bic	r3, r2, #(_JB_MAGIC_SETJMP ^ _JB_MAGIC_SETJMP_VFP)
-	teq	r3, ip
+#else
+	ldr	r3, .Lsetjmp_magic
+	mov	ip, r3
+	ldr	r3, [r0]
+	movs	r2, #(_JB_MAGIC_SETJMP ^ _JB_MAGIC_SETJMP_VFP)
+	bics	r3, r2 
+	/* r2 is not the magic but we don't need it since we can't do VFP */
+#endif
+	cmp	r3, ip
 	bne	.Lbotch
 
 	/* Restore the signal mask. */
-	stmfd	sp!, {r0-r2, r14}
-	mov	r2, #0x00000000
-	add	r1, r0, #(_JB_SIGMASK * 4)
-	mov	r0, #3				/* SIG_SETMASK */
+	push	{r0-r2, lr}
+	movs	r2, #0
+#if !defined(__thumb__)
+	adds	r1, r0, #(_JB_SIGMASK * 4)
+#else
+	mov	r1, r0
+	adds	r1, r1, #(_JB_SIGMASK * 4)
+#endif
+	movs	r0, #3				/* SIG_SETMASK */
 	bl	PIC_SYM(_C_LABEL(__sigprocmask14), PLT)
-	ldmfd	sp!, {r0-r2, r14}
+#if !defined(__thumb__) || defined(_ARM_ARCH_T2)
+	pop	{r0-r2, lr}
+#else
+	pop	{r0-r3}
+	mov	lr, r3
+#endif
 
-#ifdef __ARM_EABI__
+#if defined(__ARM_EABI__) && (!defined(__thumb__) || defined(_ARM_ARCH_T2))
 	tst	r2, #(_JB_MAGIC_SETJMP ^ _JB_MAGIC_SETJMP_VFP)
 						/* is this a VFP magic? */
 	beq	1f				/*   no, don't restore VFP */
-	add	ip, r0, #(_JB_REG_D8 * 4)
-	vldmia	ip, {d8-d15}
-	ldr	ip, [r0, #(_JB_REG_FPSCR * 4)]
-	vmsr	fpscr, ip
+	adds	r2, r0, #(_JB_REG_D8 * 4)
+	vldmia	r2, {d8-d15}
+	ldr	r2, [r0, #(_JB_REG_FPSCR * 4)]
+	vmsr	fpscr, r2
 1:
-#endif /* __ARM_EABI__ */
+#endif /* __ARM_EABI__ && (!__thumb__ || _ARM_ARCH_T2) */
 
-	add	r0, r0, #(_JB_REG_R4 * 4)
+	adds	r0, r0, #(_JB_REG_R4 * 4)
 	/* Restore integer registers */
-        ldmia	r0, {r4-r14}
+#if !defined(__thumb__) || defined(_ARM_ARCH_T2)
+	ldmia	r0!, {r4-r12}
+#else
+	ldmia	r0!, {r4-r7}
+	ldmia	r0!, {r2-r3}
+	mov	r8, r2
+	mov	r9, r3
+	ldmia	r0!, {r2-r3}
+	mov	r10, r2
+	mov	r11, r3
+	adds	r0, r0, #4	/* skip ip(r12) */
+#endif
+
+	ldmia	r0!, {r2-r3}
 
-	/* Validate sp and r14 */
-	teq	sp, #0
-	teqne	r14, #0
+	/* Validate sp and lr */
+#if defined(__thumb__) && defined(_ARM_ARCH_T2)
+	cbz	r2, .Lbotch
+#else
+	cmp	r2, #0
 	beq	.Lbotch
+#endif
+	mov	sp, r2
+
+#if defined(__thumb__) && defined(_ARM_ARCH_T2)
+	cbz	r3, .Lbotch
+#else
+	cmp	r3, #0
+	beq	.Lbotch
+#endif
+	mov	lr, r3
 
 	/* Set return value */
 	movs	r0, r1
-	moveq	r0, #0x00000001
+#if !defined(__thumb__)
+	moveq	r0, #1
+#else
+	bne	1f
+	movs	r0, #1
+1:
+#endif
 	RET
 
 	/* validation failed, die die die. */
 .Lbotch:
 	bl	PIC_SYM(_C_LABEL(longjmperror), PLT)
 	bl	PIC_SYM(_C_LABEL(abort), PLT)
-	b	. - 8		/* Cannot get here */
+1:	b	1b		/* Cannot get here */
+
+	.align	0
+.Lsetjmp_magic:
+	.word	_JB_MAGIC_SETJMP
+END(__longjmp14)

Index: src/lib/libc/arch/arm/gen/sigsetjmp.S
diff -u src/lib/libc/arch/arm/gen/sigsetjmp.S:1.6 src/lib/libc/arch/arm/gen/sigsetjmp.S:1.7
--- src/lib/libc/arch/arm/gen/sigsetjmp.S:1.6	Fri Apr 19 16:50:22 2013
+++ src/lib/libc/arch/arm/gen/sigsetjmp.S	Tue Sep  3 00:30:19 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: sigsetjmp.S,v 1.6 2013/04/19 16:50:22 matt Exp $	*/
+/*	$NetBSD: sigsetjmp.S,v 1.7 2013/09/03 00:30:19 matt Exp $	*/
 
 /*
  * Copyright (c) 1997 Mark Brinicombe
@@ -46,17 +46,50 @@
  */
 
 ENTRY(__sigsetjmp14)
-	teq	r1, #0
-	beq	PIC_SYM(_C_LABEL(_setjmp), PLT)
-	b	PIC_SYM(_C_LABEL(__setjmp14), PLT)
-
-.L_setjmp_magic:
-	.word	_JB_MAGIC__SETJMP
+#if defined(__thumb__) && defined(_ARM_ARCH_T2)
+	cbnz	r1, 1f
+	b	PLT_SYM(_C_LABEL(_setjmp))
+1:	b	PLT_SYM(_C_LABEL(__setjmp14))
+#elif !defined(__thumb__)
+	cmp	r1, #0
+	beq	PLT_SYM(_C_LABEL(_setjmp))
+	b	PLT_SYM(_C_LABEL(__setjmp14))
+#else
+	push	{r3, lr}
+	beq	1f
+	bl	PLT_SYM(_C_LABEL(__setjmp14))
+	b	2f
+1:	bl	PLT_SYM(_C_LABEL(_setjmp))
+2:	pop	{r3, pc}
+#endif
+END(__sigsetjmp14)
 
 ENTRY(__siglongjmp14)
-	ldr	r2, .L_setjmp_magic
 	ldr	r3, [r0]
-	bic	r3, r3, #(_JB_MAGIC_SETJMP ^ _JB_MAGIC_SETJMP_VFP)
-	teq	r2, r3
+#if !defined(__thumb__)
+	bics	r3, r3, #(_JB_MAGIC_SETJMP ^ _JB_MAGIC_SETJMP_VFP)
+#else
+	movs	r2, #(_JB_MAGIC_SETJMP ^ _JB_MAGIC_SETJMP_VFP)
+	bics	r3, r3, r2
+#endif
+	ldr	r2, .L_setjmp_magic
+	cmp	r2, r3
+#if !defined(__thumb__) || defined(_ARM_ARCH_T2)
+#ifdef __thumb__
+	it	eq
+#endif
 	beq	PIC_SYM(_C_LABEL(_longjmp), PLT)
 	b	PIC_SYM(_C_LABEL(__longjmp14), PLT)
+#else
+	push	{r3, lr}
+	beq	11f
+	bl	PIC_SYM(_C_LABEL(__longjmp14), PLT)
+	pop	{r3, pc}
+11:	bl	PIC_SYM(_C_LABEL(_longjmp), PLT)
+	pop	{r3, pc}
+#endif
+
+	.align	0
+.L_setjmp_magic:
+	.word	_JB_MAGIC__SETJMP
+END(__siglongjmp14)

Index: src/lib/libc/arch/arm/gen/swapcontext.S
diff -u src/lib/libc/arch/arm/gen/swapcontext.S:1.9 src/lib/libc/arch/arm/gen/swapcontext.S:1.10
--- src/lib/libc/arch/arm/gen/swapcontext.S:1.9	Wed Nov 28 02:18:24 2012
+++ src/lib/libc/arch/arm/gen/swapcontext.S	Tue Sep  3 00:30:19 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: swapcontext.S,v 1.9 2012/11/28 02:18:24 matt Exp $	*/
+/*	$NetBSD: swapcontext.S,v 1.10 2013/09/03 00:30:19 matt Exp $	*/
 
 /*-
  * Copyright (c) 2001 The NetBSD Foundation, Inc.
@@ -33,22 +33,53 @@
 #include "assym.h"
 
 #if defined(LIBC_SCCS) && !defined(lint)
-        RCSID("$NetBSD: swapcontext.S,v 1.9 2012/11/28 02:18:24 matt Exp $")
+        RCSID("$NetBSD: swapcontext.S,v 1.10 2013/09/03 00:30:19 matt Exp $")
 #endif /* LIBC_SCCS && !lint */
 
 ENTRY(swapcontext)
-	stmfd	sp!, {r0-r1, lr}	/* Must save oucp, ucp, lr. */
-	sub	sp, sp, #4
+	.fnstart
+	.cfi_startproc
+	push	{r0-r2, lr}	/* Must save oucp, ucp, lr. */
+	.save	{r0-r2, lr}
+	.cfi_def_cfa_offset 16
+	.cfi_offset 14, -4
+	.cfi_offset 2, -8
+	.cfi_offset 1, -12
+	.cfi_offset 0, -16
 	bl	PIC_SYM(_C_LABEL(_getcontext), PLT)  /* getcontext(oucp) */
 	cmp	r0, #0
-	add	sp, sp, #4
-	ldmfd	sp!, {r0-r1, lr}
+#if !defined(__thumb__)
+	pop	{r0-r2, lr}
+	.cfi_def_cfa_offset 0
 	RETc(ne)
+#else
+	pop	{r0-r3}
+	beq	1f
+	.cfi_def_cfa_offset 0
+	.cfi_register 14, 3
+	RETr(r3)
+1:
+#endif
+#if !defined(__thumb__)
 	str	sp, [r0, #_UC_REGS_SP]	/* Adjust saved SP. */
-	str	lr, [r0, #_UC_REGS_PC]	/* Adjust saved PC. */
+	str	lr, [r0, #_UC_REGS_PC]	/* Adjust saved SP. */
+#else
+	mov	r2, sp
+	str	r2, [r0, #_UC_REGS_SP]	/* Adjust saved SP. */
+	str	r3, [r0, #_UC_REGS_PC]	/* Adjust saved PC. */
+	mov	lr, r3
+#endif
 #ifdef SOFTFLOAT
 	/* Ahem. */
 #endif
 	mov	r0, r1
+#if !defined(__thumb__) || defined(_ARM_ARCH_T2)
+	b	PIC_SYM(_C_LABEL(setcontext), PLT)
+#else
+	push	{lr}
 	bl	PIC_SYM(_C_LABEL(setcontext), PLT)
-	RET
+	pop	{pc}
+#endif
+	.cfi_endproc
+	.fnend
+END(swapcontext)

Index: src/lib/libc/arch/arm/sys/__clone.S
diff -u src/lib/libc/arch/arm/sys/__clone.S:1.7 src/lib/libc/arch/arm/sys/__clone.S:1.8
--- src/lib/libc/arch/arm/sys/__clone.S:1.7	Thu Aug  1 05:54:24 2013
+++ src/lib/libc/arch/arm/sys/__clone.S	Tue Sep  3 00:30:19 2013
@@ -1,4 +1,4 @@
-/* $NetBSD: __clone.S,v 1.7 2013/08/01 05:54:24 matt Exp $ */
+/* $NetBSD: __clone.S,v 1.8 2013/09/03 00:30:19 matt Exp $ */
 
 /*
  * Copyright (c) 2001 Christopher Gilbert
@@ -26,9 +26,8 @@
  * SUCH DAMAGE.
  */
 
-#include <machine/asm.h>
-#include <sys/errno.h>
 #include "SYS.h"
+#include <sys/errno.h>
 
 #ifdef WEAK_ALIAS
 WEAK_ALIAS(clone, __clone)
@@ -40,54 +39,90 @@ WEAK_ALIAS(clone, __clone)
 ENTRY(__clone)
 
 	/* test stack and function are not null */
-	teq	r0, #0x00
-	teqne	r1, #0x00
+#if defined(__thumb__) && defined(_ARM_ARCH_T2)
+	cbz	r0, .Leinval
+	cbz	r1, .Leinval
+#elif !defined(__thumb__)
+	cmp	r0, #0x00
+	cmpne	r1, #0x00
+	beq	.Leinval
+#else
+	cmp	r0, #0x00
+	beq	.Leinval
+	cmp	r1, #0x00
 	beq	.Leinval
+#endif
 
 	/* place the func and its arg onto the child's stack */
+#if !defined(__thumb__) || defined(_ARM_ARCH_T2)
 	stmfd	r1!, {r0, r3} 
+#else
+	subs	r1, r1, #8
+	stmia	r1!, {r0, r3} 
+#endif
 	
 	/* syscall expects (flags, stack) */
 	mov	r0, r2
 
 	SYSTRAP(__clone)
-	bcs	CERROR
+#if !defined(__thumb__) || defined(_ARM_ARCH_T2)
+	_INVOKE_CERROR()
+#else
+	bcs	.Lcerror
+#endif
 
 	/*
 	 * r1 and r0 are the same as from fork:
 	 * r1 == 0 in parent process, r1 == 1 in child process.
 	 * r0 == pid of child in parent, r0 == pid of parent in child.
 	 */
-	teq	r1, #0x00
-
 	/* if this is the parent then just return the pid */
+#if defined(__thumb__)
+#if defined(_ARM_ARCH_T2)
+	cbz	r1, 1f
+#else
+	cmp	r1, #0x00
+	bne	1f
+#endif
+	RET
+1:
+#else
+	cmp	r1, #0x00
 	RETc(eq)
+#endif
+
 	/*
 	 * This is the child
 	 * load the function and arg off the stack
 	 */
-	ldmfd	sp!, {r1, r2}
-
-	/* setup return address */
-	add	lr, pc, #.Lreturnhere - . - 8
+	pop	{r1, r2}
 
 	/* place arg in r0 */
 	mov	r0, r2
 
 	/* call the function */
-#ifdef _ARM_ARCH_4T
-	bx	r1
+#ifdef _ARM_ARCH_5T
+	blx	r1
 #else
-	mov	pc, r1
+	/* setup return address */
+	mov	lr, pc
+	RETr(r1)
 #endif
-
-.Lreturnhere:
 	/* call _exit with the returned value */
-	b	PIC_SYM(_C_LABEL(_exit), PLT)
+	bl	PIC_SYM(_C_LABEL(_exit), PLT)
 
 	/* NOTREACHED */
 
 	/* error handler if func or stack is NULL */
+	.align	0
 .Leinval:
-	mov	R0, #EINVAL
+	movs	r0, #EINVAL
+#if !defined(__thumb__) || defined(_ARM_ARCH_T2)
 	b	CERROR
+#else
+.Lcerror:
+	push	{lr}
+	bl	CERROR
+	pop	{pc}
+#endif
+END(__clone)

Index: src/lib/libc/arch/arm/sys/__vfork14.S
diff -u src/lib/libc/arch/arm/sys/__vfork14.S:1.9 src/lib/libc/arch/arm/sys/__vfork14.S:1.10
--- src/lib/libc/arch/arm/sys/__vfork14.S:1.9	Fri Aug 16 22:27:32 2013
+++ src/lib/libc/arch/arm/sys/__vfork14.S	Tue Sep  3 00:30:19 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: __vfork14.S,v 1.9 2013/08/16 22:27:32 matt Exp $	*/
+/*	$NetBSD: __vfork14.S,v 1.10 2013/09/03 00:30:19 matt Exp $	*/
 
 /*-
  * Copyright (c) 1990 The Regents of the University of California.
@@ -40,9 +40,6 @@
  * r1 == 0 in parent process, r1 == 1 in child process.
  * r0 == pid of child in parent, r0 == pid of parent in child.
  */
-	.text
-	.align	0
-
 ENTRY(__vfork14)
 	mov	r2, lr
 	SYSTRAP(__vfork14)
Index: src/lib/libc/arch/arm/sys/cerror.S
diff -u src/lib/libc/arch/arm/sys/cerror.S:1.9 src/lib/libc/arch/arm/sys/cerror.S:1.10
--- src/lib/libc/arch/arm/sys/cerror.S:1.9	Thu Aug  1 05:54:24 2013
+++ src/lib/libc/arch/arm/sys/cerror.S	Tue Sep  3 00:30:19 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: cerror.S,v 1.9 2013/08/01 05:54:24 matt Exp $	*/
+/*	$NetBSD: cerror.S,v 1.10 2013/09/03 00:30:19 matt Exp $	*/
 
 /*-
  * Copyright (c) 1990 The Regents of the University of California.
@@ -33,39 +33,70 @@
 
 #include "SYS.h"
 
-ASENTRY(CERROR)
+ENTRY_NP(CERROR)
 #ifdef _REENTRANT
-	stmfd	sp!, {r4, lr}
+#ifdef __ARM_EABI__
+	.fnstart
+	.cfi_startproc
+#endif
+	push	{r4, lr}
+#ifdef __ARM_EABI__
+	.save	{r4, lr}
+	.cfi_def_cfa_offset 8
+	.cfi_offset 14, -4
+	.cfi_offset 4, -8
+#endif
 	mov	r4, r0
 	bl	PIC_SYM(_C_LABEL(__errno), PLT)
 	str	r4, [r0]
-	mvn	r0, #0x00000000
-	mvn	r1, #0x00000000
-	ldmfd	sp!, {r4, pc}
+#ifdef __thumb__
+	movs	r0, #0
+	mvns	r0, r0
 #else
+	mvn	r0, #0
+#endif
+	mov	r1, r0
+	pop	{r4, pc}
+#ifdef __ARM_EABI__
+	.cfi_endproc
+	.fnend
+#endif
+#else /* !_REENTRANT */
+#ifdef __ARM_EABI__
+	.fnstart
+	.cfi_startproc
+#endif
 #ifdef PIC
 	/* Setup the GOT */
 	ldr	r3, .Lgot
-	add	r3, pc, r3
-.L1:
+	add	r3, r3, pc	/* pc = &.LPIC0 */
 	ldr	r1, .Lerrno
-	ldr	r1, [r3, r1]
+.LPIC0:	ldr	r1, [r3, r1]
 #else
 	ldr	r1, .Lerrno
 #endif /* PIC */
 	str	r0, [r1]
-	mvn	r0, #0x00000000
-	mvn	r1, #0x00000000
+#ifdef __thumb__
+	movs	r0, #0
+	mvns	r0, r0
+#else
+	mvn	r0, #0
+#endif /* __thumb__ */
+	mov	r1, r0
 	RET
+#ifdef __ARM_EABI__
+	.cfi_endproc
+	.fnend
+#endif
 
 #ifdef PIC
 	.align	0
 .Lgot:
-	.word	_C_LABEL(_GLOBAL_OFFSET_TABLE_) + (. - (.L1+4))
+	.word	_C_LABEL(_GLOBAL_OFFSET_TABLE_) - .LPIC0
 #endif /* PIC */
-
 	.globl	_C_LABEL(errno)
 
 .Lerrno:
 	.word	PIC_SYM(_C_LABEL(errno), GOT)
 #endif /* _REENTRANT */
+END(CERROR)
Index: src/lib/libc/arch/arm/sys/getcontext.S
diff -u src/lib/libc/arch/arm/sys/getcontext.S:1.9 src/lib/libc/arch/arm/sys/getcontext.S:1.10
--- src/lib/libc/arch/arm/sys/getcontext.S:1.9	Thu Aug  1 05:54:24 2013
+++ src/lib/libc/arch/arm/sys/getcontext.S	Tue Sep  3 00:30:19 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: getcontext.S,v 1.9 2013/08/01 05:54:24 matt Exp $	*/
+/*	$NetBSD: getcontext.S,v 1.10 2013/09/03 00:30:19 matt Exp $	*/
 
 /*-
  * Copyright (c) 2001 The NetBSD Foundation, Inc.
@@ -33,7 +33,7 @@
 #include "assym.h"
 
 #if defined(SYSLIBC_SCCS) && !defined(lint)
-	RCSID("$NetBSD: getcontext.S,v 1.9 2013/08/01 05:54:24 matt Exp $")
+	RCSID("$NetBSD: getcontext.S,v 1.10 2013/09/03 00:30:19 matt Exp $")
 #endif /* SYSLIBC_SCCS && !lint */
 
 #ifdef WEAK_ALIAS
@@ -43,13 +43,19 @@ WEAK_ALIAS(getcontext, _getcontext)
 ENTRY(_getcontext)
 	mov	r2, r0			/* Must save argument pointer. */
 	SYSTRAP (getcontext)
-	bcs	CERROR
+	_INVOKE_CERROR()
+#if !defined(__thumb__) || defined(_ARM_ARCH_T2)
 	str	lr, [r2, #_UC_REGS_PC]	/* Adjust PC. */
+#else
+	mov	r3, lr
+	str	r3, [r2, #_UC_REGS_PC]	/* Adjust PC. */
+#endif
 #ifdef SOFTFLOAT
 	/* Ahem. */
 	/* Judging from the softfloat code we should at least save
 	   the exception codes and rounding mode here. */
 #endif
-	mov	r0, #0
+	movs	r0, #0
 	str	r0, [r2, #_UC_REGS_R0]	/* Return 0. */
 	RET
+END(_getcontext)
Index: src/lib/libc/arch/arm/sys/ptrace.S
diff -u src/lib/libc/arch/arm/sys/ptrace.S:1.9 src/lib/libc/arch/arm/sys/ptrace.S:1.10
--- src/lib/libc/arch/arm/sys/ptrace.S:1.9	Thu Aug  1 05:54:24 2013
+++ src/lib/libc/arch/arm/sys/ptrace.S	Tue Sep  3 00:30:19 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: ptrace.S,v 1.9 2013/08/01 05:54:24 matt Exp $ */
+/*	$NetBSD: ptrace.S,v 1.10 2013/09/03 00:30:19 matt Exp $ */
 
 /*-
  * Copyright (c) 1990 The Regents of the University of California.
@@ -35,41 +35,52 @@
 
 ENTRY(ptrace)
 #ifdef _REENTRANT
-	stmfd	sp!, {r0-r3, lr}
+#if !defined(__thumb__) || defined(_ARM_ARCH_T2)
+	push	{r0-r3, lr}
+#else
+	push	{r0-r4}
+	mov	r4, lr
+#endif
 	sub	sp, sp, #4	/* align stack */
 	bl	PIC_SYM(_C_LABEL(__errno), PLT)
 	add	sp, sp, #4	/* unalign stack */
-	mov	r1, #0x00000000
+	movs	r1, #0
 	str	r1, [r0]
-	ldmfd	sp!, {r0-r3, lr}
+#if !defined(__thumb__) || defined(_ARM_ARCH_T2)
+	pop	{r0-r3, lr}
+#else
+	mov	lr, r4
+	pop	{r0-r4}
+#endif
 #else
-	stmfd	sp!, {r0, r1}
+	push	{r0, r1}
 #ifdef PIC
 	/* Setup the GOT */
 	ldr	r0, .Lgot
-	add	r0, pc, r0
-.L1:
+	adr	r1, .Lgot
+	add	r0, r0, r1
 	ldr	r1, .Lerrno
 	ldr	r1, [r0, r1]
 #else
 	ldr	r1, .Lerrno
 #endif /* PIC */
-	mov	r0, #0x00000000
+	movs	r0, #0
 	str	r0, [r1]
-	ldmfd	sp!, {r0, r1}
+	pop	{r0, r1}
 #endif /* _REENTRANT */
 
 	SYSTRAP(ptrace)
-	bcs	CERROR
+	_INVOKE_CERROR()
 	RET
 
 #ifndef _REENTRANT
 #ifdef PIC
 	.align	0
 .Lgot:
-	.word	_C_LABEL(_GLOBAL_OFFSET_TABLE_) + (. - (.L1+4))
+	.word	_C_LABEL(_GLOBAL_OFFSET_TABLE_) - .Lgot
 #endif /* PIC */
 
 .Lerrno:
 	.word	PIC_SYM(_C_LABEL(errno), GOT)
 #endif /* !_REENTRANT */
+END(ptrace)

Index: src/lib/libc/arch/arm/sys/brk.S
diff -u src/lib/libc/arch/arm/sys/brk.S:1.11 src/lib/libc/arch/arm/sys/brk.S:1.12
--- src/lib/libc/arch/arm/sys/brk.S:1.11	Thu Aug  1 05:54:24 2013
+++ src/lib/libc/arch/arm/sys/brk.S	Tue Sep  3 00:30:19 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: brk.S,v 1.11 2013/08/01 05:54:24 matt Exp $	*/
+/*	$NetBSD: brk.S,v 1.12 2013/09/03 00:30:19 matt Exp $	*/
 
 /*-
  * Copyright (c) 1990 The Regents of the University of California.
@@ -52,15 +52,10 @@ _C_LABEL(__minbrk):
  * Change the data segment size
  */
 ENTRY(_brk)
-#ifdef PIC
-	/* Setup the GOT */
-	ldr	r3, .Lgot
-	add	r3, pc, r3
-.L1:
-	ldr	r1, .Lminbrk
-	add	r1, r3, r1
-#else
 	ldr	r1, .Lminbrk
+#ifdef PIC
+	adr	r3, .Lminbrk
+	adds	r1, r1, r3
 #endif
 	/* Get the minimum allowable brk address */
 	ldr	r1, [r1]
@@ -70,30 +65,31 @@ ENTRY(_brk)
 	 * if the address is below minbrk.
 	 */
 	cmp	r0, r1
+#ifdef __thumb__
+	bcs	1f
+	mov	r0, r1
+1:
+#else
 	movcc	r0, r1
+#endif
 	mov	r2, r0
 	SYSTRAP(break)
-	bcs	CERROR
+	_INVOKE_CERROR()
 
-#ifdef PIC
-	ldr	r1, .Lcurbrk
-	add	r1, r3, r1
-#else
 	ldr	r1, .Lcurbrk
+#ifdef PIC
+	adds	r1, r1, r3
 #endif
 	/* Store the new address in curbrk */
 	str	r2, [r1]
 
 	/* Return 0 for success */
-	mov	r0, #0x00000000
+	movs	r0, #0
 	RET
 
-	.align	2
-#ifdef PIC
-.Lgot:
-	.word	_C_LABEL(_GLOBAL_OFFSET_TABLE_) + (. - (.L1+4))
-#endif
+	.align	0
 .Lminbrk:
-	.word	PIC_SYM(_C_LABEL(__minbrk), GOTOFF)
+	.word	REL_SYM(_C_LABEL(__minbrk), .Lminbrk)
 .Lcurbrk:
-	.word	PIC_SYM(_C_LABEL(__curbrk), GOTOFF)
+	.word	REL_SYM(_C_LABEL(__curbrk), .Lminbrk)
+END(_brk)

Index: src/lib/libc/arch/arm/sys/sbrk.S
diff -u src/lib/libc/arch/arm/sys/sbrk.S:1.10 src/lib/libc/arch/arm/sys/sbrk.S:1.11
--- src/lib/libc/arch/arm/sys/sbrk.S:1.10	Thu Aug  1 05:32:33 2013
+++ src/lib/libc/arch/arm/sys/sbrk.S	Tue Sep  3 00:30:19 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: sbrk.S,v 1.10 2013/08/01 05:32:33 matt Exp $	*/
+/*	$NetBSD: sbrk.S,v 1.11 2013/09/03 00:30:19 matt Exp $	*/
 
 /*-
  * Copyright (c) 1990 The Regents of the University of California.
@@ -51,25 +51,24 @@ _C_LABEL(__curbrk):
  * Change the data segment size
  */
 ENTRY(_sbrk)
-	/* get address or PC offset to __curbrk */
+	/* get address or offset to __curbrk */
 	ldr	r2, .Lcurbrk
 #ifdef PIC
-	add	r2, pc, r2
-.L1:
+	add	r2, r2, pc	/* pc = &.LPIC0 */
 #endif
 
 	/* Get the current brk address */
 	ldr	r1, [r2]
 
 	/* Calculate new value */
-	mov	r3, r0
-	add	r0, r0, r1
+.LPIC0:	mov	r3, r0
+	adds	r0, r0, r1
 	SYSTRAP(break)
-	bcs	CERROR
+	_INVOKE_CERROR()
 
 	/* Store new curbrk value */
 	ldr	r0, [r2]
-	add	r1, r0, r3
+	adds	r1, r0, r3
 	str	r1, [r2]
 
 	/* Return old curbrk value */
@@ -77,8 +76,5 @@ ENTRY(_sbrk)
 
 	.align	0
 .Lcurbrk:
-#ifdef PIC
-	.word	_C_LABEL(__curbrk) - (.L1+4)
-#else
-	.word	_C_LABEL(__curbrk)
-#endif
+	.word	REL_SYM(_C_LABEL(__curbrk), .LPIC0)
+END(_sbrk)

Reply via email to