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.
This commit is contained in:
Ulrich Drepper 2003-02-17 20:46:52 +00:00
parent 81b5057288
commit b2740a3b0a
14 changed files with 136 additions and 26 deletions

View File

@ -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> 2003-02-17 Franz Sirl <Franz.Sirl-kernel@lauterbach.com>
* sysdeps/unix/sysv/linux/powerpc/ftruncate64.c: Delete. * sysdeps/unix/sysv/linux/powerpc/ftruncate64.c: Delete.

View File

@ -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> 2003-02-14 Steven Munroe <sjmunroe@us.ibm.com>
* sysdeps/unix/sysv/linux/powerpc/powerpc64/vfork.S (__vfork): * sysdeps/unix/sysv/linux/powerpc/powerpc64/vfork.S (__vfork):

View File

@ -2,3 +2,6 @@ ifeq ($(subdir):$(elf),linuxthreads:yes)
# See CFLAGS-initfini.s above; this is the same code. # See CFLAGS-initfini.s above; this is the same code.
CFLAGS-pt-initfini.s = -g0 -fpic -O1 CFLAGS-pt-initfini.s = -g0 -fpic -O1
endif endif
ifeq ($(subdir),csu)
gen-as-const-headers += tcb-offsets.sym
endif

View File

@ -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. */ need to make sure that the compiler has flushed everything to memory. */
#define MEMORY_BARRIER() __asm__ __volatile__ ("sync" : : : "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 /* Get some notion of the current stack. Need not be exactly the top
of the stack, just something somewhere in the current frame. */ of the stack, just something somewhere in the current frame. */
#define CURRENT_STACK_FRAME stack_pointer #define CURRENT_STACK_FRAME stack_pointer
register char * stack_pointer __asm__ ("r1"); 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. */ /* Compare-and-swap for semaphores. */
/* note that test-and-set(x) is the same as !compare-and-swap(x, 0, 1) */ /* note that test-and-set(x) is the same as !compare-and-swap(x, 0, 1) */

View File

@ -0,0 +1,4 @@
#include <sysdep.h>
#include <tls.h>
MULTIPLE_THREADS_OFFSET offsetof (tcbhead_t, multiple_threads)

View File

@ -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 */

View File

@ -18,6 +18,7 @@
02111-1307 USA. */ 02111-1307 USA. */
#include <sysdep.h> #include <sysdep.h>
#include <tls.h>
#ifndef __ASSEMBLER__ #ifndef __ASSEMBLER__
# include <linuxthreads/internals.h> # include <linuxthreads/internals.h>
#endif #endif
@ -77,32 +78,19 @@
# ifdef IS_IN_libpthread # ifdef IS_IN_libpthread
# define CENABLE bl JUMPTARGET(__pthread_enable_asynccancel) # define CENABLE bl JUMPTARGET(__pthread_enable_asynccancel)
# define CDISABLE bl JUMPTARGET(__pthread_disable_asynccancel) # define CDISABLE bl JUMPTARGET(__pthread_disable_asynccancel)
# define __local_multiple_threads __pthread_multiple_threads
# else # else
# define CENABLE bl JUMPTARGET(__libc_enable_asynccancel) # define CENABLE bl JUMPTARGET(__libc_enable_asynccancel)
# define CDISABLE bl JUMPTARGET(__libc_disable_asynccancel) # define CDISABLE bl JUMPTARGET(__libc_disable_asynccancel)
# define __local_multiple_threads __libc_multiple_threads
# endif # endif
# ifndef __ASSEMBLER__ # ifndef __ASSEMBLER__
extern int __local_multiple_threads attribute_hidden; # define SINGLE_THREAD_P \
# define SINGLE_THREAD_P __builtin_expect (__local_multiple_threads == 0, 1) __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
p_header.data.multiple_threads) == 0, 1)
# else # else
# if !defined PIC # define SINGLE_THREAD_P \
# define SINGLE_THREAD_P \ lwz 10,MULTIPLE_THREADS_OFFSET(2); \
lis 10,__local_multiple_threads@ha; \
lwz 10,__local_multiple_threads@l(10); \
cmpwi 10,0 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 # endif
#elif !defined __ASSEMBLER__ #elif !defined __ASSEMBLER__

View File

@ -33,7 +33,7 @@ extern void *__libc_stack_end;
#ifndef SHARED #ifndef SHARED
# include <tls.h> # include <tls.h>
extern void __pthread_initialize_minimal (void) extern void __pthread_initialize_minimal (void)
# if !(USE_TLS - 0) # if !(USE_TLS - 0) && !defined NONTLS_INIT_TP
__attribute__ ((weak)) __attribute__ ((weak))
# endif # 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 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 handle TLS the function is defined in the libc to initialized the
TLS handling. */ TLS handling. */
# if !(USE_TLS - 0) # if !(USE_TLS - 0) && !defined NONTLS_INIT_TP
if (__pthread_initialize_minimal) if (__pthread_initialize_minimal)
# endif # endif
__pthread_initialize_minimal (); __pthread_initialize_minimal ();

View File

@ -28,7 +28,6 @@ ENTRY (BP_SYM (__longjmp))
CHECK_BOUNDS_BOTH_WIDE_LIT (r3, r8, r9, JB_SIZE) CHECK_BOUNDS_BOTH_WIDE_LIT (r3, r8, r9, JB_SIZE)
lwz r1,(JB_GPR1*4)(r3) lwz r1,(JB_GPR1*4)(r3)
lwz r2,(JB_GPR2*4)(r3)
lwz r0,(JB_LR*4)(r3) lwz r0,(JB_LR*4)(r3)
lwz r14,((JB_GPRS+0)*4)(r3) lwz r14,((JB_GPRS+0)*4)(r3)
lwz r15,((JB_GPRS+1)*4)(r3) lwz r15,((JB_GPRS+1)*4)(r3)

View File

@ -28,7 +28,6 @@ ENTRY (BP_SYM (__longjmp))
CHECK_BOUNDS_BOTH_WIDE_LIT (r3, r8, r9, JB_SIZE) CHECK_BOUNDS_BOTH_WIDE_LIT (r3, r8, r9, JB_SIZE)
lwz r1,(JB_GPR1*4)(r3) lwz r1,(JB_GPR1*4)(r3)
lwz r2,(JB_GPR2*4)(r3)
lwz r0,(JB_LR*4)(r3) lwz r0,(JB_LR*4)(r3)
lwz r14,((JB_GPRS+0)*4)(r3) lwz r14,((JB_GPRS+0)*4)(r3)
lfd fp14,((JB_FPRS+0*2)*4)(r3) lfd fp14,((JB_FPRS+0*2)*4)(r3)

View File

@ -29,7 +29,6 @@ ENTRY (BP_SYM (__sigsetjmp))
stw r1,(JB_GPR1*4)(3) stw r1,(JB_GPR1*4)(3)
mflr r0 mflr r0
stw r2,(JB_GPR2*4)(3)
stw r14,((JB_GPRS+0)*4)(3) stw r14,((JB_GPRS+0)*4)(3)
stfd fp14,((JB_FPRS+0*2)*4)(3) stfd fp14,((JB_FPRS+0*2)*4)(3)
stw r0,(JB_LR*4)(3) stw r0,(JB_LR*4)(3)

View File

@ -29,7 +29,6 @@ ENTRY (BP_SYM (__sigsetjmp))
stw r1,(JB_GPR1*4)(3) stw r1,(JB_GPR1*4)(3)
mflr r0 mflr r0
stw r2,(JB_GPR2*4)(3)
stw r14,((JB_GPRS+0)*4)(3) stw r14,((JB_GPRS+0)*4)(3)
stw r0,(JB_LR*4)(3) stw r0,(JB_LR*4)(3)
stw r15,((JB_GPRS+1)*4)(3) stw r15,((JB_GPRS+1)*4)(3)

View File

@ -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. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or 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 Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */ 02111-1307 USA. */
#include <errno.h>
#include <string.h> #include <string.h>
#include <termios.h> #include <termios.h>
#include <unistd.h> #include <unistd.h>
#include <sys/ioctl.h> #include <sys/ioctl.h>
#include <sys/types.h> #include <sys/types.h>
#include <sysdep.h>
/* The difference here is that the termios structure used in the /* 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 kernel is not the same as we use in the libc. Therefore we must

View File

@ -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. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -21,6 +21,7 @@
#include <termios.h> #include <termios.h>
#include <sys/ioctl.h> #include <sys/ioctl.h>
#include <sys/types.h> #include <sys/types.h>
#include <sysdep.h>
/* The difference here is that the termios structure used in the /* 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 kernel is not the same as we use in the libc. Therefore we must