xref: /openbsd-src/sys/arch/sh/include/tcb.h (revision 8908800ca8f0a578dfd16a11e07ae56faa1c7a29)
1*8908800cSguenther /*	$OpenBSD: tcb.h,v 1.2 2016/05/18 20:21:13 guenther Exp $	*/
2022e6e66Sguenther 
3022e6e66Sguenther /*
4022e6e66Sguenther  * Copyright (c) 2011 Philip Guenther <guenther@openbsd.org>
5022e6e66Sguenther  *
6022e6e66Sguenther  * Permission to use, copy, modify, and distribute this software for any
7022e6e66Sguenther  * purpose with or without fee is hereby granted, provided that the above
8022e6e66Sguenther  * copyright notice and this permission notice appear in all copies.
9022e6e66Sguenther  *
10022e6e66Sguenther  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11022e6e66Sguenther  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12022e6e66Sguenther  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13022e6e66Sguenther  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14022e6e66Sguenther  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15022e6e66Sguenther  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16022e6e66Sguenther  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17022e6e66Sguenther  */
18022e6e66Sguenther 
19022e6e66Sguenther #ifndef _MACHINE_TCB_H_
20022e6e66Sguenther #define _MACHINE_TCB_H_
21022e6e66Sguenther 
22022e6e66Sguenther #ifdef _KERNEL
23022e6e66Sguenther 
24*8908800cSguenther /*
25*8908800cSguenther  * In userspace, register gbr contains the address of the thread's TCB
26*8908800cSguenther  */
27*8908800cSguenther #define TCB_GET(p)		((void *)(p)->p_md.md_regs->tf_gbr)
28*8908800cSguenther #define TCB_SET(p, addr)	((p)->p_md.md_regs->tf_gbr = (int)(addr))
29022e6e66Sguenther 
30022e6e66Sguenther #else /* _KERNEL */
31022e6e66Sguenther 
32022e6e66Sguenther /* ELF TLS ABI calls for small TCB, with static TLS data after it */
33022e6e66Sguenther #define TLS_VARIANT	1
34022e6e66Sguenther 
35*8908800cSguenther /* Get a pointer to the TCB itself */
36*8908800cSguenther static inline void *
__sh_get_tcb(void)37*8908800cSguenther __sh_get_tcb(void)
38*8908800cSguenther {
39*8908800cSguenther 	void *__val;
40*8908800cSguenther 	__asm__ ("stc gbr, %0" : "=r" (__val));
41*8908800cSguenther 	return __val;
42*8908800cSguenther }
43*8908800cSguenther #define TCB_GET()	__sh_get_tcb()
44*8908800cSguenther #define TCB_SET(tcb)	__asm__ ("ldc %0, gbr" : : "r" (tcb));
45*8908800cSguenther 
46022e6e66Sguenther #endif /* _KERNEL */
47022e6e66Sguenther 
48022e6e66Sguenther #endif /* _MACHINE_TCB_H_ */
49