From edac0e8f443c332821a63e4f26e298a1622827fe Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Thu, 14 Apr 2005 21:46:37 +0000 Subject: Add sparc64 TLS and NPTL support. * elf/tls-macros.h: Add Sparc64 defines. * sysdeps/sparc/sparc64/dl-machine.h (sparc64_fixup_plt): Mark as always_inline. (elf_machine_fixup_plt): Likewise. (elf_machine_rela): Handle TLS relocations. (elf_machine_type_cleaa): Likewise. * sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h (SYSCALL_ERROR_HANDLER_ENTRY): Use sethi/or for GOT reloc. It does not always fit in R_SPARC_GOT13 when building -fPIC. Also, add TLS handling. * sysdeps/unix/sysv/linux/configure.in (arch_minimum_kernel): Increase it to 2.4.21 for sparc64. * sysdeps/unix/sysv/linux/sparc/sparc32/clone.S: NULL terminate backtrace by zero'ing out %fp. Store away flags, func_ptr, and func_arg in global registers not local registers. * sysdeps/unix/sysv/linux/sparc/sparc64/clone.S: Handle PTID, TLS, and CTID arguments properly. Add RESET_PID handling. * sysdeps/unix/sysv/linux/sparc/sparc64/pause.c: Rework so that we do not invoke __sigprocmask(). We can always assume rt signals are present on sparc64, so just do an inline syscall. 2005-04-13 Jakub Jelinek * sysdeps/sparc/sparc64/dl-machine.h: Add dl_machine_h multiple inclusion guard for the first half of the header. (elf_machine_type_class, ELF_MACHINE_JMP_SLOT, ELF_MACHINE_NO_REL, ELF_MACHINE_PLTREL_OVERLAP, elf_machine_runtime_setup, elf_machine_relplt, DL_STACK_END, RTLD_START): Move into the #ifndef dl_machine_h guarded part of the header. --- sysdeps/unix/sysv/linux/sparc/sparc32/clone.S | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) (limited to 'sysdeps/unix/sysv/linux/sparc/sparc32') diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/clone.S b/sysdeps/unix/sysv/linux/sparc/sparc32/clone.S index 66cdbf3ca7..4d8fdb8200 100644 --- a/sysdeps/unix/sysv/linux/sparc/sparc32/clone.S +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/clone.S @@ -40,11 +40,19 @@ __clone: save %sp,-96,%sp /* sanity check arguments */ - tst %i0 + orcc %i0,%g0,%g2 be .Lerror orcc %i1,%g0,%o1 be .Lerror mov %i2,%o0 + + /* The child_stack is the top of the stack, allocate one + whole stack frame from that as this is what the kernel + expects. */ + sub %o1, 96, %o1 + mov %i3, %g3 + mov %i2, %g4 + /* ptid */ mov %i4,%o2 /* tls */ @@ -76,19 +84,21 @@ __clone: __thread_start: #ifdef RESET_PID sethi %hi(CLONE_THREAD), %l0 - andcc %i2, %l0, %g0 + andcc %g4, %l0, %g0 bne 1f - andcc %i2, CLONE_VM, %g0 + andcc %g4, CLONE_VM, %g0 bne,a 2f mov -1,%o0 set __NR_getpid,%g1 ta 0x10 -2: st %o0,[%g7 + PID] +2: + st %o0,[%g7 + PID] st %o0,[%g7 + TID] 1: #endif - call %i0 - mov %i3,%o0 + mov %g0, %fp /* terminate backtrace */ + call %g2 + mov %g3,%o0 call _exit,0 nop -- cgit v1.2.3