diff options
Diffstat (limited to 'linuxthreads')
8 files changed, 82 insertions, 19 deletions
diff --git a/linuxthreads/ChangeLog b/linuxthreads/ChangeLog index d81864b..2949321 100644 --- a/linuxthreads/ChangeLog +++ b/linuxthreads/ChangeLog @@ -1,3 +1,19 @@ +2003-01-24 Jakub Jelinek <jakub@redhat.com> + + * sysdeps/sparc/sparc32/pt-machine.h (__thread_self): Change to %g7, + as required by TLS ABI. + * sysdeps/sparc/sparc64/pt-machine.h (__thread_self): Likewise. + * sysdeps/sparc/tls.h [HAVE_TLS_SUPPORT] (USE_TLS, TLS_INIT_TCB_SIZE, + TLS_INIT_TCB_ALIGN, TLS_TCB_SIZE, TLS_TCB_ALIGN, TLS_TCB_AT_TP, + INSTALL_DTV, INSTALL_NEW_DTV, GET_DTV, TLS_INIT_TP, THREAD_DTV): + Define. + [HAVE_TLS_SUPPORT]: Include descr.h and sysdep.h. + * sysdeps/unix/sysv/linux/sparc/sparc32/sysdep-cancel.h: Use %g7 + instead of %g6 for thread pointer. + * sysdeps/unix/sysv/linux/sparc/sparc32/vfork.S: Likewise. + * sysdeps/unix/sysv/linux/sparc/sparc64/sysdep-cancel.h: Likewise. + * sysdeps/unix/sysv/linux/sparc/sparc64/vfork.S: Likewise. + 2003-01-25 Guido Guenther <agx@sigxcpu.org> * sysdeps/unix/sysv/linux/mips/sysdep-cancel.h: New file. diff --git a/linuxthreads/sysdeps/sparc/sparc32/pt-machine.h b/linuxthreads/sysdeps/sparc/sparc32/pt-machine.h index 2e91233..cbfc872 100644 --- a/linuxthreads/sysdeps/sparc/sparc32/pt-machine.h +++ b/linuxthreads/sysdeps/sparc/sparc32/pt-machine.h @@ -1,6 +1,6 @@ /* Machine-dependent pthreads configuration and inline functions. sparc version. - Copyright (C) 1996,1997,1998,2000,2001,2002 Free Software Foundation, Inc. + Copyright (C) 1996-1998, 2000-2003 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Richard Henderson <rth@tamu.edu>. @@ -53,10 +53,10 @@ testandset (int *spinlock) register char *stack_pointer __asm__("%sp"); -/* Registers %g6 and %g7 are reserved by the ABI for "system use". It - happens that Solaris uses %g6 for the thread pointer -- we do the same. */ +/* Registers %g6 and %g7 are reserved by the ABI for "system use". + %g7 is specified in the TLS ABI as thread pointer -- we do the same. */ struct _pthread_descr_struct; -register struct _pthread_descr_struct *__thread_self __asm__("%g6"); +register struct _pthread_descr_struct *__thread_self __asm__("%g7"); /* Return the thread descriptor for the current thread. */ #define THREAD_SELF __thread_self diff --git a/linuxthreads/sysdeps/sparc/sparc64/pt-machine.h b/linuxthreads/sysdeps/sparc/sparc64/pt-machine.h index f32b1feac8..3087020 100644 --- a/linuxthreads/sysdeps/sparc/sparc64/pt-machine.h +++ b/linuxthreads/sysdeps/sparc/sparc64/pt-machine.h @@ -1,6 +1,6 @@ /* Machine-dependent pthreads configuration and inline functions. Sparc v9 version. - Copyright (C) 1997,1998,1999,2000,2001,2002 Free Software Foundation, Inc. + Copyright (C) 1997-2002, 2003 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Richard Henderson <rth@tamu.edu>. @@ -59,10 +59,10 @@ testandset (int *spinlock) register char *stack_pointer __asm__ ("%sp"); -/* Registers %g6 and %g7 are reserved by the ABI for "system use". It - happens that Solaris uses %g6 for the thread pointer -- we do the same. */ +/* Registers %g6 and %g7 are reserved by the ABI for "system use". The + TLS ABI specifies %g7 as the thread pointer. */ struct _pthread_descr_struct; -register struct _pthread_descr_struct *__thread_self __asm__ ("%g6"); +register struct _pthread_descr_struct *__thread_self __asm__ ("%g7"); /* Return the thread descriptor for the current thread. */ #define THREAD_SELF __thread_self diff --git a/linuxthreads/sysdeps/sparc/tls.h b/linuxthreads/sysdeps/sparc/tls.h index 4571922..9a9719c 100644 --- a/linuxthreads/sysdeps/sparc/tls.h +++ b/linuxthreads/sysdeps/sparc/tls.h @@ -1,5 +1,5 @@ /* Definitions for thread-local data handling. linuxthreads/sparc version. - Copyright (C) 2002 Free Software Foundation, Inc. + Copyright (C) 2002, 2003 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -45,9 +45,56 @@ typedef struct # include <tcb-offsets.h> #endif /* __ASSEMBLER__ */ -#undef USE_TLS +#ifdef HAVE_TLS_SUPPORT -#if USE_TLS +/* Signal that TLS support is available. */ +# define USE_TLS 1 + +# ifndef __ASSEMBLER__ +/* Get system call information. */ +# include <sysdep.h> + +/* Get the thread descriptor definition. */ +# include <linuxthreads/descr.h> + +/* This is the size of the initial TCB. */ +# define TLS_INIT_TCB_SIZE sizeof (tcbhead_t) + +/* Alignment requirements for the initial TCB. */ +# define TLS_INIT_TCB_ALIGN __alignof__ (tcbhead_t) + +/* This is the size of the TCB. */ +# define TLS_TCB_SIZE sizeof (struct _pthread_descr_struct) + +/* Alignment requirements for the TCB. */ +# define TLS_TCB_ALIGN __alignof__ (struct _pthread_descr_struct) + +/* The TCB can have any size and the memory following the address the + thread pointer points to is unspecified. Allocate the TCB there. */ +# define TLS_TCB_AT_TP 1 + +/* Install the dtv pointer. The pointer passed is to the element with + index -1 which contain the length. */ +# define INSTALL_DTV(descr, dtvp) \ + ((tcbhead_t *) (descr))->dtv = (dtvp) + 1 + +/* Install new dtv for current thread. */ +# define INSTALL_NEW_DTV(DTV) \ + (((tcbhead_t *) __thread_self)->dtv = (DTV)) + +/* Return dtv of given thread descriptor. */ +# define GET_DTV(descr) \ + (((tcbhead_t *) (descr))->dtv) + +/* Code to initially initialize the thread pointer. */ +# define TLS_INIT_TP(descr, secondcall) \ + (__thread_self = (__typeof (__thread_self)) (descr), NULL) + +/* Return the address of the dtv for the current thread. */ +# define THREAD_DTV() \ + (((tcbhead_t *) __thread_self)->dtv) + +# endif #else diff --git a/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep-cancel.h b/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep-cancel.h index 66aaeab..545e1d3 100644 --- a/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep-cancel.h +++ b/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep-cancel.h @@ -1,4 +1,4 @@ -/* Copyright (C) 2002 Free Software Foundation, Inc. +/* Copyright (C) 2002, 2003 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Jakub Jelinek <jakub@redhat.com>, 2002. @@ -29,7 +29,7 @@ # define PSEUDO(name, syscall_name, args) \ .text; \ ENTRY(name) \ - ld [%g6 + MULTIPLE_THREADS_OFFSET], %g1; \ + ld [%g7 + MULTIPLE_THREADS_OFFSET], %g1; \ cmp %g1, 0; \ bne 1f; \ mov SYS_ify(syscall_name), %g1; \ @@ -86,7 +86,7 @@ SYSCALL_ERROR_HANDLER_ENTRY(__syscall_error_handler2) \ __builtin_expect (THREAD_GETMEM (THREAD_SELF, \ p_header.data.multiple_threads) == 0, 1) # else -# define SINGLE_THREAD_P ld [%g6 + MULTIPLE_THREADS_OFFSET], %g1 +# define SINGLE_THREAD_P ld [%g7 + MULTIPLE_THREADS_OFFSET], %g1 # endif #elif !defined __ASSEMBLER__ diff --git a/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc32/vfork.S b/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc32/vfork.S index 9378bd8..456fe74 100644 --- a/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc32/vfork.S +++ b/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc32/vfork.S @@ -21,7 +21,7 @@ .text ENTRY(__vfork) - ld [%g6 + MULTIPLE_THREADS_OFFSET], %o0 + ld [%g7 + MULTIPLE_THREADS_OFFSET], %o0 cmp %o0, 0 #ifdef SHARED bne HIDDEN_JUMPTARGET(__fork) diff --git a/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep-cancel.h b/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep-cancel.h index 7d4f9b5..dff728a 100644 --- a/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep-cancel.h +++ b/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep-cancel.h @@ -1,4 +1,4 @@ -/* Copyright (C) 2002 Free Software Foundation, Inc. +/* Copyright (C) 2002, 2003 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Jakub Jelinek <jakub@redhat.com>, 2002. @@ -29,7 +29,7 @@ # define PSEUDO(name, syscall_name, args) \ .text; \ ENTRY(name) \ - ld [%g6 + MULTIPLE_THREADS_OFFSET], %g1; \ + ld [%g7 + MULTIPLE_THREADS_OFFSET], %g1; \ brz,pn %g1, 1f; \ mov SYS_ify(syscall_name), %g1; \ ta 0x6d; \ @@ -85,7 +85,7 @@ SYSCALL_ERROR_HANDLER_ENTRY(__syscall_error_handler2) \ __builtin_expect (THREAD_GETMEM (THREAD_SELF, \ p_header.data.multiple_threads) == 0, 1) # else -# define SINGLE_THREAD_P ld [%g6 + MULTIPLE_THREADS_OFFSET], %g1 +# define SINGLE_THREAD_P ld [%g7 + MULTIPLE_THREADS_OFFSET], %g1 # endif #elif !defined __ASSEMBLER__ diff --git a/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc64/vfork.S b/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc64/vfork.S index bcfcedf..98ad457 100644 --- a/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc64/vfork.S +++ b/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc64/vfork.S @@ -21,7 +21,7 @@ .text ENTRY(__vfork) - ld [%g6 + MULTIPLE_THREADS_OFFSET], %o0 + ld [%g7 + MULTIPLE_THREADS_OFFSET], %o0 #ifdef SHARED cmp %o0, 0 bne HIDDEN_JUMPTARGET (__fork) |