* [PATCH] SPARC libc fixes
@ 2003-08-15 1:22 Jakub Jelinek
2003-08-15 3:55 ` Ulrich Drepper
0 siblings, 1 reply; 2+ messages in thread
From: Jakub Jelinek @ 2003-08-15 1:22 UTC (permalink / raw)
To: Ulrich Drepper, Roland McGrath; +Cc: Glibc hackers
Hi!
3 little changes:
1) HAVE_TLS_SUPPORT was always undefined on sparc32, because the assembly
could not be assembled due to missing []
2) we cannot include <linux/user.h> in <sys/user.h> anymore on SPARC,
since kernel includes <asm/a.out.h> and that clashes with <a.out.h>
which e.g. readlib.c includes
3) one lock per library for all atomic operations is too big bottleneck,
this patch provides 64 locks instead
2003-08-15 Jakub Jelinek <jakub@redhat.com>
* sysdeps/sparc/sparc32/elf/configure.in (libc_cv_sparc32_tls):
Change quotes before using [].
* sysdeps/sparc/sparc32/elf/configure: Rebuilt.
* sysdeps/unix/sysv/linux/sparc/sys/user.h: New file.
* sysdeps/sparc/sparc32/bits/atomic.h (__sparc32_atomic_lock):
Renamed to...
(__sparc32_atomic_locks): ...this. Change into 64-byte array.
(__sparc32_atomic_do_lock, __sparc32_atomic_do_unlock): Add addr
argument. Select one of 64 locks from address bits.
(atomic_compare_and_exchange_val_acq,
atomic_compare_and_exchange_bool_acq): Pass memory address to
__sparc32_atomic_do_{,un}lock.
--- libc/sysdeps/sparc/sparc32/elf/configure.in.jj 2003-02-04 03:39:20.000000000 -0500
+++ libc/sysdeps/sparc/sparc32/elf/configure.in 2003-08-14 17:15:01.000000000 -0400
@@ -4,6 +4,7 @@ GLIBC_PROVIDES dnl See aclocal.m4 in the
if test "$usetls" != no; then
# Check for support of thread-local storage handling in assembler and linker.
AC_CACHE_CHECK(for sparc32 TLS support, libc_cv_sparc32_tls, [dnl
+changequote(,)dnl
cat > conftest.s <<\EOF
.section ".tdata", "awT", @progbits
.globl foo
@@ -30,6 +31,7 @@ baz: sethi %tgd_hi22(foo), %l1
sethi %tle_hix22(foo), %l1
xor %l1, %tle_lox10(foo), %l1
EOF
+changequote([,])dnl
dnl
if AC_TRY_COMMAND(${CC-cc} -c $CFLAGS conftest.s 1>&AS_MESSAGE_LOG_FD); then
libc_cv_sparc32_tls=yes
--- libc/sysdeps/sparc/sparc32/elf/configure.jj 2003-02-21 01:59:43.000000000 -0500
+++ libc/sysdeps/sparc/sparc32/elf/configure 2003-08-14 17:15:40.000000000 -0400
@@ -29,7 +29,7 @@ baz: sethi %tgd_hi22(foo), %l1
add %o0, %l1, %l1, %tldo_add(bar)
sethi %tie_hi22(foo), %l1
add %l1, %tie_lo10(foo), %l1
- ld %l7 + %l1, %l1, %tie_ld(foo)
+ ld [%l7 + %l1], %l1, %tie_ld(foo)
add %g7, %l1, %l1, %tie_add(foo)
sethi %tle_hix22(foo), %l1
xor %l1, %tle_lox10(foo), %l1
--- libc/sysdeps/unix/sysv/linux/sparc/sys/user.h.jj 2003-08-14 18:25:11.000000000 -0400
+++ libc/sysdeps/unix/sysv/linux/sparc/sys/user.h 2003-08-14 18:25:32.000000000 -0400
@@ -0,0 +1,85 @@
+/* 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 _SYS_USER_H
+#define _SYS_USER_H 1
+
+struct sunos_regs
+{
+ unsigned int psr, pc, npc, y;
+ unsigned int regs[15];
+};
+
+struct sunos_fpqueue
+{
+ unsigned int *addr;
+ unsigned int inst;
+};
+
+struct sunos_fp
+{
+ union
+ {
+ unsigned int regs[32];
+ double reg_dbls[16];
+ } fregs;
+ unsigned int fsr;
+ unsigned int flags;
+ unsigned int extra;
+ unsigned int fpq_count;
+ struct sunos_fpqueue fpq[16];
+};
+
+struct sunos_fpu
+{
+ struct sunos_fp fpstatus;
+};
+
+/* The SunOS core file header layout. */
+struct user {
+ unsigned int magic;
+ unsigned int len;
+ struct sunos_regs regs;
+ struct
+ {
+ unsigned char a_dynamic :1;
+ unsigned char a_toolversion :7;
+ unsigned char a_machtype;
+ unsigned short a_info;
+ unsigned int a_text;
+ unsigned int a_data;
+ unsigned int a_bss;
+ unsigned int a_syms;
+ unsigned int a_entry;
+ unsigned int a_trsize;
+ unsigned int a_drsize;
+ } uexec;
+ int signal;
+ size_t u_tsize;
+ size_t u_dsize;
+ size_t u_ssize;
+ char u_comm[17];
+ struct sunos_fpu fpu;
+ unsigned int sigcode;
+};
+
+#define NBPG 0x2000
+#define UPAGES 1
+#define SUNOS_CORE_MAGIC 0x080456
+
+#endif
--- libc/sysdeps/sparc/sparc32/bits/atomic.h.jj 2003-03-30 18:36:39.000000000 -0500
+++ libc/sysdeps/sparc/sparc32/bits/atomic.h 2003-08-14 19:09:32.000000000 -0400
@@ -22,28 +22,34 @@
#define _BITS_ATOMIC_H 1
/* We have no compare and swap, just test and set.
- The following implementation contends on one single global lock
+ The following implementation contends on 64 global locks
per library and assumes no variable will be accessed using atomic.h
macros from two different libraries. */
-volatile unsigned char __sparc32_atomic_lock
- __attribute__ ((nocommon, section (".gnu.linkonce.b.__sparc32_atomic_lock"),
+volatile unsigned char __sparc32_atomic_locks[64]
+ __attribute__ ((nocommon, section (".gnu.linkonce.b.__sparc32_atomic_locks"),
visibility ("hidden")));
-#define __sparc32_atomic_do_lock() \
+#define __sparc32_atomic_do_lock(addr) \
do \
{ \
unsigned int __old_lock; \
+ unsigned int __idx = (((long) addr >> 2) ^ ((long) addr >> 12)) \
+ & 63; \
do \
__asm ("ldstub %1, %0" \
- : "=r" (__old_lock), "=m" (__sparc32_atomic_lock) \
- : "m" (__sparc32_atomic_lock)); \
+ : "=r" (__old_lock), \
+ "=m" (__sparc32_atomic_locks[__idx]) \
+ : "m" (__sparc32_atomic_locks[__idx])); \
while (__old_lock); \
} \
while (0)
-#define __sparc32_atomic_do_unlock() \
- do __sparc32_atomic_lock = 0; while (0)
+#define __sparc32_atomic_do_unlock(addr) \
+ do \
+ __sparc32_atomic_locks[(((long) addr >> 2) \
+ ^ ((long) addr >> 12)) & 63] = 0; \
+ while (0)
/* The only basic operation needed is compare and exchange. */
#define atomic_compare_and_exchange_val_acq(mem, newval, oldval) \
@@ -51,11 +57,11 @@ volatile unsigned char __sparc32_atomic_
__typeof (*mem) __acev_ret; \
__typeof (*mem) __acev_newval = (newval); \
\
- __sparc32_atomic_do_lock (); \
+ __sparc32_atomic_do_lock (__acev_memp); \
__acev_ret = *__acev_memp; \
if (__acev_ret == (oldval)) \
*__acev_memp = __acev_newval; \
- __sparc32_atomic_do_unlock (); \
+ __sparc32_atomic_do_unlock (__acev_memp); \
__acev_ret; })
#define atomic_compare_and_exchange_bool_acq(mem, newval, oldval) \
@@ -63,13 +69,13 @@ volatile unsigned char __sparc32_atomic_
int __aceb_ret; \
__typeof (*mem) __aceb_newval = (newval); \
\
- __sparc32_atomic_do_lock (); \
+ __sparc32_atomic_do_lock (__aceb_memp); \
__aceb_ret = 0; \
if (*__aceb_memp == (oldval)) \
*__aceb_memp = __aceb_newval; \
else \
__aceb_ret = 1; \
- __sparc32_atomic_do_unlock (); \
+ __sparc32_atomic_do_unlock (__aceb_memp); \
__aceb_ret; })
#endif /* bits/atomic.h */
Jakub
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: [PATCH] SPARC libc fixes
2003-08-15 1:22 [PATCH] SPARC libc fixes Jakub Jelinek
@ 2003-08-15 3:55 ` Ulrich Drepper
0 siblings, 0 replies; 2+ messages in thread
From: Ulrich Drepper @ 2003-08-15 3:55 UTC (permalink / raw)
To: Jakub Jelinek; +Cc: Glibc hackers
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
Jakub Jelinek wrote:
> Hi!
>
> 3 little changes:
I've applied them. Thanks,
- --
- --------------. ,-. 444 Castro Street
Ulrich Drepper \ ,-----------------' \ Mountain View, CA 94041 USA
Red Hat `--' drepper at redhat.com `---------------------------
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.1 (GNU/Linux)
iD8DBQE/PFmT2ijCOnn/RHQRAq4BAJ9HOhKnAGyMSlExUwKdu1ENbb1y4ACfdVEp
dscVlkOfOcT1HsbdjX3V8zE=
=9a1i
-----END PGP SIGNATURE-----
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2003-08-15 3:55 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2003-08-15 1:22 [PATCH] SPARC libc fixes Jakub Jelinek
2003-08-15 3:55 ` Ulrich Drepper
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).