diff options
author | nwhitehorn <nwhitehorn@FreeBSD.org> | 2010-08-24 20:50:08 +0000 |
---|---|---|
committer | nwhitehorn <nwhitehorn@FreeBSD.org> | 2010-08-24 20:50:08 +0000 |
commit | d3a20dc0b93297e94a5351435c958bdaa7379f25 (patch) | |
tree | 56c43f8fbb3e2458a3ddd23f71244b99a38ca7b4 /lib/libthr/arch | |
parent | 86e44bf444e7c433d320ae07da9c82cbfbbb7063 (diff) | |
download | FreeBSD-src-d3a20dc0b93297e94a5351435c958bdaa7379f25.zip FreeBSD-src-d3a20dc0b93297e94a5351435c958bdaa7379f25.tar.gz |
Unify 32-bit and 64-bit PowerPC libthr support. This reduces code
duplication, and simplifies the TBEMD import.
Requested by: imp
Diffstat (limited to 'lib/libthr/arch')
-rw-r--r-- | lib/libthr/arch/powerpc/Makefile.inc | 2 | ||||
-rw-r--r-- | lib/libthr/arch/powerpc/include/pthread_md.h | 14 | ||||
-rw-r--r-- | lib/libthr/arch/powerpc64/Makefile.inc | 5 | ||||
-rw-r--r-- | lib/libthr/arch/powerpc64/include/pthread_md.h | 84 | ||||
-rw-r--r-- | lib/libthr/arch/powerpc64/powerpc64/pthread_md.c | 54 |
5 files changed, 14 insertions, 145 deletions
diff --git a/lib/libthr/arch/powerpc/Makefile.inc b/lib/libthr/arch/powerpc/Makefile.inc index b6a4acd..e4dffef 100644 --- a/lib/libthr/arch/powerpc/Makefile.inc +++ b/lib/libthr/arch/powerpc/Makefile.inc @@ -1,5 +1,5 @@ # $FreeBSD$ -.PATH: ${.CURDIR}/arch/${MACHINE_ARCH}/${MACHINE_ARCH} +.PATH: ${.CURDIR}/arch/${MACHINE_CPUARCH}/${MACHINE_CPUARCH} SRCS+= pthread_md.c diff --git a/lib/libthr/arch/powerpc/include/pthread_md.h b/lib/libthr/arch/powerpc/include/pthread_md.h index 2abbbdc..91102b4 100644 --- a/lib/libthr/arch/powerpc/include/pthread_md.h +++ b/lib/libthr/arch/powerpc/include/pthread_md.h @@ -39,12 +39,16 @@ #define CPU_SPINWAIT #define DTV_OFFSET offsetof(struct tcb, tcb_dtv) +#ifdef __powerpc64__ +#define TP_OFFSET 0x7010 +#else #define TP_OFFSET 0x7008 +#endif /* * Variant I tcb. The structure layout is fixed, don't blindly * change it. - * %r2 points to end of the structure. + * %r2 (32-bit) or %r13 (64-bit) points to end of the structure. */ struct tcb { void *tcb_dtv; @@ -57,7 +61,11 @@ void _tcb_dtor(struct tcb *); static __inline void _tcb_set(struct tcb *tcb) { +#ifdef __powerpc64__ + register uint8_t *_tp __asm__("%r13"); +#else register uint8_t *_tp __asm__("%r2"); +#endif __asm __volatile("mr %0,%1" : "=r"(_tp) : "r"((uint8_t *)tcb + TP_OFFSET)); @@ -66,7 +74,11 @@ _tcb_set(struct tcb *tcb) static __inline struct tcb * _tcb_get(void) { +#ifdef __powerpc64__ + register uint8_t *_tp __asm__("%r13"); +#else register uint8_t *_tp __asm__("%r2"); +#endif return ((struct tcb *)(_tp - TP_OFFSET)); } diff --git a/lib/libthr/arch/powerpc64/Makefile.inc b/lib/libthr/arch/powerpc64/Makefile.inc deleted file mode 100644 index b6a4acd..0000000 --- a/lib/libthr/arch/powerpc64/Makefile.inc +++ /dev/null @@ -1,5 +0,0 @@ -# $FreeBSD$ - -.PATH: ${.CURDIR}/arch/${MACHINE_ARCH}/${MACHINE_ARCH} - -SRCS+= pthread_md.c diff --git a/lib/libthr/arch/powerpc64/include/pthread_md.h b/lib/libthr/arch/powerpc64/include/pthread_md.h deleted file mode 100644 index af6a0af..0000000 --- a/lib/libthr/arch/powerpc64/include/pthread_md.h +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Copyright 2004 by Peter Grehan. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (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$ - */ - -/* - * Machine-dependent thread prototypes/definitions. - */ -#ifndef _PTHREAD_MD_H_ -#define _PTHREAD_MD_H_ - -#include <stddef.h> -#include <sys/types.h> - -#define CPU_SPINWAIT - -#define DTV_OFFSET offsetof(struct tcb, tcb_dtv) -#define TP_OFFSET 0x7010 - -/* - * Variant I tcb. The structure layout is fixed, don't blindly - * change it. - * %r13 points to end of the structure. - */ -struct tcb { - void *tcb_dtv; - struct pthread *tcb_thread; -}; - -struct tcb *_tcb_ctor(struct pthread *, int); -void _tcb_dtor(struct tcb *); - -static __inline void -_tcb_set(struct tcb *tcb) -{ - register uint8_t *_tp __asm__("%r13"); - - __asm __volatile("mr %0,%1" : "=r"(_tp) : - "r"((uint8_t *)tcb + TP_OFFSET)); -} - -static __inline struct tcb * -_tcb_get(void) -{ - register uint8_t *_tp __asm__("%r13"); - - return ((struct tcb *)(_tp - TP_OFFSET)); -} - -extern struct pthread *_thr_initial; - -static __inline struct pthread * -_get_curthread(void) -{ - if (_thr_initial) - return (_tcb_get()->tcb_thread); - return (NULL); -} - -#endif /* _PTHREAD_MD_H_ */ diff --git a/lib/libthr/arch/powerpc64/powerpc64/pthread_md.c b/lib/libthr/arch/powerpc64/powerpc64/pthread_md.c deleted file mode 100644 index 66f043e..0000000 --- a/lib/libthr/arch/powerpc64/powerpc64/pthread_md.c +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright (c) 2003 Daniel Eischen <deischen@freebsd.org> - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Neither the name of the author nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (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$ - */ - -#include <sys/types.h> -#include <rtld_tls.h> - -#include "pthread_md.h" - -/* - * The constructors. - */ -struct tcb * -_tcb_ctor(struct pthread *thread, int initial) -{ - struct tcb *tcb; - - tcb = _rtld_allocate_tls((initial) ? _tcb_get() : NULL, - sizeof(struct tcb), 1); - if (tcb) - tcb->tcb_thread = thread; - return (tcb); - -} - -void -_tcb_dtor(struct tcb *tcb) -{ - _rtld_free_tls(tcb, sizeof(struct tcb), 1); -} |