aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPekka Enberg <penberg@kernel.org>2012-01-16 21:20:23 +0200
committerPekka Enberg <penberg@kernel.org>2012-01-16 21:20:23 +0200
commit448fa88b7e44dbf9083d782eaff129e57e066ac7 (patch)
tree3d566eb454f507a580093d969d094de57abceba0
parentd18aa4b4087fda737265af76d146074afcc6dca2 (diff)
downloadjato-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.c9
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);