From 0cf5ecba126fe8215db0b079adfb1a6f9ac49e11 Mon Sep 17 00:00:00 2001 From: "Ithamar R. Adema" Date: Tue, 6 Nov 2012 11:06:04 +0100 Subject: [PATCH] ARM: Add asm_offsets.cpp This will generate asm_offsets.h which makes our assembly code easier to maintain by preventing hardcoded offsets for fields within structures. (copied from X86 and removed the X86 specifics) --- src/system/kernel/arch/arm/asm_offsets.cpp | 62 ++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 src/system/kernel/arch/arm/asm_offsets.cpp diff --git a/src/system/kernel/arch/arm/asm_offsets.cpp b/src/system/kernel/arch/arm/asm_offsets.cpp new file mode 100644 index 0000000000..64e85057d7 --- /dev/null +++ b/src/system/kernel/arch/arm/asm_offsets.cpp @@ -0,0 +1,62 @@ +/* + * Copyright 2007-2011, Ingo Weinhold, ingo_weinhold@gmx.de. + * Distributed under the terms of the MIT License. + */ + +// This file is used to get C structure offsets into assembly code. +// The build system assembles the file and processes the output to create +// a header file with macro definitions, that can be included from assembly +// code. + + +#include + +#include +#include +#include +#include +#include + + +#define DEFINE_MACRO(macro, value) DEFINE_COMPUTED_ASM_MACRO(macro, value) + +#define DEFINE_OFFSET_MACRO(prefix, structure, member) \ + DEFINE_MACRO(prefix##_##member, offsetof(struct structure, member)); + +#define DEFINE_SIZEOF_MACRO(prefix, structure) \ + DEFINE_MACRO(prefix##_sizeof, sizeof(struct structure)); + + +void +dummy() +{ + // struct cpu_ent + DEFINE_OFFSET_MACRO(CPU_ENT, cpu_ent, fault_handler); + DEFINE_OFFSET_MACRO(CPU_ENT, cpu_ent, fault_handler_stack_pointer); + + // struct Thread + DEFINE_OFFSET_MACRO(THREAD, Thread, time_lock); + DEFINE_OFFSET_MACRO(THREAD, Thread, kernel_time); + DEFINE_OFFSET_MACRO(THREAD, Thread, user_time); + DEFINE_OFFSET_MACRO(THREAD, Thread, last_time); + DEFINE_OFFSET_MACRO(THREAD, Thread, in_kernel); + DEFINE_OFFSET_MACRO(THREAD, Thread, flags); + DEFINE_OFFSET_MACRO(THREAD, Thread, kernel_stack_top); + DEFINE_OFFSET_MACRO(THREAD, Thread, fault_handler); + + // struct iframe + DEFINE_SIZEOF_MACRO(IFRAME, iframe); + + // struct signal_frame_data + DEFINE_SIZEOF_MACRO(SIGNAL_FRAME_DATA, signal_frame_data); + DEFINE_OFFSET_MACRO(SIGNAL_FRAME_DATA, signal_frame_data, info); + DEFINE_OFFSET_MACRO(SIGNAL_FRAME_DATA, signal_frame_data, context); + DEFINE_OFFSET_MACRO(SIGNAL_FRAME_DATA, signal_frame_data, user_data); + DEFINE_OFFSET_MACRO(SIGNAL_FRAME_DATA, signal_frame_data, handler); + + // struct ucontext_t + DEFINE_OFFSET_MACRO(UCONTEXT_T, __ucontext_t, uc_mcontext); + + // struct siginfo_t + DEFINE_OFFSET_MACRO(SIGINFO_T, __siginfo_t, si_signo); +}