diff options
author | Pekka Enberg <penberg@kernel.org> | 2012-02-15 16:48:38 +0200 |
---|---|---|
committer | Pekka Enberg <penberg@kernel.org> | 2012-02-15 16:48:38 +0200 |
commit | 12c4f26ce3316e114e9b7949a2eee06954734d93 (patch) | |
tree | b2db4f0638749456b2d252fc62b9dc3985f966a1 | |
parent | d4e6ba67e7662987d6aaace3d052edff01ed9294 (diff) | |
download | jato-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.c | 15 |
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); |