瀏覽代碼

xtensa: Stack unwinding on Xtensa requires that the return address register always be valid. This patch fixes a part of ldso that had been using an Xtensa CALL0 instruction to get the current PC value, which temporarily clobbered the return address register. The revised code just loads the address of a label in the code. See my change to GCC from 2007-12-20 for more info (http://gcc.gnu.org/ml/gcc-patches/2007-12/msg01023.html).

Chris Zankel 17 年之前
父節點
當前提交
c9db9e50e6
共有 1 個文件被更改,包括 4 次插入8 次删除
  1. 4 8
      ldso/ldso/xtensa/resolve.S

+ 4 - 8
ldso/ldso/xtensa/resolve.S

@@ -32,15 +32,11 @@
 	.type	_dl_linux_resolve, @function
 _dl_linux_resolve:
 	/* Fix up the high 2 bits of the return address.  */
-	mov	a14, a0		// save a0 temporarily
-	_call0	0f
-	.align	4
-0:	extui	a13, a0, 30, 2
-	slli	a13, a13, 30
-	mov	a0, a14		// restore a0
+	movi	a13, 0f
 	slli	a12, a0, 2
-	srli	a12, a12, 2
-	or	a12, a12, a13
+0:	extui	a13, a13, 30, 2
+	ssai	2
+	src	a12, a13, a12
 
 	/* Call the fixup function.  */
 	movi	a8, _dl_linux_resolver