genode/repos/base/src/lib/startup/spec/x86_32/crt0.s

109 lines
2.3 KiB
ArmAsm

/**
* \brief Startup code for Genode applications
* \author Christian Helmuth
* \author Martin Stein
* \date 2009-08-12
*/
/*
* Copyright (C) 2009-2013 Genode Labs GmbH
*
* This file is part of the Genode OS framework, which is distributed
* under the terms of the GNU General Public License version 2.
*/
/**************************
** .text (program code) **
**************************/
.section ".text.crt0.ld"
/* ld.lib.so entry point for Linux */
.global _start_initial_stack
_start_initial_stack:
/* set GOT */
call 1f
1:
pop %ebx
addl $_GLOBAL_OFFSET_TABLE_ + 1, %ebx
/* init_rtld relocates the linker */
call init_rtld
/* the address of __initial_sp is now correct */
movl %esp, __initial_sp@GOTOFF(%ebx)
jmp 2f
.section ".text.crt0"
/* program entry-point */
.global _start
_start:
/* save initial register values using GOT-relative addressing */
3:
movl $., %ecx
addl $_GLOBAL_OFFSET_TABLE_ + (. - 3b) , %ecx
movl %esp, __initial_sp@GOTOFF(%ecx)
movl %eax, __initial_ax@GOTOFF(%ecx)
movl %ebx, __initial_bx@GOTOFF(%ecx)
movl %edi, __initial_di@GOTOFF(%ecx)
/* initialize GOT pointer in EBX as expected by the tool chain */
mov %ecx, %ebx
/*
* Install initial temporary environment that is replaced later by the
* environment that init_main_thread creates.
*/
leal _stack_high@GOTOFF(%ebx), %esp
/* if this is the dynamic linker, init_rtld relocates the linker */
call init_rtld
jmp 2f
.section ".text.crt0.common"
2:
/* create proper environment for the main thread */
call init_main_thread
/* apply environment that was created by init_main_thread */
movl init_main_thread_result@GOTOFF(%ebx), %esp
/* clear the base pointer in order that stack backtraces will work */
xor %ebp, %ebp
/* jump into init C code instead of calling it as it should never return */
jmp _main
/*********************************
** .bss (non-initialized data) **
*********************************/
.bss
/* stack of the temporary initial environment */
.p2align 4
.space 32 * 1024
_stack_high:
/* initial value of the ESP, EAX and EDI register */
.global __initial_sp
__initial_sp:
.space 4
.global __initial_ax
__initial_ax:
.space 4
.global __initial_bx
__initial_bx:
.space 4
.global __initial_di
__initial_di:
.space 4