Files
vlibc/crt/x86_64/crt1.s
T

35 lines
1.4 KiB
ArmAsm

/*
* vlibc — x86_64 _start (todo 3).
*
* The kernel enters the program here with the initial stack holding, in
* order from %rsp: argc, argv[0..argc-1], a NULL argv terminator, the
* environment strings, a NULL envp terminator, and the auxiliary vector.
* The kernel leaves %rsp 16-byte aligned at entry.
*
* _start forwards (main, argc, argv, envp) to __libc_start_main, matching
* vlibc's startup signature (src/start/start.h). The frame pointer is
* zeroed first so the outermost frame terminates backtraces, and %rsp is
* 16-byte aligned at the call site per the SysV AMD64 ABI. __libc_start_main
* never returns (it ends in exit), so the hlt loop below is unreachable; it
* exists only to satisfy the assembler and to fault loudly (hlt in user
* mode raises #GP) if a broken build ever falls through.
*/
.text
.global _start
.type _start, @function
_start:
xor %ebp, %ebp # outermost frame: zero frame pointer
mov %rsp, %r8 # keep the raw initial stack for envp
pop %rsi # rsi = argc
mov %rsp, %rdx # rdx = argv
lea 16(%r8, %rsi, 8), %rcx # rcx = envp = initial rsp + 8 + 8*(argc+1)
lea main(%rip), %rdi # rdi = &main
and $-16, %rsp # ABI: rsp % 16 == 0 at the call site
call __libc_start_main # _Noreturn: routes main's result into exit
1: hlt
jmp 1b
.size _start, . - _start
.section .note.GNU-stack, "", @progbits