crt0 cleanup

- use the generic 'crt0.s' for Linux
- move the read-only '__dso_handle' definition into the '.text' section
- move the '__initial_sp' definition into the '.bss' section
- remove the '_main_utcb' definition

Part of #766.
This commit is contained in:
Christian Prochaska 2013-06-06 17:43:13 +02:00 committed by Norman Feske
parent 1b96e8a7e1
commit c962240922
22 changed files with 44 additions and 450 deletions

View File

@ -1,5 +0,0 @@
LIBS += syscall
include $(BASE_DIR)/lib/mk/startup.inc
vpath crt0.s $(REP_DIR)/src/platform/arm

View File

@ -1,5 +0,0 @@
LIBS += syscall
include $(BASE_DIR)/lib/mk/startup.inc
vpath crt0.s $(REP_DIR)/src/platform/x86_32

View File

@ -1,5 +0,0 @@
LIBS += syscall
include $(BASE_DIR)/lib/mk/startup.inc
vpath crt0.s $(REP_DIR)/src/platform/x86_64

View File

@ -19,11 +19,9 @@
#include <linux_syscalls.h>
/*
* Define 'lx_environ' pointer that is supposed to be initialized by the
* startup code.
* Define 'lx_environ' pointer.
*/
__attribute__((weak)) char **lx_environ = (char **)0;
char **lx_environ;
/**
@ -36,6 +34,20 @@ static inline void main_thread_bootstrap()
{
using namespace Genode;
extern Genode::addr_t *__initial_sp;
/*
* Initialize the 'lx_environ' pointer
*
* environ = &argv[argc + 1]
* __initial_sp[0] = argc (always 1 in Genode)
* __initial_sp[1] = argv[0]
* __initial_sp[2] = NULL
* __initial_sp[3] = environ
*
*/
lx_environ = (char**)&__initial_sp[3];
/* reserve context area */
Genode::addr_t base = Native_config::context_area_virtual_base();
Genode::size_t size = Native_config::context_area_virtual_size();

View File

@ -1,66 +0,0 @@
/*
* \brief Startup code for Genode applications
* \author Christian Helmuth
* \author Christian Prochaska
* \date 2006-07-06
*/
/*
* Copyright (C) 2006-2012 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) -------------------------*/
.text
.globl _start
_start:
ldr r1,=__initial_sp
str sp,[r1]
/*
* environ = &argv[argc + 1]
* in Genode argc is always 1
*/
add sp,sp,#12
ldr r1,=lx_environ
str sp,[r1]
/* XXX Switch to our own stack. */
ldr sp,=_stack_high
/* Clear the frame pointer and the link register so that stack backtraces will work. */
mov fp,#0
mov lr,#0
/* Jump into init C code */
b _main
/*--------------------------------------------------*/
.data
.globl __dso_handle
__dso_handle:
.long 0
.globl __initial_sp
__initial_sp:
.long 0
/*--- .eh_frame (exception frames) -----------------*/
/*
.section .eh_frame,"aw"
.globl __EH_FRAME_BEGIN__
__EH_FRAME_BEGIN__:
*/
/*--- .bss (non-initialized data) ------------------*/
.bss
.p2align 4
.globl _stack_low
_stack_low:
.space 64*1024
.globl _stack_high
_stack_high:

View File

@ -1,70 +0,0 @@
/*
* \brief Startup code for Genode applications
* \author Christian Helmuth
* \date 2006-07-06
*/
/*
* Copyright (C) 2006-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) -------------------------*/
.text
.globl _start
_start:
movl %esp, __initial_sp
/*
* environ = &argv[argc + 1]
* in Genode argc is always 1
*/
popl %eax /* argc */
popl %eax /* argv[0] */
popl %eax /* NULL */
movl %esp, lx_environ
/* XXX Switch to our own stack. */
movl $_stack_high,%esp
/* Clear the base pointer so that stack backtraces will work. */
xorl %ebp,%ebp
/* Jump into init C code */
call _main
/* We should never get here since _main does not return */
1: int $3
jmp 2f
.ascii "_main() returned."
2: jmp 1b
/*--------------------------------------------------*/
.data
.globl __dso_handle
__dso_handle:
.long 0
.globl __initial_sp
__initial_sp:
.long 0
/*--- .eh_frame (exception frames) -----------------*/
/*
.section .eh_frame,"aw"
.globl __EH_FRAME_BEGIN__
__EH_FRAME_BEGIN__:
*/
/*--- .bss (non-initialized data) ------------------*/
.bss
.p2align 4
.globl _stack_low
_stack_low:
.space 64*1024
.globl _stack_high
_stack_high:

View File

@ -1,74 +0,0 @@
/*
* \brief Startup code for Genode applications
* \author Christian Helmuth
* \date 2006-07-06
*/
/*
* Copyright (C) 2006-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) -------------------------*/
.text
.globl _start
_start:
movq __initial_sp@GOTPCREL(%rip), %rax
movq %rsp, (%rax)
/*
* environ = &argv[argc + 1]
* in Genode argc is always 1
*/
popq %rax /* argc */
popq %rax /* argv[0] */
popq %rax /* NULL */
movq lx_environ@GOTPCREL(%rip), %rax
movq %rsp, (%rax)
/* XXX Switch to our own stack. */
leaq _stack_high@GOTPCREL(%rip), %rax
movq (%rax), %rsp
/* Clear the base pointer so that stack backtraces will work. */
xorq %rbp,%rbp
/* Jump into init C code */
callq _main
/* We should never get here since _main does not return */
1: int $3
jmp 2f
.ascii "_main() returned."
2: jmp 1b
/*--------------------------------------------------*/
.data
.p2align 8
.globl __dso_handle
__dso_handle:
.quad 0
.globl __initial_sp
__initial_sp:
.quad 0
/*--- .eh_frame (exception frames) -----------------*/
/*
.section .eh_frame,"aw"
.globl __EH_FRAME_BEGIN__
__EH_FRAME_BEGIN__:
*/
/*--- .bss (non-initialized data) ------------------*/
.bss
.p2align 8
.globl _stack_low
_stack_low:
.space 64*1024
.globl _stack_high
_stack_high:

View File

@ -3,4 +3,6 @@ SRC_CC += _main.cc
REP_INC_DIR += src/platform
LIBS += syscall
vpath _main.cc $(BASE_DIR)/src/platform

View File

@ -26,15 +26,8 @@ _start:
.initial_sp: .word __initial_sp
.stack_high: .word _stack_high
/*--------------------------------------------------*/
.data
.globl __dso_handle
__dso_handle:
.long 0
.globl __initial_sp
__initial_sp:
.long 0
__dso_handle: .long 0
/*--- .bss (non-initialized data) ------------------*/
.section ".bss"
@ -46,10 +39,6 @@ _stack_low:
.globl _stack_high
_stack_high:
/*
* Symbol referenced by ldso's crt0.s, which is needed by base-hw only.
* It is defined here merely to resolve the symbol for non-base-hw
* platforms.
*/
.globl _main_utcb
_main_utcb: .long 0
/* initial value of the SP register */
.globl __initial_sp
__initial_sp: .space 4

View File

@ -33,16 +33,8 @@ _start:
.ascii "_main() returned."
2: jmp 1b
/*--------------------------------------------------*/
.data
.globl __dso_handle
__dso_handle:
.long 0
.globl __initial_sp
__initial_sp:
.long 0
__dso_handle: .long 0
/*--- .eh_frame (exception frames) -----------------*/
/*
@ -59,3 +51,7 @@ _stack_low:
.space 64*1024
.global _stack_high
_stack_high:
/* initial value of the ESP register */
.globl __initial_sp
__initial_sp: .space 4

View File

@ -36,17 +36,8 @@ _start:
.ascii "_main() returned."
2: jmp 1b
/*--------------------------------------------------*/
.data
.p2align 8
.globl __dso_handle
__dso_handle:
.quad 0
.globl __initial_sp
__initial_sp:
.quad 0
__dso_handle: .quad 0
/*--- .eh_frame (exception frames) -----------------*/
/*
@ -63,3 +54,7 @@ _stack_low:
.space 64*1024
.global _stack_high
_stack_high:
/* initial value of the RSP register */
.globl __initial_sp
__initial_sp: .space 8

View File

@ -1,3 +0,0 @@
SRC_S = crt0.s
vpath crt0.s $(REP_DIR)/src/lib/ldso/arm/linux

View File

@ -1,6 +1,6 @@
SRC_CC = parent_cap.cc binary_name.cc
LIBS = ldso_crt0_lx
LIBS = ldso_crt0
vpath parent_cap.cc $(REP_DIR)/src/lib/ldso/arch/linux
vpath binary_name.cc $(REP_DIR)/src/lib/ldso/arch/linux

View File

@ -1,3 +0,0 @@
SRC_S = crt0.s
vpath crt0.s $(REP_DIR)/src/lib/ldso/x86_32/linux/

View File

@ -1,3 +0,0 @@
SRC_S = crt0.s
vpath crt0.s $(REP_DIR)/src/lib/ldso/x86_64/linux/

View File

@ -17,9 +17,6 @@
.globl _start_ldso
_start_ldso:
ldr r2, .initial_utcb
str r0, [r2]
ldr r2, .initial_sp
str sp, [r2]
@ -29,5 +26,4 @@ _start_ldso:
.initial_sp: .word __initial_sp
.stack_high: .word _stack_high
.initial_utcb: .word _main_utcb

View File

@ -1,58 +0,0 @@
/*
* \brief Startup code for ld.lib.so (linux_arm)
* \author Christian Prochaska
* \date 2012-07-06
*/
/*
* Copyright (C) 2012 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"
.globl _start_ldso
_start_ldso:
ldr sl, .L_GOT
.L_GOT_OFF:
add sl, pc, sl
ldr r1, .initial_sp
ldr r1, [sl, r1]
str sp, [r1]
/*
* environ = &argv[argc + 1]
* in Genode argc is always 1
*/
add sp, sp,#12
ldr r1, .lx_environ
ldr r1, [sl, r1]
str sp, [r1]
/* XXX Switch to our own stack. */
ldr r1, .stack_high
ldr sp, [sl, r1]
/* relocate ldso */
mov r1, #0
bl init_rtld
/*
* Clear the frame pointer and the link register so that stack
* backtraces will work.
*/
mov fp, #0
mov lr, #0
/* Jump into init C code */
b _main
.L_GOT: .word _GLOBAL_OFFSET_TABLE_ - (.L_GOT_OFF + 8)
.initial_sp: .word __initial_sp(GOT)
.lx_environ: .word lx_environ(GOT)
.stack_high: .word _stack_high(GOT)

View File

@ -13,9 +13,9 @@
#ifndef _ARM__CALL_MAIN_H_
#define _ARM__CALL_MAIN_H_
/**
* Restore SP from initial sp and jump to entry function
*/
/**
* Restore SP from initial sp and jump to entry function
*/
void call_main(void (*func)(void))
{
extern long __initial_sp;

View File

@ -13,9 +13,9 @@
#ifndef _X86_32__CALL_MAIN_H_
#define _X86_32__CALL_MAIN_H_
/**
* Restore SP from initial sp and jump to entry function
*/
/**
* Restore SP from initial sp and jump to entry function
*/
void call_main(void (*func)(void))
{
extern long __initial_sp;

View File

@ -52,7 +52,7 @@ static void *setup_stack(const char *name, long fd)
(char*)fd,
(char*)AT_NULL, //AT terminator
};
void *sp = malloc(sizeof(sp_argc) + sizeof(sp_argv) + (env_count * sizeof(long))
+ sizeof(sp_at));
void *sp_tmp = sp;
@ -88,6 +88,8 @@ int main(int argc, char **argv)
void *sp = setup_stack(binary, (long)fd);
printf("Starting ldso ...\n");
/* this is usually '_start' */
func_ptr_type main_func = _rtld(sp, &exit_proc, &objp);
/* DEBUGGING
@ -97,11 +99,11 @@ int main(int argc, char **argv)
*/
/* start loaded application */
printf("Starting application ... environ: %p\n", lx_environ);
call_main(main_func);
exit_proc();
printf("Exiting ldso\n");
return 0;
}

View File

@ -1,54 +0,0 @@
/*
* \brief Startup code for Genode applications
* \author Christian Helmuth
* \date 2006-07-06
*/
/*
* Copyright (C) 2006-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) -------------------------*/
.text
.globl _start_ldso
_start_ldso:
/* set global offset table the taditional way */
call 3f
3:
popl %ebx;
addl $_GLOBAL_OFFSET_TABLE_+ (. - 3b), %ebx
movl %esp, __initial_sp@GOTOFF(%ebx)
/*
* environ = &argv[argc + 1]
* in Genode argc is always 1
*/
popl %eax /* argc */
popl %eax /* argv[0] */
popl %eax /* NULL */
movl %esp, lx_environ@GOTOFF(%ebx)
/* XXX Switch to our own stack. */
leal _stack_high@GOTOFF(%ebx), %esp
/* relocate ldso */
call init_rtld
/* Clear the base pointer so that stack backtraces will work. */
xorl %ebp,%ebp
/* Jump into init C code */
call _main
/* We should never get here since _main does not return */
1: int $3
jmp 2f
.ascii "_main() returned."
2: jmp 1b

View File

@ -1,52 +0,0 @@
/*
* \brief Startup code for ldso 64Bit-Linux version
* \author Christian Helmuth
* \author Sebastian Sumpf
* \date 2011-05-10
*/
/*
* Copyright (C) 2011-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) -------------------------*/
.text
.globl _start_ldso
_start_ldso:
/* initialize GLOBAL OFFSET TABLE */
leaq _GLOBAL_OFFSET_TABLE_(%rip),%r15
movq __initial_sp@GOTPCREL(%rip), %rax
movq %rsp, (%rax)
/*
* environ = &argv[argc + 1]
* in Genode argc is always 1
*/
popq %rax /* argc */
popq %rax /* argv[0] */
popq %rax /* NULL */
movq lx_environ@GOTPCREL(%rip), %rax
movq %rsp, (%rax)
/* XXX Switch to our own stack. */
leaq _stack_high@GOTPCREL(%rip),%rax
movq (%rax), %rsp
call init_rtld
/* Clear the base pointer so that stack backtraces will work. */
xorq %rbp,%rbp
/* Jump into init C code */
call _main
/* We should never get here since _main does not return */
1: int $3
jmp 2f
.ascii "_main() returned."
2: jmp 1b