xref: /haiku/src/system/kernel/arch/x86/asm_offsets.cpp (revision 2db0fbd87ec3eeed8ab9b08ecfd1c41891c7e3a6)
1 /*
2  * Copyright 2007-2011, Ingo Weinhold, ingo_weinhold@gmx.de.
3  * Distributed under the terms of the MIT License.
4  */
5 
6 // This file is used to get C structure offsets into assembly code.
7 // The build system assembles the file and processes the output to create
8 // a header file with macro definitions, that can be included from assembly
9 // code.
10 
11 
12 #include <computed_asm_macros.h>
13 
14 #include <arch_cpu.h>
15 #include <cpu.h>
16 #include <ksignal.h>
17 #include <ksyscalls.h>
18 #include <thread_types.h>
19 
20 
21 #define DEFINE_MACRO(macro, value) DEFINE_COMPUTED_ASM_MACRO(macro, value)
22 
23 #define DEFINE_OFFSET_MACRO(prefix, structure, member) \
24 	DEFINE_MACRO(prefix##_##member, offsetof(struct structure, member));
25 
26 #define DEFINE_SIZEOF_MACRO(prefix, structure) \
27 	DEFINE_MACRO(prefix##_sizeof, sizeof(struct structure));
28 
29 
30 void
31 dummy()
32 {
33 	// struct cpu_ent
34 	DEFINE_OFFSET_MACRO(CPU_ENT, cpu_ent, fault_handler);
35 	DEFINE_OFFSET_MACRO(CPU_ENT, cpu_ent, fault_handler_stack_pointer);
36 
37 	// struct Team
38 	DEFINE_OFFSET_MACRO(TEAM, Team, commpage_address);
39 
40 	// struct Thread
41 	DEFINE_OFFSET_MACRO(THREAD, Thread, team);
42 	DEFINE_OFFSET_MACRO(THREAD, Thread, time_lock);
43 	DEFINE_OFFSET_MACRO(THREAD, Thread, kernel_time);
44 	DEFINE_OFFSET_MACRO(THREAD, Thread, user_time);
45 	DEFINE_OFFSET_MACRO(THREAD, Thread, last_time);
46 	DEFINE_OFFSET_MACRO(THREAD, Thread, in_kernel);
47 	DEFINE_OFFSET_MACRO(THREAD, Thread, flags);
48 	DEFINE_OFFSET_MACRO(THREAD, Thread, kernel_stack_top);
49 	DEFINE_OFFSET_MACRO(THREAD, Thread, fault_handler);
50 
51 #ifdef __x86_64__
52 	// struct arch_thread
53 	DEFINE_OFFSET_MACRO(ARCH_THREAD, arch_thread, syscall_rsp);
54 	DEFINE_OFFSET_MACRO(ARCH_THREAD, arch_thread, user_rsp);
55 	DEFINE_OFFSET_MACRO(ARCH_THREAD, arch_thread, current_stack);
56 #endif
57 
58 	// struct iframe
59 	DEFINE_SIZEOF_MACRO(IFRAME, iframe);
60 	DEFINE_OFFSET_MACRO(IFRAME, iframe, cs);
61 	DEFINE_OFFSET_MACRO(IFRAME, iframe, ax);
62 	DEFINE_OFFSET_MACRO(IFRAME, iframe, dx);
63 	DEFINE_OFFSET_MACRO(IFRAME, iframe, di);
64 	DEFINE_OFFSET_MACRO(IFRAME, iframe, si);
65 	DEFINE_OFFSET_MACRO(IFRAME, iframe, vector);
66 	DEFINE_OFFSET_MACRO(IFRAME, iframe, ip);
67 	DEFINE_OFFSET_MACRO(IFRAME, iframe, flags);
68 	DEFINE_OFFSET_MACRO(IFRAME, iframe, user_sp);
69 #ifdef __x86_64__
70 	DEFINE_OFFSET_MACRO(IFRAME, iframe, r8);
71 	DEFINE_OFFSET_MACRO(IFRAME, iframe, r9);
72 	DEFINE_OFFSET_MACRO(IFRAME, iframe, r10);
73 	DEFINE_OFFSET_MACRO(IFRAME, iframe, fpu);
74 #else
75 	DEFINE_OFFSET_MACRO(IFRAME, iframe, orig_eax);
76 #endif
77 
78 	// struct syscall_info
79 	DEFINE_SIZEOF_MACRO(SYSCALL_INFO, syscall_info);
80 	DEFINE_OFFSET_MACRO(SYSCALL_INFO, syscall_info, function);
81 	DEFINE_OFFSET_MACRO(SYSCALL_INFO, syscall_info, parameter_size);
82 
83 	// struct extended_syscall_info
84 	DEFINE_SIZEOF_MACRO(EXTENDED_SYSCALL_INFO, extended_syscall_info);
85 	DEFINE_OFFSET_MACRO(EXTENDED_SYSCALL_INFO, extended_syscall_info,
86 		parameter_count);
87 	DEFINE_OFFSET_MACRO(EXTENDED_SYSCALL_INFO, extended_syscall_info,
88 		parameters);
89 
90 	// struct syscall_parameter_info
91 	DEFINE_SIZEOF_MACRO(SYSCALL_PARAMETER_INFO, syscall_parameter_info);
92 	DEFINE_OFFSET_MACRO(SYSCALL_PARAMETER_INFO, syscall_parameter_info,
93 		used_size);
94 
95 	// struct signal_frame_data
96 	DEFINE_SIZEOF_MACRO(SIGNAL_FRAME_DATA, signal_frame_data);
97 	DEFINE_OFFSET_MACRO(SIGNAL_FRAME_DATA, signal_frame_data, info);
98 	DEFINE_OFFSET_MACRO(SIGNAL_FRAME_DATA, signal_frame_data, context);
99 	DEFINE_OFFSET_MACRO(SIGNAL_FRAME_DATA, signal_frame_data, user_data);
100 	DEFINE_OFFSET_MACRO(SIGNAL_FRAME_DATA, signal_frame_data, handler);
101 	DEFINE_OFFSET_MACRO(SIGNAL_FRAME_DATA, signal_frame_data, siginfo_handler);
102 	DEFINE_OFFSET_MACRO(SIGNAL_FRAME_DATA, signal_frame_data, commpage_address);
103 
104 	// struct ucontext_t
105 	DEFINE_OFFSET_MACRO(UCONTEXT_T, __ucontext_t, uc_mcontext);
106 
107 	// struct vregs
108 	DEFINE_SIZEOF_MACRO(VREGS, vregs);
109 
110 	// struct siginfo_t
111 	DEFINE_OFFSET_MACRO(SIGINFO_T, __siginfo_t, si_signo);
112 }
113