diff options
Diffstat (limited to 'lib/libthr/arch/amd64/include/pthread_md.h')
-rw-r--r-- | lib/libthr/arch/amd64/include/pthread_md.h | 65 |
1 files changed, 9 insertions, 56 deletions
diff --git a/lib/libthr/arch/amd64/include/pthread_md.h b/lib/libthr/arch/amd64/include/pthread_md.h index 1d393d9cbbed..f43578a8241a 100644 --- a/lib/libthr/arch/amd64/include/pthread_md.h +++ b/lib/libthr/arch/amd64/include/pthread_md.h @@ -1,5 +1,5 @@ /*- - * SPDX-License-Identifier: BSD-2-Clause-FreeBSD + * SPDX-License-Identifier: BSD-2-Clause * * Copyright (C) 2003 David Xu <davidxu@freebsd.org> * Copyright (c) 2001 Daniel Eischen <deischen@freebsd.org> @@ -25,8 +25,6 @@ * 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$ */ /* @@ -37,66 +35,21 @@ #include <stddef.h> #include <sys/types.h> -#include <machine/sysarch.h> +#include <machine/tls.h> #define CPU_SPINWAIT __asm __volatile("pause") -#define DTV_OFFSET offsetof(struct tcb, tcb_dtv) - -/* - * Variant II tcb, first two members are required by rtld, - * %fs points to the structure. - */ -struct tcb { - struct tcb *tcb_self; /* required by rtld */ - void *tcb_dtv; /* required by rtld */ - struct pthread *tcb_thread; - void *tcb_spare[1]; -}; - -/* - * Evaluates to the byte offset of the per-tcb variable name. - */ -#define __tcb_offset(name) __offsetof(struct tcb, name) - -/* - * Evaluates to the type of the per-tcb variable name. - */ -#define __tcb_type(name) __typeof(((struct tcb *)0)->name) - -/* - * Evaluates to the value of the per-tcb variable name. - */ -#define TCB_GET64(name) ({ \ - __tcb_type(name) __result; \ - \ - u_long __i; \ - __asm __volatile("movq %%fs:%1, %0" \ - : "=r" (__i) \ - : "m" (*(volatile u_long *)(__tcb_offset(name)))); \ - __result = (__tcb_type(name))__i; \ - \ - __result; \ -}) - -static __inline void -_tcb_set(struct tcb *tcb) -{ - amd64_set_fsbase(tcb); -} - -static __inline struct tcb * -_tcb_get(void) -{ - return (TCB_GET64(tcb_self)); -} +/* For use in _Static_assert to check structs will fit in a page */ +#define THR_PAGE_SIZE_MIN PAGE_SIZE static __inline struct pthread * _get_curthread(void) { - return (TCB_GET64(tcb_thread)); -} + struct pthread *thr; -#define HAS__UMTX_OP_ERR 1 + __asm __volatile("movq %%fs:%1, %0" : "=r" (thr) + : "m" (*(volatile u_long *)offsetof(struct tcb, tcb_thread))); + return (thr); +} #endif |