diff mbox

[U-Boot] arm: Fix setjmp

Message ID 1465819267-125370-1-git-send-email-agraf@suse.de
State Accepted
Commit e677724884c175e978b463cf941ecb9310d3b900
Delegated to: Tom Rini
Headers show

Commit Message

Alexander Graf June 13, 2016, 12:01 p.m. UTC
The setjmp/longjmp implementation did not work on thumb1 implementations
because it used instruction encodings that don't exist on thumb1 yet.

This patch limits itself to thumb1 instruction set for 32bit arm and
removes a superfluous printf along the way.

Signed-off-by: Alexander Graf <agraf@suse.de>
---
 arch/arm/include/asm/setjmp.h | 9 ++++-----
 1 file changed, 4 insertions(+), 5 deletions(-)

Comments

Tom Rini June 19, 2016, 2:11 p.m. UTC | #1
On Mon, Jun 13, 2016 at 02:01:07PM +0200, Alexander Graf wrote:

> The setjmp/longjmp implementation did not work on thumb1 implementations
> because it used instruction encodings that don't exist on thumb1 yet.
> 
> This patch limits itself to thumb1 instruction set for 32bit arm and
> removes a superfluous printf along the way.
> 
> Signed-off-by: Alexander Graf <agraf@suse.de>

Applied to u-boot/master, thanks!
diff mbox

Patch

diff --git a/arch/arm/include/asm/setjmp.h b/arch/arm/include/asm/setjmp.h
index b8b85b7..ae738b2 100644
--- a/arch/arm/include/asm/setjmp.h
+++ b/arch/arm/include/asm/setjmp.h
@@ -43,13 +43,14 @@  static inline int setjmp(jmp_buf jmp)
 #else
 	asm volatile(
 #ifdef CONFIG_SYS_THUMB_BUILD
-		"adr r0, jmp_target + 1\n"
+		"adr r0, jmp_target\n"
+		"add r0, r0, $1\n"
 #else
 		"adr r0, jmp_target\n"
 #endif
 		"mov r1, %1\n"
 		"mov r2, sp\n"
-		"stm r1, {r0, r2, r4, r5, r6, r7}\n"
+		"stm r1!, {r0, r2, r4, r5, r6, r7}\n"
 		"b 2f\n"
 		"jmp_target: "
 		"mov %0, #1\n"
@@ -61,8 +62,6 @@  static inline int setjmp(jmp_buf jmp)
 		  "cc", "memory");
 #endif
 
-printf("%s:%d target=%#lx\n", __func__, __LINE__, jmp->target);
-
 	return r;
 }
 
@@ -84,7 +83,7 @@  static inline __noreturn void longjmp(jmp_buf jmp)
 #else
 	asm volatile(
 		"mov r1, %0\n"
-		"ldm r1, {r0, r2, r4, r5, r6, r7}\n"
+		"ldm r1!, {r0, r2, r4, r5, r6, r7}\n"
 		"mov sp, r2\n"
 		"bx r0\n"
 		: