diff options
author | Anton Blanchard <anton@samba.org> | 2005-01-11 01:43:15 -0800 |
---|---|---|
committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-01-11 01:43:15 -0800 |
commit | 61542216fa90397a2e70c46583edf26bc81994df (patch) | |
tree | a41ca366cc2cd879c4b401105126601826f3f4f5 /arch | |
parent | 1540912c5f7d190cd44d6f10106b7a64556edf0b (diff) | |
download | history-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.S | 73 | ||||
-rw-r--r-- | arch/ppc64/xmon/setjmp.c | 77 |
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)); -} |