xref: /haiku/headers/private/kernel/arch/x86/arch_thread_types.h (revision 46b7da1f4f40f7157d74fc7fb26ff9ec7f2416f2)
1 /*
2  * Copyright 2002-2006, The Haiku Team. All rights reserved.
3  * Distributed under the terms of the MIT License.
4  *
5  * Copyright 2001-2002, Travis Geiselbrecht. All rights reserved.
6  * Distributed under the terms of the NewOS License.
7  */
8 #ifndef _KERNEL_ARCH_x86_THREAD_TYPES_H
9 #define _KERNEL_ARCH_x86_THREAD_TYPES_H
10 
11 
12 #include <SupportDefs.h>
13 
14 #ifdef __x86_64__
15 #	include <arch/x86/64/iframe.h>
16 #else
17 #	include <arch/x86/32/iframe.h>
18 #endif
19 
20 
21 namespace BKernel {
22     struct Thread;
23 }
24 
25 
26 #define _ALIGNED(bytes) __attribute__((aligned(bytes)))
27 	// move this to somewhere else, maybe BeBuild.h?
28 
29 
30 #ifndef __x86_64__
31 struct farcall {
32 	uint32* esp;
33 	uint32* ss;
34 };
35 #endif
36 
37 
38 // architecture specific thread info
39 struct arch_thread {
40 #ifdef __x86_64__
41 	// Back pointer to the containing Thread structure. The GS segment base is
42 	// pointed here, used to get the current thread.
43 	BKernel::Thread* thread;
44 
45 	// RSP for kernel entry used by SYSCALL, and temporary scratch space.
46 	uint64*			syscall_rsp;
47 	uint64*			user_rsp;
48 
49 	uintptr_t*		current_stack;
50 	uintptr_t		instruction_pointer;
51 
52 	uint64			user_gs_base;
53 #else
54 	struct farcall	current_stack;
55 	struct farcall	interrupt_stack;
56 #endif
57 
58 #ifndef __x86_64__
59 	// 512 byte floating point save point - this must be 16 byte aligned
60 	uint8			fpu_state[512] _ALIGNED(16);
61 #else
62 	// floating point save point - this must be 64 byte aligned for xsave and
63 	// have enough space for all the registers, at least 2560 bytes according
64 	// to Intel Architecture Instruction Set Extensions Programming Reference,
65 	// Section 3.2.4, table 3-8
66 	uint8			fpu_state[2560] _ALIGNED(64);
67 #endif
68 
69 	addr_t			GetFramePointer() const;
70 } _ALIGNED(16);
71 
72 
73 struct arch_team {
74 	// gcc treats empty structures as zero-length in C, but as if they contain
75 	// a char in C++. So we have to put a dummy in to be able to use the struct
76 	// from both in a consistent way.
77 	char			dummy;
78 };
79 
80 
81 struct arch_fork_arg {
82 	struct iframe	iframe;
83 };
84 
85 
86 #ifdef __x86_64__
87 
88 
89 inline addr_t
GetFramePointer()90 arch_thread::GetFramePointer() const
91 {
92 	return current_stack[0];
93 }
94 
95 
96 #else
97 
98 
99 inline addr_t
GetFramePointer()100 arch_thread::GetFramePointer() const
101 {
102 	return current_stack.esp[2];
103 }
104 
105 
106 #endif	// __x86_64__
107 
108 #endif	// _KERNEL_ARCH_x86_THREAD_TYPES_H
109