PERFORCE change 32083 for review
Peter Wemm
peter at FreeBSD.org
Thu May 29 18:14:09 PDT 2003
http://perforce.freebsd.org/chv.cgi?CH=32083
Change 32083 by peter at peter_daintree on 2003/05/29 18:13:15
IFC @32081
Affected files ...
.. //depot/projects/hammer/lib/libpthread/Makefile#7 integrate
.. //depot/projects/hammer/lib/libpthread/pthread.map#1 branch
.. //depot/projects/hammer/lib/libpthread/support/Makefile.inc#1 branch
.. //depot/projects/hammer/lib/libpthread/support/thr_support.c#1 branch
.. //depot/projects/hammer/lib/libpthread/sys/Makefile.inc#4 integrate
.. //depot/projects/hammer/lib/libpthread/thread/Makefile.inc#5 integrate
.. //depot/projects/hammer/lib/libpthread/thread/thr_cond.c#8 integrate
.. //depot/projects/hammer/lib/libpthread/thread/thr_exit.c#5 integrate
.. //depot/projects/hammer/lib/libpthread/thread/thr_init.c#8 integrate
.. //depot/projects/hammer/lib/libpthread/thread/thr_mutex.c#5 integrate
.. //depot/projects/hammer/lib/libpthread/thread/thr_private.h#10 integrate
.. //depot/projects/hammer/lib/libpthread/thread/thr_rtld.c#1 branch
.. //depot/projects/hammer/lib/libpthread/thread/thr_rwlock.c#4 integrate
.. //depot/projects/hammer/lib/libpthread/thread/thr_sigprocmask.c#2 integrate
.. //depot/projects/hammer/libexec/rtld-elf/Makefile#4 integrate
.. //depot/projects/hammer/libexec/rtld-elf/alpha/rtld_machdep.h#3 integrate
.. //depot/projects/hammer/libexec/rtld-elf/alpha/rtld_start.S#2 integrate
.. //depot/projects/hammer/libexec/rtld-elf/amd64/rtld_machdep.h#5 integrate
.. //depot/projects/hammer/libexec/rtld-elf/i386/lockdflt.c#2 integrate
.. //depot/projects/hammer/libexec/rtld-elf/i386/rtld_machdep.h#3 integrate
.. //depot/projects/hammer/libexec/rtld-elf/ia64/reloc.c#5 integrate
.. //depot/projects/hammer/libexec/rtld-elf/ia64/rtld_machdep.h#3 integrate
.. //depot/projects/hammer/libexec/rtld-elf/ia64/rtld_start.S#2 integrate
.. //depot/projects/hammer/libexec/rtld-elf/libmap.c#5 integrate
.. //depot/projects/hammer/libexec/rtld-elf/powerpc/reloc.c#3 integrate
.. //depot/projects/hammer/libexec/rtld-elf/powerpc/rtld_machdep.h#2 integrate
.. //depot/projects/hammer/libexec/rtld-elf/powerpc/rtld_start.S#2 integrate
.. //depot/projects/hammer/libexec/rtld-elf/rtld.c#8 integrate
.. //depot/projects/hammer/libexec/rtld-elf/rtld.h#3 integrate
.. //depot/projects/hammer/libexec/rtld-elf/rtld_lock.c#1 branch
.. //depot/projects/hammer/libexec/rtld-elf/rtld_lock.h#1 branch
.. //depot/projects/hammer/libexec/rtld-elf/sparc64/reloc.c#6 integrate
.. //depot/projects/hammer/libexec/rtld-elf/sparc64/rtld_machdep.h#4 integrate
.. //depot/projects/hammer/libexec/rtld-elf/sparc64/rtld_start.S#3 integrate
.. //depot/projects/hammer/sys/amd64/amd64/amd64-gdbstub.c#3 integrate
.. //depot/projects/hammer/sys/amd64/amd64/db_interface.c#7 integrate
.. //depot/projects/hammer/sys/amd64/amd64/db_trace.c#6 integrate
.. //depot/projects/hammer/sys/amd64/amd64/support.S#9 integrate
.. //depot/projects/hammer/sys/amd64/include/db_machdep.h#7 integrate
.. //depot/projects/hammer/sys/conf/Makefile.amd64#12 integrate
.. //depot/projects/hammer/sys/conf/files.amd64#17 integrate
.. //depot/projects/hammer/sys/conf/kern.mk#12 integrate
.. //depot/projects/hammer/sys/dev/usb/ugen.c#5 integrate
.. //depot/projects/hammer/sys/security/mac_biba/mac_biba.c#12 integrate
.. //depot/projects/hammer/sys/security/mac_mls/mac_mls.c#12 integrate
Differences ...
==== //depot/projects/hammer/lib/libpthread/Makefile#7 (text+ko) ====
@@ -1,4 +1,4 @@
-# $FreeBSD: src/lib/libpthread/Makefile,v 1.41 2003/04/25 01:31:56 deischen Exp $
+# $FreeBSD: src/lib/libpthread/Makefile,v 1.42 2003/05/30 00:21:51 kan Exp $
#
# All library objects contain FreeBSD revision strings by default; they may be
# excluded as a space-saving measure. To produce a library that does
@@ -14,12 +14,16 @@
-I${.CURDIR}/../../include
CFLAGS+=-I${.CURDIR}/arch/${MACHINE_ARCH}/include
CFLAGS+=-I${.CURDIR}/sys
+CFLAGS+=-I${.CURDIR}/../../libexec/rtld-elf
+CFLAGS+=-fno-builtin
# Uncomment this if you want libpthread to contain debug information for
# thread locking.
CFLAGS+=-D_LOCK_DEBUG
#CFLAGS+= -g
+LDADD+= -Wl,--version-script=${.CURDIR}/pthread.map
+
# enable extra internal consistancy checks
CFLAGS+=-D_PTHREADS_INVARIANTS -Wall
@@ -28,5 +32,6 @@
.include "${.CURDIR}/thread/Makefile.inc"
.include "${.CURDIR}/sys/Makefile.inc"
+.include "${.CURDIR}/support/Makefile.inc"
.include <bsd.lib.mk>
==== //depot/projects/hammer/lib/libpthread/sys/Makefile.inc#4 (text+ko) ====
@@ -1,6 +1,7 @@
-# $FreeBSD: src/lib/libpthread/sys/Makefile.inc,v 1.13 2003/04/18 05:02:39 deischen Exp $
+# $FreeBSD: src/lib/libpthread/sys/Makefile.inc,v 1.14 2003/05/30 00:21:52 kan Exp $
.PATH: ${.CURDIR}/sys ${.CURDIR}/arch/${MACHINE_ARCH}/${MACHINE_ARCH}
SRCS+= thr_error.c _atomic_lock.S ksd.c thr_enter_uts.S thr_getcontext.S \
thr_switch.S lock.c
+
==== //depot/projects/hammer/lib/libpthread/thread/Makefile.inc#5 (text+ko) ====
@@ -1,4 +1,4 @@
-# $FreeBSD: src/lib/libpthread/thread/Makefile.inc,v 1.40 2003/04/22 20:29:16 deischen Exp $
+# $FreeBSD: src/lib/libpthread/thread/Makefile.inc,v 1.41 2003/05/30 00:21:52 kan Exp $
# thr sources
.PATH: ${.CURDIR}/thread
@@ -71,6 +71,7 @@
thr_read.c \
thr_readv.c \
thr_resume_np.c \
+ thr_rtld.c \
thr_rwlock.c \
thr_rwlockattr.c \
thr_select.c \
==== //depot/projects/hammer/lib/libpthread/thread/thr_cond.c#8 (text+ko) ====
@@ -29,7 +29,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $FreeBSD: src/lib/libpthread/thread/thr_cond.c,v 1.42 2003/05/24 02:29:25 deischen Exp $
+ * $FreeBSD: src/lib/libpthread/thread/thr_cond.c,v 1.43 2003/05/30 00:21:52 kan Exp $
*/
#include <stdlib.h>
#include <errno.h>
@@ -355,6 +355,8 @@
return (rval);
}
+__strong_reference(_pthread_cond_wait, _thr_cond_wait);
+
int
__pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex)
{
@@ -632,6 +634,8 @@
return (rval);
}
+__strong_reference(_pthread_cond_signal, _thr_cond_signal);
+
int
_pthread_cond_broadcast(pthread_cond_t * cond)
{
@@ -673,7 +677,7 @@
/* There are no more waiting threads: */
(*cond)->c_mutex = NULL;
break;
-
+
/* Trap invalid condition variable types: */
default:
/* Return an invalid argument error: */
@@ -689,6 +693,8 @@
return (rval);
}
+__strong_reference(_pthread_cond_broadcast, _thr_cond_broadcast);
+
void
_cond_wait_backout(struct pthread *curthread)
{
==== //depot/projects/hammer/lib/libpthread/thread/thr_exit.c#5 (text+ko) ====
@@ -29,7 +29,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $FreeBSD: src/lib/libpthread/thread/thr_exit.c,v 1.32 2003/05/16 19:58:29 deischen Exp $
+ * $FreeBSD: src/lib/libpthread/thread/thr_exit.c,v 1.33 2003/05/30 00:21:52 kan Exp $
*/
#include <errno.h>
#include <unistd.h>
@@ -47,16 +47,12 @@
void
_thr_exit(char *fname, int lineno, char *msg)
{
- char s[256];
- /* Prepare an error message string: */
- snprintf(s, sizeof(s),
+ /* Write an error message to the standard error file descriptor: */
+ _thread_printf(2,
"Fatal error '%s' at line %d in file %s (errno = %d)\n",
msg, lineno, fname, errno);
- /* Write the string to the standard error file descriptor: */
- __sys_write(2, s, strlen(s));
-
abort();
}
==== //depot/projects/hammer/lib/libpthread/thread/thr_init.c#8 (text+ko) ====
@@ -30,7 +30,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $FreeBSD: src/lib/libpthread/thread/thr_init.c,v 1.53 2003/05/29 17:10:45 deischen Exp $
+ * $FreeBSD: src/lib/libpthread/thread/thr_init.c,v 1.54 2003/05/30 00:21:52 kan Exp $
*/
/* Allocate space for global thread variables here: */
@@ -304,6 +304,8 @@
_thr_initial->kse->k_curthread = _thr_initial;
_thr_initial->kse->k_flags |= KF_INITIALIZED;
_kse_initial->k_curthread = _thr_initial;
+
+ _thr_rtld_init();
}
/*
==== //depot/projects/hammer/lib/libpthread/thread/thr_mutex.c#5 (text+ko) ====
@@ -29,7 +29,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $FreeBSD: src/lib/libpthread/thread/thr_mutex.c,v 1.35 2003/05/16 19:58:29 deischen Exp $
+ * $FreeBSD: src/lib/libpthread/thread/thr_mutex.c,v 1.36 2003/05/30 00:21:52 kan Exp $
*/
#include <stdlib.h>
#include <errno.h>
@@ -718,6 +718,8 @@
return (ret);
}
+__strong_reference(__pthread_mutex_lock, _thr_mutex_lock);
+
int
_pthread_mutex_lock(pthread_mutex_t *m)
{
@@ -748,6 +750,8 @@
return (mutex_unlock_common(m, /* add reference */ 0));
}
+__strong_reference(_pthread_mutex_unlock, _thr_mutex_unlock);
+
int
_mutex_cv_unlock(pthread_mutex_t *m)
{
==== //depot/projects/hammer/lib/libpthread/thread/thr_private.h#10 (text+ko) ====
@@ -31,7 +31,7 @@
*
* Private thread definitions for the uthread kernel.
*
- * $FreeBSD: src/lib/libpthread/thread/thr_private.h,v 1.88 2003/05/29 17:10:45 deischen Exp $
+ * $FreeBSD: src/lib/libpthread/thread/thr_private.h,v 1.89 2003/05/30 00:21:52 kan Exp $
*/
#ifndef _THR_PRIVATE_H
@@ -794,6 +794,11 @@
struct pthread_specific_elem *specific;
int specific_data_count;
+ /*
+ * Current locks bitmap for rtld.
+ */
+ int rtld_bits;
+
/* Cleanup handlers Link List */
struct pthread_cleanup *cleanup;
char *fname; /* Ptr to source file name */
@@ -1084,6 +1089,8 @@
int _pthread_mutexattr_destroy(pthread_mutexattr_t *);
int _pthread_mutexattr_settype(pthread_mutexattr_t *, int);
int _pthread_once(pthread_once_t *, void (*) (void));
+int _pthread_rwlock_init(pthread_rwlock_t *, const pthread_rwlockattr_t *);
+int _pthread_rwlock_destroy (pthread_rwlock_t *);
struct pthread *_pthread_self(void);
int _pthread_setspecific(pthread_key_t, const void *);
struct pthread *_thr_alloc(struct pthread *);
@@ -1128,6 +1135,19 @@
int _thr_setconcurrency(int new_level);
int _thr_setmaxconcurrency(void);
+/*
+ * Aliases for _pthread functions. Should be called instead of
+ * originals if PLT replocation is unwanted at runtme.
+ */
+int _thr_cond_broadcast(pthread_cond_t *);
+int _thr_cond_signal(pthread_cond_t *);
+int _thr_cond_wait(pthread_cond_t *, pthread_mutex_t *);
+int _thr_mutex_lock(pthread_mutex_t *);
+int _thr_mutex_unlock(pthread_mutex_t *);
+int _thr_rwlock_rdlock (pthread_rwlock_t *);
+int _thr_rwlock_wrlock (pthread_rwlock_t *);
+int _thr_rwlock_unlock (pthread_rwlock_t *);
+
/* XXX - Stuff that goes away when my sources get more up to date. */
/* #include <sys/kse.h> */
#ifdef SYS_KSE_H
==== //depot/projects/hammer/lib/libpthread/thread/thr_rwlock.c#4 (text+ko) ====
@@ -23,7 +23,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $FreeBSD: src/lib/libpthread/thread/thr_rwlock.c,v 1.11 2003/04/18 05:04:16 deischen Exp $
+ * $FreeBSD: src/lib/libpthread/thread/thr_rwlock.c,v 1.12 2003/05/30 00:21:52 kan Exp $
*/
#include <errno.h>
@@ -46,7 +46,6 @@
__weak_reference(_pthread_rwlock_unlock, pthread_rwlock_unlock);
__weak_reference(_pthread_rwlock_wrlock, pthread_rwlock_wrlock);
-
/*
* Prototypes
*/
@@ -158,16 +157,16 @@
}
/* grab the monitor lock */
- if ((ret = _pthread_mutex_lock(&prwlock->lock)) != 0)
+ if ((ret = _thr_mutex_lock(&prwlock->lock)) != 0)
return (ret);
/* give writers priority over readers */
while (prwlock->blocked_writers || prwlock->state < 0) {
- ret = _pthread_cond_wait(&prwlock->read_signal, &prwlock->lock);
+ ret = _thr_cond_wait(&prwlock->read_signal, &prwlock->lock);
if (ret != 0) {
/* can't do a whole lot if this fails */
- _pthread_mutex_unlock(&prwlock->lock);
+ _thr_mutex_unlock(&prwlock->lock);
return (ret);
}
}
@@ -184,11 +183,13 @@
* lock. Decrementing 'state' is no good because we probably
* don't have the monitor lock.
*/
- _pthread_mutex_unlock(&prwlock->lock);
+ _thr_mutex_unlock(&prwlock->lock);
return (ret);
}
+__strong_reference(_pthread_rwlock_rdlock, _thr_rwlock_rdlock);
+
int
_pthread_rwlock_tryrdlock (pthread_rwlock_t *rwlock)
{
@@ -276,28 +277,30 @@
return (EINVAL);
/* grab the monitor lock */
- if ((ret = _pthread_mutex_lock(&prwlock->lock)) != 0)
+ if ((ret = _thr_mutex_lock(&prwlock->lock)) != 0)
return (ret);
if (prwlock->state > 0) {
if (--prwlock->state == 0 && prwlock->blocked_writers)
- ret = _pthread_cond_signal(&prwlock->write_signal);
+ ret = _thr_cond_signal(&prwlock->write_signal);
} else if (prwlock->state < 0) {
prwlock->state = 0;
if (prwlock->blocked_writers)
- ret = _pthread_cond_signal(&prwlock->write_signal);
+ ret = _thr_cond_signal(&prwlock->write_signal);
else
- ret = _pthread_cond_broadcast(&prwlock->read_signal);
+ ret = _thr_cond_broadcast(&prwlock->read_signal);
} else
ret = EINVAL;
/* see the comment on this in pthread_rwlock_rdlock */
- _pthread_mutex_unlock(&prwlock->lock);
+ _thr_mutex_unlock(&prwlock->lock);
return (ret);
}
+__strong_reference(_pthread_rwlock_unlock, _thr_rwlock_unlock);
+
int
_pthread_rwlock_wrlock (pthread_rwlock_t *rwlock)
{
@@ -318,17 +321,17 @@
}
/* grab the monitor lock */
- if ((ret = _pthread_mutex_lock(&prwlock->lock)) != 0)
+ if ((ret = _thr_mutex_lock(&prwlock->lock)) != 0)
return (ret);
while (prwlock->state != 0) {
++prwlock->blocked_writers;
- ret = _pthread_cond_wait(&prwlock->write_signal, &prwlock->lock);
+ ret = _thr_cond_wait(&prwlock->write_signal, &prwlock->lock);
if (ret != 0) {
--prwlock->blocked_writers;
- _pthread_mutex_unlock(&prwlock->lock);
+ _thr_mutex_unlock(&prwlock->lock);
return (ret);
}
@@ -339,7 +342,9 @@
prwlock->state = -1;
/* see the comment on this in pthread_rwlock_rdlock */
- _pthread_mutex_unlock(&prwlock->lock);
+ _thr_mutex_unlock(&prwlock->lock);
return (ret);
}
+
+__strong_reference(_pthread_rwlock_wrlock, _thr_rwlock_wrlock);
==== //depot/projects/hammer/lib/libpthread/thread/thr_sigprocmask.c#2 (text+ko) ====
@@ -29,7 +29,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $FreeBSD: src/lib/libpthread/thread/thr_sigprocmask.c,v 1.13 2002/09/16 08:45:36 mini Exp $
+ * $FreeBSD: src/lib/libpthread/thread/thr_sigprocmask.c,v 1.14 2003/05/30 00:09:22 deischen Exp $
*/
#include <sys/param.h>
#include <sys/types.h>
@@ -44,5 +44,8 @@
int
_sigprocmask(int how, const sigset_t *set, sigset_t *oset)
{
- return (pthread_sigmask(how, set, oset));
+ if (_kse_isthreaded() != 0)
+ return (pthread_sigmask(how, set, oset));
+ else
+ return (__sys_sigprocmask(how, set, oset));
}
==== //depot/projects/hammer/libexec/rtld-elf/Makefile#4 (text+ko) ====
@@ -1,10 +1,11 @@
-# $FreeBSD: src/libexec/rtld-elf/Makefile,v 1.18 2003/04/07 16:21:25 mdodd Exp $
+# $FreeBSD: src/libexec/rtld-elf/Makefile,v 1.19 2003/05/29 22:58:22 kan Exp $
PROG= ld-elf.so.1
-SRCS= rtld_start.S rtld.c lockdflt.c map_object.c malloc.c \
+SRCS= rtld_start.S rtld.c rtld_lock.c map_object.c malloc.c \
xmalloc.c debug.c reloc.c
MAN= rtld.1
-CFLAGS+= -Wall -DFREEBSD_ELF -I${.CURDIR}/${MACHINE_ARCH} -I${.CURDIR}
+CFLAGS+= -Wall -DFREEBSD_ELF -DIN_RTLD
+CFLAGS+= -I${.CURDIR}/${MACHINE_ARCH} -I${.CURDIR}
LDFLAGS+= -nostdlib -e .rtld_start
INSTALLFLAGS= -fschg -C -b
MLINKS= rtld.1 ld-elf.so.1.1 \
==== //depot/projects/hammer/libexec/rtld-elf/alpha/rtld_machdep.h#3 (text+ko) ====
@@ -23,12 +23,24 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $FreeBSD: src/libexec/rtld-elf/alpha/rtld_machdep.h,v 1.8 2002/11/18 22:08:49 tmm Exp $
+ * $FreeBSD: src/libexec/rtld-elf/alpha/rtld_machdep.h,v 1.9 2003/05/29 22:58:24 kan Exp $
*/
#ifndef RTLD_MACHDEP_H
#define RTLD_MACHDEP_H 1
+#include <sys/types.h>
+#include <machine/atomic.h>
+
+/*
+ * This value of CACHE_LINE_SIZE is conservative. The actual size
+ * is 32 on the 21064, 21064A, 21066, 21066A, and 21164. It is 64
+ * on the 21264. Compaq recommends sequestering each lock in its own
+ * 128-byte block to allow for future implementations with larger
+ * cache lines.
+ */
+#define CACHE_LINE_SIZE 128
+
struct Struct_Obj_Entry;
/* Return the address of the .dynamic section in the dynamic linker. */
@@ -48,10 +60,4 @@
/* Lazy binding entry point, called via PLT. */
void _rtld_bind_start_old(void);
-/* Atomic operations. */
-int cmp0_and_store_int(volatile int *, int);
-void atomic_add_int(volatile int *, int);
-void atomic_incr_int(volatile int *);
-void atomic_decr_int(volatile int *);
-
#endif
==== //depot/projects/hammer/libexec/rtld-elf/alpha/rtld_start.S#2 (text+ko) ====
@@ -1,4 +1,4 @@
-/* $FreeBSD: src/libexec/rtld-elf/alpha/rtld_start.S,v 1.5 2002/02/18 02:24:10 peter Exp $ */
+/* $FreeBSD: src/libexec/rtld-elf/alpha/rtld_start.S,v 1.6 2003/05/29 22:58:24 kan Exp $ */
/* From: NetBSD: rtld_start.S,v 1.1 1996/12/16 20:38:09 cgd Exp */
/*
@@ -209,52 +209,3 @@
END(_rtld_bind_start_old)
-/*
- * int cmp0_and_store_int(volatile int *p, int newval);
- *
- * If an int holds 0, store newval into it; else do nothing. Returns
- * the previous value.
- */
-LEAF(cmp0_and_store_int, 2)
-1: mov a1, t0
- ldl_l v0, 0(a0)
- bne v0, 3f
- stl_c t0, 0(a0)
- beq t0, 2f
- mb
- RET
-2: br 1b
-3: RET
-END(cmp0_and_store_int)
-
-LEAF(atomic_add_int, 2)
-0: ldl_l t0, 0(a0)
- addq t0, a1, t0
- stl_c t0, 0(a0)
- beq t0, 1f
- mb
- RET
-1: br 0b
-END(atomic_add_int)
-
-/* Atomically increment an int. */
-LEAF(atomic_incr_int, 1)
-0: ldl_l t0, 0(a0)
- addq t0, 1, t0
- stl_c t0, 0(a0)
- beq t0, 1f
- mb
- RET
-1: br 0b
-END(atomic_incr_int)
-
-/* Atomically decrement an int. */
-LEAF(atomic_decr_int, 1)
-0: ldl_l t0, 0(a0)
- subq t0, 1, t0
- stl_c t0, 0(a0)
- beq t0, 1f
- mb
- RET
-1: br 0b
-END(atomic_decr_int)
==== //depot/projects/hammer/libexec/rtld-elf/amd64/rtld_machdep.h#5 (text+ko) ====
@@ -23,12 +23,17 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $FreeBSD: src/libexec/rtld-elf/amd64/rtld_machdep.h,v 1.8 2002/11/18 22:08:49 tmm Exp $
+ * $FreeBSD: src/libexec/rtld-elf/amd64/rtld_machdep.h,v 1.9 2003/05/29 22:58:24 kan Exp $
*/
#ifndef RTLD_MACHDEP_H
#define RTLD_MACHDEP_H 1
+#include <sys/types.h>
+#include <machine/atomic.h>
+
+#define CACHE_LINE_SIZE 32
+
struct Struct_Obj_Entry;
/* Return the address of the .dynamic section in the dynamic linker. */
@@ -53,25 +58,4 @@
#define call_initfini_pointer(obj, target) \
(((InitFunc)(target))())
-static inline void
-atomic_decr_int(volatile int *p)
-{
- __asm __volatile ("lock; decl %0" : "+m"(*p) : : "cc");
-}
-
-static inline void
-atomic_incr_int(volatile int *p)
-{
- __asm __volatile ("lock; incl %0" : "+m"(*p) : : "cc");
-}
-
-static inline void
-atomic_add_int(volatile int *p, int val)
-{
- __asm __volatile ("lock; addl %1, %0"
- : "+m"(*p)
- : "ri"(val)
- : "cc");
-}
-
#endif
==== //depot/projects/hammer/libexec/rtld-elf/i386/lockdflt.c#2 (text+ko) ====
@@ -22,7 +22,7 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
- * $FreeBSD: src/libexec/rtld-elf/i386/lockdflt.c,v 1.8 2002/07/06 20:25:55 jdp Exp $
+ * $FreeBSD: src/libexec/rtld-elf/i386/lockdflt.c,v 1.9 2003/05/29 22:58:25 kan Exp $
*/
/*
@@ -50,24 +50,7 @@
#include <setjmp.h>
#include <signal.h>
-#include <stdlib.h>
-#include <time.h>
-
-#include "debug.h"
-#include "rtld.h"
-
-#define CACHE_LINE_SIZE 32
-
-#define WAFLAG 0x1 /* A writer holds the lock */
-#define RC_INCR 0x2 /* Adjusts count of readers desiring lock */
-
-typedef struct Struct_Lock {
- volatile int lock;
- void *base;
-} Lock;
-static sigset_t fullsigmask, oldsigmask;
-
static inline int
cmpxchgl(int old, int new, volatile int *m)
{
@@ -93,44 +76,6 @@
return result;
}
-static void *
-lock_create(void *context)
-{
- void *base;
- char *p;
- uintptr_t r;
- Lock *l;
-
- /*
- * Arrange for the lock to occupy its own cache line. First, we
- * optimistically allocate just a cache line, hoping that malloc
- * will give us a well-aligned block of memory. If that doesn't
- * work, we allocate a larger block and take a well-aligned cache
- * line from it.
- */
- base = xmalloc(CACHE_LINE_SIZE);
- p = (char *)base;
- if ((uintptr_t)p % CACHE_LINE_SIZE != 0) {
- free(base);
- base = xmalloc(2 * CACHE_LINE_SIZE);
- p = (char *)base;
- if ((r = (uintptr_t)p % CACHE_LINE_SIZE) != 0)
- p += CACHE_LINE_SIZE - r;
- }
- l = (Lock *)p;
- l->base = base;
- l->lock = 0;
- return l;
-}
-
-static void
-lock_destroy(void *lock)
-{
- Lock *l = (Lock *)lock;
-
- free(l->base);
-}
-
/*
* Crude exclusive locks for the 80386, which does not support the
* cmpxchg instruction.
@@ -162,51 +107,6 @@
}
/*
- * Better reader/writer locks for the 80486 and later CPUs.
- */
-static void
-rlock_acquire(void *lock)
-{
- Lock *l = (Lock *)lock;
-
- atomic_add_int(&l->lock, RC_INCR);
- while (l->lock & WAFLAG)
- ; /* Spin */
-}
-
-static void
-wlock_acquire(void *lock)
-{
- Lock *l = (Lock *)lock;
- sigset_t tmp_oldsigmask;
-
- for ( ; ; ) {
- sigprocmask(SIG_BLOCK, &fullsigmask, &tmp_oldsigmask);
- if (cmpxchgl(0, WAFLAG, &l->lock) == 0)
- break;
- sigprocmask(SIG_SETMASK, &tmp_oldsigmask, NULL);
- }
- oldsigmask = tmp_oldsigmask;
-}
-
-static void
-rlock_release(void *lock)
-{
- Lock *l = (Lock *)lock;
-
- atomic_add_int(&l->lock, -RC_INCR);
-}
-
-static void
-wlock_release(void *lock)
-{
- Lock *l = (Lock *)lock;
-
- atomic_add_int(&l->lock, -WAFLAG);
- sigprocmask(SIG_SETMASK, &oldsigmask, NULL);
-}
-
-/*
* Code to determine at runtime whether the CPU supports the cmpxchg
* instruction. This instruction allows us to use locks that are more
* efficient, but it didn't exist on the 80386.
@@ -242,35 +142,3 @@
return result;
}
-void
-lockdflt_init(LockInfo *li)
-{
- li->context = NULL;
- li->context_destroy = NULL;
- li->lock_create = lock_create;
- li->lock_destroy = lock_destroy;
- if (cpu_supports_cmpxchg()) {
- /* Use fast locks that require an 80486 or later. */
- li->rlock_acquire = rlock_acquire;
- li->wlock_acquire = wlock_acquire;
- li->rlock_release = rlock_release;
- li->wlock_release = wlock_release;
- } else {
- /* It's a cruddy old 80386. */
- li->rlock_acquire = li->wlock_acquire = lock80386_acquire;
- li->rlock_release = li->wlock_release = lock80386_release;
- }
- /*
- * Construct a mask to block all signals except traps which might
- * conceivably be generated within the dynamic linker itself.
- */
- sigfillset(&fullsigmask);
- sigdelset(&fullsigmask, SIGILL);
- sigdelset(&fullsigmask, SIGTRAP);
- sigdelset(&fullsigmask, SIGABRT);
- sigdelset(&fullsigmask, SIGEMT);
- sigdelset(&fullsigmask, SIGFPE);
- sigdelset(&fullsigmask, SIGBUS);
- sigdelset(&fullsigmask, SIGSEGV);
- sigdelset(&fullsigmask, SIGSYS);
-}
==== //depot/projects/hammer/libexec/rtld-elf/i386/rtld_machdep.h#3 (text+ko) ====
@@ -23,12 +23,17 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $FreeBSD: src/libexec/rtld-elf/i386/rtld_machdep.h,v 1.8 2002/11/18 22:08:49 tmm Exp $
+ * $FreeBSD: src/libexec/rtld-elf/i386/rtld_machdep.h,v 1.9 2003/05/29 22:58:25 kan Exp $
*/
#ifndef RTLD_MACHDEP_H
#define RTLD_MACHDEP_H 1
+#include <sys/types.h>
+#include <machine/atomic.h>
+
+#define CACHE_LINE_SIZE 32
+
struct Struct_Obj_Entry;
/* Return the address of the .dynamic section in the dynamic linker. */
@@ -53,25 +58,4 @@
#define call_initfini_pointer(obj, target) \
(((InitFunc)(target))())
-static inline void
-atomic_decr_int(volatile int *p)
-{
- __asm __volatile ("lock; decl %0" : "+m"(*p) : : "cc");
-}
-
-static inline void
-atomic_incr_int(volatile int *p)
-{
- __asm __volatile ("lock; incl %0" : "+m"(*p) : : "cc");
-}
-
-static inline void
-atomic_add_int(volatile int *p, int val)
-{
- __asm __volatile ("lock; addl %1, %0"
- : "+m"(*p)
- : "ri"(val)
- : "cc");
-}
-
#endif
==== //depot/projects/hammer/libexec/rtld-elf/ia64/reloc.c#5 (text+ko) ====
@@ -22,7 +22,7 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
- * $FreeBSD: src/libexec/rtld-elf/ia64/reloc.c,v 1.12 2003/03/19 21:38:27 arun Exp $
+ * $FreeBSD: src/libexec/rtld-elf/ia64/reloc.c,v 1.13 2003/05/29 22:58:25 kan Exp $
*/
/*
@@ -122,8 +122,8 @@
}
/*
- * This assertion is necessary to guarantee function pointer
- * uniqueness
+ * This assertion is necessary to guarantee function pointer
+ * uniqueness
*/
assert(fptrs != NULL);
@@ -136,12 +136,12 @@
struct fptr **fptrs;
size_t fbytes;
- fptrs = obj->priv;
+ fptrs = obj->priv;
if (fptrs == NULL)
return;
fbytes = obj->nchains * sizeof(struct fptr *);
- if (mapped)
+ if (mapped)
munmap(fptrs, fbytes);
else
free(fptrs);
@@ -186,7 +186,7 @@
/*
* We have to make sure that all @fptr references to
* the same function are identical so that code can
- * compare function pointers.
+ * compare function pointers.
*/
const Elf_Sym *def;
const Obj_Entry *defobj;
@@ -313,8 +313,8 @@
if (cache)
munmap(cache, bytes);
- /*
- * Release temporarily mapped fptrs if relocating
+ /*
+ * Release temporarily mapped fptrs if relocating
* rtld object itself. A new table will be created
* in make_function_pointer using malloc when needed.
*/
==== //depot/projects/hammer/libexec/rtld-elf/ia64/rtld_machdep.h#3 (text+ko) ====
@@ -23,12 +23,17 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $FreeBSD: src/libexec/rtld-elf/ia64/rtld_machdep.h,v 1.3 2002/11/18 22:08:50 tmm Exp $
+ * $FreeBSD: src/libexec/rtld-elf/ia64/rtld_machdep.h,v 1.4 2003/05/29 22:58:25 kan Exp $
*/
#ifndef RTLD_MACHDEP_H
#define RTLD_MACHDEP_H 1
+#include <sys/types.h>
+#include <machine/atomic.h>
+
+#define CACHE_LINE_SIZE 128
+
/*
* Macros for cracking ia64 function pointers.
*/
@@ -50,10 +55,4 @@
void *make_function_pointer(const Elf_Sym *, const struct Struct_Obj_Entry *);
void call_initfini_pointer(const struct Struct_Obj_Entry *, Elf_Addr);
-/* Atomic operations. */
-int cmp0_and_store_int(volatile int *, int);
-void atomic_add_int(volatile int *, int);
-void atomic_incr_int(volatile int *);
-void atomic_decr_int(volatile int *);
-
#endif
==== //depot/projects/hammer/libexec/rtld-elf/ia64/rtld_start.S#2 (text+ko) ====
@@ -1,4 +1,4 @@
-/* $FreeBSD: src/libexec/rtld-elf/ia64/rtld_start.S,v 1.2 2001/10/29 10:05:32 peter Exp $ */
+/* $FreeBSD: src/libexec/rtld-elf/ia64/rtld_start.S,v 1.3 2003/05/29 22:58:25 kan Exp $ */
/* From: NetBSD: rtld_start.S,v 1.1 1996/12/16 20:38:09 cgd Exp */
/*
@@ -50,7 +50,7 @@
;;
sub out0=r14,r15 // out0 is image base address
br.call.sptk.many rp=_rtld_reloc // fixup image
-
+
add sp=-16,sp // 16 bytes for us, 16 for _rtld
;;
mov out0=in0
@@ -60,7 +60,7 @@
br.call.sptk.many rp=_rtld // r8=_rtld(sp, &exit_proc, &obj_main)
add r16=16,sp // address for exit proc
- ;;
+ ;;
ld8 r15=[r16] // read exit proc
add sp=16,sp // readjust stack
mov b7=r8 // address of real _start
@@ -106,12 +106,12 @@
stf.spill [r17]=f10,32
stf.spill [r18]=f11,32
mov out0=r16 // Obj_Entry for caller
- ;;
+ ;;
} { .mmi
stf.spill [r17]=f12,32
stf.spill [r18]=f13,32
shladd out1=r15,3,out1 // rela offset = 24 * index
- ;;
+ ;;
} { .mmb
stf.spill [r17]=f14,32
stf.spill [r18]=f15,32
@@ -125,21 +125,21 @@
ld8 r1=[r8] // target gp
mov ar.pfs=loc0 // clean up
mov rp=loc1
-} { .mmi
+} { .mmi
ldf.fill f8=[r17],32 // restore float arguments
ldf.fill f9=[r18],32
mov r8=loc2 // restore structure pointer
- ;;
+ ;;
} { .mmi
ldf.fill f10=[r17],32
ldf.fill f11=[r18],32
mov r9=loc3
- ;;
+ ;;
} { .mmi
ldf.fill f12=[r17],32
ldf.fill f13=[r18],32
mov r10=loc4
- ;;
+ ;;
} { .mmi
ldf.fill f14=[r17],32
ldf.fill f15=[r18],32
@@ -157,69 +157,15 @@
}
END(_rtld_bind_start)
-/*
- * int cmp0_and_store_int(volatile int *p, int newval);
- *
- * If an int holds 0, store newval into it; else do nothing. Returns
- * the previous value.
- */
-ENTRY(cmp0_and_store_int, 2)
- mov ar.ccv=0
>>> TRUNCATED FOR MAIL (1000 lines) <<<
More information about the p4-projects
mailing list