From fe2843026f69141b3222cfbbcb7369653a25c66a Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Thu, 13 Nov 2008 04:05:06 +0000 Subject: [PATCH] RtlCaptureContext: - Don't safe the current rsp, but the one before calling the function. - Try to optimize a bit by moving stuff around svn path=/branches/ros-amd64-bringup/; revision=37330 --- reactos/lib/rtl/amd64/except_asm.S | 61 ++++++++++++++++++------------ 1 file changed, 36 insertions(+), 25 deletions(-) diff --git a/reactos/lib/rtl/amd64/except_asm.S b/reactos/lib/rtl/amd64/except_asm.S index 0c9b86fc2ea..df4971f5862 100644 --- a/reactos/lib/rtl/amd64/except_asm.S +++ b/reactos/lib/rtl/amd64/except_asm.S @@ -23,6 +23,41 @@ _RtlCaptureContext: .cfi_startproc + /* Push eflags */ + pushfq + + /* Save the basic register context */ + mov [rcx + CONTEXT_Rax], rax + mov [rcx + CONTEXT_Rcx], rcx + mov [rcx + CONTEXT_Rdx], rdx + mov [rcx + CONTEXT_Rbx], rbx + + /* pop eflags */ + pop [rcx + CONTEXT_EFlags] + + mov [rcx + CONTEXT_Rsi], rsi + mov [rcx + CONTEXT_Rdi], rdi + mov [rcx + CONTEXT_Rbp], rbp + + /* Load former stack pointer in rax */ + lea rax, [rsp + 8] + + mov [rcx + CONTEXT_R8], r8 + mov [rcx + CONTEXT_R9], r9 + mov [rcx + CONTEXT_R10], r10 + mov [rcx + CONTEXT_R11], r11 + + /* Store stack pointer */ + mov [rcx + CONTEXT_Rsp], rax + + mov [rcx + CONTEXT_R12], r12 + mov [rcx + CONTEXT_R13], r13 + mov [rcx + CONTEXT_R14], r14 + mov [rcx + CONTEXT_R15], r15 + + /* Load return address in rax */ + mov rax, [rsp] + /* Safe segment selectors */ mov [rcx + CONTEXT_SegCs], cs mov [rcx + CONTEXT_SegDs], ds @@ -31,31 +66,7 @@ _RtlCaptureContext: mov [rcx + CONTEXT_SegGs], gs mov [rcx + CONTEXT_SegSs], ss - /* Save the basic register context */ - mov [rcx + CONTEXT_Rax], rax - mov [rcx + CONTEXT_Rcx], rcx - mov [rcx + CONTEXT_Rdx], rdx - mov [rcx + CONTEXT_Rbx], rbx - mov [rcx + CONTEXT_Rsp], rsp - mov [rcx + CONTEXT_Rbp], rbp - mov [rcx + CONTEXT_Rsi], rsi - mov [rcx + CONTEXT_Rdi], rdi - mov [rcx + CONTEXT_R8], r8 - mov [rcx + CONTEXT_R9], r9 - mov [rcx + CONTEXT_R10], r10 - mov [rcx + CONTEXT_R11], r11 - mov [rcx + CONTEXT_R12], r12 - mov [rcx + CONTEXT_R13], r13 - mov [rcx + CONTEXT_R14], r14 - mov [rcx + CONTEXT_R15], r15 - - /* Capture eflags */ - pushfq - pop rax - mov [rcx + CONTEXT_EFlags], rax - - /* Put return address in rip member */ - mov rax, [rsp] + /* Store return address */ mov [rcx + CONTEXT_Rip], rax /* Safe mmx registers */