mirror of
https://sourceware.org/git/glibc.git
synced 2024-12-22 02:40:08 +00:00
Update.
2003-08-31 Ulrich Drepper <drepper@redhat.com> * sysdeps/x86_64/bsd-_setjmp.S: Use HIDDEN_JUMPTARGET. * include/setjmp.h: Add libc_hidden_proto for __sigsetjmp. (CFLAGS-clnt_perr.c): Likewise.
This commit is contained in:
parent
b5bc52efe7
commit
cd2fbe58e6
@ -1,3 +1,8 @@
|
||||
2003-08-31 Ulrich Drepper <drepper@redhat.com>
|
||||
|
||||
* sysdeps/x86_64/bsd-_setjmp.S: Use HIDDEN_JUMPTARGET.
|
||||
* include/setjmp.h: Add libc_hidden_proto for __sigsetjmp.
|
||||
|
||||
2003-08-30 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
* sysdeps/generic/sysdep.h (cfi_window_save, CFI_WINDOW_SAVE): Define.
|
||||
@ -37,6 +42,7 @@
|
||||
* sunrpc/Makefile (CFLAGS-auth_unix.c): Add -fexceptions.
|
||||
(CFLAGS-key_call.c): Likewise.
|
||||
(CFLAGS-pmap_rmt.c): Likewise.
|
||||
(CFLAGS-clnt_perr.c): Likewise.
|
||||
* sunrpc/rpc/auth.h: Remove serveral __THROW.
|
||||
|
||||
* inet/Makefile (CFLAGS-gethstbyad_r.c): Add -fexceptions.
|
||||
|
@ -22,5 +22,6 @@ extern void __libc_longjmp (sigjmp_buf env, int val)
|
||||
libc_hidden_proto (__libc_longjmp)
|
||||
|
||||
libc_hidden_proto (_setjmp)
|
||||
libc_hidden_proto (__sigsetjmp)
|
||||
|
||||
#endif
|
||||
|
@ -1,3 +1,36 @@
|
||||
2003-08-30 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
* sysdeps/unix/sysv/linux/sparc/sparc64/Versions: New file.
|
||||
* sysdeps/unix/sysv/linux/sparc/sparc64/timer_create.c: New file.
|
||||
* sysdeps/unix/sysv/linux/sparc/sparc64/timer_delete.c: New file.
|
||||
* sysdeps/unix/sysv/linux/sparc/sparc64/timer_getoverr.c: New file.
|
||||
* sysdeps/unix/sysv/linux/sparc/sparc64/timer_gettime.c: New file.
|
||||
* sysdeps/unix/sysv/linux/sparc/sparc64/timer_settime.c: New file.
|
||||
* sysdeps/unix/sysv/linux/sparc/sparc64/sysdep-cancel.h: New file.
|
||||
* sysdeps/unix/sysv/linux/sparc/sparc32/sysdep-cancel.h: New file.
|
||||
* sysdeps/unix/sysv/linux/sparc/bits/pthreadtypes.h: New file.
|
||||
* sysdeps/unix/sysv/linux/sparc/bits/semaphore.h: New file.
|
||||
* sysdeps/unix/sysv/linux/sparc/lowlevellock.h: New file.
|
||||
* sysdeps/unix/sysv/linux/sparc/pthread_once.c: New file.
|
||||
* sysdeps/unix/sysv/linux/sparc/pt-vfork.S: New file.
|
||||
* sysdeps/unix/sysv/linux/sparc/fork.c: New file.
|
||||
* sysdeps/unix/sysv/linux/sparc/aio_cancel.c: New file.
|
||||
* sysdeps/sparc/sparc32/sparcv9/pthread_spin_lock.c: New file.
|
||||
* sysdeps/sparc/sparc32/sparcv9/pthread_spin_trylock.c: New file.
|
||||
* sysdeps/sparc/sparc32/sparcv9/pthread_spin_unlock.c: New file.
|
||||
* sysdeps/sparc/sparc32/pthread_spin_lock.c: New file.
|
||||
* sysdeps/sparc/sparc32/pthread_spin_trylock.c: New file.
|
||||
* sysdeps/sparc/sparc32/pthreaddef.h: New file.
|
||||
* sysdeps/sparc/sparc64/pthread_spin_lock.c: New file.
|
||||
* sysdeps/sparc/sparc64/pthread_spin_trylock.c: New file.
|
||||
* sysdeps/sparc/sparc64/pthread_spin_unlock.c: New file.
|
||||
* sysdeps/sparc/sparc64/pthreaddef.h: New file.
|
||||
* sysdeps/sparc/tls.h: New file.
|
||||
* sysdeps/sparc/tcb-offsets.sym: New file.
|
||||
* sysdeps/sparc/Makefile: New file.
|
||||
* sysdeps/sparc/td_ta_map_lwp2thr.c: New file.
|
||||
* init.c [__sparc__] (__NR_set_tid_address): Define.
|
||||
|
||||
2003-08-29 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
* sysdeps/pthread/bits/stdio-lock.h (_IO_acquire_lock,
|
||||
|
@ -46,6 +46,8 @@
|
||||
# define __NR_set_tid_address 218
|
||||
#elif defined __powerpc__
|
||||
# define __NR_set_tid_address 232
|
||||
#elif defined __sparc__
|
||||
# define __NR_set_tid_address 166
|
||||
#else
|
||||
# error "define __NR_set_tid_address"
|
||||
#endif
|
||||
|
3
nptl/sysdeps/sparc/Makefile
Normal file
3
nptl/sysdeps/sparc/Makefile
Normal file
@ -0,0 +1,3 @@
|
||||
ifeq ($(subdir),csu)
|
||||
gen-as-const-headers += tcb-offsets.sym
|
||||
endif
|
40
nptl/sysdeps/sparc/sparc32/pthread_spin_lock.c
Normal file
40
nptl/sysdeps/sparc/sparc32/pthread_spin_lock.c
Normal file
@ -0,0 +1,40 @@
|
||||
/* Copyright (C) 2003 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Jakub Jelinek <jakub@redhat.com>, 2003.
|
||||
|
||||
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. */
|
||||
|
||||
#include "pthreadP.h"
|
||||
|
||||
int
|
||||
pthread_spin_lock (pthread_spinlock_t *lock)
|
||||
{
|
||||
__asm __volatile
|
||||
("1: ldstub [%0], %%g2\n"
|
||||
" orcc %%g2, 0x0, %%g0\n"
|
||||
" bne,a 2f\n"
|
||||
" ldub [%0], %%g2\n"
|
||||
".subsection 2\n"
|
||||
"2: orcc %%g2, 0x0, %%g0\n"
|
||||
" bne,a 2b\n"
|
||||
" ldub [%0], %%g2\n"
|
||||
" b,a 1b\n"
|
||||
".previous"
|
||||
: /* no outputs */
|
||||
: "r" (lock)
|
||||
: "g2", "memory", "cc");
|
||||
return 0;
|
||||
}
|
29
nptl/sysdeps/sparc/sparc32/pthread_spin_trylock.c
Normal file
29
nptl/sysdeps/sparc/sparc32/pthread_spin_trylock.c
Normal file
@ -0,0 +1,29 @@
|
||||
/* Copyright (C) 2003 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Jakub Jelinek <jakub@redhat.com>, 2003.
|
||||
|
||||
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. */
|
||||
|
||||
#include <errno.h>
|
||||
#include "pthreadP.h"
|
||||
|
||||
int
|
||||
pthread_spin_trylock (pthread_spinlock_t *lock)
|
||||
{
|
||||
int res;
|
||||
__asm __volatile ("ldstub [%1], %0" : "=r" (res) : "r" (lock) : "memory");
|
||||
return res == 0 ? 0 : EBUSY;
|
||||
}
|
40
nptl/sysdeps/sparc/sparc32/pthreaddef.h
Normal file
40
nptl/sysdeps/sparc/sparc32/pthreaddef.h
Normal file
@ -0,0 +1,40 @@
|
||||
/* 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. */
|
||||
|
||||
/* Default stack size. */
|
||||
#define ARCH_STACK_DEFAULT_SIZE (2 * 1024 * 1024)
|
||||
|
||||
/* Required stack pointer alignment at beginning. */
|
||||
#define STACK_ALIGN 16
|
||||
|
||||
/* Minimal stack size after allocating thread descriptor and guard size. */
|
||||
#define MINIMAL_REST_STACK 2048
|
||||
|
||||
/* Alignment requirement for TCB. */
|
||||
#define TCB_ALIGNMENT 16
|
||||
|
||||
|
||||
/* Location of current stack frame. */
|
||||
#define CURRENT_STACK_FRAME (stack_pointer + (2 * 64))
|
||||
register char *stack_pointer __asm__("%sp");
|
||||
|
||||
/* XXX Until we have a better place keep the definitions here. */
|
||||
|
||||
/* While there is no such syscall. */
|
||||
#define __exit_thread_inline(val) \
|
||||
INLINE_SYSCALL (exit, 1, (val))
|
39
nptl/sysdeps/sparc/sparc32/sparcv9/pthread_spin_lock.c
Normal file
39
nptl/sysdeps/sparc/sparc32/sparcv9/pthread_spin_lock.c
Normal file
@ -0,0 +1,39 @@
|
||||
/* Copyright (C) 2003 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Jakub Jelinek <jakub@redhat.com>, 2003.
|
||||
|
||||
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. */
|
||||
|
||||
#include "pthreadP.h"
|
||||
|
||||
int
|
||||
pthread_spin_lock (pthread_spinlock_t *lock)
|
||||
{
|
||||
__asm __volatile
|
||||
("1: ldstub [%0], %%g2\n"
|
||||
" brnz,pn %%g2, 2f\n"
|
||||
" membar #StoreLoad | #StoreStore\n"
|
||||
".subsection 2\n"
|
||||
"2: ldub [%0], %%g2\n"
|
||||
" brnz,pt %%g2, 2b\n"
|
||||
" membar #LoadLoad\n"
|
||||
" b,a,pt %%xcc, 1b\n"
|
||||
".previous"
|
||||
: /* no outputs */
|
||||
: "r" (lock)
|
||||
: "g2", "memory");
|
||||
return 0;
|
||||
}
|
@ -0,0 +1 @@
|
||||
#include <sparc64/pthread_spin_trylock.c>
|
1
nptl/sysdeps/sparc/sparc32/sparcv9/pthread_spin_unlock.c
Normal file
1
nptl/sysdeps/sparc/sparc32/sparcv9/pthread_spin_unlock.c
Normal file
@ -0,0 +1 @@
|
||||
#include <sparc64/pthread_spin_unlock.c>
|
39
nptl/sysdeps/sparc/sparc64/pthread_spin_lock.c
Normal file
39
nptl/sysdeps/sparc/sparc64/pthread_spin_lock.c
Normal file
@ -0,0 +1,39 @@
|
||||
/* Copyright (C) 2003 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Jakub Jelinek <jakub@redhat.com>, 2003.
|
||||
|
||||
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. */
|
||||
|
||||
#include "pthreadP.h"
|
||||
|
||||
int
|
||||
pthread_spin_lock (pthread_spinlock_t *lock)
|
||||
{
|
||||
__asm __volatile
|
||||
("1: ldstub [%0], %%g5\n"
|
||||
" brnz,pn %%g5, 2f\n"
|
||||
" membar #StoreLoad | #StoreStore\n"
|
||||
".subsection 2\n"
|
||||
"2: ldub [%0], %%g5\n"
|
||||
" brnz,pt %%g5, 2b\n"
|
||||
" membar #LoadLoad\n"
|
||||
" b,a,pt %%xcc, 1b\n"
|
||||
".previous"
|
||||
: /* no outputs */
|
||||
: "r" (lock)
|
||||
: "g5", "memory");
|
||||
return 0;
|
||||
}
|
34
nptl/sysdeps/sparc/sparc64/pthread_spin_trylock.c
Normal file
34
nptl/sysdeps/sparc/sparc64/pthread_spin_trylock.c
Normal file
@ -0,0 +1,34 @@
|
||||
/* Copyright (C) 2003 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Jakub Jelinek <jakub@redhat.com>, 2003.
|
||||
|
||||
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. */
|
||||
|
||||
#include <errno.h>
|
||||
#include "pthreadP.h"
|
||||
|
||||
int
|
||||
pthread_spin_trylock (pthread_spinlock_t *lock)
|
||||
{
|
||||
int res;
|
||||
__asm __volatile
|
||||
("ldstub [%1], %0\n"
|
||||
"membar #StoreLoad | #StoreStore"
|
||||
: "=r" (res)
|
||||
: "r" (lock)
|
||||
: "memory");
|
||||
return res == 0 ? 0 : EBUSY;
|
||||
}
|
30
nptl/sysdeps/sparc/sparc64/pthread_spin_unlock.c
Normal file
30
nptl/sysdeps/sparc/sparc64/pthread_spin_unlock.c
Normal file
@ -0,0 +1,30 @@
|
||||
/* pthread_spin_unlock -- unlock a spin lock. Generic version.
|
||||
Copyright (C) 2003 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Paul Mackerras <paulus@au.ibm.com>, 2003.
|
||||
|
||||
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. */
|
||||
|
||||
#include "pthreadP.h"
|
||||
#include <atomic.h>
|
||||
|
||||
int
|
||||
pthread_spin_unlock (pthread_spinlock_t *lock)
|
||||
{
|
||||
__asm __volatile ("membar #StoreStore | #LoadStore");
|
||||
*lock = 0;
|
||||
return 0;
|
||||
}
|
40
nptl/sysdeps/sparc/sparc64/pthreaddef.h
Normal file
40
nptl/sysdeps/sparc/sparc64/pthreaddef.h
Normal file
@ -0,0 +1,40 @@
|
||||
/* 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. */
|
||||
|
||||
/* Default stack size. */
|
||||
#define ARCH_STACK_DEFAULT_SIZE (4 * 1024 * 1024)
|
||||
|
||||
/* Required stack pointer alignment at beginning. */
|
||||
#define STACK_ALIGN 16
|
||||
|
||||
/* Minimal stack size after allocating thread descriptor and guard size. */
|
||||
#define MINIMAL_REST_STACK 4096
|
||||
|
||||
/* Alignment requirement for TCB. */
|
||||
#define TCB_ALIGNMENT 16
|
||||
|
||||
|
||||
/* Location of current stack frame. */
|
||||
#define CURRENT_STACK_FRAME (stack_pointer + (2 * 128))
|
||||
register char *stack_pointer __asm__("%sp");
|
||||
|
||||
/* XXX Until we have a better place keep the definitions here. */
|
||||
|
||||
/* While there is no such syscall. */
|
||||
#define __exit_thread_inline(val) \
|
||||
INLINE_SYSCALL (exit, 1, (val))
|
4
nptl/sysdeps/sparc/tcb-offsets.sym
Normal file
4
nptl/sysdeps/sparc/tcb-offsets.sym
Normal file
@ -0,0 +1,4 @@
|
||||
#include <sysdep.h>
|
||||
#include <tls.h>
|
||||
|
||||
MULTIPLE_THREADS_OFFSET offsetof (tcbhead_t, multiple_threads)
|
44
nptl/sysdeps/sparc/td_ta_map_lwp2thr.c
Normal file
44
nptl/sysdeps/sparc/td_ta_map_lwp2thr.c
Normal file
@ -0,0 +1,44 @@
|
||||
/* Which thread is running on an LWP? SPARC 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. */
|
||||
|
||||
#include "thread_dbP.h"
|
||||
#include <tls.h>
|
||||
|
||||
|
||||
td_err_e
|
||||
td_ta_map_lwp2thr (const td_thragent_t *ta, lwpid_t lwpid, td_thrhandle_t *th)
|
||||
{
|
||||
LOG ("td_ta_map_lwp2thr");
|
||||
|
||||
/* Test whether the TA parameter is ok. */
|
||||
if (! ta_ok (ta))
|
||||
return TD_BADTA;
|
||||
|
||||
prgregset_t regs;
|
||||
if (ps_lgetregs (ta->ph, lwpid, regs) != PS_OK)
|
||||
return TD_ERR;
|
||||
|
||||
/* SPARC thread register is %g7. */
|
||||
th->th_unique = (void *) regs[7];
|
||||
|
||||
/* Found it. Now complete the `td_thrhandle_t' object. */
|
||||
th->th_ta_p = (td_thragent_t *) ta;
|
||||
|
||||
return TD_OK;
|
||||
}
|
119
nptl/sysdeps/sparc/tls.h
Normal file
119
nptl/sysdeps/sparc/tls.h
Normal file
@ -0,0 +1,119 @@
|
||||
/* Definitions for thread-local data handling. NPTL/sparc 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
|
||||
|
||||
#include <dl-sysdep.h>
|
||||
#ifndef __ASSEMBLER__
|
||||
# include <stddef.h>
|
||||
# include <stdint.h>
|
||||
# include <stdlib.h>
|
||||
# include <list.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;
|
||||
int multiple_threads;
|
||||
} tcbhead_t;
|
||||
|
||||
#else /* __ASSEMBLER__ */
|
||||
# include <tcb-offsets.h>
|
||||
#endif /* __ASSEMBLER__ */
|
||||
|
||||
/* We require TLS support in the tools. */
|
||||
#ifndef HAVE_TLS_SUPPORT
|
||||
# error "TLS support is required."
|
||||
#endif
|
||||
|
||||
/* 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 <nptl/descr.h>
|
||||
|
||||
register struct pthread *__thread_self __asm__("%g7");
|
||||
|
||||
/* 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)
|
||||
|
||||
/* Alignment requirements for the TCB. */
|
||||
# define TLS_TCB_ALIGN __alignof__ (struct pthread)
|
||||
|
||||
/* 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)
|
||||
|
||||
/* Return the thread descriptor for the current thread. */
|
||||
#define THREAD_SELF __thread_self
|
||||
|
||||
/* Access to data in the thread descriptor is easy. */
|
||||
#define THREAD_GETMEM(descr, member) \
|
||||
descr->member
|
||||
#define THREAD_GETMEM_NC(descr, member, idx) \
|
||||
descr->member[idx]
|
||||
#define THREAD_SETMEM(descr, member, value) \
|
||||
descr->member = (value)
|
||||
#define THREAD_SETMEM_NC(descr, member, idx, value) \
|
||||
descr->member[idx] = (value)
|
||||
|
||||
#endif /* !ASSEMBLER */
|
||||
|
||||
#endif /* tls.h */
|
33
nptl/sysdeps/unix/sysv/linux/sparc/aio_cancel.c
Normal file
33
nptl/sysdeps/unix/sysv/linux/sparc/aio_cancel.c
Normal file
@ -0,0 +1,33 @@
|
||||
#include <shlib-compat.h>
|
||||
|
||||
#define aio_cancel64 XXX
|
||||
#include <aio.h>
|
||||
#undef aio_cancel64
|
||||
#include <errno.h>
|
||||
|
||||
extern __typeof (aio_cancel) __new_aio_cancel;
|
||||
extern __typeof (aio_cancel) __old_aio_cancel;
|
||||
|
||||
#define aio_cancel __new_aio_cancel
|
||||
|
||||
#include <sysdeps/pthread/aio_cancel.c>
|
||||
|
||||
#undef aio_cancel
|
||||
strong_alias (__new_aio_cancel, __new_aio_cancel64);
|
||||
versioned_symbol (librt, __new_aio_cancel, aio_cancel, GLIBC_2_3);
|
||||
versioned_symbol (librt, __new_aio_cancel64, aio_cancel64, GLIBC_2_3);
|
||||
|
||||
#if SHLIB_COMPAT (librt, GLIBC_2_1, GLIBC_2_3)
|
||||
|
||||
#undef ECANCELED
|
||||
#define aio_cancel __old_aio_cancel
|
||||
#define ECANCELED 125
|
||||
|
||||
#include <sysdeps/pthread/aio_cancel.c>
|
||||
|
||||
#undef aio_cancel
|
||||
strong_alias (__old_aio_cancel, __old_aio_cancel64);
|
||||
compat_symbol (librt, __old_aio_cancel, aio_cancel, GLIBC_2_1);
|
||||
compat_symbol (librt, __old_aio_cancel64, aio_cancel64, GLIBC_2_1);
|
||||
|
||||
#endif
|
193
nptl/sysdeps/unix/sysv/linux/sparc/bits/pthreadtypes.h
Normal file
193
nptl/sysdeps/unix/sysv/linux/sparc/bits/pthreadtypes.h
Normal file
@ -0,0 +1,193 @@
|
||||
/* Machine-specific pthread type layouts. SPARC version.
|
||||
Copyright (C) 2003 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Jakub Jelinek <jakub@redhat.com>, 2003.
|
||||
|
||||
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 _BITS_PTHREADTYPES_H
|
||||
#define _BITS_PTHREADTYPES_H 1
|
||||
|
||||
#include <bits/wordsize.h>
|
||||
|
||||
#if __WORDSIZE == 64
|
||||
# define __SIZEOF_PTHREAD_ATTR_T 56
|
||||
# define __SIZEOF_PTHREAD_MUTEX_T 40
|
||||
# define __SIZEOF_PTHREAD_MUTEXATTR_T 4
|
||||
# define __SIZEOF_PTHREAD_COND_T 48
|
||||
# define __SIZEOF_PTHREAD_CONDATTR_T 4
|
||||
# define __SIZEOF_PTHREAD_RWLOCK_T 56
|
||||
# define __SIZEOF_PTHREAD_RWLOCKATTR_T 8
|
||||
# define __SIZEOF_PTHREAD_BARRIER_T 32
|
||||
# define __SIZEOF_PTHREAD_BARRIERATTR_T 4
|
||||
#else
|
||||
# define __SIZEOF_PTHREAD_ATTR_T 36
|
||||
# define __SIZEOF_PTHREAD_MUTEX_T 24
|
||||
# define __SIZEOF_PTHREAD_MUTEXATTR_T 4
|
||||
# define __SIZEOF_PTHREAD_COND_T 48
|
||||
# define __SIZEOF_PTHREAD_CONDATTR_T 4
|
||||
# define __SIZEOF_PTHREAD_RWLOCK_T 32
|
||||
# define __SIZEOF_PTHREAD_RWLOCKATTR_T 8
|
||||
# define __SIZEOF_PTHREAD_BARRIER_T 20
|
||||
# define __SIZEOF_PTHREAD_BARRIERATTR_T 4
|
||||
#endif
|
||||
|
||||
|
||||
/* Thread identifiers. The structure of the attribute type is
|
||||
deliberately not exposed. */
|
||||
typedef struct __opaque_pthread *pthread_t;
|
||||
|
||||
|
||||
typedef union
|
||||
{
|
||||
char __size[__SIZEOF_PTHREAD_ATTR_T];
|
||||
long int __align;
|
||||
} pthread_attr_t;
|
||||
|
||||
|
||||
/* Data structures for mutex handling. The structure of the attribute
|
||||
type is deliberately not exposed. */
|
||||
typedef union
|
||||
{
|
||||
struct
|
||||
{
|
||||
int __lock;
|
||||
unsigned int __count;
|
||||
int __owner;
|
||||
#if __WORDSIZE == 64
|
||||
unsigned int __nusers;
|
||||
#endif
|
||||
/* KIND must stay at this position in the structure to maintain
|
||||
binary compatibility. */
|
||||
int __kind;
|
||||
#if __WORDSIZE != 64
|
||||
unsigned int __nusers;
|
||||
#endif
|
||||
} __data;
|
||||
char __size[__SIZEOF_PTHREAD_MUTEX_T];
|
||||
long int __align;
|
||||
} pthread_mutex_t;
|
||||
|
||||
typedef union
|
||||
{
|
||||
char __size[__SIZEOF_PTHREAD_MUTEXATTR_T];
|
||||
int __align;
|
||||
} pthread_mutexattr_t;
|
||||
|
||||
|
||||
/* Data structure for conditional variable handling. The structure of
|
||||
the attribute type is deliberately not exposed. */
|
||||
typedef union
|
||||
{
|
||||
struct
|
||||
{
|
||||
int __lock;
|
||||
int __clock;
|
||||
unsigned long long int __total_seq;
|
||||
unsigned long long int __wakeup_seq;
|
||||
unsigned long long int __woken_seq;
|
||||
void *__mutex;
|
||||
} __data;
|
||||
char __size[__SIZEOF_PTHREAD_COND_T];
|
||||
long long int __align;
|
||||
} pthread_cond_t;
|
||||
|
||||
typedef union
|
||||
{
|
||||
char __size[__SIZEOF_PTHREAD_CONDATTR_T];
|
||||
int __align;
|
||||
} pthread_condattr_t;
|
||||
|
||||
|
||||
/* Keys for thread-specific data */
|
||||
typedef unsigned int pthread_key_t;
|
||||
|
||||
|
||||
/* Once-only execution */
|
||||
typedef int pthread_once_t;
|
||||
|
||||
|
||||
#ifdef __USE_UNIX98
|
||||
/* Data structure for read-write lock variable handling. The
|
||||
structure of the attribute type is deliberately not exposed. */
|
||||
typedef union
|
||||
{
|
||||
# if __WORDSIZE == 64
|
||||
struct
|
||||
{
|
||||
int __lock;
|
||||
unsigned int __nr_readers;
|
||||
unsigned int __readers_wakeup;
|
||||
unsigned int __writer_wakeup;
|
||||
unsigned int __nr_readers_queued;
|
||||
unsigned int __nr_writers_queued;
|
||||
int __writer;
|
||||
int __pad1;
|
||||
unsigned long int __pad2;
|
||||
unsigned long int __pad3;
|
||||
/* FLAGS must stay at this position in the structure to maintain
|
||||
binary compatibility. */
|
||||
unsigned int __flags;
|
||||
} __data;
|
||||
# else
|
||||
struct
|
||||
{
|
||||
int __lock;
|
||||
unsigned int __nr_readers;
|
||||
unsigned int __readers_wakeup;
|
||||
unsigned int __writer_wakeup;
|
||||
unsigned int __nr_readers_queued;
|
||||
unsigned int __nr_writers_queued;
|
||||
/* FLAGS must stay at this position in the structure to maintain
|
||||
binary compatibility. */
|
||||
unsigned int __flags;
|
||||
int __writer;
|
||||
} __data;
|
||||
# endif
|
||||
char __size[__SIZEOF_PTHREAD_RWLOCK_T];
|
||||
long int __align;
|
||||
} pthread_rwlock_t;
|
||||
|
||||
typedef union
|
||||
{
|
||||
char __size[__SIZEOF_PTHREAD_RWLOCKATTR_T];
|
||||
long int __align;
|
||||
} pthread_rwlockattr_t;
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef __USE_XOPEN2K
|
||||
/* POSIX spinlock data type. */
|
||||
typedef volatile int pthread_spinlock_t;
|
||||
|
||||
|
||||
/* POSIX barriers data type. The structure of the type is
|
||||
deliberately not exposed. */
|
||||
typedef union
|
||||
{
|
||||
char __size[__SIZEOF_PTHREAD_BARRIER_T];
|
||||
long int __align;
|
||||
} pthread_barrier_t;
|
||||
|
||||
typedef union
|
||||
{
|
||||
char __size[__SIZEOF_PTHREAD_BARRIERATTR_T];
|
||||
int __align;
|
||||
} pthread_barrierattr_t;
|
||||
#endif
|
||||
|
||||
|
||||
#endif /* bits/pthreadtypes.h */
|
44
nptl/sysdeps/unix/sysv/linux/sparc/bits/semaphore.h
Normal file
44
nptl/sysdeps/unix/sysv/linux/sparc/bits/semaphore.h
Normal file
@ -0,0 +1,44 @@
|
||||
/* Machine-specific POSIX semaphore type layouts. SPARC version.
|
||||
Copyright (C) 2003 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Jakub Jelinek <jakub@redhat.com>, 2003.
|
||||
|
||||
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 _SEMAPHORE_H
|
||||
# error "Never use <bits/semaphore.h> directly; include <semaphore.h> instead."
|
||||
#endif
|
||||
|
||||
#include <bits/wordsize.h>
|
||||
|
||||
#if __WORDSIZE == 64
|
||||
# define __SIZEOF_SEM_T 32
|
||||
#else
|
||||
# define __SIZEOF_SEM_T 16
|
||||
#endif
|
||||
|
||||
/* Value returned if `sem_open' failed. */
|
||||
#define SEM_FAILED ((sem_t *) 0)
|
||||
|
||||
/* Maximum value the semaphore can have. */
|
||||
#define SEM_VALUE_MAX ((int) ((~0u) >> 1))
|
||||
|
||||
|
||||
typedef union
|
||||
{
|
||||
char __size[__SIZEOF_SEM_T];
|
||||
long int __align;
|
||||
} sem_t;
|
29
nptl/sysdeps/unix/sysv/linux/sparc/fork.c
Normal file
29
nptl/sysdeps/unix/sysv/linux/sparc/fork.c
Normal file
@ -0,0 +1,29 @@
|
||||
/* Copyright (C) 2003 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Jakub Jelinek <jakub@redhat.com>, 2003.
|
||||
|
||||
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. */
|
||||
|
||||
#include <sched.h>
|
||||
#include <signal.h>
|
||||
#include <sysdep.h>
|
||||
#include <tls.h>
|
||||
|
||||
#define ARCH_FORK() \
|
||||
INLINE_CLONE_SYSCALL (CLONE_CHILD_SETTID | CLONE_CHILD_CLEARTID | SIGCHLD, \
|
||||
0, NULL, NULL, &THREAD_SELF->tid)
|
||||
|
||||
#include "../fork.c"
|
222
nptl/sysdeps/unix/sysv/linux/sparc/lowlevellock.h
Normal file
222
nptl/sysdeps/unix/sysv/linux/sparc/lowlevellock.h
Normal file
@ -0,0 +1,222 @@
|
||||
/* Copyright (C) 2003 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Jakub Jelinek <jakub@redhat.com>, 2003.
|
||||
|
||||
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 Libr \ary; if not, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#ifndef _LOWLEVELLOCK_H
|
||||
#define _LOWLEVELLOCK_H 1
|
||||
|
||||
#include <time.h>
|
||||
#include <sys/param.h>
|
||||
#include <bits/pthreadtypes.h>
|
||||
#include <atomic.h>
|
||||
|
||||
|
||||
#define FUTEX_WAIT 0
|
||||
#define FUTEX_WAKE 1
|
||||
#define FUTEX_REQUEUE 3
|
||||
|
||||
/* Initializer for compatibility lock. */
|
||||
#define LLL_MUTEX_LOCK_INITIALIZER (0)
|
||||
|
||||
#define lll_futex_wait(futexp, val) \
|
||||
({ \
|
||||
INTERNAL_SYSCALL_DECL (__err); \
|
||||
long int __ret; \
|
||||
\
|
||||
__ret = INTERNAL_SYSCALL (futex, __err, 4, \
|
||||
(futexp), FUTEX_WAIT, (val), 0); \
|
||||
__ret; \
|
||||
})
|
||||
|
||||
#define lll_futex_timed_wait(futexp, val, timespec) \
|
||||
({ \
|
||||
INTERNAL_SYSCALL_DECL (__err); \
|
||||
long int __ret; \
|
||||
\
|
||||
__ret = INTERNAL_SYSCALL (futex, __err, 4, \
|
||||
(futexp), FUTEX_WAIT, (val), (timespec)); \
|
||||
__ret; \
|
||||
})
|
||||
|
||||
#define lll_futex_wake(futexp, nr) \
|
||||
({ \
|
||||
INTERNAL_SYSCALL_DECL (__err); \
|
||||
long int __ret; \
|
||||
\
|
||||
__ret = INTERNAL_SYSCALL (futex, __err, 4, \
|
||||
(futexp), FUTEX_WAKE, (nr), 0); \
|
||||
__ret; \
|
||||
})
|
||||
|
||||
#define lll_futex_requeue(futexp, nr_wake, nr_move, mutex) \
|
||||
({ \
|
||||
INTERNAL_SYSCALL_DECL (__err); \
|
||||
long int __ret; \
|
||||
\
|
||||
__ret = INTERNAL_SYSCALL (futex, __err, 5, \
|
||||
(futexp), FUTEX_REQUEUE, (nr_wake), (nr_move), \
|
||||
(mutex)); \
|
||||
__ret; \
|
||||
})
|
||||
|
||||
#ifdef __sparc32_atomic_do_lock
|
||||
#error SPARC < v9 does not support compare and swap which is essential for futex based locking
|
||||
#endif
|
||||
|
||||
static inline int
|
||||
__attribute__ ((always_inline))
|
||||
__lll_mutex_trylock (int *futex)
|
||||
{
|
||||
return atomic_compare_and_exchange_val_acq (futex, 1, 0) != 0;
|
||||
}
|
||||
#define lll_mutex_trylock(futex) __lll_mutex_trylock (&(futex))
|
||||
|
||||
|
||||
extern void __lll_lock_wait (int *futex, int val) attribute_hidden;
|
||||
|
||||
|
||||
static inline void
|
||||
__attribute__ ((always_inline))
|
||||
__lll_mutex_lock (int *futex)
|
||||
{
|
||||
int val = atomic_exchange_and_add (futex, 1);
|
||||
|
||||
if (__builtin_expect (val != 0, 0))
|
||||
__lll_lock_wait (futex, val);
|
||||
}
|
||||
#define lll_mutex_lock(futex) __lll_mutex_lock (&(futex))
|
||||
|
||||
|
||||
static inline void
|
||||
__attribute__ ((always_inline))
|
||||
__lll_mutex_cond_lock (int *futex)
|
||||
{
|
||||
int val = atomic_exchange_and_add (futex, 2);
|
||||
|
||||
if (__builtin_expect (val != 0, 0))
|
||||
/* Note, the val + 1 is kind of ugly here. __lll_lock_wait will add
|
||||
1 again. But we added 2 to the futex value so this is the right
|
||||
value which will be passed to the kernel. */
|
||||
__lll_lock_wait (futex, val + 1);
|
||||
}
|
||||
#define lll_mutex_cond_lock(futex) __lll_mutex_cond_lock (&(futex))
|
||||
|
||||
|
||||
extern int __lll_timedlock_wait (int *futex, int val, const struct timespec *)
|
||||
attribute_hidden;
|
||||
|
||||
|
||||
static inline int
|
||||
__attribute__ ((always_inline))
|
||||
__lll_mutex_timedlock (int *futex, const struct timespec *abstime)
|
||||
{
|
||||
int val = atomic_exchange_and_add (futex, 1);
|
||||
int result = 0;
|
||||
|
||||
if (__builtin_expect (val != 0, 0))
|
||||
result = __lll_timedlock_wait (futex, val, abstime);
|
||||
|
||||
return result;
|
||||
}
|
||||
#define lll_mutex_timedlock(futex, abstime) \
|
||||
__lll_mutex_timedlock (&(futex), abstime)
|
||||
|
||||
#define lll_mutex_unlock(lock) \
|
||||
((void) ({ \
|
||||
int *__futex = &(lock); \
|
||||
int __val = atomic_exchange_rel (__futex, 0); \
|
||||
if (__builtin_expect (__val > 1, 0)) \
|
||||
lll_futex_wake (__futex, 1); \
|
||||
}))
|
||||
|
||||
#define lll_mutex_unlock_force(lock) \
|
||||
((void) ({ \
|
||||
int *__futex = &(lock); \
|
||||
(void) atomic_exchange_rel (__futex, 0); \
|
||||
lll_futex_wake (__futex, 1); \
|
||||
}))
|
||||
|
||||
#define lll_mutex_islocked(futex) \
|
||||
(futex != 0)
|
||||
|
||||
|
||||
/* We have a separate internal lock implementation which is not tied
|
||||
to binary compatibility. We can use the lll_mutex_*. */
|
||||
|
||||
/* Type for lock object. */
|
||||
typedef int lll_lock_t;
|
||||
|
||||
extern int lll_unlock_wake_cb (int *__futex) attribute_hidden;
|
||||
|
||||
/* Initializers for lock. */
|
||||
#define LLL_LOCK_INITIALIZER (0)
|
||||
#define LLL_LOCK_INITIALIZER_LOCKED (1)
|
||||
|
||||
#define lll_trylock(futex) lll_mutex_trylock (futex)
|
||||
#define lll_lock(futex) lll_mutex_lock (futex)
|
||||
#define lll_unlock(futex) lll_mutex_unlock (futex)
|
||||
#define lll_islocked(futex) lll_mutex_islocked (futex)
|
||||
|
||||
|
||||
/* The kernel notifies a process with uses CLONE_CLEARTID via futex
|
||||
wakeup when the clone terminates. The memory location contains the
|
||||
thread ID while the clone is running and is reset to zero
|
||||
afterwards. */
|
||||
#define lll_wait_tid(tid) \
|
||||
do \
|
||||
{ \
|
||||
__typeof (tid) __tid; \
|
||||
while ((__tid = (tid)) != 0) \
|
||||
lll_futex_wait (&(tid), __tid); \
|
||||
} \
|
||||
while (0)
|
||||
|
||||
extern int __lll_timedwait_tid (int *, const struct timespec *)
|
||||
attribute_hidden;
|
||||
|
||||
#define lll_timedwait_tid(tid, abstime) \
|
||||
({ \
|
||||
int __res = 0; \
|
||||
if ((tid) != 0) \
|
||||
__res = __lll_timedwait_tid (&(tid), (abstime)); \
|
||||
__res; \
|
||||
})
|
||||
|
||||
|
||||
/* Conditional variable handling. */
|
||||
|
||||
extern void __lll_cond_wait (pthread_cond_t *cond)
|
||||
attribute_hidden;
|
||||
extern int __lll_cond_timedwait (pthread_cond_t *cond,
|
||||
const struct timespec *abstime)
|
||||
attribute_hidden;
|
||||
extern void __lll_cond_wake (pthread_cond_t *cond)
|
||||
attribute_hidden;
|
||||
extern void __lll_cond_broadcast (pthread_cond_t *cond)
|
||||
attribute_hidden;
|
||||
|
||||
#define lll_cond_wait(cond) \
|
||||
__lll_cond_wait (cond)
|
||||
#define lll_cond_timedwait(cond, abstime) \
|
||||
__lll_cond_timedwait (cond, abstime)
|
||||
#define lll_cond_wake(cond) \
|
||||
__lll_cond_wake (cond)
|
||||
#define lll_cond_broadcast(cond) \
|
||||
__lll_cond_broadcast (cond)
|
||||
|
||||
#endif /* lowlevellock.h */
|
28
nptl/sysdeps/unix/sysv/linux/sparc/pt-vfork.S
Normal file
28
nptl/sysdeps/unix/sysv/linux/sparc/pt-vfork.S
Normal file
@ -0,0 +1,28 @@
|
||||
/* Copyright (C) 1999, 2002, 2003 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Jakub Jelinek <jj@ultra.linux.cz>, 1999.
|
||||
|
||||
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. */
|
||||
|
||||
#include <sysdep.h>
|
||||
|
||||
PSEUDO (__vfork, vfork, 0)
|
||||
sub %o1, 1, %o1
|
||||
retl
|
||||
and %o0, %o1, %o0
|
||||
|
||||
PSEUDO_END (__vfork)
|
||||
weak_alias (__vfork, vfork)
|
94
nptl/sysdeps/unix/sysv/linux/sparc/pthread_once.c
Normal file
94
nptl/sysdeps/unix/sysv/linux/sparc/pthread_once.c
Normal file
@ -0,0 +1,94 @@
|
||||
/* Copyright (C) 2003 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Jakub Jelinek <jakub@redhat.com>, 2003.
|
||||
|
||||
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. */
|
||||
|
||||
#include "pthreadP.h"
|
||||
#include <lowlevellock.h>
|
||||
|
||||
|
||||
unsigned long int __fork_generation attribute_hidden;
|
||||
|
||||
|
||||
static void
|
||||
clear_once_control (void *arg)
|
||||
{
|
||||
pthread_once_t *once_control = (pthread_once_t *) arg;
|
||||
|
||||
*once_control = 0;
|
||||
lll_futex_wake (once_control, INT_MAX);
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
__pthread_once (once_control, init_routine)
|
||||
pthread_once_t *once_control;
|
||||
void (*init_routine) (void);
|
||||
{
|
||||
while (1)
|
||||
{
|
||||
int oldval, val, newval;
|
||||
|
||||
val = *once_control;
|
||||
do
|
||||
{
|
||||
/* Check if the initialized has already been done. */
|
||||
if ((val & 2) != 0)
|
||||
return 0;
|
||||
|
||||
oldval = val;
|
||||
newval = (oldval & 3) | __fork_generation | 1;
|
||||
val = atomic_compare_and_exchange_val_acq (once_control, newval,
|
||||
oldval);
|
||||
}
|
||||
while (__builtin_expect (val != oldval, 0));
|
||||
|
||||
/* Check if another thread already runs the initializer. */
|
||||
if ((oldval & 1) != 0)
|
||||
{
|
||||
/* Check whether the initializer execution was interrupted
|
||||
by a fork. */
|
||||
if (((oldval ^ newval) & -4) == 0)
|
||||
{
|
||||
/* Same generation, some other thread was faster. Wait. */
|
||||
lll_futex_wait (once_control, newval);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
/* This thread is the first here. Do the initialization.
|
||||
Register a cleanup handler so that in case the thread gets
|
||||
interrupted the initialization can be restarted. */
|
||||
pthread_cleanup_push (clear_once_control, once_control);
|
||||
|
||||
init_routine ();
|
||||
|
||||
pthread_cleanup_pop (0);
|
||||
|
||||
|
||||
/* Add one to *once_control. */
|
||||
atomic_exchange_and_add (once_control, 1);
|
||||
|
||||
/* Wake up all other threads. */
|
||||
lll_futex_wake (once_control, INT_MAX);
|
||||
break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
weak_alias (__pthread_once, pthread_once)
|
||||
strong_alias (__pthread_once, __pthread_once_internal)
|
107
nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep-cancel.h
Normal file
107
nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep-cancel.h
Normal file
@ -0,0 +1,107 @@
|
||||
/* 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.
|
||||
|
||||
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. */
|
||||
|
||||
#include <sysdep.h>
|
||||
#include <tls.h>
|
||||
#ifndef __ASSEMBLER__
|
||||
# include <nptl/pthreadP.h>
|
||||
#endif
|
||||
|
||||
#if !defined NOT_IN_libc || defined IS_IN_libpthread || defined IS_IN_librt
|
||||
|
||||
# undef PSEUDO
|
||||
# define PSEUDO(name, syscall_name, args) \
|
||||
.text; \
|
||||
ENTRY(name) \
|
||||
ld [%g7 + MULTIPLE_THREADS_OFFSET], %g1; \
|
||||
cmp %g1, 0; \
|
||||
bne 1f; \
|
||||
mov SYS_ify(syscall_name), %g1; \
|
||||
ta 0x10; \
|
||||
bcs __syscall_error_handler; \
|
||||
nop; \
|
||||
.subsection 2; \
|
||||
cfi_startproc; \
|
||||
1: save %sp, -96, %sp; \
|
||||
cfi_def_cfa_register (%fp); \
|
||||
cfi_window_save; \
|
||||
cfi_register (%o7, %i7); \
|
||||
CENABLE; \
|
||||
nop; \
|
||||
mov %o0, %l0; \
|
||||
COPY_ARGS_##args \
|
||||
mov SYS_ify(syscall_name), %g1; \
|
||||
ta 0x10; \
|
||||
bcs __syscall_error_handler2; \
|
||||
mov %o0, %l1; \
|
||||
CDISABLE; \
|
||||
mov %l0, %o0; \
|
||||
jmpl %i7 + 8, %g0; \
|
||||
restore %g0, %l1, %o0; \
|
||||
cfi_endproc; \
|
||||
.previous; \
|
||||
SYSCALL_ERROR_HANDLER \
|
||||
SYSCALL_ERROR_HANDLER2
|
||||
|
||||
#define SYSCALL_ERROR_HANDLER2 \
|
||||
SYSCALL_ERROR_HANDLER_ENTRY(__syscall_error_handler2) \
|
||||
.global __errno_location; \
|
||||
.type __errno_location,@function; \
|
||||
call __errno_location; \
|
||||
nop; \
|
||||
st %l1, [%o0]; \
|
||||
jmpl %i7 + 8, %g0; \
|
||||
restore %g0, -1, %o0; \
|
||||
.previous;
|
||||
|
||||
# ifdef IS_IN_libpthread
|
||||
# define CENABLE call __pthread_enable_asynccancel
|
||||
# define CDISABLE call __pthread_disable_asynccancel
|
||||
# elif !defined NOT_IN_libc
|
||||
# define CENABLE call __libc_enable_asynccancel
|
||||
# define CDISABLE call __libc_disable_asynccancel
|
||||
# elif defined IS_IN_librt
|
||||
# define CENABLE call __librt_enable_asynccancel
|
||||
# define CDISABLE call __librt_disable_asynccancel
|
||||
# else
|
||||
# error Unsupported library
|
||||
# endif
|
||||
|
||||
#define COPY_ARGS_0 /* Nothing */
|
||||
#define COPY_ARGS_1 COPY_ARGS_0 mov %i0, %o0;
|
||||
#define COPY_ARGS_2 COPY_ARGS_1 mov %i1, %o1;
|
||||
#define COPY_ARGS_3 COPY_ARGS_2 mov %i2, %o2;
|
||||
#define COPY_ARGS_4 COPY_ARGS_3 mov %i3, %o3;
|
||||
#define COPY_ARGS_5 COPY_ARGS_4 mov %i4, %o4;
|
||||
#define COPY_ARGS_6 COPY_ARGS_5 mov %i5, %o5;
|
||||
|
||||
# ifndef __ASSEMBLER__
|
||||
# define SINGLE_THREAD_P \
|
||||
__builtin_expect (THREAD_GETMEM (THREAD_SELF, \
|
||||
header.multiple_threads) == 0, 1)
|
||||
# else
|
||||
# define SINGLE_THREAD_P ld [%g7 + MULTIPLE_THREADS_OFFSET], %g1
|
||||
# endif
|
||||
|
||||
#elif !defined __ASSEMBLER__
|
||||
|
||||
/* This code should never be used but we define it anyhow. */
|
||||
# define SINGLE_THREAD_P (1)
|
||||
|
||||
#endif
|
7
nptl/sysdeps/unix/sysv/linux/sparc/sparc64/Versions
Normal file
7
nptl/sysdeps/unix/sysv/linux/sparc/sparc64/Versions
Normal file
@ -0,0 +1,7 @@
|
||||
librt {
|
||||
GLIBC_2.3.3 {
|
||||
# Changed timer_t.
|
||||
timer_create; timer_delete; timer_getoverrun; timer_gettime;
|
||||
timer_settime;
|
||||
}
|
||||
}
|
101
nptl/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep-cancel.h
Normal file
101
nptl/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep-cancel.h
Normal file
@ -0,0 +1,101 @@
|
||||
/* 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.
|
||||
|
||||
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. */
|
||||
|
||||
#include <sysdep.h>
|
||||
#include <tls.h>
|
||||
#ifndef __ASSEMBLER__
|
||||
# include <nptl/pthreadP.h>
|
||||
#endif
|
||||
|
||||
#if !defined NOT_IN_libc || defined IS_IN_libpthread || defined IS_IN_librt
|
||||
|
||||
# undef PSEUDO
|
||||
# define PSEUDO(name, syscall_name, args) \
|
||||
.text; \
|
||||
ENTRY(name) \
|
||||
ld [%g7 + MULTIPLE_THREADS_OFFSET], %g1; \
|
||||
brnz,pn %g1, 1f; \
|
||||
mov SYS_ify(syscall_name), %g1; \
|
||||
ta 0x6d; \
|
||||
bcs,pn %xcc, __syscall_error_handler; \
|
||||
nop; \
|
||||
.subsection 2; \
|
||||
1: save %sp, -192, %sp; \
|
||||
CENABLE; \
|
||||
nop; \
|
||||
mov %o0, %l0; \
|
||||
COPY_ARGS_##args \
|
||||
mov SYS_ify(syscall_name), %g1; \
|
||||
ta 0x6d; \
|
||||
bcs,pn %xcc, __syscall_error_handler2; \
|
||||
mov %o0, %l1; \
|
||||
CDISABLE; \
|
||||
mov %l0, %o0; \
|
||||
jmpl %i7 + 8, %g0; \
|
||||
restore %g0, %l1, %o0; \
|
||||
.previous; \
|
||||
SYSCALL_ERROR_HANDLER \
|
||||
SYSCALL_ERROR_HANDLER2
|
||||
|
||||
#define SYSCALL_ERROR_HANDLER2 \
|
||||
SYSCALL_ERROR_HANDLER_ENTRY(__syscall_error_handler2) \
|
||||
.global __errno_location; \
|
||||
.type __errno_location,@function; \
|
||||
call __errno_location; \
|
||||
nop; \
|
||||
st %l1, [%o0]; \
|
||||
jmpl %i7 + 8, %g0; \
|
||||
restore %g0, -1, %o0; \
|
||||
.previous;
|
||||
|
||||
# ifdef IS_IN_libpthread
|
||||
# define CENABLE call __pthread_enable_asynccancel
|
||||
# define CDISABLE call __pthread_disable_asynccancel
|
||||
# elif !defined NOT_IN_libc
|
||||
# define CENABLE call __libc_enable_asynccancel
|
||||
# define CDISABLE call __libc_disable_asynccancel
|
||||
# elif defined IS_IN_librt
|
||||
# define CENABLE call __librt_enable_asynccancel
|
||||
# define CDISABLE call __librt_disable_asynccancel
|
||||
# else
|
||||
# error Unsupported library
|
||||
# endif
|
||||
|
||||
#define COPY_ARGS_0 /* Nothing */
|
||||
#define COPY_ARGS_1 COPY_ARGS_0 mov %i0, %o0;
|
||||
#define COPY_ARGS_2 COPY_ARGS_1 mov %i1, %o1;
|
||||
#define COPY_ARGS_3 COPY_ARGS_2 mov %i2, %o2;
|
||||
#define COPY_ARGS_4 COPY_ARGS_3 mov %i3, %o3;
|
||||
#define COPY_ARGS_5 COPY_ARGS_4 mov %i4, %o4;
|
||||
#define COPY_ARGS_6 COPY_ARGS_5 mov %i5, %o5;
|
||||
|
||||
# ifndef __ASSEMBLER__
|
||||
# define SINGLE_THREAD_P \
|
||||
__builtin_expect (THREAD_GETMEM (THREAD_SELF, \
|
||||
header.multiple_threads) == 0, 1)
|
||||
# else
|
||||
# define SINGLE_THREAD_P ld [%g7 + MULTIPLE_THREADS_OFFSET], %g1
|
||||
# endif
|
||||
|
||||
#elif !defined __ASSEMBLER__
|
||||
|
||||
/* This code should never be used but we define it anyhow. */
|
||||
# define SINGLE_THREAD_P (1)
|
||||
|
||||
#endif
|
@ -0,0 +1 @@
|
||||
#include "../../x86_64/timer_create.c"
|
@ -0,0 +1 @@
|
||||
#include "../../x86_64/timer_delete.c"
|
@ -0,0 +1 @@
|
||||
#include "../../x86_64/timer_getoverr.c"
|
@ -0,0 +1 @@
|
||||
#include "../../x86_64/timer_gettime.c"
|
@ -0,0 +1 @@
|
||||
#include "../../x86_64/timer_settime.c"
|
@ -121,6 +121,7 @@ CFLAGS-xkey_prot.c = -Wno-unused
|
||||
CFLAGS-auth_unix.c = -fexceptions
|
||||
CFLAGS-key_call.c = -fexceptions
|
||||
CFLAGS-pmap_rmt.c = -fexceptions
|
||||
CFLAGS-clnt_perr.c = -fexceptions
|
||||
|
||||
ifeq (yes,$(have_doors))
|
||||
CPPFLAGS-key_call.c += -DHAVE_DOORS=1
|
||||
|
@ -128,4 +128,22 @@
|
||||
__o0; \
|
||||
})
|
||||
|
||||
#define INLINE_CLONE_SYSCALL(arg1,arg2,arg3,arg4,arg5) \
|
||||
({ \
|
||||
register long __o0 __asm__ ("o0") = (long)(arg1); \
|
||||
register long __o1 __asm__ ("o1") = (long)(arg2); \
|
||||
register long __o2 __asm__ ("o2") = (long)(arg3); \
|
||||
register long __o3 __asm__ ("o3") = (long)(arg4); \
|
||||
register long __o4 __asm__ ("o4") = (long)(arg5); \
|
||||
register long __g1 __asm__ ("g1") = __NR_clone; \
|
||||
__asm __volatile (__CLONE_SYSCALL_STRING : \
|
||||
"=r" (__g1), "=r" (__o0), "=r" (__o1) : \
|
||||
"0" (__g1), "1" (__o0), "2" (__o1), \
|
||||
"r" (__o2), "r" (__o3), "r" (__o4) : \
|
||||
__SYSCALL_CLOBBERS); \
|
||||
__o0; \
|
||||
})
|
||||
|
||||
|
||||
|
||||
#endif /* _LINUX_SPARC_SYSDEP_H */
|
||||
|
@ -31,8 +31,8 @@
|
||||
ENTRY (BP_SYM (_setjmp))
|
||||
/* Set up arguments, we only need to set the second arg. */
|
||||
xorq %rsi, %rsi
|
||||
#ifdef PIC
|
||||
jmp __GI___sigsetjmp
|
||||
#ifdef PIC
|
||||
jmp HIDDEN_JUMPTARGET (__sigsetjmp)
|
||||
#else
|
||||
jmp BP_SYM (__sigsetjmp)
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user