diff options
author | Pekka Enberg <penberg@kernel.org> | 2012-01-16 21:20:23 +0200 |
---|---|---|
committer | Pekka Enberg <penberg@kernel.org> | 2012-01-16 21:20:23 +0200 |
commit | 448fa88b7e44dbf9083d782eaff129e57e066ac7 (patch) | |
tree | 3d566eb454f507a580093d969d094de57abceba0 | |
parent | d18aa4b4087fda737265af76d146074afcc6dca2 (diff) | |
download | jato-448fa88b7e44dbf9083d782eaff129e57e066ac7.tar.gz |
x86-32: Make stack frame redzone failures debuggable
Signed-off-by: Pekka Enberg <penberg@kernel.org>
-rw-r--r-- | arch/x86/emit_32.c | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/arch/x86/emit_32.c b/arch/x86/emit_32.c index 8e62e1a0..c3bd776e 100644 --- a/arch/x86/emit_32.c +++ b/arch/x86/emit_32.c @@ -633,16 +633,17 @@ void emit_prolog(struct buffer *buf, struct stack_frame *frame, __emit_push_imm(buf, STACK_FRAME_REDZONE_END); } -/* magic is in ecx */ -static void __attribute__((regparm(1))) -stack_frame_redzone_fail(void *magic) +/* call-site in edx, magic is in ecx */ +void __attribute__((regparm(3))) +stack_frame_redzone_fail(void *eax, void *edx, void *ecx) { - printf("Redzone overwritten: %p\n", magic); + printf("Stack frame redzone overwritten at %p: %p\n", edx, ecx); abort(); } static void emit_stack_redzone_check(struct buffer *buf) { + __emit_mov_imm_reg(buf, (unsigned long) buffer_current(buf), MACH_REG_EDX); __emit_pop_reg(buf, MACH_REG_ECX); __emit_cmp_imm_reg(buf, 1, STACK_FRAME_REDZONE_END, MACH_REG_ECX); |