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@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"