diff --git a/patches/openwrt/0046-ar71xx-lzma-loader-fix-O32-ABI-conformance.patch b/patches/openwrt/0046-ar71xx-lzma-loader-fix-O32-ABI-conformance.patch new file mode 100644 index 00000000..2d08f3b4 --- /dev/null +++ b/patches/openwrt/0046-ar71xx-lzma-loader-fix-O32-ABI-conformance.patch @@ -0,0 +1,36 @@ +From: Matthias Schiffer +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