aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorAnton Blanchard <anton@samba.org>2005-01-11 01:43:15 -0800
committerLinus Torvalds <torvalds@ppc970.osdl.org>2005-01-11 01:43:15 -0800
commit61542216fa90397a2e70c46583edf26bc81994df (patch)
treea41ca366cc2cd879c4b401105126601826f3f4f5 /arch
parent1540912c5f7d190cd44d6f10106b7a64556edf0b (diff)
downloadhistory-61542216fa90397a2e70c46583edf26bc81994df.tar.gz
[PATCH] ppc64: fix xmon longjmp handling
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> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'arch')
-rw-r--r--arch/ppc64/xmon/setjmp.S73
-rw-r--r--arch/ppc64/xmon/setjmp.c77
2 files changed, 73 insertions, 77 deletions
diff --git a/arch/ppc64/xmon/setjmp.S b/arch/ppc64/xmon/setjmp.S
new file mode 100644
index 00000000000000..30ee643d557cd8
--- /dev/null
+++ b/arch/ppc64/xmon/setjmp.S
@@ -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
diff --git a/arch/ppc64/xmon/setjmp.c b/arch/ppc64/xmon/setjmp.c
deleted file mode 100644
index a3f6135c5669b5..00000000000000
--- a/arch/ppc64/xmon/setjmp.c
+++ /dev/null
@@ -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));
-}