
From: Anton Blanchard <anton@samba.org>

It turns out gcc decides to allocate a stack frame in the current xmon setjmp
function.  This means the stack linkage we save away is destroyed when
returning from it and its just a matter of time before another function stomps
on it.

This should fix the problem Linas reported this week.

Signed-off-by: Anton Blanchard <anton@samba.org>
Signed-off-by: Andrew Morton <akpm@osdl.org>
---

 /dev/null                        |   77 ---------------------------------------
 25-akpm/arch/ppc64/xmon/setjmp.S |   73 ++++++++++++++++++++++++++++++++++++
 2 files changed, 73 insertions(+), 77 deletions(-)

diff -L arch/ppc64/xmon/setjmp.c -puN arch/ppc64/xmon/setjmp.c~ppc64-fix-xmon-longjmp-handling /dev/null
--- 25/arch/ppc64/xmon/setjmp.c
+++ /dev/null	2003-09-15 06:40:47.000000000 -0700
@@ -1,77 +0,0 @@
-/*
- * Copyright (C) 1996 Paul Mackerras.
- *
- *      This program is free software; you can redistribute it and/or
- *      modify it under the terms of the GNU General Public License
- *      as published by the Free Software Foundation; either version
- *      2 of the License, or (at your option) any later version.
- *
- * NB this file must be compiled with -O2.
- */
-
-int
-xmon_setjmp(long *buf)  /* NOTE: assert(sizeof(buf) > 184) */
-{
-	/* XXX should save fp regs as well */
-	asm volatile (
-	"mflr 0; std 0,0(%0)\n\
-	 std	1,8(%0)\n\
-	 std	2,16(%0)\n\
-	 mfcr 0; std 0,24(%0)\n\
-	 std	13,32(%0)\n\
-	 std	14,40(%0)\n\
-	 std	15,48(%0)\n\
-	 std	16,56(%0)\n\
-	 std	17,64(%0)\n\
-	 std	18,72(%0)\n\
-	 std	19,80(%0)\n\
-	 std	20,88(%0)\n\
-	 std	21,96(%0)\n\
-	 std	22,104(%0)\n\
-	 std	23,112(%0)\n\
-	 std	24,120(%0)\n\
-	 std	25,128(%0)\n\
-	 std	26,136(%0)\n\
-	 std	27,144(%0)\n\
-	 std	28,152(%0)\n\
-	 std	29,160(%0)\n\
-	 std	30,168(%0)\n\
-	 std	31,176(%0)\n\
-	 " : : "r" (buf));
-    return 0;
-}
-
-void
-xmon_longjmp(long *buf, int val)
-{
-	if (val == 0)
-		val = 1;
-	asm volatile (
-	"ld	13,32(%0)\n\
-	 ld	14,40(%0)\n\
-	 ld	15,48(%0)\n\
-	 ld	16,56(%0)\n\
-	 ld	17,64(%0)\n\
-	 ld	18,72(%0)\n\
-	 ld	19,80(%0)\n\
-	 ld	20,88(%0)\n\
-	 ld	21,96(%0)\n\
-	 ld	22,104(%0)\n\
-	 ld	23,112(%0)\n\
-	 ld	24,120(%0)\n\
-	 ld	25,128(%0)\n\
-	 ld	26,136(%0)\n\
-	 ld	27,144(%0)\n\
-	 ld	28,152(%0)\n\
-	 ld	29,160(%0)\n\
-	 ld	30,168(%0)\n\
-	 ld	31,176(%0)\n\
-	 ld	0,24(%0)\n\
-	 mtcrf	0x38,0\n\
-	 ld	0,0(%0)\n\
-	 ld	1,8(%0)\n\
-	 ld	2,16(%0)\n\
-	 mtlr	0\n\
-	 mr	3,%1\n\
-	 " : : "r" (buf), "r" (val));
-}
diff -puN /dev/null arch/ppc64/xmon/setjmp.S
--- /dev/null	2003-09-15 06:40:47.000000000 -0700
+++ 25-akpm/arch/ppc64/xmon/setjmp.S	2005-01-10 19:59:19.513712416 -0800
@@ -0,0 +1,73 @@
+/*
+ * Copyright (C) 1996 Paul Mackerras.
+ *
+ *      This program is free software; you can redistribute it and/or
+ *      modify it under the terms of the GNU General Public License
+ *      as published by the Free Software Foundation; either version
+ *      2 of the License, or (at your option) any later version.
+ *
+ * NOTE: assert(sizeof(buf) > 184)
+ */
+#include <asm/processor.h>
+#include <asm/ppc_asm.h>
+
+_GLOBAL(xmon_setjmp)
+	mflr    r0
+	std     r0,0(r3)
+	std     r1,8(r3)
+	std     r2,16(r3)
+	mfcr    r0
+	std     r0,24(r3)
+	std     r13,32(r3)
+	std     r14,40(r3)
+	std     r15,48(r3)
+	std     r16,56(r3)
+	std     r17,64(r3)
+	std     r18,72(r3)
+	std     r19,80(r3)
+	std     r20,88(r3)
+	std     r21,96(r3)
+	std     r22,104(r3)
+	std     r23,112(r3)
+	std     r24,120(r3)
+	std     r25,128(r3)
+	std     r26,136(r3)
+	std     r27,144(r3)
+	std     r28,152(r3)
+	std     r29,160(r3)
+	std     r30,168(r3)
+	std     r31,176(r3)
+	li      r3,0
+	blr
+
+_GLOBAL(xmon_longjmp)
+	cmpdi   r4,0
+	bne     1f
+	li      r4,1
+1:	ld      r13,32(r3)
+	ld      r14,40(r3)
+	ld      r15,48(r3)
+	ld      r16,56(r3)
+	ld      r17,64(r3)
+	ld      r18,72(r3)
+	ld      r19,80(r3)
+	ld      r20,88(r3)
+	ld      r21,96(r3)
+	ld      r22,104(r3)
+	ld      r23,112(r3)
+	ld      r24,120(r3)
+	ld      r25,128(r3)
+	ld      r26,136(r3)
+	ld      r27,144(r3)
+	ld      r28,152(r3)
+	ld      r29,160(r3)
+	ld      r30,168(r3)
+	ld      r31,176(r3)
+	ld      r0,24(r3)
+	mtcrf   56,r0
+	ld      r0,0(r3)
+	ld      r1,8(r3)
+	ld      r2,16(r3)
+	mtlr    r0
+	mr      r3,r4
+	blr
_
