Module Name: src Committed By: martin Date: Sun Aug 8 10:22:04 UTC 2021
Modified Files: src/lib/libc/arch/arm/gen [netbsd-9]: swapcontext.S src/lib/libc/arch/arm/sys [netbsd-9]: __clone.S src/sys/external/bsd/compiler_rt/dist/lib/builtins/arm [netbsd-9]: aeabi_cfcmp.S divmodsi4.S divsi3.S modsi3.S Log Message: Pull up following revision(s) (requested by skrll in ticket #1329): lib/libc/arch/arm/gen/swapcontext.S: revision 1.18 sys/external/bsd/compiler_rt/dist/lib/builtins/arm/divsi3.S: revision 1.2 sys/external/bsd/compiler_rt/dist/lib/builtins/arm/divsi3.S: revision 1.3 sys/external/bsd/compiler_rt/dist/lib/builtins/arm/aeabi_cfcmp.S: revision 1.2 sys/external/bsd/compiler_rt/dist/lib/builtins/arm/aeabi_cfcmp.S: revision 1.3 lib/libc/arch/arm/sys/__clone.S: revision 1.10 lib/libc/arch/arm/sys/__clone.S: revision 1.11 sys/external/bsd/compiler_rt/dist/lib/builtins/arm/modsi3.S: revision 1.2 lib/libc/arch/arm/sys/__clone.S: revision 1.12 sys/external/bsd/compiler_rt/dist/lib/builtins/arm/modsi3.S: revision 1.3 lib/libc/arch/arm/sys/__clone.S: revision 1.13 lib/libc/arch/arm/sys/__clone.S: revision 1.14 sys/external/bsd/compiler_rt/dist/lib/builtins/arm/divmodsi4.S: revision 1.2 sys/external/bsd/compiler_rt/dist/lib/builtins/arm/divmodsi4.S: revision 1.3 lib/libc/arch/arm/gen/swapcontext.S: revision 1.16 lib/libc/arch/arm/gen/swapcontext.S: revision 1.17 Align sp to 8-byte boundary as required by EABI. This is especially important for non-leaf functions; GCC optimizes codes based on assumption that sp is aligned properly. Mostly fix broken earmv5 userland compiled by GCC10 due to alignment faults in ld.elf_so, where {ld,st}rd are used for [sp, #8x]. No regression for ATF is observed for earmv[67]{,hf}{,eb}. Align sp to 8-byte boundary as required by EABI. IIUC, this change only affects libc compiled for ``Thumb-mode userland'', which we've not officially supported yet. Fix previous. For Thumb-1: - sp cannot be manipulated directly - {add,sub}s should be used instead of {add,sub} Trailing whitespace The _INVOKE_CERROR macro deals with thumb so simplify the code (at the expense of a couple more instructions). Do previous differently by pushing even number of registers and remove strange r7 usage. Do previous differtly by pushing two registers in the same way as the _INVOKE_CERROR macro To generate a diff of this commit: cvs rdiff -u -r1.15 -r1.15.2.1 src/lib/libc/arch/arm/gen/swapcontext.S cvs rdiff -u -r1.9 -r1.9.28.1 src/lib/libc/arch/arm/sys/__clone.S cvs rdiff -u -r1.1.1.1 -r1.1.1.1.26.1 \ src/sys/external/bsd/compiler_rt/dist/lib/builtins/arm/aeabi_cfcmp.S cvs rdiff -u -r1.1.1.4 -r1.1.1.4.22.1 \ src/sys/external/bsd/compiler_rt/dist/lib/builtins/arm/divmodsi4.S \ src/sys/external/bsd/compiler_rt/dist/lib/builtins/arm/divsi3.S \ src/sys/external/bsd/compiler_rt/dist/lib/builtins/arm/modsi3.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/gen/swapcontext.S diff -u src/lib/libc/arch/arm/gen/swapcontext.S:1.15 src/lib/libc/arch/arm/gen/swapcontext.S:1.15.2.1 --- src/lib/libc/arch/arm/gen/swapcontext.S:1.15 Wed Nov 21 21:01:41 2018 +++ src/lib/libc/arch/arm/gen/swapcontext.S Sun Aug 8 10:22:04 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: swapcontext.S,v 1.15 2018/11/21 21:01:41 skrll Exp $ */ +/* $NetBSD: swapcontext.S,v 1.15.2.1 2021/08/08 10:22:04 martin Exp $ */ /*- * Copyright (c) 2001 The NetBSD Foundation, Inc. @@ -33,7 +33,7 @@ #include "assym.h" #if defined(LIBC_SCCS) && !defined(lint) - RCSID("$NetBSD: swapcontext.S,v 1.15 2018/11/21 21:01:41 skrll Exp $") + RCSID("$NetBSD: swapcontext.S,v 1.15.2.1 2021/08/08 10:22:04 martin Exp $") #endif /* LIBC_SCCS && !lint */ ENTRY(swapcontext) @@ -84,9 +84,9 @@ ENTRY(swapcontext) #if !defined(__thumb__) || defined(_ARM_ARCH_T2) b PLT_SYM(_C_LABEL(setcontext)) #else - push {lr} + push {r3, lr} bl PLT_SYM(_C_LABEL(setcontext)) - pop {pc} + pop {r3, pc} #endif #if defined(__ARM_EABI__) && defined(__UNWIND_TABLES__) .cfi_endproc Index: src/lib/libc/arch/arm/sys/__clone.S diff -u src/lib/libc/arch/arm/sys/__clone.S:1.9 src/lib/libc/arch/arm/sys/__clone.S:1.9.28.1 --- src/lib/libc/arch/arm/sys/__clone.S:1.9 Sat Nov 30 20:20:42 2013 +++ src/lib/libc/arch/arm/sys/__clone.S Sun Aug 8 10:22:04 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: __clone.S,v 1.9 2013/11/30 20:20:42 joerg Exp $ */ +/* $NetBSD: __clone.S,v 1.9.28.1 2021/08/08 10:22:04 martin Exp $ */ /* * Copyright (c) 2001 Christopher Gilbert @@ -55,21 +55,17 @@ ENTRY(__clone) /* place the func and its arg onto the child's stack */ #if !defined(__thumb__) || defined(_ARM_ARCH_T2) - stmfd r1!, {r0, r3} + stmfd r1!, {r0, r3} #else subs r1, r1, #8 - stmia r1!, {r0, r3} + stmia r1!, {r0, r3} #endif - + /* syscall expects (flags, stack) */ mov r0, r2 SYSTRAP(__clone) -#if !defined(__thumb__) || defined(_ARM_ARCH_T2) _INVOKE_CERROR() -#else - bcs .Lcerror -#endif /* * r1 and r0 are the same as from fork: @@ -121,8 +117,8 @@ ENTRY(__clone) b CERROR #else .Lcerror: - push {lr} + push {r3, lr} bl CERROR - pop {pc} + pop {r3, pc} #endif END(__clone) Index: src/sys/external/bsd/compiler_rt/dist/lib/builtins/arm/aeabi_cfcmp.S diff -u src/sys/external/bsd/compiler_rt/dist/lib/builtins/arm/aeabi_cfcmp.S:1.1.1.1 src/sys/external/bsd/compiler_rt/dist/lib/builtins/arm/aeabi_cfcmp.S:1.1.1.1.26.1 --- src/sys/external/bsd/compiler_rt/dist/lib/builtins/arm/aeabi_cfcmp.S:1.1.1.1 Sat Feb 27 18:59:31 2016 +++ src/sys/external/bsd/compiler_rt/dist/lib/builtins/arm/aeabi_cfcmp.S Sun Aug 8 10:22:04 2021 @@ -27,10 +27,11 @@ .syntax unified .p2align 2 DEFINE_COMPILERRT_FUNCTION(__aeabi_cfcmpeq) - push {r0-r3, lr} + // Save ip to ensure stack alignment (could be any register) + push {r0-r3, ip, lr} bl __aeabi_cfcmpeq_check_nan cmp r0, #1 - pop {r0-r3, lr} + pop {r0-r3, ip, lr} // NaN has been ruled out, so __aeabi_cfcmple can't trap bne __aeabi_cfcmple @@ -55,7 +56,8 @@ END_COMPILERRT_FUNCTION(__aeabi_cfcmpeq) DEFINE_COMPILERRT_FUNCTION(__aeabi_cfcmple) // Per the RTABI, this function must preserve r0-r11. // Save lr in the same instruction for compactness - push {r0-r3, lr} + // Save ip to ensure stack alignment (could be any register) + push {r0-r3, ip, lr} bl __aeabi_fcmplt cmp r0, #1 @@ -70,7 +72,7 @@ DEFINE_COMPILERRT_FUNCTION(__aeabi_cfcmp 1: msr CPSR_f, ip - pop {r0-r3} + pop {r0-r3, ip} POP_PC() END_COMPILERRT_FUNCTION(__aeabi_cfcmple) Index: src/sys/external/bsd/compiler_rt/dist/lib/builtins/arm/divmodsi4.S diff -u src/sys/external/bsd/compiler_rt/dist/lib/builtins/arm/divmodsi4.S:1.1.1.4 src/sys/external/bsd/compiler_rt/dist/lib/builtins/arm/divmodsi4.S:1.1.1.4.22.1 --- src/sys/external/bsd/compiler_rt/dist/lib/builtins/arm/divmodsi4.S:1.1.1.4 Sat Feb 27 18:59:31 2016 +++ src/sys/external/bsd/compiler_rt/dist/lib/builtins/arm/divmodsi4.S Sun Aug 8 10:22:04 2021 @@ -16,10 +16,9 @@ #include "../assembly.h" #define ESTABLISH_FRAME \ - push {r4-r7, lr} ;\ - add r7, sp, #12 + push {r4-r6, lr} #define CLEAR_FRAME_AND_RETURN \ - pop {r4-r7, pc} + pop {r4-r6, pc} .syntax unified .text Index: src/sys/external/bsd/compiler_rt/dist/lib/builtins/arm/divsi3.S diff -u src/sys/external/bsd/compiler_rt/dist/lib/builtins/arm/divsi3.S:1.1.1.4 src/sys/external/bsd/compiler_rt/dist/lib/builtins/arm/divsi3.S:1.1.1.4.22.1 --- src/sys/external/bsd/compiler_rt/dist/lib/builtins/arm/divsi3.S:1.1.1.4 Sat Feb 27 18:59:31 2016 +++ src/sys/external/bsd/compiler_rt/dist/lib/builtins/arm/divsi3.S Sun Aug 8 10:22:04 2021 @@ -15,10 +15,9 @@ #include "../assembly.h" #define ESTABLISH_FRAME \ - push {r4, r7, lr} ;\ - add r7, sp, #4 + push {r4, lr} #define CLEAR_FRAME_AND_RETURN \ - pop {r4, r7, pc} + pop {r4, pc} .syntax unified .text Index: src/sys/external/bsd/compiler_rt/dist/lib/builtins/arm/modsi3.S diff -u src/sys/external/bsd/compiler_rt/dist/lib/builtins/arm/modsi3.S:1.1.1.4 src/sys/external/bsd/compiler_rt/dist/lib/builtins/arm/modsi3.S:1.1.1.4.22.1 --- src/sys/external/bsd/compiler_rt/dist/lib/builtins/arm/modsi3.S:1.1.1.4 Sat Feb 27 18:59:31 2016 +++ src/sys/external/bsd/compiler_rt/dist/lib/builtins/arm/modsi3.S Sun Aug 8 10:22:04 2021 @@ -15,10 +15,9 @@ #include "../assembly.h" #define ESTABLISH_FRAME \ - push {r4, r7, lr} ;\ - add r7, sp, #4 + push {r4, lr} #define CLEAR_FRAME_AND_RETURN \ - pop {r4, r7, pc} + pop {r4, pc} .syntax unified .text