aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc/kernel/vdso64
diff options
context:
space:
mode:
authorBenjamin Herrenschmidt <benh@au1.ibm.com>2007-10-17 00:26:50 -0400
committerPaul Mackerras <paulus@samba.org>2007-10-17 08:30:09 -0400
commit081c11a5d0cc24ab58adc7de2ddf209149bf176f (patch)
treee1b3c185b0d148a6ee5a87ac47edb5e6ae2756fd /arch/powerpc/kernel/vdso64
parentf66bce5e6aa1388289c04496c3fcae7bebf5f905 (diff)
[POWERPC] Fix 64 bits vDSO DWARF info for CR register
The current DWARF info for CR are incorrect, causing the gcc unwinder to go to lunch if we take a segfault in the vdso. This fixes it. Problem identified by Andrew Haley, and fix provided by Jakub Jelinek (thanks !). Unfortunately, a bug in gcc cause it to not quite work either, but that is being fixed separately with something around the lines of: linux-unwind.h: fs->regs.reg[R_CR2].loc.offset = (long) &regs->ccr - new_cfa; + /* CR? regs are just 32-bit and PPC is big-endian. */ + fs->regs.reg[R_CR2].loc.offset += sizeof (long) - 4; (According to Jakub) Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org> Signed-off-by: Paul Mackerras <paulus@samba.org>
Diffstat (limited to 'arch/powerpc/kernel/vdso64')
-rw-r--r--arch/powerpc/kernel/vdso64/sigtramp.S11
1 files changed, 7 insertions, 4 deletions
diff --git a/arch/powerpc/kernel/vdso64/sigtramp.S b/arch/powerpc/kernel/vdso64/sigtramp.S
index 17a83fa6dc5..59eb59bb408 100644
--- a/arch/powerpc/kernel/vdso64/sigtramp.S
+++ b/arch/powerpc/kernel/vdso64/sigtramp.S
@@ -134,13 +134,16 @@ V_FUNCTION_END(__kernel_sigtramp_rt64)
1349: 1349:
135 135
136/* This is where the pt_regs pointer can be found on the stack. */ 136/* This is where the pt_regs pointer can be found on the stack. */
137#define PTREGS 128+168+56 137#define PTREGS 128+168+56
138 138
139/* Size of regs. */ 139/* Size of regs. */
140#define RSIZE 8 140#define RSIZE 8
141
142/* Size of CR reg in DWARF unwind info. */
143#define CRSIZE 4
141 144
142/* This is the offset of the VMX reg pointer. */ 145/* This is the offset of the VMX reg pointer. */
143#define VREGS 48*RSIZE+33*8 146#define VREGS 48*RSIZE+33*8
144 147
145/* Describe where general purpose regs are saved. */ 148/* Describe where general purpose regs are saved. */
146#define EH_FRAME_GEN \ 149#define EH_FRAME_GEN \
@@ -178,7 +181,7 @@ V_FUNCTION_END(__kernel_sigtramp_rt64)
178 rsave (31, 31*RSIZE); \ 181 rsave (31, 31*RSIZE); \
179 rsave (67, 32*RSIZE); /* ap, used as temp for nip */ \ 182 rsave (67, 32*RSIZE); /* ap, used as temp for nip */ \
180 rsave (65, 36*RSIZE); /* lr */ \ 183 rsave (65, 36*RSIZE); /* lr */ \
181 rsave (70, 38*RSIZE) /* cr */ 184 rsave (70, 38*RSIZE + (RSIZE - CRSIZE)) /* cr */
182 185
183/* Describe where the FP regs are saved. */ 186/* Describe where the FP regs are saved. */
184#define EH_FRAME_FP \ 187#define EH_FRAME_FP \