[PATCH v2] ntdll: Force align the stack in RtlRaiseException() on i386.
Zebediah Figura
z.figura12 at gmail.com
Sat Jan 11 17:33:54 CST 2020
Hello Chip,
On 1/11/20 4:51 PM, Chip Davis wrote:
> This is an assembly function, so we have to do it manually.
>
> Signed-off-by: Chip Davis <cdavis at codeweavers.com>
> ---
>
> Notes:
> v2: Fix saving EAX. Unfortunately, I need a register because of the 'subl'
> instruction.
>
> dlls/ntdll/signal_i386.c | 10 +++++++++-
> 1 file changed, 9 insertions(+), 1 deletion(-)
>
> diff --git a/dlls/ntdll/signal_i386.c b/dlls/ntdll/signal_i386.c
> index e9dd0de2fc3c..099e10a3ebf2 100644
> --- a/dlls/ntdll/signal_i386.c
> +++ b/dlls/ntdll/signal_i386.c
> @@ -2548,14 +2548,22 @@ __ASM_STDCALL_FUNC( RtlRaiseException, 4,
> "movl %esp,%ebp\n\t"
> __ASM_CFI(".cfi_def_cfa_register %ebp\n\t")
> "leal -0x2cc(%esp),%esp\n\t" /* sizeof(CONTEXT) */
> - "pushl %esp\n\t" /* context */
> + "andl $-16,%esp\n\t"
> + "subl $16,%esp\n\t"
> + "movl %eax,(%esp)\n\t"
> + "movl %esp,%eax\n\t"
> + "subl $12,%esp\n\t" /* stack alignment */
> + "pushl %eax\n\t" /* context */
Out of curiosity, why do you need to align the stack again before
calling RtlCaptureContext()? I don't see anything in our implementation
that I'm aware relies on an aligned stack.
And if so, perhaps it'd be better to align the stack inside
RtlCaptureContext() instead of here?
> + "movl 16(%esp),%eax\n\t"
> "call " __ASM_STDCALL("RtlCaptureContext",4) "\n\t"
> + "addl $12,%esp\n\t"
> "movl 4(%ebp),%eax\n\t" /* return address */
> "movl 8(%ebp),%ecx\n\t" /* rec */
> "movl %eax,12(%ecx)\n\t" /* rec->ExceptionAddress */
> "leal 12(%ebp),%eax\n\t"
> "movl %eax,0xc4(%esp)\n\t" /* context->Esp */
> "movl %esp,%eax\n\t"
> + "subl $8,%esp\n\t" /* stack alignment */
> "pushl %eax\n\t"
> "pushl %ecx\n\t"
> "call " __ASM_NAME("raise_exception_full_context") "\n\t"
>
More information about the wine-devel
mailing list