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()90arch_thread::GetFramePointer() const 91 { 92 return current_stack[0]; 93 } 94 95 96 #else 97 98 99 inline addr_t GetFramePointer()100arch_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