123456789101112131415161718192021222324252627282930313233343536 |
- From: Matthias Schiffer <mschiffer@universe-factory.net>
- Date: Sun, 28 Feb 2016 04:49:51 +0100
- Subject: ar71xx/lzma-loader: fix O32 ABI conformance
- According to the calling convention of the o32 ABI the caller
- function must reserve stack space for $a0-$a3 registers in case
- the callee needs to save its arguments.
- The assembly code of the loader does not reserve stack space for
- these registers thus when the 'loader_main' function needs to save
- its arguments, those will be stored in the 'workspace' area instead
- of the stack.
- Because the workspace area is also used by other part of the code, the
- saved register values gets overwritten and this often leads to failed
- kernel boots.
- Fix the code to reserve stack space for the registers to avoid this
- error.
- Backport of r48279
- diff --git a/target/linux/ar71xx/image/lzma-loader/src/head.S b/target/linux/ar71xx/image/lzma-loader/src/head.S
- index 543996a..47a7c9b 100644
- --- a/target/linux/ar71xx/image/lzma-loader/src/head.S
- +++ b/target/linux/ar71xx/image/lzma-loader/src/head.S
- @@ -109,6 +109,9 @@ __bss_check:
- /* Setup new "C" stack */
- la sp, _stack
-
- + /* reserve stack space for a0-a3 registers */
- + subu sp, 16
- +
- /* jump to the decompressor routine */
- la t0, loader_main
- jr t0
|