tools/nolibc: s390: shrink _start with _start_c
move most of the _start operations to _start_c(), include the stackprotector initialization. Signed-off-by: Zhangjin Wu <falcon@tinylab.org> Signed-off-by: Willy Tarreau <w@1wt.eu>
This commit is contained in:
parent
eea70cdac6
commit
c48d8af2fa
@ -9,6 +9,7 @@
|
||||
#include <asm/unistd.h>
|
||||
|
||||
#include "compiler.h"
|
||||
#include "crt.h"
|
||||
|
||||
/* Syscalls for s390:
|
||||
* - registers are 64-bit
|
||||
@ -137,41 +138,14 @@
|
||||
_arg1; \
|
||||
})
|
||||
|
||||
char **environ __attribute__((weak));
|
||||
const unsigned long *_auxv __attribute__((weak));
|
||||
|
||||
/* startup code */
|
||||
void __attribute__((weak, noreturn, optimize("Os", "omit-frame-pointer"))) __no_stack_protector _start(void)
|
||||
{
|
||||
__asm__ volatile (
|
||||
"lg %r2,0(%r15)\n" /* argument count */
|
||||
"la %r3,8(%r15)\n" /* argument pointers */
|
||||
|
||||
"xgr %r0,%r0\n" /* r0 will be our NULL value */
|
||||
/* search for envp */
|
||||
"lgr %r4,%r3\n" /* start at argv */
|
||||
"0:\n"
|
||||
"clg %r0,0(%r4)\n" /* entry zero? */
|
||||
"la %r4,8(%r4)\n" /* advance pointer */
|
||||
"jnz 0b\n" /* no -> test next pointer */
|
||||
/* yes -> r4 now contains start of envp */
|
||||
"larl %r1,environ\n"
|
||||
"stg %r4,0(%r1)\n"
|
||||
|
||||
/* search for auxv */
|
||||
"lgr %r5,%r4\n" /* start at envp */
|
||||
"1:\n"
|
||||
"clg %r0,0(%r5)\n" /* entry zero? */
|
||||
"la %r5,8(%r5)\n" /* advance pointer */
|
||||
"jnz 1b\n" /* no -> test next pointer */
|
||||
"larl %r1,_auxv\n" /* yes -> store value in _auxv */
|
||||
"stg %r5,0(%r1)\n"
|
||||
|
||||
"aghi %r15,-160\n" /* allocate new stackframe */
|
||||
"xc 0(8,%r15),0(%r15)\n" /* clear backchain */
|
||||
"brasl %r14,main\n" /* ret value of main is arg to exit */
|
||||
"lghi %r1,1\n" /* __NR_exit */
|
||||
"svc 0\n"
|
||||
"lgr %r2, %r15\n" /* save stack pointer to %r2, as arg1 of _start_c */
|
||||
"aghi %r15, -160\n" /* allocate new stackframe */
|
||||
"xc 0(8,%r15), 0(%r15)\n" /* clear backchain */
|
||||
"brasl %r14, _start_c\n" /* transfer to c runtime */
|
||||
);
|
||||
__builtin_unreachable();
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user