28f5688dcf
The initial stack is solely used to initialize the Genode environment along with the application stack located in the stack area. It never executes application code. Hence, we can make it small. To check that it is not dimensioned too small, the patch introduces a sanity check right before switching to the application stack.
111 lines
2.3 KiB
ArmAsm
111 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
|
|
.global __initial_stack_base
|
|
__initial_stack_base:
|
|
.space 4*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
|