Port-arm archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: armv5 userland broken
On 30/06/2021 07:22, Nick Hudson wrote:
Great work!
On 29/06/2021 08:13, Rin Okuyama wrote:
I've examined assembler codes for userland libraries for arm:
common/lib/libc, csu, libc, compiler_rt, and libm, and found that
some routines in compiler_rt do not align sp correctly:
http://www.netbsd.org/~rin/arm_stack_align_compiler_rt.patch
Also, some routines in libc do not also in Thumb-mode userland:
http://www.netbsd.org/~rin/arm_stack_align_libc_thumb.patch
I think it's better / less ugly to push even numbers of registers rather
than adjusting sp (especially for thumb)
How about this diff? (untested)
I've dropped callee saved registers from the compiler_rt code as (I
think) they're unused.
Nick
? sys/external/bsd/compiler_rt/dist/lib/builtins/arm/.aeabi_cfcmp.S.kate-swp
Index: lib/libc/arch/arm/gen/swapcontext.S
===================================================================
RCS file: /cvsroot/src/lib/libc/arch/arm/gen/swapcontext.S,v
retrieving revision 1.17
diff -u -p -r1.17 swapcontext.S
--- lib/libc/arch/arm/gen/swapcontext.S 30 Jun 2021 00:00:49 -0000 1.17
+++ lib/libc/arch/arm/gen/swapcontext.S 30 Jun 2021 07:37:44 -0000
@@ -84,15 +84,9 @@ ENTRY(swapcontext)
#if !defined(__thumb__) || defined(_ARM_ARCH_T2)
b PLT_SYM(_C_LABEL(setcontext))
#else
- push {lr}
- mov r1, sp
- subs r1, #4
- mov sp, r1
+ push {r3, lr}
bl PLT_SYM(_C_LABEL(setcontext))
- mov r1, sp
- adds r1, #4
- mov sp, r1
- pop {pc}
+ pop {r3, pc}
#endif
#if defined(__ARM_EABI__) && defined(__UNWIND_TABLES__)
.cfi_endproc
Index: lib/libc/arch/arm/sys/__clone.S
===================================================================
RCS file: /cvsroot/src/lib/libc/arch/arm/sys/__clone.S,v
retrieving revision 1.13
diff -u -p -r1.13 __clone.S
--- lib/libc/arch/arm/sys/__clone.S 30 Jun 2021 07:36:05 -0000 1.13
+++ lib/libc/arch/arm/sys/__clone.S 30 Jun 2021 07:37:44 -0000
@@ -117,14 +117,8 @@ ENTRY(__clone)
b CERROR
#else
.Lcerror:
- push {lr}
- mov r1, sp
- subs r1, #4
- mov sp, r1
+ push {r3, lr}
bl CERROR
- mov r1, sp
- adds r1, #4
- mov sp, r1
- pop {pc}
+ pop {r3, pc}
#endif
END(__clone)
Index: sys/external/bsd/compiler_rt/dist/lib/builtins/arm/aeabi_cfcmp.S
===================================================================
RCS file: /cvsroot/src/sys/external/bsd/compiler_rt/dist/lib/builtins/arm/aeabi_cfcmp.S,v
retrieving revision 1.2
diff -u -p -r1.2 aeabi_cfcmp.S
--- sys/external/bsd/compiler_rt/dist/lib/builtins/arm/aeabi_cfcmp.S 29 Jun 2021 23:26:00 -0000 1.2
+++ sys/external/bsd/compiler_rt/dist/lib/builtins/arm/aeabi_cfcmp.S 30 Jun 2021 07:37:45 -0000
@@ -57,17 +57,15 @@ 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}
- sub sp, #4
+ // Save ip to ensure stack alignment (could be any register)
+ push {r0-r3, ip, lr}
bl __aeabi_fcmplt
cmp r0, #1
moveq ip, #0
beq 1f
- add sp, #4
ldm sp, {r0-r3}
- sub sp, #4
bl __aeabi_fcmpeq
cmp r0, #1
moveq ip, #(APSR_C | APSR_Z)
@@ -75,8 +73,7 @@ DEFINE_COMPILERRT_FUNCTION(__aeabi_cfcmp
1:
msr CPSR_f, ip
- add sp, #4
- pop {r0-r3}
+ pop {r0-r3, ip}
POP_PC()
END_COMPILERRT_FUNCTION(__aeabi_cfcmple)
Index: sys/external/bsd/compiler_rt/dist/lib/builtins/arm/divmodsi4.S
===================================================================
RCS file: /cvsroot/src/sys/external/bsd/compiler_rt/dist/lib/builtins/arm/divmodsi4.S,v
retrieving revision 1.2
diff -u -p -r1.2 divmodsi4.S
--- sys/external/bsd/compiler_rt/dist/lib/builtins/arm/divmodsi4.S 29 Jun 2021 23:26:00 -0000 1.2
+++ sys/external/bsd/compiler_rt/dist/lib/builtins/arm/divmodsi4.S 30 Jun 2021 07:37:45 -0000
@@ -16,12 +16,9 @@
#include "../assembly.h"
#define ESTABLISH_FRAME \
- push {r4-r7, lr} ;\
- add r7, sp, #12 ;\
- sub sp, #4
+ push {r4-r6, lr}
#define CLEAR_FRAME_AND_RETURN \
- add sp, #4 ;\
- pop {r4-r7, pc}
+ pop {r4-r6, pc}
.syntax unified
.text
Index: sys/external/bsd/compiler_rt/dist/lib/builtins/arm/divsi3.S
===================================================================
RCS file: /cvsroot/src/sys/external/bsd/compiler_rt/dist/lib/builtins/arm/divsi3.S,v
retrieving revision 1.2
diff -u -p -r1.2 divsi3.S
--- sys/external/bsd/compiler_rt/dist/lib/builtins/arm/divsi3.S 29 Jun 2021 23:26:00 -0000 1.2
+++ sys/external/bsd/compiler_rt/dist/lib/builtins/arm/divsi3.S 30 Jun 2021 07:37:45 -0000
@@ -15,12 +15,9 @@
#include "../assembly.h"
#define ESTABLISH_FRAME \
- push {r4, r7, lr} ;\
- add r7, sp, #4 ;\
- sub sp, #4
+ push {r4, lr}
#define CLEAR_FRAME_AND_RETURN \
- add sp, #4 ;\
- pop {r4, r7, pc}
+ pop {r4, pc}
.syntax unified
.text
Index: sys/external/bsd/compiler_rt/dist/lib/builtins/arm/modsi3.S
===================================================================
RCS file: /cvsroot/src/sys/external/bsd/compiler_rt/dist/lib/builtins/arm/modsi3.S,v
retrieving revision 1.2
diff -u -p -r1.2 modsi3.S
--- sys/external/bsd/compiler_rt/dist/lib/builtins/arm/modsi3.S 29 Jun 2021 23:26:00 -0000 1.2
+++ sys/external/bsd/compiler_rt/dist/lib/builtins/arm/modsi3.S 30 Jun 2021 07:37:45 -0000
@@ -15,12 +15,9 @@
#include "../assembly.h"
#define ESTABLISH_FRAME \
- push {r4, r7, lr} ;\
- add r7, sp, #4 ;\
- sub sp, #4
+ push {r4, lr}
#define CLEAR_FRAME_AND_RETURN \
- add sp, #4 ;\
- pop {r4, r7, pc}
+ pop {r4, pc}
.syntax unified
.text
Home |
Main Index |
Thread Index |
Old Index