svn commit: r320470 - head/lib/libc/arm/gen

Andrew Turner andrew at FreeBSD.org
Thu Jun 29 14:00:06 UTC 2017


Author: andrew
Date: Thu Jun 29 14:00:05 2017
New Revision: 320470
URL: https://svnweb.freebsd.org/changeset/base/320470

Log:
  Start to remove _libc_arm_fpu_present checks. We don't support the VFP on
  ARMv4 or ARMv5, and only support it when it's present on ARMv6 and later.
  As such always store the VFP register in setjmp and restore them in
  longjmp when building for armv6.
  
  Reviewed by:	mmel
  Sponsored by:	DARPA, AFRL
  Differential Revision:	https://reviews.freebsd.org/D11393

Modified:
  head/lib/libc/arm/gen/_setjmp.S
  head/lib/libc/arm/gen/setjmp.S

Modified: head/lib/libc/arm/gen/_setjmp.S
==============================================================================
--- head/lib/libc/arm/gen/_setjmp.S	Thu Jun 29 12:49:03 2017	(r320469)
+++ head/lib/libc/arm/gen/_setjmp.S	Thu Jun 29 14:00:05 2017	(r320470)
@@ -61,25 +61,12 @@ __FBSDID("$FreeBSD$");
 ENTRY(_setjmp)
 	ldr	r1, .L_setjmp_magic
 
-#if !defined(_STANDALONE)
-	ldr	r2, .Lfpu_present
-#ifdef PIC
-	GOT_INIT(r3, .L_setjmp_got, .L_setjmp_gotinit)
-	ldr	r2, [r2, r3]
-#else
-	ldr	r2, [r2]
-#endif
-	teq	r2, #0		/* do we have a FPU? */
-	beq	1f		/*   no, don't save VFP registers */
-
-	orr	r1, r1, #(_JB_MAGIC__SETJMP ^ _JB_MAGIC__SETJMP_VFP)
-				/* change magic to VFP magic */
+#if !defined(_STANDALONE) && __ARM_ARCH >= 6
 	add	r2, r0, #(_JB_REG_D8 * 4)
 	vstmia	r2, {d8-d15}
 	vmrs	r2, fpscr
 	str	r2, [r0, #(_JB_REG_FPSCR * 4)]
-1:
-#endif /* !_STANDALONE */
+#endif /* !_STANDALONE && __ARM_ARCH >= 6 */
 
 	str	r1, [r0]
 
@@ -99,30 +86,20 @@ END(_setjmp)
 
 .L_setjmp_magic:
 	.word	_JB_MAGIC__SETJMP
-#if !defined(_STANDALONE)
-	GOT_INITSYM(.L_setjmp_got, .L_setjmp_gotinit)
-.Lfpu_present:
-	.word	PIC_SYM(_libc_arm_fpu_present, GOTOFF)
-#endif /* !_STANDALONE */
 
 WEAK_ALIAS(___longjmp, _longjmp)
 ENTRY(_longjmp)
 	ldr	r2, [r0]			/* get magic from jmp_buf */
-	bic	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? */
+	teq	ip, r2				/* magic correct? */
 	bne	botch				/*   no, botch */
 
-#if !defined(_STANDALONE)
-	teq	r3, r2				/* did magic change? */
-	beq	1f				/*   no, don't restore VFP */
+#if !defined(_STANDALONE) && __ARM_ARCH >= 6
 	add	ip, r0, #(_JB_REG_D8 * 4)
 	vldmia	ip, {d8-d15}
 	ldr	ip, [r0, #(_JB_REG_FPSCR * 4)]
 	vmsr	fpscr, ip
-1:
-#endif /* !_STANDALONE */
+#endif /* !_STANDALONE && __ARM_ARCH >= 6 */
 
 	add	r0, r0, #(_JB_REG_R4 * 4)
        	/* Restore integer registers */

Modified: head/lib/libc/arm/gen/setjmp.S
==============================================================================
--- head/lib/libc/arm/gen/setjmp.S	Thu Jun 29 12:49:03 2017	(r320469)
+++ head/lib/libc/arm/gen/setjmp.S	Thu Jun 29 14:00:05 2017	(r320470)
@@ -64,23 +64,12 @@ ENTRY(setjmp)
 
 	ldr	r1, .Lsetjmp_magic
 
-	ldr	r2, .Lfpu_present
-#ifdef PIC
-	GOT_INIT(r3, .Lsetjmp_got, .Lsetjmp_gotinit)
-	ldr	r2, [r2, r3]
-#else
-	ldr	r2, [r2]
-#endif
-	teq	r2, #0		/* do we have a FPU? */
-	beq	1f		/*   no, don't save VFP registers */
-
-	orr	r1, r1, #(_JB_MAGIC_SETJMP ^ _JB_MAGIC_SETJMP_VFP)
-				/* change magic to VFP magic */
+#if __ARM_ARCH >= 6
 	add	r2, r0, #(_JB_REG_D8 * 4)
 	vstmia	r2, {d8-d15}
 	vmrs	r2, fpscr
 	str	r2, [r0, #(_JB_REG_FPSCR * 4)]
-1:
+#endif
 
 	str	r1, [r0]		/* store magic */
 
@@ -98,9 +87,6 @@ ENTRY(setjmp)
 
 .Lsetjmp_magic:
 	.word	_JB_MAGIC_SETJMP
-	GOT_INITSYM(.Lsetjmp_got, .Lsetjmp_gotinit)
-.Lfpu_present:
-	.word	PIC_SYM(_libc_arm_fpu_present, GOTOFF)
 END(setjmp)
 
 .weak _C_LABEL(longjmp)
@@ -108,8 +94,7 @@ END(setjmp)
 ENTRY(__longjmp)
 	ldr	r2, [r0]
 	ldr	ip, .Lsetjmp_magic
-	bic	r3, r2, #(_JB_MAGIC_SETJMP ^ _JB_MAGIC_SETJMP_VFP)
-	teq	r3, ip
+	teq	r2, ip
 	bne	.Lbotch
 
 	/* Restore the signal mask. */
@@ -120,14 +105,12 @@ ENTRY(__longjmp)
 	bl	PIC_SYM(_C_LABEL(sigprocmask), PLT)
 	ldmfd	sp!, {r0-r2, r14}
 
-	tst	r2, #(_JB_MAGIC_SETJMP ^ _JB_MAGIC_SETJMP_VFP)
-						/* is this a VFP magic? */
-	beq	1f				/*   no, don't restore VFP */
+#if __ARM_ARCH >= 6
 	add	ip, r0, #(_JB_REG_D8 * 4)
 	vldmia	ip, {d8-d15}
 	ldr	ip, [r0, #(_JB_REG_FPSCR * 4)]
 	vmsr	fpscr, ip
-1:
+#endif
 
 	add	r0, r0, #(_JB_REG_R4 * 4)
 	/* Restore integer registers */


More information about the svn-src-all mailing list