diff options
-rw-r--r-- | ChangeLog | 9 | ||||
-rw-r--r-- | linuxthreads/ChangeLog | 18 | ||||
-rw-r--r-- | linuxthreads/sysdeps/powerpc/Makefile | 3 | ||||
-rw-r--r-- | linuxthreads/sysdeps/powerpc/powerpc32/pt-machine.h | 26 | ||||
-rw-r--r-- | linuxthreads/sysdeps/powerpc/tcb-offsets.sym | 4 | ||||
-rw-r--r-- | linuxthreads/sysdeps/powerpc/tls.h | 63 | ||||
-rw-r--r-- | linuxthreads/sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep-cancel.h | 24 | ||||
-rw-r--r-- | sysdeps/powerpc/elf/libc-start.c | 4 | ||||
-rw-r--r-- | sysdeps/powerpc/powerpc32/__longjmp.S | 1 | ||||
-rw-r--r-- | sysdeps/powerpc/powerpc32/fpu/__longjmp.S | 1 | ||||
-rw-r--r-- | sysdeps/powerpc/powerpc32/fpu/setjmp.S | 1 | ||||
-rw-r--r-- | sysdeps/powerpc/powerpc32/setjmp.S | 1 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/tcgetattr.c | 4 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/tcsetattr.c | 3 |
14 files changed, 136 insertions, 26 deletions
@@ -1,3 +1,12 @@ +2003-02-17 Kevin B. Hendricks <kevin.hendricks@sympatico.ca> + Franz Sirl <Franz.Sirl-kernel@lauterbach.com> + + * sysdeps/powerpc/elf/libc-start.c: Handle NONTLS_INIT_TP. + * sysdeps/powerpc/powerpc32/__longjmp.S: Remove R2 handling. + * sysdeps/powerpc/powerpc32/setjmp.S: Likewise. + * sysdeps/powerpc/powerpc32/fpu/__longjmp.S: Likewise. + * sysdeps/powerpc/powerpc32/fpu/setjmp.S: Likewise. + 2003-02-17 Franz Sirl <Franz.Sirl-kernel@lauterbach.com> * sysdeps/unix/sysv/linux/powerpc/ftruncate64.c: Delete. diff --git a/linuxthreads/ChangeLog b/linuxthreads/ChangeLog index 4f1d89909f..5a187ab57e 100644 --- a/linuxthreads/ChangeLog +++ b/linuxthreads/ChangeLog @@ -1,3 +1,21 @@ +2003-02-17 Kevin B. Hendricks <kevin.hendricks@sympatico.ca> + Franz Sirl <Franz.Sirl-kernel@lauterbach.com> + + * sysdeps/powerpc/Makefile: Handle tcb-offsets.sym. + * sysdeps/powerpc/tcb-offsets.sym: New file. + * sysdeps/powerpc/tls.h: New file. + * sysdeps/powerpc/powerpc32/pt-machine.h (FLOATING_STACKS): Define. + (ARCH_STACK_MAX_SIZE): Define. + (THREAD_SELF): Define. + (INIT_THREAD_SELF): Define. + (THREAD_GETMEM): Define. + (THREAD_GETMEM_NC): Define. + (THREAD_SETMEM): Define. + (THREAD_SETMEM_NC): Define. + (__thread_self): Declare. + * sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep-cancel.h: Adjust + for thread register. + 2003-02-14 Steven Munroe <sjmunroe@us.ibm.com> * sysdeps/unix/sysv/linux/powerpc/powerpc64/vfork.S (__vfork): diff --git a/linuxthreads/sysdeps/powerpc/Makefile b/linuxthreads/sysdeps/powerpc/Makefile index 37eb22ed34..33e4aceb5b 100644 --- a/linuxthreads/sysdeps/powerpc/Makefile +++ b/linuxthreads/sysdeps/powerpc/Makefile @@ -2,3 +2,6 @@ ifeq ($(subdir):$(elf),linuxthreads:yes) # See CFLAGS-initfini.s above; this is the same code. CFLAGS-pt-initfini.s = -g0 -fpic -O1 endif +ifeq ($(subdir),csu) +gen-as-const-headers += tcb-offsets.sym +endif diff --git a/linuxthreads/sysdeps/powerpc/powerpc32/pt-machine.h b/linuxthreads/sysdeps/powerpc/powerpc32/pt-machine.h index 19b77b7e6a..f38f466bc3 100644 --- a/linuxthreads/sysdeps/powerpc/powerpc32/pt-machine.h +++ b/linuxthreads/sysdeps/powerpc/powerpc32/pt-machine.h @@ -36,11 +36,37 @@ extern int __compare_and_swap (long int *p, long int oldval, long int newval); need to make sure that the compiler has flushed everything to memory. */ #define MEMORY_BARRIER() __asm__ __volatile__ ("sync" : : : "memory") +/* We want the OS to assign stack addresses. */ +#define FLOATING_STACKS 1 + +/* Maximum size of the stack if the rlimit is unlimited. */ +#define ARCH_STACK_MAX_SIZE 8*1024*1024 + /* Get some notion of the current stack. Need not be exactly the top of the stack, just something somewhere in the current frame. */ #define CURRENT_STACK_FRAME stack_pointer register char * stack_pointer __asm__ ("r1"); +/* Register r2 (tp) is reserved by the ABI as "thread pointer". */ +struct _pthread_descr_struct; +register struct _pthread_descr_struct *__thread_self __asm__("r2"); + +/* Return the thread descriptor for the current thread. */ +#define THREAD_SELF __thread_self + +/* Initialize the thread-unique value. */ +#define INIT_THREAD_SELF(descr, nr) (__thread_self = (descr)) + +/* Access to data in the thread descriptor is easy. */ +#define THREAD_GETMEM(descr, member) \ + ((void) (descr), THREAD_SELF->member) +#define THREAD_GETMEM_NC(descr, member) \ + ((void) (descr), THREAD_SELF->member) +#define THREAD_SETMEM(descr, member, value) \ + ((void) (descr), THREAD_SELF->member = (value)) +#define THREAD_SETMEM_NC(descr, member, value) \ + ((void) (descr), THREAD_SELF->member = (value)) + /* Compare-and-swap for semaphores. */ /* note that test-and-set(x) is the same as !compare-and-swap(x, 0, 1) */ diff --git a/linuxthreads/sysdeps/powerpc/tcb-offsets.sym b/linuxthreads/sysdeps/powerpc/tcb-offsets.sym new file mode 100644 index 0000000000..aee6be2570 --- /dev/null +++ b/linuxthreads/sysdeps/powerpc/tcb-offsets.sym @@ -0,0 +1,4 @@ +#include <sysdep.h> +#include <tls.h> + +MULTIPLE_THREADS_OFFSET offsetof (tcbhead_t, multiple_threads) diff --git a/linuxthreads/sysdeps/powerpc/tls.h b/linuxthreads/sysdeps/powerpc/tls.h new file mode 100644 index 0000000000..5b234d9882 --- /dev/null +++ b/linuxthreads/sysdeps/powerpc/tls.h @@ -0,0 +1,63 @@ +/* Definitions for thread-local data handling. linuxthreads/PPC version. + Copyright (C) 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 + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#ifndef _TLS_H +#define _TLS_H + +#ifndef __ASSEMBLER__ + +# include <pt-machine.h> +# include <stddef.h> + +/* Type for the dtv. */ +typedef union dtv +{ + size_t counter; + void *pointer; +} dtv_t; + +typedef struct +{ + void *tcb; /* Pointer to the TCB. Not necessary the + thread descriptor used by libpthread. */ + dtv_t *dtv; + void *self; /* Pointer to the thread descriptor. */ + int multiple_threads; +} tcbhead_t; + +#else /* __ASSEMBLER__ */ +# include <tcb-offsets.h> +#endif /* __ASSEMBLER__ */ + +#undef USE_TLS + +#if USE_TLS + +#else + +#define NONTLS_INIT_TP \ + do { \ + static const tcbhead_t nontls_init_tp \ + = { .multiple_threads = 0 }; \ + __thread_self = (__typeof (__thread_self)) &nontls_init_tp; \ + } while (0) + +#endif /* USE_TLS */ + +#endif /* tls.h */ diff --git a/linuxthreads/sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep-cancel.h b/linuxthreads/sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep-cancel.h index 94da65fdb0..155ea47d84 100644 --- a/linuxthreads/sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep-cancel.h +++ b/linuxthreads/sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep-cancel.h @@ -18,6 +18,7 @@ 02111-1307 USA. */ #include <sysdep.h> +#include <tls.h> #ifndef __ASSEMBLER__ # include <linuxthreads/internals.h> #endif @@ -77,32 +78,19 @@ # ifdef IS_IN_libpthread # define CENABLE bl JUMPTARGET(__pthread_enable_asynccancel) # define CDISABLE bl JUMPTARGET(__pthread_disable_asynccancel) -# define __local_multiple_threads __pthread_multiple_threads # else # define CENABLE bl JUMPTARGET(__libc_enable_asynccancel) # define CDISABLE bl JUMPTARGET(__libc_disable_asynccancel) -# define __local_multiple_threads __libc_multiple_threads # endif # ifndef __ASSEMBLER__ -extern int __local_multiple_threads attribute_hidden; -# define SINGLE_THREAD_P __builtin_expect (__local_multiple_threads == 0, 1) +# define SINGLE_THREAD_P \ + __builtin_expect (THREAD_GETMEM (THREAD_SELF, \ + p_header.data.multiple_threads) == 0, 1) # else -# if !defined PIC -# define SINGLE_THREAD_P \ - lis 10,__local_multiple_threads@ha; \ - lwz 10,__local_multiple_threads@l(10); \ +# define SINGLE_THREAD_P \ + lwz 10,MULTIPLE_THREADS_OFFSET(2); \ cmpwi 10,0 -# else -# define SINGLE_THREAD_P \ - mflr 9; \ - bl _GLOBAL_OFFSET_TABLE_@local-4; \ - mflr 10; \ - mtlr 9; \ - lwz 10,__local_multiple_threads@got(10); \ - lwz 10,0(10); \ - cmpwi 10,0 -# endif # endif #elif !defined __ASSEMBLER__ diff --git a/sysdeps/powerpc/elf/libc-start.c b/sysdeps/powerpc/elf/libc-start.c index 4878979f43..6f61770bf2 100644 --- a/sysdeps/powerpc/elf/libc-start.c +++ b/sysdeps/powerpc/elf/libc-start.c @@ -33,7 +33,7 @@ extern void *__libc_stack_end; #ifndef SHARED # include <tls.h> extern void __pthread_initialize_minimal (void) -# if !(USE_TLS - 0) +# if !(USE_TLS - 0) && !defined NONTLS_INIT_TP __attribute__ ((weak)) # endif ; @@ -134,7 +134,7 @@ BP_SYM (__libc_start_main) (int argc, char *__unbounded *__unbounded ubp_av, we need to setup errno. If there is no thread library and we handle TLS the function is defined in the libc to initialized the TLS handling. */ -# if !(USE_TLS - 0) +# if !(USE_TLS - 0) && !defined NONTLS_INIT_TP if (__pthread_initialize_minimal) # endif __pthread_initialize_minimal (); diff --git a/sysdeps/powerpc/powerpc32/__longjmp.S b/sysdeps/powerpc/powerpc32/__longjmp.S index c9d2a2d02d..5a3d1d8180 100644 --- a/sysdeps/powerpc/powerpc32/__longjmp.S +++ b/sysdeps/powerpc/powerpc32/__longjmp.S @@ -28,7 +28,6 @@ ENTRY (BP_SYM (__longjmp)) CHECK_BOUNDS_BOTH_WIDE_LIT (r3, r8, r9, JB_SIZE) lwz r1,(JB_GPR1*4)(r3) - lwz r2,(JB_GPR2*4)(r3) lwz r0,(JB_LR*4)(r3) lwz r14,((JB_GPRS+0)*4)(r3) lwz r15,((JB_GPRS+1)*4)(r3) diff --git a/sysdeps/powerpc/powerpc32/fpu/__longjmp.S b/sysdeps/powerpc/powerpc32/fpu/__longjmp.S index 7b2dc26cb8..de100445fa 100644 --- a/sysdeps/powerpc/powerpc32/fpu/__longjmp.S +++ b/sysdeps/powerpc/powerpc32/fpu/__longjmp.S @@ -28,7 +28,6 @@ ENTRY (BP_SYM (__longjmp)) CHECK_BOUNDS_BOTH_WIDE_LIT (r3, r8, r9, JB_SIZE) lwz r1,(JB_GPR1*4)(r3) - lwz r2,(JB_GPR2*4)(r3) lwz r0,(JB_LR*4)(r3) lwz r14,((JB_GPRS+0)*4)(r3) lfd fp14,((JB_FPRS+0*2)*4)(r3) diff --git a/sysdeps/powerpc/powerpc32/fpu/setjmp.S b/sysdeps/powerpc/powerpc32/fpu/setjmp.S index b6c63663f4..871ae28625 100644 --- a/sysdeps/powerpc/powerpc32/fpu/setjmp.S +++ b/sysdeps/powerpc/powerpc32/fpu/setjmp.S @@ -29,7 +29,6 @@ ENTRY (BP_SYM (__sigsetjmp)) stw r1,(JB_GPR1*4)(3) mflr r0 - stw r2,(JB_GPR2*4)(3) stw r14,((JB_GPRS+0)*4)(3) stfd fp14,((JB_FPRS+0*2)*4)(3) stw r0,(JB_LR*4)(3) diff --git a/sysdeps/powerpc/powerpc32/setjmp.S b/sysdeps/powerpc/powerpc32/setjmp.S index 47dc693e49..9c9729a8dd 100644 --- a/sysdeps/powerpc/powerpc32/setjmp.S +++ b/sysdeps/powerpc/powerpc32/setjmp.S @@ -29,7 +29,6 @@ ENTRY (BP_SYM (__sigsetjmp)) stw r1,(JB_GPR1*4)(3) mflr r0 - stw r2,(JB_GPR2*4)(3) stw r14,((JB_GPRS+0)*4)(3) stw r0,(JB_LR*4)(3) stw r15,((JB_GPRS+1)*4)(3) diff --git a/sysdeps/unix/sysv/linux/tcgetattr.c b/sysdeps/unix/sysv/linux/tcgetattr.c index dbbd4bb277..8a6fd59cd4 100644 --- a/sysdeps/unix/sysv/linux/tcgetattr.c +++ b/sysdeps/unix/sysv/linux/tcgetattr.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1992, 1995, 1997, 1998 Free Software Foundation, Inc. +/* Copyright (C) 1992, 1995, 1997, 1998, 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 @@ -16,11 +16,13 @@ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ +#include <errno.h> #include <string.h> #include <termios.h> #include <unistd.h> #include <sys/ioctl.h> #include <sys/types.h> +#include <sysdep.h> /* The difference here is that the termios structure used in the kernel is not the same as we use in the libc. Therefore we must diff --git a/sysdeps/unix/sysv/linux/tcsetattr.c b/sysdeps/unix/sysv/linux/tcsetattr.c index a961052202..a5eab4df2a 100644 --- a/sysdeps/unix/sysv/linux/tcsetattr.c +++ b/sysdeps/unix/sysv/linux/tcsetattr.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1993, 1996, 1997, 1998, 2002 Free Software Foundation, Inc. +/* Copyright (C) 1993,1996,1997,1998,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 @@ -21,6 +21,7 @@ #include <termios.h> #include <sys/ioctl.h> #include <sys/types.h> +#include <sysdep.h> /* The difference here is that the termios structure used in the kernel is not the same as we use in the libc. Therefore we must |