diff options
Diffstat (limited to 'libc/ports/sysdeps/unix/sysv/linux/arm/nptl')
6 files changed, 41 insertions, 60 deletions
diff --git a/libc/ports/sysdeps/unix/sysv/linux/arm/nptl/libpthread.abilist b/libc/ports/sysdeps/unix/sysv/linux/arm/nptl/libpthread.abilist index 6c0bbde67..de8095a60 100644 --- a/libc/ports/sysdeps/unix/sysv/linux/arm/nptl/libpthread.abilist +++ b/libc/ports/sysdeps/unix/sysv/linux/arm/nptl/libpthread.abilist @@ -83,7 +83,6 @@ GLIBC_2.4 pause F pread F pread64 F - pthread_atfork F pthread_attr_destroy F pthread_attr_getaffinity_np F pthread_attr_getdetachstate F diff --git a/libc/ports/sysdeps/unix/sysv/linux/arm/nptl/pt-vfork.S b/libc/ports/sysdeps/unix/sysv/linux/arm/nptl/pt-vfork.S index a38d56419..ca5045707 100644 --- a/libc/ports/sysdeps/unix/sysv/linux/arm/nptl/pt-vfork.S +++ b/libc/ports/sysdeps/unix/sysv/linux/arm/nptl/pt-vfork.S @@ -19,23 +19,16 @@ /* Save the PID value. */ #define SAVE_PID \ - str lr, [sp, #-4]!; /* Save LR. */ \ - cfi_adjust_cfa_offset (4); \ - cfi_rel_offset (lr, 0); \ - mov r0, #0xffff0fff; /* Point to the high page. */ \ - mov lr, pc; /* Save our return address. */ \ - sub pc, r0, #31; /* Jump to the TLS entry. */ \ - ldr lr, [sp], #4; /* Restore LR. */ \ - cfi_adjust_cfa_offset (-4); \ - cfi_restore (lr); \ - mov r2, r0; /* Save the TLS addr in r2. */ \ - ldr r3, [r2, #PID_OFFSET]; /* Load the saved PID. */ \ - rsb r0, r3, #0; /* Negate it. */ \ - str r0, [r2, #PID_OFFSET] /* Store the temporary PID. */ + GET_TLS (r2); \ + NEGOFF_ADJ_BASE2 (r2, r0, PID_OFFSET); /* Save the TLS addr in r2. */ \ + ldr r3, NEGOFF_OFF1 (r2, PID_OFFSET); /* Load the saved PID. */ \ + rsb r0, r3, #0; /* Negate it. */ \ + str r0, NEGOFF_OFF1 (r2, PID_OFFSET); /* Store the temp PID. */ /* Restore the old PID value in the parent. */ #define RESTORE_PID \ cmp r0, #0; /* If we are the parent... */ \ - strne r3, [r2, #PID_OFFSET] /* ... restore the saved PID. */ + it ne; \ + strne r3, NEGOFF_OFF1 (r2, PID_OFFSET); /* restore the saved PID. */ #include "../vfork.S" diff --git a/libc/ports/sysdeps/unix/sysv/linux/arm/nptl/sysdep-cancel.h b/libc/ports/sysdeps/unix/sysv/linux/arm/nptl/sysdep-cancel.h index df85d5199..59b826ded 100644 --- a/libc/ports/sysdeps/unix/sysv/linux/arm/nptl/sysdep-cancel.h +++ b/libc/ports/sysdeps/unix/sysv/linux/arm/nptl/sysdep-cancel.h @@ -31,7 +31,6 @@ # undef PSEUDO # define PSEUDO(name, syscall_name, args) \ .text; \ - PSEUDO_PROLOGUE; \ ENTRY (__##syscall_name##_nocancel); \ CFI_SECTIONS; \ DO_CALL (syscall_name, args); \ @@ -77,19 +76,19 @@ # define DOCARGS_0 \ .save {r7}; \ - str lr, [sp, #-4]!; \ + push {lr}; \ cfi_adjust_cfa_offset (4); \ cfi_rel_offset (lr, 0); \ .save {lr} # define UNDOCARGS_0 # define RESTORE_LR_0 \ - ldr lr, [sp], #4; \ + pop {lr}; \ cfi_adjust_cfa_offset (-4); \ cfi_restore (lr) # define DOCARGS_1 \ .save {r7}; \ - stmfd sp!, {r0, r1, lr}; \ + push {r0, r1, lr}; \ cfi_adjust_cfa_offset (12); \ cfi_rel_offset (lr, 8); \ .save {lr}; \ @@ -103,13 +102,13 @@ # define DOCARGS_2 \ .save {r7}; \ - stmfd sp!, {r0, r1, lr}; \ + push {r0, r1, lr}; \ cfi_adjust_cfa_offset (12); \ cfi_rel_offset (lr, 8); \ .save {lr}; \ .pad #8 # define UNDOCARGS_2 \ - ldmfd sp!, {r0, r1}; \ + pop {r0, r1}; \ cfi_adjust_cfa_offset (-8); \ RESTART_UNWIND # define RESTORE_LR_2 \ @@ -117,13 +116,13 @@ # define DOCARGS_3 \ .save {r7}; \ - stmfd sp!, {r0, r1, r2, r3, lr}; \ + push {r0, r1, r2, r3, lr}; \ cfi_adjust_cfa_offset (20); \ cfi_rel_offset (lr, 16); \ .save {lr}; \ .pad #16 # define UNDOCARGS_3 \ - ldmfd sp!, {r0, r1, r2, r3}; \ + pop {r0, r1, r2, r3}; \ cfi_adjust_cfa_offset (-16); \ RESTART_UNWIND # define RESTORE_LR_3 \ @@ -131,13 +130,13 @@ # define DOCARGS_4 \ .save {r7}; \ - stmfd sp!, {r0, r1, r2, r3, lr}; \ + push {r0, r1, r2, r3, lr}; \ cfi_adjust_cfa_offset (20); \ cfi_rel_offset (lr, 16); \ .save {lr}; \ .pad #16 # define UNDOCARGS_4 \ - ldmfd sp!, {r0, r1, r2, r3}; \ + pop {r0, r1, r2, r3}; \ cfi_adjust_cfa_offset (-16); \ RESTART_UNWIND # define RESTORE_LR_4 \ @@ -146,13 +145,13 @@ /* r4 is only stmfd'ed for correct stack alignment. */ # define DOCARGS_5 \ .save {r4, r7}; \ - stmfd sp!, {r0, r1, r2, r3, r4, lr}; \ + push {r0, r1, r2, r3, r4, lr}; \ cfi_adjust_cfa_offset (24); \ cfi_rel_offset (lr, 20); \ .save {lr}; \ .pad #20 # define UNDOCARGS_5 \ - ldmfd sp!, {r0, r1, r2, r3}; \ + pop {r0, r1, r2, r3}; \ cfi_adjust_cfa_offset (-16); \ .fnend; \ .fnstart; \ @@ -160,20 +159,20 @@ .save {lr}; \ .pad #4 # define RESTORE_LR_5 \ - ldmfd sp!, {r4, lr}; \ + pop {r4, lr}; \ cfi_adjust_cfa_offset (-8); \ /* r4 will be marked as restored later. */ \ cfi_restore (lr) # define DOCARGS_6 \ .save {r4, r5, r7}; \ - stmfd sp!, {r0, r1, r2, r3, lr}; \ + push {r0, r1, r2, r3, lr}; \ cfi_adjust_cfa_offset (20); \ cfi_rel_offset (lr, 16); \ .save {lr}; \ .pad #16 # define UNDOCARGS_6 \ - ldmfd sp!, {r0, r1, r2, r3}; \ + pop {r0, r1, r2, r3}; \ cfi_adjust_cfa_offset (-16); \ .fnend; \ .fnstart; \ @@ -203,12 +202,8 @@ extern int __local_multiple_threads attribute_hidden; # define SINGLE_THREAD_P __builtin_expect (__local_multiple_threads == 0, 1) # else # define SINGLE_THREAD_P \ - ldr ip, 1b; \ - 2: \ - ldr ip, [pc, ip]; \ - teq ip, #0; -# define PSEUDO_PROLOGUE \ - 1: .word __local_multiple_threads - 2f - PC_OFS; + LDST_PCREL(ldr, ip, ip, __local_multiple_threads); \ + teq ip, #0 # endif # else /* There is no __local_multiple_threads for librt, so use the TCB. */ @@ -217,14 +212,14 @@ extern int __local_multiple_threads attribute_hidden; __builtin_expect (THREAD_GETMEM (THREAD_SELF, \ header.multiple_threads) == 0, 1) # else -# define PSEUDO_PROLOGUE # define SINGLE_THREAD_P \ - stmfd sp!, {r0, lr}; \ + push {r0, lr}; \ cfi_adjust_cfa_offset (8); \ cfi_rel_offset (lr, 4); \ - bl __aeabi_read_tp; \ - ldr ip, [r0, #MULTIPLE_THREADS_OFFSET]; \ - ldmfd sp!, {r0, lr}; \ + GET_TLS (lr); \ + NEGOFF_ADJ_BASE (r0, MULTIPLE_THREADS_OFFSET); \ + ldr ip, NEGOFF_OFF1 (r0, MULTIPLE_THREADS_OFFSET); \ + pop {r0, lr}; \ cfi_adjust_cfa_offset (-8); \ cfi_restore (lr); \ teq ip, #0 diff --git a/libc/ports/sysdeps/unix/sysv/linux/arm/nptl/unwind-forcedunwind.c b/libc/ports/sysdeps/unix/sysv/linux/arm/nptl/unwind-forcedunwind.c index caa6a2626..108924d8b 100644 --- a/libc/ports/sysdeps/unix/sysv/linux/arm/nptl/unwind-forcedunwind.c +++ b/libc/ports/sysdeps/unix/sysv/linux/arm/nptl/unwind-forcedunwind.c @@ -93,7 +93,7 @@ asm ( "_Unwind_Resume:\n" " .cfi_sections .debug_frame\n" " " CFI_STARTPROC "\n" -" stmfd sp!, {r4, r5, r6, lr}\n" +" push {r4, r5, r6, lr}\n" " " CFI_ADJUST_CFA_OFFSET (16)" \n" " " CFI_REL_OFFSET (r4, 0) "\n" " " CFI_REL_OFFSET (r5, 4) "\n" @@ -108,7 +108,7 @@ asm ( " cmp r3, #0\n" " beq 4f\n" "5: mov r0, r6\n" -" ldmfd sp!, {r4, r5, r6, lr}\n" +" pop {r4, r5, r6, lr}\n" " " CFI_ADJUST_CFA_OFFSET (-16) "\n" " " CFI_RESTORE (r4) "\n" " " CFI_RESTORE (r5) "\n" diff --git a/libc/ports/sysdeps/unix/sysv/linux/arm/nptl/unwind-resume.c b/libc/ports/sysdeps/unix/sysv/linux/arm/nptl/unwind-resume.c index 121159913..d155ea7dc 100644 --- a/libc/ports/sysdeps/unix/sysv/linux/arm/nptl/unwind-resume.c +++ b/libc/ports/sysdeps/unix/sysv/linux/arm/nptl/unwind-resume.c @@ -56,7 +56,7 @@ asm ( "_Unwind_Resume:\n" " .cfi_sections .debug_frame\n" " " CFI_STARTPROC "\n" -" stmfd sp!, {r4, r5, r6, lr}\n" +" push {r4, r5, r6, lr}\n" " " CFI_ADJUST_CFA_OFFSET (16)" \n" " " CFI_REL_OFFSET (r4, 0) "\n" " " CFI_REL_OFFSET (r5, 4) "\n" @@ -71,7 +71,7 @@ asm ( " cmp r3, #0\n" " beq 4f\n" "5: mov r0, r6\n" -" ldmfd sp!, {r4, r5, r6, lr}\n" +" pop {r4, r5, r6, lr}\n" " " CFI_ADJUST_CFA_OFFSET (-16) "\n" " " CFI_RESTORE (r4) "\n" " " CFI_RESTORE (r5) "\n" diff --git a/libc/ports/sysdeps/unix/sysv/linux/arm/nptl/vfork.S b/libc/ports/sysdeps/unix/sysv/linux/arm/nptl/vfork.S index 3fce2d1af..216fb2d2e 100644 --- a/libc/ports/sysdeps/unix/sysv/linux/arm/nptl/vfork.S +++ b/libc/ports/sysdeps/unix/sysv/linux/arm/nptl/vfork.S @@ -19,24 +19,18 @@ /* Save the PID value. */ #define SAVE_PID \ - str lr, [sp, #-4]!; /* Save LR. */ \ - cfi_adjust_cfa_offset (4); \ - cfi_rel_offset (lr, 0); \ - mov r0, #0xffff0fff; /* Point to the high page. */ \ - mov lr, pc; /* Save our return address. */ \ - sub pc, r0, #31; /* Jump to the TLS entry. */ \ - ldr lr, [sp], #4; /* Restore LR. */ \ - cfi_adjust_cfa_offset (-4); \ - cfi_restore (lr); \ - mov r2, r0; /* Save the TLS addr in r2. */ \ - ldr r3, [r2, #PID_OFFSET]; /* Load the saved PID. */ \ - rsbs r0, r3, #0; /* Negate it. */ \ - moveq r0, #0x80000000; /* Use 0x80000000 if it was 0. */ \ - str r0, [r2, #PID_OFFSET] /* Store the temporary PID. */ + GET_TLS (r2); \ + NEGOFF_ADJ_BASE2 (r2, r0, PID_OFFSET); /* Save the TLS addr in r2. */ \ + ldr r3, NEGOFF_OFF1 (r2, PID_OFFSET); /* Load the saved PID. */ \ + rsbs r0, r3, #0; /* Negate it. */ \ + it eq; \ + moveq r0, #0x80000000; /* Use 0x80000000 if it was 0. */ \ + str r0, NEGOFF_OFF1 (r2, PID_OFFSET); /* Store the temp PID. */ /* Restore the old PID value in the parent. */ #define RESTORE_PID \ cmp r0, #0; /* If we are the parent... */ \ - strne r3, [r2, #PID_OFFSET] /* ... restore the saved PID. */ + it ne; \ + strne r3, NEGOFF_OFF1 (r2, PID_OFFSET); /* restore the saved PID. */ #include "../vfork.S" |