소스 검색

ar71xx/lzma-loader: fix O32 ABI conformance

Backport of r48279
Matthias Schiffer 8 년 전
부모
커밋
6daacdd484
1개의 변경된 파일36개의 추가작업 그리고 0개의 파일을 삭제
  1. 36 0
      patches/openwrt/0051-ar71xx-lzma-loader-fix-O32-ABI-conformance.patch

+ 36 - 0
patches/openwrt/0051-ar71xx-lzma-loader-fix-O32-ABI-conformance.patch

@@ -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