From 45262aeedf2f56dcd3b30e37630ea85bb4f55603 Mon Sep 17 00:00:00 2001 From: Roland McGrath Date: Thu, 12 Jun 2014 09:05:54 -0700 Subject: Move SH code out of nptl/ subdirectory. --- ChangeLog | 68 ++ nptl/sysdeps/sh/Makefile | 3 - nptl/sysdeps/sh/pthread_spin_init.c | 19 - nptl/sysdeps/sh/pthread_spin_lock.c | 34 - nptl/sysdeps/sh/pthread_spin_trylock.S | 31 - nptl/sysdeps/sh/pthread_spin_unlock.S | 29 - nptl/sysdeps/sh/pthreaddef.h | 34 - nptl/sysdeps/sh/tcb-offsets.sym | 15 - nptl/sysdeps/sh/tls.h | 179 ----- .../sysdeps/unix/sysv/linux/sh/libc-lowlevellock.S | 18 - nptl/sysdeps/unix/sysv/linux/sh/lowlevel-atomic.h | 80 --- nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.S | 574 --------------- nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.h | 419 ----------- .../unix/sysv/linux/sh/lowlevelrobustlock.S | 278 -------- .../unix/sysv/linux/sh/pthread_barrier_wait.S | 239 ------- .../unix/sysv/linux/sh/pthread_cond_broadcast.S | 292 -------- .../unix/sysv/linux/sh/pthread_cond_signal.S | 202 ------ .../unix/sysv/linux/sh/pthread_cond_timedwait.S | 769 --------------------- .../sysdeps/unix/sysv/linux/sh/pthread_cond_wait.S | 687 ------------------ nptl/sysdeps/unix/sysv/linux/sh/pthread_once.S | 257 ------- .../unix/sysv/linux/sh/pthread_rwlock_rdlock.S | 270 -------- .../sysv/linux/sh/pthread_rwlock_timedrdlock.S | 339 --------- .../sysv/linux/sh/pthread_rwlock_timedwrlock.S | 323 --------- .../unix/sysv/linux/sh/pthread_rwlock_unlock.S | 221 ------ .../unix/sysv/linux/sh/pthread_rwlock_wrlock.S | 252 ------- nptl/sysdeps/unix/sysv/linux/sh/sem_post.S | 111 --- nptl/sysdeps/unix/sysv/linux/sh/sem_timedwait.S | 281 -------- nptl/sysdeps/unix/sysv/linux/sh/sem_trywait.S | 102 --- nptl/sysdeps/unix/sysv/linux/sh/sem_wait.S | 229 ------ nptl/sysdeps/unix/sysv/linux/sh/sh4/lowlevellock.h | 4 - nptl/sysdeps/unix/sysv/linux/sh/smp.h | 23 - nptl/sysdeps/unix/sysv/linux/sh/sysdep-cancel.h | 169 ----- sysdeps/sh/Makefile | 4 + sysdeps/sh/nptl/pthread_spin_init.c | 19 + sysdeps/sh/nptl/pthread_spin_lock.c | 34 + sysdeps/sh/nptl/pthread_spin_trylock.S | 31 + sysdeps/sh/nptl/pthread_spin_unlock.S | 29 + sysdeps/sh/nptl/pthreaddef.h | 34 + sysdeps/sh/nptl/tcb-offsets.sym | 15 + sysdeps/sh/nptl/tls.h | 179 +++++ sysdeps/unix/sysv/linux/sh/libc-lowlevellock.S | 18 + sysdeps/unix/sysv/linux/sh/lowlevel-atomic.h | 80 +++ sysdeps/unix/sysv/linux/sh/lowlevellock.S | 574 +++++++++++++++ sysdeps/unix/sysv/linux/sh/lowlevellock.h | 419 +++++++++++ sysdeps/unix/sysv/linux/sh/lowlevelrobustlock.S | 278 ++++++++ sysdeps/unix/sysv/linux/sh/pthread_barrier_wait.S | 239 +++++++ .../unix/sysv/linux/sh/pthread_cond_broadcast.S | 292 ++++++++ sysdeps/unix/sysv/linux/sh/pthread_cond_signal.S | 201 ++++++ .../unix/sysv/linux/sh/pthread_cond_timedwait.S | 769 +++++++++++++++++++++ sysdeps/unix/sysv/linux/sh/pthread_cond_wait.S | 687 ++++++++++++++++++ sysdeps/unix/sysv/linux/sh/pthread_once.S | 257 +++++++ sysdeps/unix/sysv/linux/sh/pthread_rwlock_rdlock.S | 270 ++++++++ .../sysv/linux/sh/pthread_rwlock_timedrdlock.S | 339 +++++++++ .../sysv/linux/sh/pthread_rwlock_timedwrlock.S | 323 +++++++++ sysdeps/unix/sysv/linux/sh/pthread_rwlock_unlock.S | 221 ++++++ sysdeps/unix/sysv/linux/sh/pthread_rwlock_wrlock.S | 252 +++++++ sysdeps/unix/sysv/linux/sh/sem_post.S | 111 +++ sysdeps/unix/sysv/linux/sh/sem_timedwait.S | 281 ++++++++ sysdeps/unix/sysv/linux/sh/sem_trywait.S | 102 +++ sysdeps/unix/sysv/linux/sh/sem_wait.S | 229 ++++++ sysdeps/unix/sysv/linux/sh/sh4/lowlevellock.h | 4 + sysdeps/unix/sysv/linux/sh/smp.h | 23 + sysdeps/unix/sysv/linux/sh/sysdep-cancel.h | 169 +++++ 63 files changed, 6551 insertions(+), 6483 deletions(-) delete mode 100644 nptl/sysdeps/sh/Makefile delete mode 100644 nptl/sysdeps/sh/pthread_spin_init.c delete mode 100644 nptl/sysdeps/sh/pthread_spin_lock.c delete mode 100644 nptl/sysdeps/sh/pthread_spin_trylock.S delete mode 100644 nptl/sysdeps/sh/pthread_spin_unlock.S delete mode 100644 nptl/sysdeps/sh/pthreaddef.h delete mode 100644 nptl/sysdeps/sh/tcb-offsets.sym delete mode 100644 nptl/sysdeps/sh/tls.h delete mode 100644 nptl/sysdeps/unix/sysv/linux/sh/libc-lowlevellock.S delete mode 100644 nptl/sysdeps/unix/sysv/linux/sh/lowlevel-atomic.h delete mode 100644 nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.S delete mode 100644 nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.h delete mode 100644 nptl/sysdeps/unix/sysv/linux/sh/lowlevelrobustlock.S delete mode 100644 nptl/sysdeps/unix/sysv/linux/sh/pthread_barrier_wait.S delete mode 100644 nptl/sysdeps/unix/sysv/linux/sh/pthread_cond_broadcast.S delete mode 100644 nptl/sysdeps/unix/sysv/linux/sh/pthread_cond_signal.S delete mode 100644 nptl/sysdeps/unix/sysv/linux/sh/pthread_cond_timedwait.S delete mode 100644 nptl/sysdeps/unix/sysv/linux/sh/pthread_cond_wait.S delete mode 100644 nptl/sysdeps/unix/sysv/linux/sh/pthread_once.S delete mode 100644 nptl/sysdeps/unix/sysv/linux/sh/pthread_rwlock_rdlock.S delete mode 100644 nptl/sysdeps/unix/sysv/linux/sh/pthread_rwlock_timedrdlock.S delete mode 100644 nptl/sysdeps/unix/sysv/linux/sh/pthread_rwlock_timedwrlock.S delete mode 100644 nptl/sysdeps/unix/sysv/linux/sh/pthread_rwlock_unlock.S delete mode 100644 nptl/sysdeps/unix/sysv/linux/sh/pthread_rwlock_wrlock.S delete mode 100644 nptl/sysdeps/unix/sysv/linux/sh/sem_post.S delete mode 100644 nptl/sysdeps/unix/sysv/linux/sh/sem_timedwait.S delete mode 100644 nptl/sysdeps/unix/sysv/linux/sh/sem_trywait.S delete mode 100644 nptl/sysdeps/unix/sysv/linux/sh/sem_wait.S delete mode 100644 nptl/sysdeps/unix/sysv/linux/sh/sh4/lowlevellock.h delete mode 100644 nptl/sysdeps/unix/sysv/linux/sh/smp.h delete mode 100644 nptl/sysdeps/unix/sysv/linux/sh/sysdep-cancel.h create mode 100644 sysdeps/sh/nptl/pthread_spin_init.c create mode 100644 sysdeps/sh/nptl/pthread_spin_lock.c create mode 100644 sysdeps/sh/nptl/pthread_spin_trylock.S create mode 100644 sysdeps/sh/nptl/pthread_spin_unlock.S create mode 100644 sysdeps/sh/nptl/pthreaddef.h create mode 100644 sysdeps/sh/nptl/tcb-offsets.sym create mode 100644 sysdeps/sh/nptl/tls.h create mode 100644 sysdeps/unix/sysv/linux/sh/libc-lowlevellock.S create mode 100644 sysdeps/unix/sysv/linux/sh/lowlevel-atomic.h create mode 100644 sysdeps/unix/sysv/linux/sh/lowlevellock.S create mode 100644 sysdeps/unix/sysv/linux/sh/lowlevellock.h create mode 100644 sysdeps/unix/sysv/linux/sh/lowlevelrobustlock.S create mode 100644 sysdeps/unix/sysv/linux/sh/pthread_barrier_wait.S create mode 100644 sysdeps/unix/sysv/linux/sh/pthread_cond_broadcast.S create mode 100644 sysdeps/unix/sysv/linux/sh/pthread_cond_signal.S create mode 100644 sysdeps/unix/sysv/linux/sh/pthread_cond_timedwait.S create mode 100644 sysdeps/unix/sysv/linux/sh/pthread_cond_wait.S create mode 100644 sysdeps/unix/sysv/linux/sh/pthread_once.S create mode 100644 sysdeps/unix/sysv/linux/sh/pthread_rwlock_rdlock.S create mode 100644 sysdeps/unix/sysv/linux/sh/pthread_rwlock_timedrdlock.S create mode 100644 sysdeps/unix/sysv/linux/sh/pthread_rwlock_timedwrlock.S create mode 100644 sysdeps/unix/sysv/linux/sh/pthread_rwlock_unlock.S create mode 100644 sysdeps/unix/sysv/linux/sh/pthread_rwlock_wrlock.S create mode 100644 sysdeps/unix/sysv/linux/sh/sem_post.S create mode 100644 sysdeps/unix/sysv/linux/sh/sem_timedwait.S create mode 100644 sysdeps/unix/sysv/linux/sh/sem_trywait.S create mode 100644 sysdeps/unix/sysv/linux/sh/sem_wait.S create mode 100644 sysdeps/unix/sysv/linux/sh/sh4/lowlevellock.h create mode 100644 sysdeps/unix/sysv/linux/sh/smp.h create mode 100644 sysdeps/unix/sysv/linux/sh/sysdep-cancel.h diff --git a/ChangeLog b/ChangeLog index 1b6848078d..606a889048 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,71 @@ +2014-06-12 Roland McGrath + + * sysdeps/sh/Makefile [$(subdir) = csu] + (gen-as-const-headers): Add tcb-offsets.sym. + * nptl/sysdeps/sh/Makefile: File removed. + * nptl/sysdeps/sh/pthread_spin_init.c: Moved ... + * sysdeps/sh/nptl/pthread_spin_init.c: ... here. + * nptl/sysdeps/sh/pthread_spin_lock.c: Moved ... + * sysdeps/sh/nptl/pthread_spin_lock.c: ... here. + * nptl/sysdeps/sh/pthread_spin_trylock.S: Moved ... + * sysdeps/sh/nptl/pthread_spin_trylock.S: ... here. + * nptl/sysdeps/sh/pthread_spin_unlock.S: Moved ... + * sysdeps/sh/nptl/pthread_spin_unlock.S: ... here. + * nptl/sysdeps/sh/pthreaddef.h: Moved ... + * sysdeps/sh/nptl/pthreaddef.h: ... here. + * nptl/sysdeps/sh/tcb-offsets.sym: Moved ... + * sysdeps/sh/nptl/tcb-offsets.sym: ... here. + * nptl/sysdeps/sh/tls.h: Moved ... + * sysdeps/sh/nptl/tls.h: ... here. + * nptl/sysdeps/unix/sysv/linux/sh/libc-lowlevellock.S: Moved ... + * sysdeps/unix/sysv/linux/sh/libc-lowlevellock.S: ... here. + * nptl/sysdeps/unix/sysv/linux/sh/lowlevel-atomic.h: Moved ... + * sysdeps/unix/sysv/linux/sh/lowlevel-atomic.h: ... here. + * nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.S: Moved ... + * sysdeps/unix/sysv/linux/sh/lowlevellock.S: ... here. + * nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.h: Moved ... + * sysdeps/unix/sysv/linux/sh/lowlevellock.h: ... here. + * nptl/sysdeps/unix/sysv/linux/sh/lowlevelrobustlock.S: Moved ... + * sysdeps/unix/sysv/linux/sh/lowlevelrobustlock.S: ... here. + * nptl/sysdeps/unix/sysv/linux/sh/pthread_barrier_wait.S: Moved ... + * sysdeps/unix/sysv/linux/sh/pthread_barrier_wait.S: ... here. + * nptl/sysdeps/unix/sysv/linux/sh/pthread_cond_broadcast.S: Moved ... + * sysdeps/unix/sysv/linux/sh/pthread_cond_broadcast.S: ... here. + * nptl/sysdeps/unix/sysv/linux/sh/pthread_cond_signal.S: Moved ... + * sysdeps/unix/sysv/linux/sh/pthread_cond_signal.S: ... here. + * nptl/sysdeps/unix/sysv/linux/sh/pthread_cond_timedwait.S: Moved ... + * sysdeps/unix/sysv/linux/sh/pthread_cond_timedwait.S: ... here. + * nptl/sysdeps/unix/sysv/linux/sh/pthread_cond_wait.S: Moved ... + * sysdeps/unix/sysv/linux/sh/pthread_cond_wait.S: ... here. + * nptl/sysdeps/unix/sysv/linux/sh/pthread_once.S: Moved ... + * sysdeps/unix/sysv/linux/sh/pthread_once.S: ... here. + * nptl/sysdeps/unix/sysv/linux/sh/pthread_rwlock_rdlock.S: Moved ... + * sysdeps/unix/sysv/linux/sh/pthread_rwlock_rdlock.S: ... here. + * nptl/sysdeps/unix/sysv/linux/sh/pthread_rwlock_timedrdlock.S: + Moved ... + * sysdeps/unix/sysv/linux/sh/pthread_rwlock_timedrdlock.S: ... here. + * nptl/sysdeps/unix/sysv/linux/sh/pthread_rwlock_timedwrlock.S: + Moved ... + * sysdeps/unix/sysv/linux/sh/pthread_rwlock_timedwrlock.S: ... here. + * nptl/sysdeps/unix/sysv/linux/sh/pthread_rwlock_unlock.S: Moved ... + * sysdeps/unix/sysv/linux/sh/pthread_rwlock_unlock.S: ... here. + * nptl/sysdeps/unix/sysv/linux/sh/pthread_rwlock_wrlock.S: Moved ... + * sysdeps/unix/sysv/linux/sh/pthread_rwlock_wrlock.S: ... here. + * nptl/sysdeps/unix/sysv/linux/sh/sem_post.S: Moved ... + * sysdeps/unix/sysv/linux/sh/sem_post.S: ... here. + * nptl/sysdeps/unix/sysv/linux/sh/sem_timedwait.S: Moved ... + * sysdeps/unix/sysv/linux/sh/sem_timedwait.S: ... here. + * nptl/sysdeps/unix/sysv/linux/sh/sem_trywait.S: Moved ... + * sysdeps/unix/sysv/linux/sh/sem_trywait.S: ... here. + * nptl/sysdeps/unix/sysv/linux/sh/sem_wait.S: Moved ... + * sysdeps/unix/sysv/linux/sh/sem_wait.S: ... here. + * nptl/sysdeps/unix/sysv/linux/sh/sh4/lowlevellock.h: Moved ... + * sysdeps/unix/sysv/linux/sh/sh4/lowlevellock.h: ... here. + * nptl/sysdeps/unix/sysv/linux/sh/smp.h: Moved ... + * sysdeps/unix/sysv/linux/sh/smp.h: ... here. + * nptl/sysdeps/unix/sysv/linux/sh/sysdep-cancel.h: Moved ... + * sysdeps/unix/sysv/linux/sh/sysdep-cancel.h: ... here. + 2014-06-12 Stefan Liebler * posix/spawn_faction_addopen.c: Include string.h. diff --git a/nptl/sysdeps/sh/Makefile b/nptl/sysdeps/sh/Makefile deleted file mode 100644 index 81bddf688c..0000000000 --- a/nptl/sysdeps/sh/Makefile +++ /dev/null @@ -1,3 +0,0 @@ -ifeq ($(subdir),csu) -gen-as-const-headers += tcb-offsets.sym -endif diff --git a/nptl/sysdeps/sh/pthread_spin_init.c b/nptl/sysdeps/sh/pthread_spin_init.c deleted file mode 100644 index 279fc9a5a6..0000000000 --- a/nptl/sysdeps/sh/pthread_spin_init.c +++ /dev/null @@ -1,19 +0,0 @@ -/* Copyright (C) 2002-2014 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper , 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, see - . */ - -/* Not needed. pthread_spin_init is an alias for pthread_spin_unlock. */ diff --git a/nptl/sysdeps/sh/pthread_spin_lock.c b/nptl/sysdeps/sh/pthread_spin_lock.c deleted file mode 100644 index e4bf190075..0000000000 --- a/nptl/sysdeps/sh/pthread_spin_lock.c +++ /dev/null @@ -1,34 +0,0 @@ -/* Copyright (C) 2003-2014 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, see - . */ - -#include "pthreadP.h" - -int -pthread_spin_lock (lock) - pthread_spinlock_t *lock; -{ - unsigned int val; - - do - asm volatile ("tas.b @%1; movt %0" - : "=&r" (val) - : "r" (lock) - : "memory"); - while (val == 0); - - return 0; -} diff --git a/nptl/sysdeps/sh/pthread_spin_trylock.S b/nptl/sysdeps/sh/pthread_spin_trylock.S deleted file mode 100644 index 76ec533fa8..0000000000 --- a/nptl/sysdeps/sh/pthread_spin_trylock.S +++ /dev/null @@ -1,31 +0,0 @@ -/* Copyright (C) 2003-2014 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, see - . */ - -#include - - .globl pthread_spin_trylock - .type pthread_spin_trylock,@function - .align 5 -pthread_spin_trylock: - tas.b @r4 - bf/s 1f - mov #EBUSY, r0 - mov #0, r0 -1: - rts - nop - .size pthread_spin_trylock,.-pthread_spin_trylock diff --git a/nptl/sysdeps/sh/pthread_spin_unlock.S b/nptl/sysdeps/sh/pthread_spin_unlock.S deleted file mode 100644 index 34d7c9f1dc..0000000000 --- a/nptl/sysdeps/sh/pthread_spin_unlock.S +++ /dev/null @@ -1,29 +0,0 @@ -/* Copyright (C) 2003-2014 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, see - . */ - - .globl pthread_spin_unlock - .type pthread_spin_unlock,@function - .align 5 -pthread_spin_unlock: - mov #0,r0 - rts - mov.l r0,@r4 - .size pthread_spin_unlock,.-pthread_spin_unlock - - /* The implementation of pthread_spin_init is identical. */ - .globl pthread_spin_init -pthread_spin_init = pthread_spin_unlock diff --git a/nptl/sysdeps/sh/pthreaddef.h b/nptl/sysdeps/sh/pthreaddef.h deleted file mode 100644 index 7ea338e4d7..0000000000 --- a/nptl/sysdeps/sh/pthreaddef.h +++ /dev/null @@ -1,34 +0,0 @@ -/* Copyright (C) 2003-2014 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, see - . */ - -#include - -/* Default stack size. */ -#define ARCH_STACK_DEFAULT_SIZE (2 * 1024 * 1024) - -/* Required stack pointer alignment at beginning. */ -#define STACK_ALIGN 8 - -/* Minimal stack size after allocating thread descriptor and guard size. */ -#define MINIMAL_REST_STACK 2048 - -/* Alignment requirement for TCB. */ -#define TCB_ALIGNMENT 8 - - -/* Location of current stack frame. */ -#define CURRENT_STACK_FRAME __builtin_frame_address (0) diff --git a/nptl/sysdeps/sh/tcb-offsets.sym b/nptl/sysdeps/sh/tcb-offsets.sym deleted file mode 100644 index 753b72b2dd..0000000000 --- a/nptl/sysdeps/sh/tcb-offsets.sym +++ /dev/null @@ -1,15 +0,0 @@ -#include -#include - -RESULT offsetof (struct pthread, result) -TID offsetof (struct pthread, tid) -PID offsetof (struct pthread, pid) -CANCELHANDLING offsetof (struct pthread, cancelhandling) -CLEANUP_JMP_BUF offsetof (struct pthread, cleanup_jmp_buf) -MULTIPLE_THREADS_OFFSET offsetof (struct pthread, header.multiple_threads) -TLS_PRE_TCB_SIZE sizeof (struct pthread) -MUTEX_FUTEX offsetof (pthread_mutex_t, __data.__lock) -POINTER_GUARD offsetof (tcbhead_t, pointer_guard) -#ifndef __ASSUME_PRIVATE_FUTEX -PRIVATE_FUTEX offsetof (struct pthread, header.private_futex) -#endif diff --git a/nptl/sysdeps/sh/tls.h b/nptl/sysdeps/sh/tls.h deleted file mode 100644 index d4d3e93d64..0000000000 --- a/nptl/sysdeps/sh/tls.h +++ /dev/null @@ -1,179 +0,0 @@ -/* Definition for thread-local data handling. NPTL/SH version. - Copyright (C) 2003-2014 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, see - . */ - -#ifndef _TLS_H -#define _TLS_H - -# include - -#ifndef __ASSEMBLER__ -# include -# include -# include -# include -# include -# include -# include - -/* Type for the dtv. */ -typedef union dtv -{ - size_t counter; - struct - { - void *val; - bool is_static; - } pointer; -} dtv_t; - -typedef struct -{ - dtv_t *dtv; - uintptr_t pointer_guard; -} tcbhead_t; - -# define TLS_MULTIPLE_THREADS_IN_TCB 1 - -#else /* __ASSEMBLER__ */ -# include -#endif /* __ASSEMBLER__ */ - - -#ifndef __ASSEMBLER__ - -/* Get system call information. */ -# include - -/* 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 (tcbhead_t) - -/* This is the size we need before TCB. */ -# define TLS_PRE_TCB_SIZE sizeof (struct pthread) - -/* Alignment requirements for the TCB. */ -# define TLS_TCB_ALIGN __alignof__ (struct pthread) - -/* The TLS blocks start right after the TCB. */ -# define TLS_DTV_AT_TP 1 -# define TLS_TCB_AT_TP 0 - -/* Get the thread descriptor definition. */ -# include - -/* Install the dtv pointer. The pointer passed is to the element with - index -1 which contain the length. */ -# define INSTALL_DTV(tcbp, dtvp) \ - ((tcbhead_t *) (tcbp))->dtv = (dtvp) + 1 - -/* Install new dtv for current thread. */ -# define INSTALL_NEW_DTV(dtv) \ - ({ tcbhead_t *__tcbp; \ - __asm __volatile ("stc gbr,%0" : "=r" (__tcbp)); \ - __tcbp->dtv = (dtv);}) - -/* Return dtv of given thread descriptor. */ -# define GET_DTV(tcbp) \ - (((tcbhead_t *) (tcbp))->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(tcbp) \ - ({ __asm __volatile ("ldc %0,gbr" : : "r" (tcbp)); 0; }) - -# define TLS_DEFINE_INIT_TP(tp, pd) void *tp = (pd) + 1 - -/* Return the address of the dtv for the current thread. */ -# define THREAD_DTV() \ - ({ tcbhead_t *__tcbp; \ - __asm __volatile ("stc gbr,%0" : "=r" (__tcbp)); \ - __tcbp->dtv;}) - -/* Return the thread descriptor for the current thread. - The contained asm must *not* be marked volatile since otherwise - assignments like - struct pthread *self = thread_self(); - do not get optimized away. */ -# define THREAD_SELF \ - ({ struct pthread *__self; \ - __asm ("stc gbr,%0" : "=r" (__self)); \ - __self - 1;}) - -/* Magic for libthread_db to know how to do THREAD_SELF. */ -# define DB_THREAD_SELF \ - REGISTER (32, 32, REG_GBR * 4, -sizeof (struct pthread)) - -/* Read member of the thread descriptor directly. */ -# define THREAD_GETMEM(descr, member) (descr->member) - -/* Same as THREAD_GETMEM, but the member offset can be non-constant. */ -# define THREAD_GETMEM_NC(descr, member, idx) (descr->member[idx]) - -/* Set member of the thread descriptor directly. */ -# define THREAD_SETMEM(descr, member, value) \ - descr->member = (value) - -/* Same as THREAD_SETMEM, but the member offset can be non-constant. */ -# define THREAD_SETMEM_NC(descr, member, idx, value) \ - descr->member[idx] = (value) - -#define THREAD_GET_POINTER_GUARD() \ - ({ tcbhead_t *__tcbp; \ - __asm __volatile ("stc gbr,%0" : "=r" (__tcbp)); \ - __tcbp->pointer_guard;}) - #define THREAD_SET_POINTER_GUARD(value) \ - ({ tcbhead_t *__tcbp; \ - __asm __volatile ("stc gbr,%0" : "=r" (__tcbp)); \ - __tcbp->pointer_guard = (value);}) -#define THREAD_COPY_POINTER_GUARD(descr) \ - ({ tcbhead_t *__tcbp; \ - __asm __volatile ("stc gbr,%0" : "=r" (__tcbp)); \ - ((tcbhead_t *) (descr + 1))->pointer_guard = __tcbp->pointer_guard;}) - -/* Get and set the global scope generation counter in struct pthread. */ -#define THREAD_GSCOPE_FLAG_UNUSED 0 -#define THREAD_GSCOPE_FLAG_USED 1 -#define THREAD_GSCOPE_FLAG_WAIT 2 -#define THREAD_GSCOPE_RESET_FLAG() \ - do \ - { int __res \ - = atomic_exchange_rel (&THREAD_SELF->header.gscope_flag, \ - THREAD_GSCOPE_FLAG_UNUSED); \ - if (__res == THREAD_GSCOPE_FLAG_WAIT) \ - lll_futex_wake (&THREAD_SELF->header.gscope_flag, 1, LLL_PRIVATE); \ - } \ - while (0) -#define THREAD_GSCOPE_SET_FLAG() \ - do \ - { \ - THREAD_SELF->header.gscope_flag = THREAD_GSCOPE_FLAG_USED; \ - atomic_write_barrier (); \ - } \ - while (0) -#define THREAD_GSCOPE_WAIT() \ - GL(dl_wait_lookup_done) () - -#endif /* __ASSEMBLER__ */ - -#endif /* tls.h */ diff --git a/nptl/sysdeps/unix/sysv/linux/sh/libc-lowlevellock.S b/nptl/sysdeps/unix/sysv/linux/sh/libc-lowlevellock.S deleted file mode 100644 index ad6188d096..0000000000 --- a/nptl/sysdeps/unix/sysv/linux/sh/libc-lowlevellock.S +++ /dev/null @@ -1,18 +0,0 @@ -/* Copyright (C) 2003-2014 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, see - . */ - -#include "lowlevellock.S" diff --git a/nptl/sysdeps/unix/sysv/linux/sh/lowlevel-atomic.h b/nptl/sysdeps/unix/sysv/linux/sh/lowlevel-atomic.h deleted file mode 100644 index d580ca3ce5..0000000000 --- a/nptl/sysdeps/unix/sysv/linux/sh/lowlevel-atomic.h +++ /dev/null @@ -1,80 +0,0 @@ -/* Copyright (C) 2003-2014 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, see - . */ - -#ifdef __ASSEMBLER__ - -#define _IMP1 #1 -#define _IMM1 #-1 -#define _IMM4 #-4 -#define _IMM6 #-6 -#define _IMM8 #-8 - -#define INC(mem, reg) \ - .align 2; \ - mova 99f, r0; \ - mov r15, r1; \ - mov _IMM6, r15; \ -98: mov.l mem, reg; \ - add _IMP1, reg; \ - mov.l reg, mem; \ -99: mov r1, r15 - -#define DEC(mem, reg) \ - .align 2; \ - mova 99f, r0; \ - mov r15, r1; \ - mov _IMM6, r15; \ -98: mov.l mem, reg; \ - add _IMM1, reg; \ - mov.l reg, mem; \ -99: mov r1, r15 - -#define XADD(reg, mem, old, tmp) \ - .align 2; \ - mova 99f, r0; \ - nop; \ - mov r15, r1; \ - mov _IMM8, r15; \ -98: mov.l mem, old; \ - mov reg, tmp; \ - add old, tmp; \ - mov.l tmp, mem; \ -99: mov r1, r15 - -#define XCHG(reg, mem, old) \ - .align 2; \ - mova 99f, r0; \ - nop; \ - mov r15, r1; \ - mov _IMM4, r15; \ -98: mov.l mem, old; \ - mov.l reg, mem; \ -99: mov r1, r15 - -#define CMPXCHG(reg, mem, new, old) \ - .align 2; \ - mova 99f, r0; \ - nop; \ - mov r15, r1; \ - mov _IMM8, r15; \ -98: mov.l mem, old; \ - cmp/eq old, reg; \ - bf 99f; \ - mov.l new, mem; \ -99: mov r1, r15 - -#endif /* __ASSEMBLER__ */ diff --git a/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.S b/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.S deleted file mode 100644 index 84b8edb86c..0000000000 --- a/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.S +++ /dev/null @@ -1,574 +0,0 @@ -/* Copyright (C) 2003-2014 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, see - . */ - -#include -#include -#include -#include -#include "lowlevel-atomic.h" - - .text - -#ifdef __ASSUME_PRIVATE_FUTEX -# define LOAD_PRIVATE_FUTEX_WAIT(reg,tmp,tmp2) \ - mov #(FUTEX_WAIT | FUTEX_PRIVATE_FLAG), reg; \ - extu.b reg, reg -# define LOAD_PRIVATE_FUTEX_WAKE(reg,tmp,tmp2) \ - mov #(FUTEX_WAKE | FUTEX_PRIVATE_FLAG), reg; \ - extu.b reg, reg -# define LOAD_FUTEX_WAIT(reg,tmp,tmp2) \ - mov #(FUTEX_WAIT | FUTEX_PRIVATE_FLAG), tmp; \ - extu.b tmp, tmp; \ - xor tmp, reg -# define LOAD_FUTEX_WAIT_ABS(reg,tmp,tmp2) \ - mov #(FUTEX_WAIT_BITSET | FUTEX_PRIVATE_FLAG), tmp; \ - extu.b tmp, tmp; \ - mov #(FUTEX_CLOCK_REALTIME >> 8), tmp2; \ - swap.b tmp2, tmp2; \ - or tmp2, tmp; \ - xor tmp, reg -# define LOAD_FUTEX_WAKE(reg,tmp,tmp2) \ - mov #(FUTEX_WAKE | FUTEX_PRIVATE_FLAG), tmp; \ - extu.b tmp, tmp; \ - xor tmp, reg -#else -# if FUTEX_WAIT == 0 -# define LOAD_PRIVATE_FUTEX_WAIT(reg,tmp,tmp2) \ - stc gbr, tmp ; \ - mov.w 99f, reg ; \ - add reg, tmp ; \ - bra 98f ; \ - mov.l @tmp, reg ; \ -99: .word PRIVATE_FUTEX - TLS_PRE_TCB_SIZE ; \ -98: -# else -# define LOAD_PRIVATE_FUTEX_WAIT(reg,tmp,tmp2) \ - stc gbr, tmp ; \ - mov.w 99f, reg ; \ - add reg, tmp ; \ - mov.l @tmp, reg ; \ - bra 98f ; \ - mov #FUTEX_WAIT, tmp ; \ -99: .word PRIVATE_FUTEX - TLS_PRE_TCB_SIZE ; \ -98: or tmp, reg -# endif -# define LOAD_PRIVATE_FUTEX_WAKE(reg,tmp,tmp2) \ - stc gbr, tmp ; \ - mov.w 99f, reg ; \ - add reg, tmp ; \ - mov.l @tmp, reg ; \ - bra 98f ; \ - mov #FUTEX_WAKE, tmp ; \ -99: .word PRIVATE_FUTEX - TLS_PRE_TCB_SIZE ; \ -98: or tmp, reg -# if FUTEX_WAIT == 0 -# define LOAD_FUTEX_WAIT(reg,tmp,tmp2) \ - stc gbr, tmp ; \ - mov.w 99f, tmp2 ; \ - add tmp2, tmp ; \ - mov.l @tmp, tmp2 ; \ - bra 98f ; \ - mov #FUTEX_PRIVATE_FLAG, tmp ; \ -99: .word PRIVATE_FUTEX - TLS_PRE_TCB_SIZE ; \ -98: extu.b tmp, tmp ; \ - xor tmp, reg ; \ - and tmp2, reg -# else -# define LOAD_FUTEX_WAIT(reg,tmp,tmp2) \ - stc gbr, tmp ; \ - mov.w 99f, tmp2 ; \ - add tmp2, tmp ; \ - mov.l @tmp, tmp2 ; \ - bra 98f ; \ - mov #FUTEX_PRIVATE_FLAG, tmp ; \ -99: .word PRIVATE_FUTEX - TLS_PRE_TCB_SIZE ; \ -98: extu.b tmp, tmp ; \ - xor tmp, reg ; \ - and tmp2, reg ; \ - mov #FUTEX_WAIT, tmp ; \ - or tmp, reg -# endif -# define LOAD_FUTEX_WAIT_ABS(reg,tmp,tmp2) \ - stc gbr, tmp ; \ - mov.w 99f, tmp2 ; \ - add tmp2, tmp ; \ - mov.l @tmp, tmp2 ; \ - bra 98f ; \ - mov #FUTEX_PRIVATE_FLAG, tmp ; \ -99: .word PRIVATE_FUTEX - TLS_PRE_TCB_SIZE ; \ -98: extu.b tmp, tmp ; \ - xor tmp, reg ; \ - and tmp2, reg ; \ - mov #FUTEX_WAIT_BITSET, tmp ; \ - mov #(FUTEX_CLOCK_REALTIME >> 8), tmp2; \ - swap.b tmp2, tmp2; \ - or tmp2, tmp; \ - or tmp, reg -# define LOAD_FUTEX_WAKE(reg,tmp,tmp2) \ - stc gbr, tmp ; \ - mov.w 99f, tmp2 ; \ - add tmp2, tmp ; \ - mov.l @tmp, tmp2 ; \ - bra 98f ; \ - mov #FUTEX_PRIVATE_FLAG, tmp ; \ -99: .word PRIVATE_FUTEX - TLS_PRE_TCB_SIZE ; \ -98: extu.b tmp, tmp ; \ - xor tmp, reg ; \ - and tmp2, reg ; \ - mov #FUTEX_WAKE, tmp ; \ - or tmp, reg -#endif - - .globl __lll_lock_wait_private - .type __lll_lock_wait_private,@function - .hidden __lll_lock_wait_private - .align 5 - cfi_startproc -__lll_lock_wait_private: - mov.l r8, @-r15 - cfi_adjust_cfa_offset(4) - cfi_rel_offset (r8, 0) - mov r4, r6 - mov r5, r8 - mov #0, r7 /* No timeout. */ - LOAD_PRIVATE_FUTEX_WAIT (r5, r0, r1) - - mov #2, r4 - cmp/eq r4, r6 - bf 2f - -1: - mov r8, r4 - mov #SYS_futex, r3 - extu.b r3, r3 - trapa #0x14 - SYSCALL_INST_PAD - -2: - mov #2, r6 - XCHG (r6, @r8, r2) - tst r2, r2 - bf 1b - - mov.l @r15+, r8 - cfi_adjust_cfa_offset (-4) - cfi_restore (r8) - rts - mov r2, r0 - cfi_endproc - .size __lll_lock_wait_private,.-__lll_lock_wait_private - -#ifdef NOT_IN_libc - .globl __lll_lock_wait - .type __lll_lock_wait,@function - .hidden __lll_lock_wait - .align 5 - cfi_startproc -__lll_lock_wait: - mov.l r9, @-r15 - cfi_adjust_cfa_offset(4) - cfi_rel_offset (r9, 0) - mov.l r8, @-r15 - cfi_adjust_cfa_offset(4) - cfi_rel_offset (r8, 0) - mov r6, r9 - mov r4, r6 - mov r5, r8 - mov #0, r7 /* No timeout. */ - mov r9, r5 - LOAD_FUTEX_WAIT (r5, r0, r1) - - mov #2, r4 - cmp/eq r4, r6 - bf 2f - -1: - mov r8, r4 - mov #SYS_futex, r3 - extu.b r3, r3 - trapa #0x14 - SYSCALL_INST_PAD - -2: - mov #2, r6 - XCHG (r6, @r8, r2) - tst r2, r2 - bf 1b - - mov.l @r15+, r8 - cfi_adjust_cfa_offset (-4) - cfi_restore (r8) - mov.l @r15+, r9 - cfi_adjust_cfa_offset (-4) - cfi_restore (r9) - ret - mov r2, r0 - cfi_endproc - .size __lll_lock_wait,.-__lll_lock_wait - - /* r5 (r8): futex - r7 (r11): flags - r6 (r9): timeout - r4 (r10): futex value - */ - .globl __lll_timedlock_wait - .type __lll_timedlock_wait,@function - .hidden __lll_timedlock_wait - .align 5 - cfi_startproc -__lll_timedlock_wait: - mov.l r12, @-r15 - cfi_adjust_cfa_offset(4) - cfi_rel_offset (r12, 0) - -# ifndef __ASSUME_FUTEX_CLOCK_REALTIME - mov.l .Lhave, r1 -# ifdef PIC - mova .Lgot, r0 - mov.l .Lgot, r12 - add r0, r12 - add r12, r1 -# endif - mov.l @r1, r0 - tst r0, r0 - bt .Lreltmo -# endif - - /* if (timeout->tv_sec < 0) return ETIMEDOUT; */ - mov.l @r6, r1 - cmp/pz r1 - bf/s 5f - mov #ETIMEDOUT, r0 - - mov r4, r2 - mov r5, r4 - mov r7, r5 - mov r6, r7 - LOAD_FUTEX_WAIT_ABS (r5, r0, r1) - - mov #2, r6 - cmp/eq r6, r2 - bf/s 2f - mov r6, r2 - -1: - mov #2, r6 - mov #-1, r1 - mov #SYS_futex, r3 - extu.b r3, r3 - trapa #0x16 - SYSCALL_INST_PAD - mov r0, r6 - -2: - XCHG (r2, @r4, r3) /* NB: lock is implied */ - - tst r3, r3 - bt/s 3f - mov r6, r0 - - cmp/eq #-ETIMEDOUT, r0 - bt 4f - cmp/eq #-EINVAL, r0 - bf 1b -4: - neg r0, r3 -3: - mov r3, r0 -5: - rts - mov.l @r15+, r12 - /* Omit CFI for restore in delay slot. */ - -# ifndef __ASSUME_FUTEX_CLOCK_REALTIME - .align 2 -# ifdef PIC -.Lgot: - .long _GLOBAL_OFFSET_TABLE_ -.Lhave: - .long __have_futex_clock_realtime@GOTOFF -# else -.Lhave: - .long __have_futex_clock_realtime -# endif - -.Lreltmo: - /* Check for a valid timeout value. */ - mov.l @(4,r6), r1 - mov.l .L1g, r0 - cmp/hs r0, r1 - bt 3f - - cfi_remember_state - - mov.l r11, @-r15 - cfi_adjust_cfa_offset(4) - cfi_rel_offset (r11, 0) - mov.l r10, @-r15 - cfi_adjust_cfa_offset(4) - cfi_rel_offset (r10, 0) - mov.l r9, @-r15 - cfi_adjust_cfa_offset(4) - cfi_rel_offset (r9, 0) - mov.l r8, @-r15 - cfi_adjust_cfa_offset(4) - cfi_rel_offset (r8, 0) - mov r7, r11 - mov r4, r10 - mov r6, r9 - mov r5, r8 - - /* Stack frame for the timespec and timeval structs. */ - add #-8, r15 - cfi_adjust_cfa_offset(8) - - mov #2, r2 - XCHG (r2, @r8, r3) - - tst r3, r3 - bt 6f - -1: - /* Get current time. */ - mov r15, r4 - mov #0, r5 - mov #__NR_gettimeofday, r3 - trapa #0x12 - SYSCALL_INST_PAD - - /* Compute relative timeout. */ - mov.l @(4,r15), r0 - mov.w .L1k, r1 - dmulu.l r0, r1 /* Micro seconds to nano seconds. */ - mov.l @r9, r2 - mov.l @(4,r9), r3 - mov.l @r15, r0 - sts macl, r1 - sub r0, r2 - clrt - subc r1, r3 - bf 4f - mov.l .L1g, r1 - add r1, r3 - add #-1, r2 -4: - cmp/pz r2 - bf 2f /* Time is already up. */ - - mov.l r2, @r15 /* Store relative timeout. */ - mov.l r3, @(4,r15) - - mov r8, r4 - mov r11, r5 - LOAD_FUTEX_WAIT (r5, r0, r1) - mov r10, r6 - mov r15, r7 - mov #SYS_futex, r3 - extu.b r3, r3 - trapa #0x14 - SYSCALL_INST_PAD - mov r0, r5 - - mov #2, r2 - XCHG (r2, @r8, r3) - - tst r3, r3 - bt/s 6f - mov #-ETIMEDOUT, r1 - cmp/eq r5, r1 - bf 1b - -2: mov #ETIMEDOUT, r3 - -6: - add #8, r15 - cfi_adjust_cfa_offset (-8) - mov.l @r15+, r8 - cfi_adjust_cfa_offset (-4) - cfi_restore (r8) - mov.l @r15+, r9 - cfi_adjust_cfa_offset (-4) - cfi_restore (r9) - mov.l @r15+, r10 - cfi_adjust_cfa_offset (-4) - cfi_restore (r10) - mov.l @r15+, r11 - cfi_adjust_cfa_offset (-4) - cfi_restore (r11) - mov.l @r15+, r12 - cfi_adjust_cfa_offset (-4) - cfi_restore (r12) - rts - mov r3, r0 - - cfi_restore_state - -3: - mov.l @r15+, r12 - cfi_adjust_cfa_offset (-4) - cfi_restore (r12) - rts - mov #EINVAL, r0 -# endif - cfi_endproc - -.L1k: - .word 1000 - .align 2 -.L1g: - .long 1000000000 - - .size __lll_timedlock_wait,.-__lll_timedlock_wait -#endif - - .globl __lll_unlock_wake_private - .type __lll_unlock_wake_private,@function - .hidden __lll_unlock_wake_private - .align 5 - cfi_startproc -__lll_unlock_wake_private: - LOAD_PRIVATE_FUTEX_WAKE (r5, r0, r1) - mov #1, r6 /* Wake one thread. */ - mov #0, r7 - mov.l r7, @r4 /* Stores 0. */ - mov #SYS_futex, r3 - extu.b r3, r3 - trapa #0x14 - SYSCALL_INST_PAD - rts - nop - cfi_endproc - .size __lll_unlock_wake_private,.-__lll_unlock_wake_private - -#ifdef NOT_IN_libc - .globl __lll_unlock_wake - .type __lll_unlock_wake,@function - .hidden __lll_unlock_wake - .align 5 - cfi_startproc -__lll_unlock_wake: - LOAD_FUTEX_WAKE (r5, r0, r1) - mov #1, r6 /* Wake one thread. */ - mov #0, r7 - mov.l r7, @r4 /* Stores 0. */ - mov #SYS_futex, r3 - extu.b r3, r3 - trapa #0x14 - SYSCALL_INST_PAD - rts - nop - cfi_endproc - .size __lll_unlock_wake,.-__lll_unlock_wake - - .globl __lll_timedwait_tid - .type __lll_timedwait_tid,@function - .hidden __lll_timedwait_tid - .align 5 - cfi_startproc -__lll_timedwait_tid: - mov.l r9, @-r15 - cfi_adjust_cfa_offset(4) - cfi_rel_offset (r9, 0) - mov.l r8, @-r15 - cfi_adjust_cfa_offset(4) - cfi_rel_offset (r8, 0) - mov r4, r8 - mov r5, r9 - - /* Stack frame for the timespec and timeval structs. */ - add #-8, r15 - cfi_adjust_cfa_offset(8) - -2: - /* Get current time. */ - mov r15, r4 - mov #0, r5 - mov #__NR_gettimeofday, r3 - trapa #0x12 - SYSCALL_INST_PAD - - /* Compute relative timeout. */ - mov.l @(4,r15), r0 - mov.w .L1k2, r1 - dmulu.l r0, r1 /* Micro seconds to nano seconds. */ - mov.l @r9, r2 - mov.l @(4,r9), r3 - mov.l @r15, r0 - sts macl, r1 - sub r0, r2 - clrt - subc r1, r3 - bf 5f - mov.l .L1g2, r1 - add r1, r3 - add #-1, r2 -5: - cmp/pz r2 - bf 6f /* Time is already up. */ - - mov.l r2, @r15 /* Store relative timeout. */ - mov.l r3, @(4,r15) - - mov.l @r8, r2 - tst r2, r2 - bt 4f - - mov r8, r4 - /* XXX The kernel so far uses global futex for the wakeup at - all times. */ - mov #0, r5 - extu.b r5, r5 - mov r2, r6 - mov r15, r7 - mov #SYS_futex, r3 - extu.b r3, r3 - trapa #0x14 - SYSCALL_INST_PAD - - mov.l @r8, r2 - tst r2, r2 - bf 1f -4: - mov #0, r0 -3: - cfi_remember_state - add #8, r15 - cfi_adjust_cfa_offset (-8) - mov.l @r15+, r8 - cfi_adjust_cfa_offset (-4) - cfi_restore (r8) - rts - mov.l @r15+, r9 - /* Omit CFI for restore in delay slot. */ - cfi_restore_state -1: - /* Check whether the time expired. */ - mov #-ETIMEDOUT, r1 - cmp/eq r0, r1 - bf 2b -6: - bra 3b - mov #ETIMEDOUT, r0 - cfi_endproc - -.L1k2: - .word 1000 - .align 2 -.L1g2: - .long 1000000000 - .size __lll_timedwait_tid,.-__lll_timedwait_tid -#endif diff --git a/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.h b/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.h deleted file mode 100644 index 438632d962..0000000000 --- a/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.h +++ /dev/null @@ -1,419 +0,0 @@ -/* Copyright (C) 2003-2014 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, see - . */ - -#ifndef _LOWLEVELLOCK_H -#define _LOWLEVELLOCK_H 1 - -#ifndef __ASSEMBLER__ -#include -#include -#include -#include -#endif - -#define SYS_futex 240 -#define FUTEX_WAIT 0 -#define FUTEX_WAKE 1 -#define FUTEX_CMP_REQUEUE 4 -#define FUTEX_WAKE_OP 5 -#define FUTEX_LOCK_PI 6 -#define FUTEX_UNLOCK_PI 7 -#define FUTEX_TRYLOCK_PI 8 -#define FUTEX_WAIT_BITSET 9 -#define FUTEX_WAKE_BITSET 10 -#define FUTEX_PRIVATE_FLAG 128 -#define FUTEX_CLOCK_REALTIME 256 - -#define FUTEX_BITSET_MATCH_ANY 0xffffffff - -#define FUTEX_OP_CLEAR_WAKE_IF_GT_ONE ((4 << 24) | 1) - -/* Values for 'private' parameter of locking macros. Yes, the - definition seems to be backwards. But it is not. The bit will be - reversed before passing to the system call. */ -#define LLL_PRIVATE 0 -#define LLL_SHARED FUTEX_PRIVATE_FLAG - - -#if !defined NOT_IN_libc || defined IS_IN_rtld -/* In libc.so or ld.so all futexes are private. */ -# ifdef __ASSUME_PRIVATE_FUTEX -# define __lll_private_flag(fl, private) \ - ((fl) | FUTEX_PRIVATE_FLAG) -# else -# define __lll_private_flag(fl, private) \ - ((fl) | THREAD_GETMEM (THREAD_SELF, header.private_futex)) -# endif -#else -# ifdef __ASSUME_PRIVATE_FUTEX -# define __lll_private_flag(fl, private) \ - (((fl) | FUTEX_PRIVATE_FLAG) ^ (private)) -# else -# define __lll_private_flag(fl, private) \ - (__builtin_constant_p (private) \ - ? ((private) == 0 \ - ? ((fl) | THREAD_GETMEM (THREAD_SELF, header.private_futex)) \ - : (fl)) \ - : ((fl) | (((private) ^ FUTEX_PRIVATE_FLAG) \ - & THREAD_GETMEM (THREAD_SELF, header.private_futex)))) -# endif -#endif - -#ifndef __ASSEMBLER__ - -/* Initializer for compatibility lock. */ -#define LLL_LOCK_INITIALIZER (0) -#define LLL_LOCK_INITIALIZER_LOCKED (1) -#define LLL_LOCK_INITIALIZER_WAITERS (2) - -extern int __lll_lock_wait_private (int val, int *__futex) - attribute_hidden; -extern int __lll_lock_wait (int val, int *__futex, int private) - attribute_hidden; -extern int __lll_timedlock_wait (int val, int *__futex, - const struct timespec *abstime, int private) - attribute_hidden; -extern int __lll_robust_lock_wait (int val, int *__futex, int private) - attribute_hidden; -extern int __lll_robust_timedlock_wait (int val, int *__futex, - const struct timespec *abstime, - int private) - attribute_hidden; -extern int __lll_unlock_wake_private (int *__futex) attribute_hidden; -extern int __lll_unlock_wake (int *__futex, int private) attribute_hidden; - -#define lll_trylock(futex) \ - ({ unsigned char __result; \ - __asm __volatile ("\ - .align 2\n\ - mova 1f,r0\n\ - nop\n\ - mov r15,r1\n\ - mov #-8,r15\n\ - 0: mov.l @%1,r2\n\ - cmp/eq r2,%3\n\ - bf 1f\n\ - mov.l %2,@%1\n\ - 1: mov r1,r15\n\ - mov #-1,%0\n\ - negc %0,%0"\ - : "=r" (__result) \ - : "r" (&(futex)), \ - "r" (LLL_LOCK_INITIALIZER_LOCKED), \ - "r" (LLL_LOCK_INITIALIZER) \ - : "r0", "r1", "r2", "t", "memory"); \ - __result; }) - -#define lll_robust_trylock(futex, id) \ - ({ unsigned char __result; \ - __asm __volatile ("\ - .align 2\n\ - mova 1f,r0\n\ - nop\n\ - mov r15,r1\n\ - mov #-8,r15\n\ - 0: mov.l @%1,r2\n\ - cmp/eq r2,%3\n\ - bf 1f\n\ - mov.l %2,@%1\n\ - 1: mov r1,r15\n\ - mov #-1,%0\n\ - negc %0,%0"\ - : "=r" (__result) \ - : "r" (&(futex)), \ - "r" (id), \ - "r" (LLL_LOCK_INITIALIZER) \ - : "r0", "r1", "r2", "t", "memory"); \ - __result; }) - -#define lll_cond_trylock(futex) \ - ({ unsigned char __result; \ - __asm __volatile ("\ - .align 2\n\ - mova 1f,r0\n\ - nop\n\ - mov r15,r1\n\ - mov #-8,r15\n\ - 0: mov.l @%1,r2\n\ - cmp/eq r2,%3\n\ - bf 1f\n\ - mov.l %2,@%1\n\ - 1: mov r1,r15\n\ - mov #-1,%0\n\ - negc %0,%0"\ - : "=r" (__result) \ - : "r" (&(futex)), \ - "r" (LLL_LOCK_INITIALIZER_WAITERS), \ - "r" (LLL_LOCK_INITIALIZER) \ - : "r0", "r1", "r2", "t", "memory"); \ - __result; }) - -#define lll_lock(futex, private) \ - (void) ({ int __result, *__futex = &(futex); \ - __asm __volatile ("\ - .align 2\n\ - mova 1f,r0\n\ - nop\n\ - mov r15,r1\n\ - mov #-8,r15\n\ - 0: mov.l @%2,%0\n\ - tst %0,%0\n\ - bf 1f\n\ - mov.l %1,@%2\n\ - 1: mov r1,r15"\ - : "=&r" (__result) : "r" (1), "r" (__futex) \ - : "r0", "r1", "t", "memory"); \ - if (__result) \ - { \ - if (__builtin_constant_p (private) \ - && (private) == LLL_PRIVATE) \ - __lll_lock_wait_private (__result, __futex); \ - else \ - __lll_lock_wait (__result, __futex, (private)); \ - } \ - }) - -#define lll_robust_lock(futex, id, private) \ - ({ int __result, *__futex = &(futex); \ - __asm __volatile ("\ - .align 2\n\ - mova 1f,r0\n\ - nop\n\ - mov r15,r1\n\ - mov #-8,r15\n\ - 0: mov.l @%2,%0\n\ - tst %0,%0\n\ - bf 1f\n\ - mov.l %1,@%2\n\ - 1: mov r1,r15"\ - : "=&r" (__result) : "r" (id), "r" (__futex) \ - : "r0", "r1", "t", "memory"); \ - if (__result) \ - __result = __lll_robust_lock_wait (__result, __futex, private); \ - __result; }) - -/* Special version of lll_mutex_lock which causes the unlock function to - always wakeup waiters. */ -#define lll_cond_lock(futex, private) \ - (void) ({ int __result, *__futex = &(futex); \ - __asm __volatile ("\ - .align 2\n\ - mova 1f,r0\n\ - nop\n\ - mov r15,r1\n\ - mov #-8,r15\n\ - 0: mov.l @%2,%0\n\ - tst %0,%0\n\ - bf 1f\n\ - mov.l %1,@%2\n\ - 1: mov r1,r15"\ - : "=&r" (__result) : "r" (2), "r" (__futex) \ - : "r0", "r1", "t", "memory"); \ - if (__result) \ - __lll_lock_wait (__result, __futex, private); }) - -#define lll_robust_cond_lock(futex, id, private) \ - ({ int __result, *__futex = &(futex); \ - __asm __volatile ("\ - .align 2\n\ - mova 1f,r0\n\ - nop\n\ - mov r15,r1\n\ - mov #-8,r15\n\ - 0: mov.l @%2,%0\n\ - tst %0,%0\n\ - bf 1f\n\ - mov.l %1,@%2\n\ - 1: mov r1,r15"\ - : "=&r" (__result) : "r" (id | FUTEX_WAITERS), "r" (__futex) \ - : "r0", "r1", "t", "memory"); \ - if (__result) \ - __result = __lll_robust_lock_wait (__result, __futex, private); \ - __result; }) - -#define lll_timedlock(futex, timeout, private) \ - ({ int __result, *__futex = &(futex); \ - __asm __volatile ("\ - .align 2\n\ - mova 1f,r0\n\ - nop\n\ - mov r15,r1\n\ - mov #-8,r15\n\ - 0: mov.l @%2,%0\n\ - tst %0,%0\n\ - bf 1f\n\ - mov.l %1,@%2\n\ - 1: mov r1,r15"\ - : "=&r" (__result) : "r" (1), "r" (__futex) \ - : "r0", "r1", "t", "memory"); \ - if (__result) \ - __result = __lll_timedlock_wait (__result, __futex, timeout, private); \ - __result; }) - -#define lll_robust_timedlock(futex, timeout, id, private) \ - ({ int __result, *__futex = &(futex); \ - __asm __volatile ("\ - .align 2\n\ - mova 1f,r0\n\ - nop\n\ - mov r15,r1\n\ - mov #-8,r15\n\ - 0: mov.l @%2,%0\n\ - tst %0,%0\n\ - bf 1f\n\ - mov.l %1,@%2\n\ - 1: mov r1,r15"\ - : "=&r" (__result) : "r" (id), "r" (__futex) \ - : "r0", "r1", "t", "memory"); \ - if (__result) \ - __result = __lll_robust_timedlock_wait (__result, __futex, \ - timeout, private); \ - __result; }) - -#define lll_unlock(futex, private) \ - (void) ({ int __result, *__futex = &(futex); \ - __asm __volatile ("\ - .align 2\n\ - mova 1f,r0\n\ - mov r15,r1\n\ - mov #-6,r15\n\ - 0: mov.l @%1,%0\n\ - add #-1,%0\n\ - mov.l %0,@%1\n\ - 1: mov r1,r15"\ - : "=&r" (__result) : "r" (__futex) \ - : "r0", "r1", "memory"); \ - if (__result) \ - { \ - if (__builtin_constant_p (private) \ - && (private) == LLL_PRIVATE) \ - __lll_unlock_wake_private (__futex); \ - else \ - __lll_unlock_wake (__futex, (private)); \ - } \ - }) - -#define lll_robust_unlock(futex, private) \ - (void) ({ int __result, *__futex = &(futex); \ - __asm __volatile ("\ - .align 2\n\ - mova 1f,r0\n\ - mov r15,r1\n\ - mov #-6,r15\n\ - 0: mov.l @%1,%0\n\ - and %2,%0\n\ - mov.l %0,@%1\n\ - 1: mov r1,r15"\ - : "=&r" (__result) : "r" (__futex), "r" (FUTEX_WAITERS) \ - : "r0", "r1", "memory"); \ - if (__result) \ - __lll_unlock_wake (__futex, private); }) - -#define lll_robust_dead(futex, private) \ - (void) ({ int __ignore, *__futex = &(futex); \ - __asm __volatile ("\ - .align 2\n\ - mova 1f,r0\n\ - mov r15,r1\n\ - mov #-6,r15\n\ - 0: mov.l @%1,%0\n\ - or %2,%0\n\ - mov.l %0,@%1\n\ - 1: mov r1,r15"\ - : "=&r" (__ignore) : "r" (__futex), "r" (FUTEX_OWNER_DIED) \ - : "r0", "r1", "memory"); \ - lll_futex_wake (__futex, 1, private); }) - -# ifdef NEED_SYSCALL_INST_PAD -# define SYSCALL_WITH_INST_PAD "\ - trapa #0x14; or r0,r0; or r0,r0; or r0,r0; or r0,r0; or r0,r0" -# else -# define SYSCALL_WITH_INST_PAD "\ - trapa #0x14" -# endif - -#define lll_futex_wait(futex, val, private) \ - lll_futex_timed_wait (futex, val, NULL, private) - - -#define lll_futex_timed_wait(futex, val, timeout, private) \ - ({ \ - int __status; \ - register unsigned long __r3 asm ("r3") = SYS_futex; \ - register unsigned long __r4 asm ("r4") = (unsigned long) (futex); \ - register unsigned long __r5 asm ("r5") \ - = __lll_private_flag (FUTEX_WAIT, private); \ - register unsigned long __r6 asm ("r6") = (unsigned long) (val); \ - register unsigned long __r7 asm ("r7") = (timeout); \ - __asm __volatile (SYSCALL_WITH_INST_PAD \ - : "=z" (__status) \ - : "r" (__r3), "r" (__r4), "r" (__r5), \ - "r" (__r6), "r" (__r7) \ - : "memory", "t"); \ - __status; \ - }) - - -#define lll_futex_wake(futex, nr, private) \ - do { \ - int __ignore; \ - register unsigned long __r3 asm ("r3") = SYS_futex; \ - register unsigned long __r4 asm ("r4") = (unsigned long) (futex); \ - register unsigned long __r5 asm ("r5") \ - = __lll_private_flag (FUTEX_WAKE, private); \ - register unsigned long __r6 asm ("r6") = (unsigned long) (nr); \ - register unsigned long __r7 asm ("r7") = 0; \ - __asm __volatile (SYSCALL_WITH_INST_PAD \ - : "=z" (__ignore) \ - : "r" (__r3), "r" (__r4), "r" (__r5), \ - "r" (__r6), "r" (__r7) \ - : "memory", "t"); \ - } while (0) - - -#define lll_islocked(futex) \ - (futex != LLL_LOCK_INITIALIZER) - -/* The kernel notifies a process which uses CLONE_CHILD_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 = &(tid); \ - while (*__tid != 0) \ - lll_futex_wait (__tid, *__tid, LLL_SHARED); \ - } while (0) - -extern int __lll_timedwait_tid (int *tid, const struct timespec *abstime) - attribute_hidden; -#define lll_timedwait_tid(tid, abstime) \ - ({ \ - int __result = 0; \ - if (tid != 0) \ - { \ - if (abstime->tv_nsec < 0 || abstime->tv_nsec >= 1000000000) \ - __result = EINVAL; \ - else \ - __result = __lll_timedwait_tid (&tid, abstime); \ - } \ - __result; }) - -#endif /* !__ASSEMBLER__ */ - -#endif /* lowlevellock.h */ diff --git a/nptl/sysdeps/unix/sysv/linux/sh/lowlevelrobustlock.S b/nptl/sysdeps/unix/sysv/linux/sh/lowlevelrobustlock.S deleted file mode 100644 index 65b8d0cdcd..0000000000 --- a/nptl/sysdeps/unix/sysv/linux/sh/lowlevelrobustlock.S +++ /dev/null @@ -1,278 +0,0 @@ -/* Copyright (C) 2003-2014 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, see - . */ - -#include -#include -#include -#include -#include -#include "lowlevel-atomic.h" - - .text - -#define FUTEX_WAITERS 0x80000000 -#define FUTEX_OWNER_DIED 0x40000000 - -#ifdef __ASSUME_PRIVATE_FUTEX -# define LOAD_FUTEX_WAIT(reg,tmp,tmp2) \ - mov #(FUTEX_WAIT | FUTEX_PRIVATE_FLAG), tmp; \ - extu.b tmp, tmp; \ - xor tmp, reg -#else -# if FUTEX_WAIT == 0 -# define LOAD_FUTEX_WAIT(reg,tmp,tmp2) \ - stc gbr, tmp ; \ - mov.w 99f, tmp2 ; \ - add tmp2, tmp ; \ - mov.l @tmp, tmp2 ; \ - bra 98f ; \ - mov #FUTEX_PRIVATE_FLAG, tmp ; \ -99: .word PRIVATE_FUTEX - TLS_PRE_TCB_SIZE ; \ -98: extu.b tmp, tmp ; \ - xor tmp, reg ; \ - and tmp2, reg -# else -# define LOAD_FUTEX_WAIT(reg,tmp,tmp2) \ - stc gbr, tmp ; \ - mov.w 99f, tmp2 ; \ - add tmp2, tmp ; \ - mov.l @tmp, tmp2 ; \ - bra 98f ; \ - mov #FUTEX_PRIVATE_FLAG, tmp ; \ -99: .word PRIVATE_FUTEX - TLS_PRE_TCB_SIZE ; \ -98: extu.b tmp, tmp ; \ - xor tmp, reg ; \ - and tmp2, reg ; \ - mov #FUTEX_WAIT, tmp ; \ - or tmp, reg -# endif -#endif - - .globl __lll_robust_lock_wait - .type __lll_robust_lock_wait,@function - .hidden __lll_robust_lock_wait - .align 5 - cfi_startproc -__lll_robust_lock_wait: - mov.l r8, @-r15 - cfi_adjust_cfa_offset(4) - cfi_rel_offset (r8, 0) - mov r5, r8 - mov #0, r7 /* No timeout. */ - mov r6, r5 - LOAD_FUTEX_WAIT (r5, r0, r1) - -4: - mov r4, r6 - mov.l .L_FUTEX_WAITERS, r0 - or r0, r6 - shlr r0 /* r0 = FUTEX_OWNER_DIED */ - tst r0, r4 - bf/s 3f - cmp/eq r4, r6 - bt 1f - - CMPXCHG (r4, @r8, r6, r2) - bf 2f - -1: - mov r8, r4 - mov #SYS_futex, r3 - extu.b r3, r3 - trapa #0x14 - SYSCALL_INST_PAD - - mov.l @r8, r2 - -2: - tst r2, r2 - bf/s 4b - mov r2, r4 - - stc gbr, r1 - mov.w .Ltidoff, r2 - add r2, r1 - mov.l @r1, r6 - mov #0, r3 - CMPXCHG (r3, @r8, r6, r4) - bf 4b - mov #0, r4 - -3: - mov.l @r15+, r8 - cfi_adjust_cfa_offset (-4) - cfi_restore (r8) - ret - mov r4, r0 - cfi_endproc - .align 2 -.L_FUTEX_WAITERS: - .long FUTEX_WAITERS -.Ltidoff: - .word TID - TLS_PRE_TCB_SIZE - .size __lll_robust_lock_wait,.-__lll_robust_lock_wait - - - .globl __lll_robust_timedlock_wait - .type __lll_robust_timedlock_wait,@function - .hidden __lll_robust_timedlock_wait - .align 5 - cfi_startproc -__lll_robust_timedlock_wait: - /* Check for a valid timeout value. */ - mov.l @(4,r6), r1 - mov.l .L1g, r0 - cmp/hs r0, r1 - bt 3f - - cfi_remember_state - - mov.l r11, @-r15 - cfi_adjust_cfa_offset(4) - cfi_rel_offset (r11, 0) - mov.l r10, @-r15 - cfi_adjust_cfa_offset(4) - cfi_rel_offset (r10, 0) - mov.l r9, @-r15 - cfi_adjust_cfa_offset(4) - cfi_rel_offset (r9, 0) - mov.l r8, @-r15 - cfi_adjust_cfa_offset(4) - cfi_rel_offset (r8, 0) - mov r7, r11 - mov r4, r10 - mov r6, r9 - mov r5, r8 - - /* Stack frame for the timespec and timeval structs. */ - add #-8, r15 - cfi_adjust_cfa_offset(8) - -1: - /* Get current time. */ - mov r15, r4 - mov #0, r5 - mov #__NR_gettimeofday, r3 - trapa #0x12 - SYSCALL_INST_PAD - - /* Compute relative timeout. */ - mov.l @(4,r15), r0 - mov.w .L1k, r1 - dmulu.l r0, r1 /* Micro seconds to nano seconds. */ - mov.l @r9, r2 - mov.l @(4,r9), r3 - mov.l @r15, r0 - sts macl, r1 - sub r0, r2 - clrt - subc r1, r3 - bf 4f - mov.l .L1g, r1 - add r1, r3 - add #-1, r2 -4: - cmp/pz r2 - bf 8f /* Time is already up. */ - - mov.l r2, @r15 /* Store relative timeout. */ - mov.l r3, @(4,r15) - - mov r10, r6 - mov.l .L_FUTEX_WAITERS2, r0 - or r0, r6 - shlr r0 /* r0 = FUTEX_OWNER_DIED */ - tst r0, r4 - bf/s 6f - cmp/eq r4, r6 - bt 2f - - CMPXCHG (r4, @r8, r6, r2) - bf/s 5f - mov #0, r5 - -2: - mov r8, r4 - mov r11, r5 - LOAD_FUTEX_WAIT (r5, r0, r1) - mov r10, r6 - mov r15, r7 - mov #SYS_futex, r3 - extu.b r3, r3 - trapa #0x14 - SYSCALL_INST_PAD - mov r0, r5 - - mov.l @r8, r2 - -5: - tst r2, r2 - bf/s 7f - mov r2, r10 - - stc gbr, r1 - mov.w .Ltidoff2, r2 - add r2, r1 - mov.l @r1, r4 - mov #0, r3 - CMPXCHG (r3, @r8, r4, r10) - bf 7f - mov #0, r0 - -6: - cfi_remember_state - add #8, r15 - cfi_adjust_cfa_offset (-8) - mov.l @r15+, r8 - cfi_adjust_cfa_offset (-4) - cfi_restore (r8) - mov.l @r15+, r9 - cfi_adjust_cfa_offset (-4) - cfi_restore (r9) - mov.l @r15+, r10 - cfi_adjust_cfa_offset (-4) - cfi_restore (r10) - rts - mov.l @r15+, r11 - /* Omit CFI for restore in delay slot. */ - cfi_restore_state - -7: - /* Check whether the time expired. */ - mov #-ETIMEDOUT, r1 - cmp/eq r5, r1 - bf 1b - -8: - bra 6b - mov #ETIMEDOUT, r0 - - cfi_restore_state -3: - rts - mov #EINVAL, r0 - cfi_endproc - .align 2 -.L_FUTEX_WAITERS2: - .long FUTEX_WAITERS -.L1g: - .long 1000000000 -.Ltidoff2: - .word TID - TLS_PRE_TCB_SIZE -.L1k: - .word 1000 - .size __lll_robust_timedlock_wait,.-__lll_robust_timedlock_wait diff --git a/nptl/sysdeps/unix/sysv/linux/sh/pthread_barrier_wait.S b/nptl/sysdeps/unix/sysv/linux/sh/pthread_barrier_wait.S deleted file mode 100644 index 946b1d746f..0000000000 --- a/nptl/sysdeps/unix/sysv/linux/sh/pthread_barrier_wait.S +++ /dev/null @@ -1,239 +0,0 @@ -/* Copyright (C) 2003-2014 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, see - . */ - -#include -#include -#include -#include "lowlevel-atomic.h" - - .text - - .globl pthread_barrier_wait - .type pthread_barrier_wait,@function - .align 5 - cfi_startproc -pthread_barrier_wait: - mov.l r9, @-r15 - cfi_adjust_cfa_offset (4) - cfi_rel_offset (r9, 0) - mov.l r8, @-r15 - cfi_adjust_cfa_offset (4) - cfi_rel_offset (r8, 0) - sts.l pr, @-r15 - cfi_adjust_cfa_offset (4) - cfi_rel_offset (pr, 0) - mov r4, r8 - - /* Get the mutex. */ - mov #0, r3 - mov #1, r4 - CMPXCHG (r3, @(MUTEX,r8), r4, r2) - bf 1f - - /* One less waiter. If this was the last one needed wake - everybody. */ -2: - mov.l @(LEFT,r8), r0 - add #-1, r0 - mov.l r0, @(LEFT,r8) - tst r0, r0 - bt 3f - - /* There are more threads to come. */ - mov.l @(CURR_EVENT,r8), r6 - - /* Release the mutex. */ - DEC (@(MUTEX,r8), r2) - tst r2, r2 - bf 6f -7: - /* Wait for the remaining threads. The call will return immediately - if the CURR_EVENT memory has meanwhile been changed. */ - mov r8, r4 -#if CURR_EVENT != 0 - add #CURR_EVENT, r4 -#endif -#if FUTEX_WAIT == 0 - mov.l @(PRIVATE,r8), r5 -#else - mov #FUTEX_WAIT, r5 - mov.l @(PRIVATE,r8), r0 - or r0, r5 -#endif - mov #0, r7 -8: - mov #SYS_futex, r3 - extu.b r3, r3 - trapa #0x14 - SYSCALL_INST_PAD - - /* Don't return on spurious wakeups. The syscall does not change - any register except r0 so there is no need to reload any of - them. */ - mov.l @(CURR_EVENT,r8), r0 - cmp/eq r0, r6 - bt 8b - - /* Increment LEFT. If this brings the count back to the - initial count unlock the object. */ - mov #1, r3 - mov.l @(INIT_COUNT,r8), r4 - XADD (r3, @(LEFT,r8), r2, r5) - add #-1, r4 - cmp/eq r2, r4 - bf 10f - - /* Release the mutex. We cannot release the lock before - waking the waiting threads since otherwise a new thread might - arrive and gets waken up, too. */ - DEC (@(MUTEX,r8), r2) - tst r2, r2 - bf 9f - -10: - cfi_remember_state - lds.l @r15+, pr - cfi_adjust_cfa_offset (-4) - cfi_restore (pr) - mov.l @r15+, r8 - cfi_adjust_cfa_offset (-4) - cfi_restore (r8) - mov.l @r15+, r9 - cfi_adjust_cfa_offset (-4) - cfi_restore (r9) - rts - mov #0, r0 /* != PTHREAD_BARRIER_SERIAL_THREAD */ - cfi_restore_state - -3: - /* The necessary number of threads arrived. */ - mov.l @(CURR_EVENT,r8), r1 - add #1, r1 - mov.l r1, @(CURR_EVENT,r8) - - /* Wake up all waiters. The count is a signed number in the kernel - so 0x7fffffff is the highest value. */ - mov.l .Lall, r6 - mov r8, r4 -#if CURR_EVENT != 0 - add #CURR_EVENT, r4 -#endif - mov #0, r7 - mov #FUTEX_WAKE, r5 - mov.l @(PRIVATE,r8), r0 - or r0, r5 - mov #SYS_futex, r3 - extu.b r3, r3 - trapa #0x14 - SYSCALL_INST_PAD - - /* Increment LEFT. If this brings the count back to the - initial count unlock the object. */ - mov #1, r3 - mov.l @(INIT_COUNT,r8), r4 - XADD (r3, @(LEFT,r8), r2, r5) - add #-1, r4 - cmp/eq r2, r4 - bf 5f - - /* Release the mutex. */ - DEC (@(MUTEX,r8), r2) - tst r2, r2 - bf 4f -5: - cfi_remember_state - lds.l @r15+, pr - cfi_adjust_cfa_offset (-4) - cfi_restore (pr) - mov.l @r15+, r8 - cfi_adjust_cfa_offset (-4) - cfi_restore (r8) - mov.l @r15+, r9 - cfi_adjust_cfa_offset (-4) - cfi_restore (r9) - rts - mov #-1, r0 /* == PTHREAD_BARRIER_SERIAL_THREAD */ - cfi_restore_state - -1: - mov.l @(PRIVATE,r8), r6 - mov #LLL_SHARED, r0 - extu.b r0, r0 - xor r0, r6 - mov r2, r4 - mov r8, r5 - mov.l .Lwait0, r1 - bsrf r1 - add #MUTEX, r5 -.Lwait0b: - bra 2b - nop - -4: - mov.l @(PRIVATE,r8), r5 - mov #LLL_SHARED, r0 - extu.b r0, r0 - xor r0, r5 - mov r8, r4 - mov.l .Lwake0, r1 - bsrf r1 - add #MUTEX, r4 -.Lwake0b: - bra 5b - nop - -6: - mov r6, r9 - mov.l @(PRIVATE,r8), r5 - mov #LLL_SHARED, r0 - extu.b r0, r0 - xor r0, r5 - mov r8, r4 - mov.l .Lwake1, r1 - bsrf r1 - add #MUTEX, r4 -.Lwake1b: - bra 7b - mov r9, r6 - -9: - mov r6, r9 - mov.l @(PRIVATE,r8), r5 - mov #LLL_SHARED, r0 - extu.b r0, r0 - xor r0, r5 - mov r8, r4 - mov.l .Lwake2, r1 - bsrf r1 - add #MUTEX, r4 -.Lwake2b: - bra 10b - mov r9, r6 - cfi_endproc - - .align 2 -.Lall: - .long 0x7fffffff -.Lwait0: - .long __lll_lock_wait-.Lwait0b -.Lwake0: - .long __lll_unlock_wake-.Lwake0b -.Lwake1: - .long __lll_unlock_wake-.Lwake1b -.Lwake2: - .long __lll_unlock_wake-.Lwake2b - .size pthread_barrier_wait,.-pthread_barrier_wait diff --git a/nptl/sysdeps/unix/sysv/linux/sh/pthread_cond_broadcast.S b/nptl/sysdeps/unix/sysv/linux/sh/pthread_cond_broadcast.S deleted file mode 100644 index 89b32ccf0e..0000000000 --- a/nptl/sysdeps/unix/sysv/linux/sh/pthread_cond_broadcast.S +++ /dev/null @@ -1,292 +0,0 @@ -/* Copyright (C) 2003-2014 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 - Licens