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: enable support for thumb1 mode for ARM
Passing -mthumb to the kernel.org arm toolchain failed to build because it defaults to armv5 hence thumb1, which has a fairly limited instruction set compared to thumb2 enabled with armv7 that is much more complete. It's not very difficult to adjust the instructions to also build on thumb1, it only adds a total of 3 instructions, so it's worth doing it at least to ease use by casual testers. It was verified that the adjusted code now builds and works fine for armv5, thumb1, armv7 and thumb2, as long as frame pointers are not used. Signed-off-by: Willy Tarreau <w@1wt.eu> Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
This commit is contained in:
parent
7f85485896
commit
20470dfd65
1 changed files with 10 additions and 4 deletions
|
@ -180,10 +180,16 @@ void __attribute__((weak,noreturn,optimize("omit-frame-pointer"))) _start(void)
|
|||
__asm__ volatile (
|
||||
"pop {%r0}\n" // argc was in the stack
|
||||
"mov %r1, %sp\n" // argv = sp
|
||||
"add %r2, %r1, %r0, lsl #2\n" // envp = argv + 4*argc ...
|
||||
"add %r2, %r2, $4\n" // ... + 4
|
||||
"and %r3, %r1, $-8\n" // AAPCS : sp must be 8-byte aligned in the
|
||||
"mov %sp, %r3\n" // callee, an bl doesn't push (lr=pc)
|
||||
|
||||
"add %r2, %r0, $1\n" // envp = (argc + 1) ...
|
||||
"lsl %r2, %r2, $2\n" // * 4 ...
|
||||
"add %r2, %r2, %r1\n" // + argv
|
||||
|
||||
"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);
|
||||
"mov %sp, %r3\n" //
|
||||
|
||||
"bl main\n" // main() returns the status code, we'll exit with it.
|
||||
"movs r7, $1\n" // NR_exit == 1
|
||||
"svc $0x00\n"
|
||||
|
|
Loading…
Reference in a new issue