[ros-diffs] [tkreuzer] 37330: RtlCaptureContext: - Don't safe the current rsp, but the one before calling the function. - Try to optimize a bit by moving stuff around

tkreuzer at svn.reactos.org tkreuzer at svn.reactos.org
Thu Nov 13 05:05:07 CET 2008


Author: tkreuzer
Date: Wed Nov 12 22:05:06 2008
New Revision: 37330

URL: http://svn.reactos.org/svn/reactos?rev=37330&view=rev
Log:
RtlCaptureContext:
- Don't safe the current rsp, but the one before calling the function.
- Try to optimize a bit by moving stuff around

Modified:
    branches/ros-amd64-bringup/reactos/lib/rtl/amd64/except_asm.S

Modified: branches/ros-amd64-bringup/reactos/lib/rtl/amd64/except_asm.S
URL: http://svn.reactos.org/svn/reactos/branches/ros-amd64-bringup/reactos/lib/rtl/amd64/except_asm.S?rev=37330&r1=37329&r2=37330&view=diff
==============================================================================
--- branches/ros-amd64-bringup/reactos/lib/rtl/amd64/except_asm.S [iso-8859-1] (original)
+++ branches/ros-amd64-bringup/reactos/lib/rtl/amd64/except_asm.S [iso-8859-1] Wed Nov 12 22:05:06 2008
@@ -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 @@
     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 */



More information about the Ros-diffs mailing list