mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-29 13:53:33 +00:00
tools/nolibc: add auxiliary vector retrieval for arm
In the _start block we now iterate over envp to find the auxiliary vector after the NULL. The pointer is saved into an _auxv variable that is marked as weak so that it's accessible from multiple units. Signed-off-by: Willy Tarreau <w@1wt.eu> It was tested in arm, thumb1 and thumb2 modes. Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
This commit is contained in:
parent
2a39a53245
commit
59ea187624
1 changed files with 13 additions and 0 deletions
|
@ -197,6 +197,7 @@ struct sys_stat_struct {
|
|||
})
|
||||
|
||||
char **environ __attribute__((weak));
|
||||
const unsigned long *_auxv __attribute__((weak));
|
||||
|
||||
/* startup code */
|
||||
void __attribute__((weak,noreturn,optimize("omit-frame-pointer"))) _start(void)
|
||||
|
@ -211,6 +212,16 @@ void __attribute__((weak,noreturn,optimize("omit-frame-pointer"))) _start(void)
|
|||
"ldr %r3, 1f\n" // r3 = &environ (see below)
|
||||
"str %r2, [r3]\n" // store envp into environ
|
||||
|
||||
"mov r4, r2\n" // search for auxv (follows NULL after last env)
|
||||
"0:\n"
|
||||
"mov r5, r4\n" // r5 = r4
|
||||
"add r4, r4, #4\n" // r4 += 4
|
||||
"ldr r5,[r5]\n" // r5 = *r5 = *(r4-4)
|
||||
"cmp r5, #0\n" // and stop at NULL after last env
|
||||
"bne 0b\n"
|
||||
"ldr %r3, 2f\n" // r3 = &_auxv (low bits)
|
||||
"str r4, [r3]\n" // store r4 into _auxv
|
||||
|
||||
"mov %r3, $8\n" // AAPCS : sp must be 8-byte aligned in the
|
||||
"neg %r3, %r3\n" // callee, and bl doesn't push (lr=pc)
|
||||
"and %r3, %r3, %r1\n" // so we do sp = r1(=sp) & r3(=-8);
|
||||
|
@ -222,6 +233,8 @@ void __attribute__((weak,noreturn,optimize("omit-frame-pointer"))) _start(void)
|
|||
".align 2\n" // below are the pointers to a few variables
|
||||
"1:\n"
|
||||
".word environ\n"
|
||||
"2:\n"
|
||||
".word _auxv\n"
|
||||
);
|
||||
__builtin_unreachable();
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue