From 82468d1f271d11440f304bd337dd29e175e49b5c Mon Sep 17 00:00:00 2001 From: Marcel Moolenaar Date: Mon, 23 Jun 2003 23:15:06 +0000 Subject: [PATCH] Untangle the inter-dependency of kse types and ksd types/functions by moving the definition of struct ksd to pthread_md.h and removing the inclusion of ksd.h from thr_private.h (which has the definition of struct kse and kse_critical_t). This allows ksd.h to have inline functions that use struct kse and kse_critical_t and generally yields a cleaner implementation at the cost of not having all ksd related types/definitions in one header. Implement the ksd functionality on ia64 by using inline functions and permanently remove ksd.c from the ia64 specific makefile. This change does not clean up the i386 specific version of ksd.h. NOTE: The ksd code on ia64 abuses the tp register in the same way as it is abused in libthr in that it is incompatible with the runtime specification. This will be address when support for TLS hits the tree. --- lib/libkse/arch/i386/include/pthread_md.h | 12 +++ lib/libkse/arch/ia64/Makefile.inc | 2 +- lib/libkse/arch/ia64/include/pthread_md.h | 6 ++ lib/libkse/thread/thr_kern.c | 2 +- lib/libkse/thread/thr_private.h | 1 - lib/libpthread/arch/i386/i386/ksd.c | 1 + lib/libpthread/arch/i386/include/ksd.h | 13 --- lib/libpthread/arch/i386/include/pthread_md.h | 12 +++ lib/libpthread/arch/ia64/Makefile.inc | 2 +- lib/libpthread/arch/ia64/include/ksd.h | 91 +++++++++++++++++++ lib/libpthread/arch/ia64/include/pthread_md.h | 6 ++ lib/libpthread/thread/thr_kern.c | 2 +- lib/libpthread/thread/thr_private.h | 1 - 13 files changed, 132 insertions(+), 19 deletions(-) create mode 100644 lib/libpthread/arch/ia64/include/ksd.h diff --git a/lib/libkse/arch/i386/include/pthread_md.h b/lib/libkse/arch/i386/include/pthread_md.h index cb5a3443a345..ad0dfd61cb37 100644 --- a/lib/libkse/arch/i386/include/pthread_md.h +++ b/lib/libkse/arch/i386/include/pthread_md.h @@ -51,4 +51,16 @@ extern int _thr_getcontext(ucontext_t *); #define THR_ALIGNBYTES 15 #define THR_ALIGN(td) (((unsigned)(td) + THR_ALIGNBYTES) & ~THR_ALIGNBYTES) + +/* + * KSE Specific Data. + */ +struct ksd { + int ldt; +#define KSDF_INITIALIZED 0x01 + long flags; + void *base; + long size; +}; + #endif diff --git a/lib/libkse/arch/ia64/Makefile.inc b/lib/libkse/arch/ia64/Makefile.inc index b3aafbd34c62..4b8d9d2da8b1 100644 --- a/lib/libkse/arch/ia64/Makefile.inc +++ b/lib/libkse/arch/ia64/Makefile.inc @@ -2,4 +2,4 @@ .PATH: ${.CURDIR}/arch/${MACHINE_ARCH}/${MACHINE_ARCH} -SRCS+= ksd.c thr_enter_uts.S thr_switch.S +SRCS+= thr_enter_uts.S thr_switch.S diff --git a/lib/libkse/arch/ia64/include/pthread_md.h b/lib/libkse/arch/ia64/include/pthread_md.h index 93a179d2ec7f..096543589fac 100644 --- a/lib/libkse/arch/ia64/include/pthread_md.h +++ b/lib/libkse/arch/ia64/include/pthread_md.h @@ -35,4 +35,10 @@ #define THR_ALIGNBYTES 15 #define THR_ALIGN(td) (((uintptr_t)(td) + THR_ALIGNBYTES) & ~THR_ALIGNBYTES) +/* KSE Specific Data. */ +struct ksd { + void *ksd_base; + int ksd_size; +}; + #endif /* _PTHREAD_MD_H_ */ diff --git a/lib/libkse/thread/thr_kern.c b/lib/libkse/thread/thr_kern.c index 2641890a747a..d1a20062d0fc 100644 --- a/lib/libkse/thread/thr_kern.c +++ b/lib/libkse/thread/thr_kern.c @@ -52,8 +52,8 @@ __FBSDID("$FreeBSD$"); #include "atomic_ops.h" #include "thr_private.h" -#include "pthread_md.h" #include "libc_private.h" +#include "ksd.h" /*#define DEBUG_THREAD_KERN */ #ifdef DEBUG_THREAD_KERN diff --git a/lib/libkse/thread/thr_private.h b/lib/libkse/thread/thr_private.h index 092f86d84262..367202592710 100644 --- a/lib/libkse/thread/thr_private.h +++ b/lib/libkse/thread/thr_private.h @@ -54,7 +54,6 @@ #include #include -#include "ksd.h" #include "lock.h" #include "pthread_md.h" diff --git a/lib/libpthread/arch/i386/i386/ksd.c b/lib/libpthread/arch/i386/i386/ksd.c index 791c63665ab2..4e959594eb27 100644 --- a/lib/libpthread/arch/i386/i386/ksd.c +++ b/lib/libpthread/arch/i386/i386/ksd.c @@ -39,6 +39,7 @@ __FBSDID("$FreeBSD$"); #include #include +#include "pthread_md.h" #include "ksd.h" #define LDT_ENTRIES 8192 diff --git a/lib/libpthread/arch/i386/include/ksd.h b/lib/libpthread/arch/i386/include/ksd.h index 0b38505e82a3..4921238d1e0d 100644 --- a/lib/libpthread/arch/i386/include/ksd.h +++ b/lib/libpthread/arch/i386/include/ksd.h @@ -34,21 +34,8 @@ #include -struct pthread; -struct __ucontext; struct kse; -/* - * KSE Specific Data. - */ -struct ksd { - int ldt; -#define KSDF_INITIALIZED 0x01 - long flags; - void *base; - long size; -}; - /* * Evaluates to the byte offset of the per-kse variable name. */ diff --git a/lib/libpthread/arch/i386/include/pthread_md.h b/lib/libpthread/arch/i386/include/pthread_md.h index cb5a3443a345..ad0dfd61cb37 100644 --- a/lib/libpthread/arch/i386/include/pthread_md.h +++ b/lib/libpthread/arch/i386/include/pthread_md.h @@ -51,4 +51,16 @@ extern int _thr_getcontext(ucontext_t *); #define THR_ALIGNBYTES 15 #define THR_ALIGN(td) (((unsigned)(td) + THR_ALIGNBYTES) & ~THR_ALIGNBYTES) + +/* + * KSE Specific Data. + */ +struct ksd { + int ldt; +#define KSDF_INITIALIZED 0x01 + long flags; + void *base; + long size; +}; + #endif diff --git a/lib/libpthread/arch/ia64/Makefile.inc b/lib/libpthread/arch/ia64/Makefile.inc index b3aafbd34c62..4b8d9d2da8b1 100644 --- a/lib/libpthread/arch/ia64/Makefile.inc +++ b/lib/libpthread/arch/ia64/Makefile.inc @@ -2,4 +2,4 @@ .PATH: ${.CURDIR}/arch/${MACHINE_ARCH}/${MACHINE_ARCH} -SRCS+= ksd.c thr_enter_uts.S thr_switch.S +SRCS+= thr_enter_uts.S thr_switch.S diff --git a/lib/libpthread/arch/ia64/include/ksd.h b/lib/libpthread/arch/ia64/include/ksd.h new file mode 100644 index 000000000000..8878132bdf3a --- /dev/null +++ b/lib/libpthread/arch/ia64/include/ksd.h @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2003 Marcel Moolenaar + * 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. + * + * 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$ + */ + +#ifndef _KSD_H_ +#define _KSD_H_ + +struct kse; +struct pthread; + +register struct kse *_tp __asm("%r13"); + +static __inline int +_ksd_create(struct ksd *ksd, void *base, int size) +{ + ksd->ksd_base = base; + ksd->ksd_size = size; + return (0); +} + +static __inline struct kse * +_ksd_curkse() +{ + /* XXX why not simply return _tp? */ + return ((struct kse *)_tp->k_mbx.km_udata); +} + +static __inline struct pthread * +_ksd_curthread() +{ + return (_tp->k_curthread); +} + +static __inline void +_ksd_destroy(struct ksd *ksd) +{ +} + +static __inline kse_critical_t +_ksd_get_tmbx() +{ + return (_tp->k_mbx.km_curthread); +} + +static __inline kse_critical_t +_ksd_readandclear_tmbx() +{ + kse_critical_t crit; + __asm("xchg8 %0=[%1],r0" : "=r"(crit) + : "r"(&_tp->k_mbx.km_curthread)); + return (crit); +} + +static __inline void +_ksd_set_tmbx(kse_critical_t crit) +{ + _tp->k_mbx.km_curthread = crit; +} + +static __inline int +_ksd_setprivate(struct ksd *ksd) +{ + _tp = (struct kse *)ksd->ksd_base; + return (0); +} + +#endif /* _KSD_H_ */ diff --git a/lib/libpthread/arch/ia64/include/pthread_md.h b/lib/libpthread/arch/ia64/include/pthread_md.h index 93a179d2ec7f..096543589fac 100644 --- a/lib/libpthread/arch/ia64/include/pthread_md.h +++ b/lib/libpthread/arch/ia64/include/pthread_md.h @@ -35,4 +35,10 @@ #define THR_ALIGNBYTES 15 #define THR_ALIGN(td) (((uintptr_t)(td) + THR_ALIGNBYTES) & ~THR_ALIGNBYTES) +/* KSE Specific Data. */ +struct ksd { + void *ksd_base; + int ksd_size; +}; + #endif /* _PTHREAD_MD_H_ */ diff --git a/lib/libpthread/thread/thr_kern.c b/lib/libpthread/thread/thr_kern.c index 2641890a747a..d1a20062d0fc 100644 --- a/lib/libpthread/thread/thr_kern.c +++ b/lib/libpthread/thread/thr_kern.c @@ -52,8 +52,8 @@ __FBSDID("$FreeBSD$"); #include "atomic_ops.h" #include "thr_private.h" -#include "pthread_md.h" #include "libc_private.h" +#include "ksd.h" /*#define DEBUG_THREAD_KERN */ #ifdef DEBUG_THREAD_KERN diff --git a/lib/libpthread/thread/thr_private.h b/lib/libpthread/thread/thr_private.h index 092f86d84262..367202592710 100644 --- a/lib/libpthread/thread/thr_private.h +++ b/lib/libpthread/thread/thr_private.h @@ -54,7 +54,6 @@ #include #include -#include "ksd.h" #include "lock.h" #include "pthread_md.h"