Define a BUSY_WAIT_NOP for sparc.

nptl/

	* sysdeps/unix/sysv/linux/sparc/lowlevellock.h (BUSY_WAIT_NOP):
	Define when we have v9 instructions available.
	* sysdeps/unix/sysv/linux/sparc/sparc64/cpu_relax.S: New file.
	* sysdeps/unix/sysv/linux/sparc/sparc32/sparcv9/cpu_relax.S: New
	file.
	* sysdeps/unix/sysv/linux/sparc/sparc32/sparcv9/Makefile: New
	file.
	* sysdeps/unix/sysv/linux/sparc/sparc64/Makefile: Add cpu_relax
	to libpthread-routines.
This commit is contained in:
David S. Miller 2012-10-28 23:19:00 -07:00
parent 86ebe6b133
commit 19f1dd5f2d
6 changed files with 88 additions and 0 deletions

View File

@ -1,3 +1,15 @@
2012-10-28 David S. Miller <davem@davemloft.net>
* sysdeps/unix/sysv/linux/sparc/lowlevellock.h (BUSY_WAIT_NOP):
Define when we have v9 instructions available.
* sysdeps/unix/sysv/linux/sparc/sparc64/cpu_relax.S: New file.
* sysdeps/unix/sysv/linux/sparc/sparc32/sparcv9/cpu_relax.S: New
file.
* sysdeps/unix/sysv/linux/sparc/sparc32/sparcv9/Makefile: New
file.
* sysdeps/unix/sysv/linux/sparc/sparc64/Makefile: Add cpu_relax
to libpthread-routines.
2012-10-25 Roland McGrath <roland@hack.frob.com>
* tst-cond-except.c (TEST_FUNCTION): New macro.

View File

@ -50,6 +50,11 @@
#define LLL_PRIVATE 0
#define LLL_SHARED FUTEX_PRIVATE_FLAG
#ifndef __sparc32_atomic_do_lock
/* Delay in spinlock loop. */
extern void __cpu_relax(void);
#define BUSY_WAIT_NOP __cpu_relax()
#endif
#if !defined NOT_IN_libc || defined IS_IN_rtld
/* In libc.so or ld.so all futexes are private. */

View File

@ -0,0 +1 @@
libpthread-routines += cpu_relax

View File

@ -0,0 +1 @@
#include <sparc64/cpu_relax.S>

View File

@ -1,3 +1,5 @@
libpthread-routines += cpu_relax
ifeq ($(subdir),nptl)
CFLAGS-pause.c += -fexceptions
CFLAGS-sigsuspend.c += -fexceptions

View File

@ -0,0 +1,67 @@
/* CPU strand yielding for busy loops.
Copyright (C) 2012 Free Software Foundation, Inc.
Contributed by David S. Miller (davem@davemloft.net)
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
<http://www.gnu.org/licenses/>. */
#include <sysdep.h>
.text
__cpu_relax_generic:
rd %ccr, %g0
rd %ccr, %g0
rd %ccr, %g0
retl
nop
.size __cpu_relax_generic,.-__cpu_relax_generic
__cpu_relax_pause:
wr %g0, 128, %asr27
retl
nop
.size __cpu_relax_pause,.-__cpu_relax_pause
ENTRY(__cpu_relax)
.type __cpu_relax, @gnu_indirect_function
# ifdef SHARED
SETUP_PIC_REG_LEAF(o3, o5)
# endif
set HWCAP_SPARC_PAUSE, %o1
andcc %o0, %o1, %g0
be 1f
nop
# ifdef SHARED
sethi %gdop_hix22(__cpu_relax_pause), %o1
xor %o1, %gdop_lox10(__cpu_relax_pause), %o1
# else
set __cpu_relax_pause, %o1
# endif
ba 10f
nop
1:
# ifdef SHARED
sethi %gdop_hix22(__cpu_relax_generic), %o1
xor %o1, %gdop_lox10(__cpu_relax_generic), %o1
# else
set __cpu_relax_generic, %o1
# endif
10:
# ifdef SHARED
add %o3, %o1, %o1
# endif
retl
mov %o1, %o0
END(__cpu_relax)