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 #else 74 DEFINE_OFFSET_MACRO(IFRAME, iframe, orig_eax); 75 #endif 76 77 // struct syscall_info 78 DEFINE_SIZEOF_MACRO(SYSCALL_INFO, syscall_info); 79 DEFINE_OFFSET_MACRO(SYSCALL_INFO, syscall_info, function); 80 DEFINE_OFFSET_MACRO(SYSCALL_INFO, syscall_info, parameter_size); 81 82 // struct x86_optimized_functions 83 DEFINE_OFFSET_MACRO(X86_OPTIMIZED_FUNCTIONS, x86_optimized_functions, 84 memcpy); 85 DEFINE_OFFSET_MACRO(X86_OPTIMIZED_FUNCTIONS, x86_optimized_functions, 86 memset); 87 88 // struct signal_frame_data 89 DEFINE_SIZEOF_MACRO(SIGNAL_FRAME_DATA, signal_frame_data); 90 DEFINE_OFFSET_MACRO(SIGNAL_FRAME_DATA, signal_frame_data, info); 91 DEFINE_OFFSET_MACRO(SIGNAL_FRAME_DATA, signal_frame_data, context); 92 DEFINE_OFFSET_MACRO(SIGNAL_FRAME_DATA, signal_frame_data, user_data); 93 DEFINE_OFFSET_MACRO(SIGNAL_FRAME_DATA, signal_frame_data, handler); 94 DEFINE_OFFSET_MACRO(SIGNAL_FRAME_DATA, signal_frame_data, siginfo_handler); 95 DEFINE_OFFSET_MACRO(SIGNAL_FRAME_DATA, signal_frame_data, commpage_address); 96 97 // struct ucontext_t 98 DEFINE_OFFSET_MACRO(UCONTEXT_T, __ucontext_t, uc_mcontext); 99 100 // struct vregs 101 DEFINE_SIZEOF_MACRO(VREGS, vregs); 102 103 // struct siginfo_t 104 DEFINE_OFFSET_MACRO(SIGINFO_T, __siginfo_t, si_signo); 105 } 106