From: Zebediah Figura Subject: Re: [PATCH v2] ntdll: Force align the stack in RtlRaiseException() on i386. Message-Id: <2a432543-68a5-9d73-5bf3-5df6ae0bccdf@gmail.com> Date: Sat, 11 Jan 2020 17:33:54 -0600 In-Reply-To: <20200111225140.6126-1-cdavis@codeweavers.com> References: <20200111225140.6126-1-cdavis@codeweavers.com> 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 > --- > > 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" >