1 /* 2 * Copyright 2002-2011, The Haiku Team. All rights reserved. 3 * Distributed under the terms of the MIT License. 4 * 5 * Copyright 2002, Travis Geiselbrecht. All rights reserved. 6 * Distributed under the terms of the NewOS License. 7 */ 8 #ifndef _KERNEL_ARCH_x86_THREAD_H 9 #define _KERNEL_ARCH_x86_THREAD_H 10 11 12 #include <arch/cpu.h> 13 14 15 #ifdef __cplusplus 16 extern "C" { 17 #endif 18 19 struct sigaction; 20 21 22 struct iframe* x86_get_user_iframe(void); 23 struct iframe* x86_get_current_iframe(void); 24 struct iframe* x86_get_thread_user_iframe(Thread* thread); 25 26 phys_addr_t x86_next_page_directory(Thread* from, Thread* to); 27 void x86_initial_return_to_userland(Thread* thread, struct iframe* iframe); 28 29 void x86_restart_syscall(struct iframe* frame); 30 void x86_set_tls_context(Thread* thread); 31 32 33 static inline Thread* 34 arch_thread_get_current_thread(void) 35 { 36 addr_t addr; 37 __asm__("mov %%gs:0, %0" : "=r"(addr)); 38 return (Thread*)addr; 39 } 40 41 42 #ifdef __x86_64__ 43 44 45 static inline void 46 arch_thread_set_current_thread(Thread* t) 47 { 48 // Point GS segment base at thread architecture data. 49 t->arch_info.thread = t; 50 x86_write_msr(IA32_MSR_GS_BASE, (addr_t)&t->arch_info); 51 } 52 53 54 #else // __x86_64__ 55 56 57 // override empty macro 58 #undef arch_syscall_64_bit_return_value 59 void arch_syscall_64_bit_return_value(void); 60 61 62 static inline void 63 arch_thread_set_current_thread(Thread* t) 64 { 65 asm volatile("mov %0, %%gs:0" : : "r" (t) : "memory"); 66 } 67 68 69 #endif // __x86_64__ 70 71 72 #ifdef __cplusplus 73 } 74 #endif 75 76 #endif /* _KERNEL_ARCH_x86_THREAD_H */ 77 78