diff options
author | peter <peter@FreeBSD.org> | 2005-06-29 23:15:36 +0000 |
---|---|---|
committer | peter <peter@FreeBSD.org> | 2005-06-29 23:15:36 +0000 |
commit | db8830bc2df63d901372f95b64e88e5acca62a62 (patch) | |
tree | 6ecd7b890dad6bb1f8d329ad34bc2693e44ec484 /lib/libkse | |
parent | d93999836826da90a255a4a59fa2f6fe8f289425 (diff) | |
download | FreeBSD-src-db8830bc2df63d901372f95b64e88e5acca62a62.zip FreeBSD-src-db8830bc2df63d901372f95b64e88e5acca62a62.tar.gz |
Clean out the leftovers from the i386_set_gsbase() TLS conversion.
Like on libthr, there is an i386_set_gsbase() stub implementation here
to avoid libc.so.5 issues. This should likely be a weak symbol and I
expect this will be fixed soon.
Approved by: re
Diffstat (limited to 'lib/libkse')
-rw-r--r-- | lib/libkse/arch/i386/i386/pthread_md.c | 46 | ||||
-rw-r--r-- | lib/libkse/arch/i386/include/pthread_md.h | 13 |
2 files changed, 8 insertions, 51 deletions
diff --git a/lib/libkse/arch/i386/i386/pthread_md.c b/lib/libkse/arch/i386/i386/pthread_md.c index acb60f5..5c85fe0 100644 --- a/lib/libkse/arch/i386/i386/pthread_md.c +++ b/lib/libkse/arch/i386/i386/pthread_md.c @@ -30,7 +30,6 @@ __FBSDID("$FreeBSD$"); #include <sys/types.h> #include <machine/cpufunc.h> -#include <machine/segments.h> #include <machine/sysarch.h> #include <unistd.h> @@ -42,8 +41,6 @@ __FBSDID("$FreeBSD$"); #include "rtld_tls.h" #include "pthread_md.h" -int _thr_using_setbase; - struct tcb * _tcb_ctor(struct pthread *thread, int initial) { @@ -78,46 +75,14 @@ _tcb_dtor(struct tcb *tcb) struct kcb * _kcb_ctor(struct kse *kse) { - union descriptor ldt; void *base; struct kcb *kcb; - int error; kcb = malloc(sizeof(struct kcb)); if (kcb != NULL) { bzero(kcb, sizeof(struct kcb)); kcb->kcb_self = kcb; kcb->kcb_kse = kse; - switch (_thr_using_setbase) { - case 1: /* use i386_set_gsbase() in _kcb_set */ - kcb->kcb_ldt = -1; - break; - case 0: /* Untested, try the get/set_gsbase routines once */ - error = i386_get_gsbase(&base); - if (error == 0) { - _thr_using_setbase = 1; - break; - } - /* fall through */ - case 2: /* Use the user_ldt code, we must have an old kernel */ - _thr_using_setbase = 2; - ldt.sd.sd_hibase = (unsigned int)kcb >> 24; - ldt.sd.sd_lobase = (unsigned int)kcb & 0xFFFFFF; - ldt.sd.sd_hilimit = (sizeof(struct kcb) >> 16) & 0xF; - ldt.sd.sd_lolimit = sizeof(struct kcb) & 0xFFFF; - ldt.sd.sd_type = SDT_MEMRWA; - ldt.sd.sd_dpl = SEL_UPL; - ldt.sd.sd_p = 1; - ldt.sd.sd_xx = 0; - ldt.sd.sd_def32 = 1; - ldt.sd.sd_gran = 0; /* no more than 1M */ - kcb->kcb_ldt = i386_set_ldt(LDT_AUTO_ALLOC, &ldt, 1); - if (kcb->kcb_ldt < 0) { - free(kcb); - return (NULL); - } - break; - } } return (kcb); } @@ -125,9 +90,12 @@ _kcb_ctor(struct kse *kse) void _kcb_dtor(struct kcb *kcb) { - if (kcb->kcb_ldt >= 0) { - i386_set_ldt(kcb->kcb_ldt, NULL, 1); - kcb->kcb_ldt = -1; /* just in case */ - } free(kcb); } + +int +i386_set_gsbase(void *addr) +{ + + return (sysarch(I386_SET_GSBASE, &addr)); +} diff --git a/lib/libkse/arch/i386/include/pthread_md.h b/lib/libkse/arch/i386/include/pthread_md.h index da200d3..52afd6a 100644 --- a/lib/libkse/arch/i386/include/pthread_md.h +++ b/lib/libkse/arch/i386/include/pthread_md.h @@ -40,8 +40,6 @@ extern int _thr_setcontext(mcontext_t *, intptr_t, intptr_t *); extern int _thr_getcontext(mcontext_t *); -extern int _thr_using_setbase; - #define KSE_STACKSIZE 16384 #define DTV_OFFSET offsetof(struct tcb, tcb_dtv) @@ -60,7 +58,6 @@ struct pthread; struct kcb { struct tcb *kcb_curtcb; struct kcb *kcb_self; /* self reference */ - int kcb_ldt; struct kse *kcb_kse; struct kse_mailbox kcb_kmbx; }; @@ -154,15 +151,7 @@ void _kcb_dtor(struct kcb *); static __inline void _kcb_set(struct kcb *kcb) { - int val; - - if (_thr_using_setbase == 1) { - i386_set_gsbase(kcb); - } else { - val = (kcb->kcb_ldt << 3) | 7; - __asm __volatile("movl %0, %%gs" : : "r" (val)); - } - + i386_set_gsbase(kcb); } /* Get the current kcb. */ |