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
16extern "C" {
17#endif
18
19struct sigaction;
20
21
22struct iframe* x86_get_user_iframe(void);
23struct iframe* x86_get_current_iframe(void);
24struct iframe* x86_get_thread_user_iframe(Thread* thread);
25
26phys_addr_t x86_next_page_directory(Thread* from, Thread* to);
27void x86_initial_return_to_userland(Thread* thread, struct iframe* iframe);
28
29void x86_restart_syscall(struct iframe* frame);
30void x86_set_tls_context(Thread* thread);
31
32
33static inline Thread*
34arch_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
45static inline void
46arch_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
59void arch_syscall_64_bit_return_value(void);
60
61
62static inline void
63arch_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