xref: /freebsd/lib/libthr/arch/aarch64/include/pthread_md.h (revision a7dfee7ab19a0b6d8d4f74463cf9fe3c717c15df)
1*a7dfee7aSAndrew Turner /*-
2*a7dfee7aSAndrew Turner  * Copyright (c) 2005 David Xu <davidxu@freebsd.org>.
3*a7dfee7aSAndrew Turner  * Copyright (c) 2014 the FreeBSD Foundation
4*a7dfee7aSAndrew Turner  * All rights reserved.
5*a7dfee7aSAndrew Turner  *
6*a7dfee7aSAndrew Turner  * Portions of this software were developed by Andrew Turner
7*a7dfee7aSAndrew Turner  * under sponsorship from the FreeBSD Foundation
8*a7dfee7aSAndrew Turner  *
9*a7dfee7aSAndrew Turner  * Redistribution and use in source and binary forms, with or without
10*a7dfee7aSAndrew Turner  * modification, are permitted provided that the following conditions
11*a7dfee7aSAndrew Turner  * are met:
12*a7dfee7aSAndrew Turner  *
13*a7dfee7aSAndrew Turner  * 1. Redistributions of source code must retain the above copyright
14*a7dfee7aSAndrew Turner  *    notice, this list of conditions and the following disclaimer.
15*a7dfee7aSAndrew Turner  * 2. Redistributions in binary form must reproduce the above copyright
16*a7dfee7aSAndrew Turner  *    notice, this list of conditions and the following disclaimer in the
17*a7dfee7aSAndrew Turner  *    documentation and/or other materials provided with the distribution.
18*a7dfee7aSAndrew Turner  *
19*a7dfee7aSAndrew Turner  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
20*a7dfee7aSAndrew Turner  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
21*a7dfee7aSAndrew Turner  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
22*a7dfee7aSAndrew Turner  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
23*a7dfee7aSAndrew Turner  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
24*a7dfee7aSAndrew Turner  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25*a7dfee7aSAndrew Turner  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26*a7dfee7aSAndrew Turner  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27*a7dfee7aSAndrew Turner  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
28*a7dfee7aSAndrew Turner  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29*a7dfee7aSAndrew Turner  *
30*a7dfee7aSAndrew Turner  * $FreeBSD$
31*a7dfee7aSAndrew Turner  */
32*a7dfee7aSAndrew Turner 
33*a7dfee7aSAndrew Turner /*
34*a7dfee7aSAndrew Turner  * Machine-dependent thread prototypes/definitions.
35*a7dfee7aSAndrew Turner  */
36*a7dfee7aSAndrew Turner #ifndef _PTHREAD_MD_H_
37*a7dfee7aSAndrew Turner #define	_PTHREAD_MD_H_
38*a7dfee7aSAndrew Turner 
39*a7dfee7aSAndrew Turner #include <sys/types.h>
40*a7dfee7aSAndrew Turner #include <machine/sysarch.h>
41*a7dfee7aSAndrew Turner #include <stddef.h>
42*a7dfee7aSAndrew Turner 
43*a7dfee7aSAndrew Turner #define	CPU_SPINWAIT
44*a7dfee7aSAndrew Turner #define	DTV_OFFSET		offsetof(struct tcb, tcb_dtv)
45*a7dfee7aSAndrew Turner 
46*a7dfee7aSAndrew Turner /*
47*a7dfee7aSAndrew Turner  * Variant I tcb. The structure layout is fixed, don't blindly
48*a7dfee7aSAndrew Turner  * change it.
49*a7dfee7aSAndrew Turner  */
50*a7dfee7aSAndrew Turner struct tcb {
51*a7dfee7aSAndrew Turner 	void			*tcb_dtv;
52*a7dfee7aSAndrew Turner 	struct pthread		*tcb_thread;
53*a7dfee7aSAndrew Turner };
54*a7dfee7aSAndrew Turner 
55*a7dfee7aSAndrew Turner /* Called from the thread to set its private data. */
56*a7dfee7aSAndrew Turner static __inline void
57*a7dfee7aSAndrew Turner _tcb_set(struct tcb *tcb)
58*a7dfee7aSAndrew Turner {
59*a7dfee7aSAndrew Turner 
60*a7dfee7aSAndrew Turner 	__asm __volatile("msr	tpidr_el0, %x0" :: "r" (tcb));
61*a7dfee7aSAndrew Turner }
62*a7dfee7aSAndrew Turner 
63*a7dfee7aSAndrew Turner /*
64*a7dfee7aSAndrew Turner  * Get the current tcb.
65*a7dfee7aSAndrew Turner  */
66*a7dfee7aSAndrew Turner static __inline struct tcb *
67*a7dfee7aSAndrew Turner _tcb_get(void)
68*a7dfee7aSAndrew Turner {
69*a7dfee7aSAndrew Turner 	struct tcb *tcb;
70*a7dfee7aSAndrew Turner 
71*a7dfee7aSAndrew Turner 	__asm __volatile("mrs	%x0, tpidr_el0" : "=r" (tcb));
72*a7dfee7aSAndrew Turner 	return (tcb);
73*a7dfee7aSAndrew Turner }
74*a7dfee7aSAndrew Turner 
75*a7dfee7aSAndrew Turner extern struct pthread *_thr_initial;
76*a7dfee7aSAndrew Turner 
77*a7dfee7aSAndrew Turner static __inline struct pthread *
78*a7dfee7aSAndrew Turner _get_curthread(void)
79*a7dfee7aSAndrew Turner {
80*a7dfee7aSAndrew Turner 
81*a7dfee7aSAndrew Turner 	return (_tcb_get()->tcb_thread);
82*a7dfee7aSAndrew Turner }
83*a7dfee7aSAndrew Turner 
84*a7dfee7aSAndrew Turner #endif /* _PTHREAD_MD_H_ */
85