[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