xref: /freebsd/stand/kboot/libkboot/arch/aarch64/start_arch.h (revision a03411e84728e9b267056fd31c7d1d9d1dc1b01e)
1 /*
2  * Copyright (c) 2022, Netflix, Inc.
3  *
4  * SPDX-License-Identifier: BSD-2-Clause
5  */
6 
7 /*
8  * Provides a _start routine that calls a _start_c routine that takes a pointer
9  * to the stack as documented in crt1.c. We skip the pointer to _DYNAMIC since
10  * we don't support dynamic libraries, at all. And while _start_c is our own
11  * thing and doesn't have a second arg, we comport to the calling conventions
12  * that glibc and musl have by passing x1 as 0 for the dynamic pointer. We
13  * likely could call main directly with only a few more lines of code, but this
14  * is simple enough and concentrates all the expressable in C stuff there.  We
15  * also generate eh_frames should we need to debug things (it doesn't change the
16  * genreated code, but leaves enough breadcrumbs to keep gdb happy)
17  */
18 
19 __asm__(
20 ".text\n"		/* ENTRY(_start) -- can't expand and stringify, so by hand */
21 ".align 2\n"
22 ".global _start\n"
23 ".type _start, #function\n"
24 "_start:\n"
25 ".cfi_startproc\n"
26 /*
27  * Linux zeros all registers so x29 (frame pointer) and x30 (link register) are 0.
28  */
29 "	mov	x0, sp\n"	/* Pointer to argc, etc kernel left on the stack */
30 "	and	sp, x0, #-16\n"	/* Align stack to 16-byte boundary */
31 "	b	_start_c\n"	/* Our MI code takes it from here */
32 /* NORETURN */
33 ".ltorg\n"		/* END(_start) */
34 ".cfi_endproc\n"
35 ".size _start, .-_start\n"
36 );
37