1/* $OpenBSD: tcb.h,v 1.2 2016/05/15 23:37:42 guenther Exp $ */ 2 3/* 4 * Copyright (c) 2011 Philip Guenther <guenther@openbsd.org> 5 * 6 * Permission to use, copy, modify, and distribute this software for any 7 * purpose with or without fee is hereby granted, provided that the above 8 * copyright notice and this permission notice appear in all copies. 9 * 10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 17 */ 18 19#ifndef _MACHINE_TCB_H_ 20#define _MACHINE_TCB_H_ 21 22#ifdef _KERNEL 23 24void *tcb_get(struct proc *_p); 25void tcb_set(struct proc *_p, void *_newtcb); 26 27#define TCB_GET(p) tcb_get(p) 28#define TCB_SET(p, addr) tcb_set(p, addr) 29 30#else /* _KERNEL */ 31 32/* ELF TLS ABI calls for small TCB, with static TLS data after it */ 33#define TLS_VARIANT 1 34 35static inline void * 36__alpha_get_tcb(void) 37{ 38 register void *__tmp __asm__("$0"); 39 40 __asm__ ("call_pal %1 # PAL_rdunique" 41 : "=r" (__tmp) 42 : "i" (0x009e /* PAL_rdunique */)); 43 return __tmp; 44} 45#define TCB_GET() __alpha_get_tcb() 46 47static inline void 48__alpha_set_tcb(void *__val) 49{ 50 register void *__tmp __asm__("$16") = __val; 51 52 __asm__ volatile ("call_pal %1 # PAL_wrunique" 53 : "=r" (__tmp) 54 : "i" (0x009f /* PAL_wrunique */), "0" (__tmp)); 55} 56#define TCB_SET(addr) __alpha_set_tcb(addr) 57 58#endif /* _KERNEL */ 59 60#endif /* _MACHINE_TCB_H_ */ 61