aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPekka Enberg <penberg@kernel.org>2012-02-15 16:48:38 +0200
committerPekka Enberg <penberg@kernel.org>2012-02-15 16:48:38 +0200
commit12c4f26ce3316e114e9b7949a2eee06954734d93 (patch)
treeb2db4f0638749456b2d252fc62b9dc3985f966a1
parentd4e6ba67e7662987d6aaace3d052edff01ed9294 (diff)
downloadjato-12c4f26ce3316e114e9b7949a2eee06954734d93.tar.gz
x86-32: Fix stack pointer alignment with -Xdebug:stack
Fix same issues on 32-bit as commit 1dd46e3 ("x86-64: Fix stack pointer alignment with -Xdebug:stack") on 64-bit. This fixes wide-spread test breakage when -Xdebug:stack is enabled. Signed-off-by: Pekka Enberg <penberg@kernel.org>
-rw-r--r--arch/x86/emit_32.c15
1 files changed, 9 insertions, 6 deletions
diff --git a/arch/x86/emit_32.c b/arch/x86/emit_32.c
index b308a0ec..e57ac9d4 100644
--- a/arch/x86/emit_32.c
+++ b/arch/x86/emit_32.c
@@ -562,6 +562,11 @@ static void emit_alu_imm_reg(struct buffer *buf, unsigned char opc_ext,
emit_imm(buf, imm);
}
+static void __emit_add_imm_reg(struct buffer *buf, long imm, enum machine_reg reg)
+{
+ emit_alu_imm_reg(buf, 0x00, imm, reg);
+}
+
static void __emit_sub_imm_reg(struct buffer *buf, unsigned long imm,
enum machine_reg reg)
{
@@ -629,8 +634,10 @@ void emit_prolog(struct buffer *buf, struct stack_frame *frame,
emit_save_callee_save_regs(buf);
- if (opt_debug_stack)
+ if (opt_debug_stack) {
__emit_push_imm(buf, STACK_FRAME_REDZONE_END);
+ __emit_sub_imm_reg(buf, X86_STACK_ALIGN - sizeof(unsigned long), MACH_REG_ESP);
+ }
}
/* call-site in edx, magic is in ecx */
@@ -643,6 +650,7 @@ stack_frame_redzone_fail(void *eax, void *edx, void *ecx)
static void emit_stack_redzone_check(struct buffer *buf)
{
+ __emit_add_imm_reg(buf, X86_STACK_ALIGN - sizeof(unsigned long), MACH_REG_ESP);
__emit_mov_imm_reg(buf, (unsigned long) buffer_current(buf), MACH_REG_EDX);
__emit_pop_reg(buf, MACH_REG_ECX);
@@ -792,11 +800,6 @@ static void emit_or_imm_membase(struct insn *insn, struct buffer *buf, struct ba
emit_imm32(buf, insn->src.disp);
}
-static void __emit_add_imm_reg(struct buffer *buf, long imm, enum machine_reg reg)
-{
- emit_alu_imm_reg(buf, 0x00, imm, reg);
-}
-
static void emit_indirect_jump_reg(struct buffer *buf, enum machine_reg reg)
{
emit(buf, 0xff);