Переглянути джерело

[IA64] fix stack alignment for ia32 signal handlers

This fixes the setup of the alignment of the signal frame, so that all
signal handlers are run with a properly aligned stack frame.

The current code "over-aligns" the stack pointer so that the stack frame
is effectively always mis-aligned by 4 bytes.  But what we really want
is that on function entry ((sp + 4) & 15) == 0, which matches what would
happen if the stack were aligned before a "call" instruction.

i386 and x86_64 are already fixed by d347f372273c2b3d86a66e2e1c94c790c208e166

Signed-off-by: Markus F.X.J. Oberhumer <markus@oberhumer.com>
Signed-off-by: Tony Luck <tony.luck@intel.com>
Markus F.X.J. Oberhumer 18 роки тому
батько
коміт
66761522a7
1 змінених файлів з 5 додано та 1 видалено
  1. 5 1
      arch/ia64/ia32/ia32_signal.c

+ 5 - 1
arch/ia64/ia32/ia32_signal.c

@@ -811,7 +811,11 @@ get_sigframe (struct k_sigaction *ka, struct pt_regs * regs, size_t frame_size)
 	}
 	/* Legacy stack switching not supported */
 
-	return (void __user *)((esp - frame_size) & -8ul);
+	esp -= frame_size;
+	/* Align the stack pointer according to the i386 ABI,
+	 * i.e. so that on function entry ((sp + 4) & 15) == 0. */
+	esp = ((esp + 4) & -16ul) - 4;
+	return (void __user *) esp;
 }
 
 static int