Re: [PATCH] i386: fix stack alignment for signal handlers (ia64)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



[I did not get any reply after 6 weeks, so I'm cc'ing the ML]

Markus F.X.J. Oberhumer wrote:
Tony,

I've just realized that this patch probably should also be applied for the ia64 arch - but I cannot test it due to lack of hardware.

Please see
http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=d347f372273c2b3d86a66e2e1c94c790c208e166
for more info.

Thanks,
Markus


------------------------------------------------------------------------

[PATCH] i386: fix stack alignment for signal handlers (ia64)

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.

[ This patch fixes ia64. i386 and x86_64 are already fixed by
  git commit d347f372273c2b3d86a66e2e1c94c790c208e166 ]

Signed-off-by: Markus F.X.J. Oberhumer <markus@xxxxxxxxxxxxx>



Index: b/arch/ia64/ia32/ia32_signal.c
===================================================================
--- a/arch/ia64/ia32/ia32_signal.c
+++ b/arch/ia64/ia32/ia32_signal.c
@@ -811,7 +811,11 @@
 	}
 	/* 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


--
Markus Oberhumer, <markus@xxxxxxxxxxxxx>, http://www.oberhumer.com/
[PATCH] i386: fix stack alignment for signal handlers (ia64)

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.

[ This patch fixes ia64. i386 and x86_64 are already fixed by
  git commit d347f372273c2b3d86a66e2e1c94c790c208e166 ]

Signed-off-by: Markus F.X.J. Oberhumer <markus@xxxxxxxxxxxxx>



Index: b/arch/ia64/ia32/ia32_signal.c
===================================================================
--- a/arch/ia64/ia32/ia32_signal.c
+++ b/arch/ia64/ia32/ia32_signal.c
@@ -811,7 +811,11 @@
 	}
 	/* 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

[Index of Archives]     [Linux Kernel]     [Sparc Linux]     [DCCP]     [Linux ARM]     [Yosemite News]     [Linux SCSI]     [Linux x86_64]     [Linux for Ham Radio]

  Powered by Linux