diff options
| author | Mike Frysinger <vapier@gentoo.org> | 2005-02-15 01:44:34 +0000 | 
|---|---|---|
| committer | Mike Frysinger <vapier@gentoo.org> | 2005-02-15 01:44:34 +0000 | 
| commit | 9e167b421380b59278df44caf64e5800ef6e7f4d (patch) | |
| tree | a5f75ef9b3ad67ac87b5662c1895d0d9842989b6 /libpthread/linuxthreads/sysdeps | |
| parent | 1271f242c654c5a5a4d64bf599e73fada417f62e (diff) | |
some test header files for x86_64
Diffstat (limited to 'libpthread/linuxthreads/sysdeps')
| -rw-r--r-- | libpthread/linuxthreads/sysdeps/x86_64/pt-machine.h | 86 | ||||
| -rw-r--r-- | libpthread/linuxthreads/sysdeps/x86_64/tls.h | 129 | 
2 files changed, 215 insertions, 0 deletions
diff --git a/libpthread/linuxthreads/sysdeps/x86_64/pt-machine.h b/libpthread/linuxthreads/sysdeps/x86_64/pt-machine.h new file mode 100644 index 000000000..8a2d1a762 --- /dev/null +++ b/libpthread/linuxthreads/sysdeps/x86_64/pt-machine.h @@ -0,0 +1,86 @@ +/* Machine-dependent pthreads configuration and inline functions. +   x86-64 version. +   Copyright (C) 2001, 2002, 2003, 2004 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 _PT_MACHINE_H +#define _PT_MACHINE_H   1 + +#ifndef __ASSEMBLER__ +# include <stddef.h>	/* For offsetof.  */ +# include <stdlib.h>	/* For abort().  */ +# include <asm/prctl.h> + + +# ifndef PT_EI +#  define PT_EI extern inline __attribute__ ((always_inline)) +# endif + +extern long int testandset (int *spinlock); +extern int __compare_and_swap (long int *p, long int oldval, long int newval); + +/* 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__ ("%rsp") __attribute_used__; + + +/* Spinlock implementation; required.  */ +PT_EI long int +testandset (int *spinlock) +{ +  long int ret; + +  __asm__ __volatile__ ( +	"xchgl %k0, %1" +	: "=r"(ret), "=m"(*spinlock) +	: "0"(1), "m"(*spinlock) +	: "memory"); + +  return ret; +} + + +/* Compare-and-swap for semaphores.  */ +# define HAS_COMPARE_AND_SWAP + +PT_EI int +__compare_and_swap (long int *p, long int oldval, long int newval) +{ +  char ret; +  long int readval; + +  __asm__ __volatile__ ("lock; cmpxchgq %3, %1; sete %0" +			: "=q" (ret), "=m" (*p), "=a" (readval) +			: "r" (newval), "m" (*p), "a" (oldval) +			: "memory"); +  return ret; +} + +#endif /* !__ASSEMBLER__ */ + +/* 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	32*1024*1024 + +/* The ia32e really want some help to prevent overheating.  */ +#define BUSY_WAIT_NOP	__asm__ ("rep; nop") + +#endif /* pt-machine.h */ diff --git a/libpthread/linuxthreads/sysdeps/x86_64/tls.h b/libpthread/linuxthreads/sysdeps/x86_64/tls.h new file mode 100644 index 000000000..63feebdb2 --- /dev/null +++ b/libpthread/linuxthreads/sysdeps/x86_64/tls.h @@ -0,0 +1,129 @@ +/* Definitions for thread-local data handling.  linuxthreads/x86-64 version. +   Copyright (C) 2002 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 + + +#ifdef HAVE_TLS_SUPPORT + +/* 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) \ +  ({ struct _pthread_descr_struct *__descr;				      \ +     THREAD_SETMEM (__descr, p_header.data.dtvp, (dtv)); }) + +/* Return dtv of given thread descriptor.  */ +#  define GET_DTV(descr) \ +  (((tcbhead_t *) (descr))->dtv) + +/* Code to initially initialize the thread pointer.  This might need +   special attention since 'errno' is not yet available and if the +   operation can cause a failure 'errno' must not be touched.  */ +# define TLS_INIT_TP(descr, secondcall)					      \ +  ({									      \ +    void *_descr = (descr);						      \ +    tcbhead_t *head = _descr;						      \ +    long int _result;							      \ +									      \ +    head->tcb = _descr;							      \ +    /* For now the thread descriptor is at the same address.  */	      \ +    head->self = _descr;						      \ +									      \ +    asm volatile ("syscall"						      \ +		  : "=a" (_result)					      \ +		  : "0" ((unsigned long int) __NR_arch_prctl),		      \ +		    "D" ((unsigned long int) ARCH_SET_FS),		      \ +		    "S" (_descr)					      \ +		  : "memory", "cc", "r11", "cx");			      \ +									      \ +    _result ? "cannot set %fs base address for thread-local storage" : 0;     \ +  }) + +/* Indicate that dynamic linker shouldn't try to initialize TLS even +   when no PT_TLS segments are found in the program and libraries +   it is linked against.  */ +#  define TLS_INIT_TP_EXPENSIVE 1 + +/* Return the address of the dtv for the current thread.  */ +#  define THREAD_DTV() \ +  ({ struct _pthread_descr_struct *__descr;				      \ +     THREAD_GETMEM (__descr, p_header.data.dtvp); }) + +# endif	/* HAVE_TLS_SUPPORT */ +#endif /* __ASSEMBLER__ */ + +#endif	/* tls.h */  | 
