ar71xx/lzma-loader: fix O32 ABI conformance
Backport of r48279
This commit is contained in:
parent
549187b66c
commit
6d3de131bf
@ -0,0 +1,36 @@
|
|||||||
|
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
|
Loading…
Reference in New Issue
Block a user