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