Alexandre Julliard : ntdll: Avoid copying and restoring the context in RtlCaptureContext for x86_64.

Alexandre Julliard julliard at winehq.org
Thu Jan 27 12:43:17 CST 2011


Module: wine
Branch: master
Commit: 33e6238f0481f9f0ef94d87a250011390549b28b
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=33e6238f0481f9f0ef94d87a250011390549b28b

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Thu Jan 27 12:20:19 2011 +0100

ntdll: Avoid copying and restoring the context in RtlCaptureContext for x86_64.

---

 dlls/ntdll/signal_x86_64.c |   56 +++++++++++++++++++++++++++++++++++++++----
 1 files changed, 50 insertions(+), 6 deletions(-)

diff --git a/dlls/ntdll/signal_x86_64.c b/dlls/ntdll/signal_x86_64.c
index ad49411..ae9a2bd 100644
--- a/dlls/ntdll/signal_x86_64.c
+++ b/dlls/ntdll/signal_x86_64.c
@@ -1459,12 +1459,56 @@ static void restore_context( const CONTEXT *context, ucontext_t *sigcontext )
 /***********************************************************************
  *		RtlCaptureContext (NTDLL.@)
  */
-void WINAPI __regs_RtlCaptureContext( CONTEXT *context, CONTEXT *regs )
-{
-    *context = *regs;
-}
-DEFINE_REGS_ENTRYPOINT( RtlCaptureContext, 1 )
-
+__ASM_GLOBAL_FUNC( RtlCaptureContext,
+                   "pushfq\n\t"
+                   __ASM_CFI(".cfi_adjust_cfa_offset 8\n\t")
+                   "movl $0x001000f,0x30(%rcx)\n\t" /* context->ContextFlags */
+                   "stmxcsr 0x34(%rcx)\n\t"         /* context->MxCsr */
+                   "movw %cs,0x38(%rcx)\n\t"        /* context->SegCs */
+                   "movw %ds,0x3a(%rcx)\n\t"        /* context->SegDs */
+                   "movw %es,0x3c(%rcx)\n\t"        /* context->SegEs */
+                   "movw %fs,0x3e(%rcx)\n\t"        /* context->SegFs */
+                   "movw %gs,0x40(%rcx)\n\t"        /* context->SegGs */
+                   "movw %ss,0x42(%rcx)\n\t"        /* context->SegSs */
+                   "popq 0x44(%rcx)\n\t"            /* context->Eflags */
+                   __ASM_CFI(".cfi_adjust_cfa_offset -8\n\t")
+                   "movq %rax,0x78(%rcx)\n\t"       /* context->Rax */
+                   "movq %rcx,0x80(%rcx)\n\t"       /* context->Rcx */
+                   "movq %rdx,0x88(%rcx)\n\t"       /* context->Rdx */
+                   "movq %rbx,0x90(%rcx)\n\t"       /* context->Rbx */
+                   "leaq 8(%rsp),%rax\n\t"
+                   "movq %rax,0x98(%rcx)\n\t"       /* context->Rsp */
+                   "movq %rbp,0xa0(%rcx)\n\t"       /* context->Rbp */
+                   "movq %rsi,0xa8(%rcx)\n\t"       /* context->Rsi */
+                   "movq %rdi,0xb0(%rcx)\n\t"       /* context->Rdi */
+                   "movq %r8,0xb8(%rcx)\n\t"        /* context->R8 */
+                   "movq %r9,0xc0(%rcx)\n\t"        /* context->R9 */
+                   "movq %r10,0xc8(%rcx)\n\t"       /* context->R10 */
+                   "movq %r11,0xd0(%rcx)\n\t"       /* context->R11 */
+                   "movq %r12,0xd8(%rcx)\n\t"       /* context->R12 */
+                   "movq %r13,0xe0(%rcx)\n\t"       /* context->R13 */
+                   "movq %r14,0xe8(%rcx)\n\t"       /* context->R14 */
+                   "movq %r15,0xf0(%rcx)\n\t"       /* context->R15 */
+                   "movq (%rsp),%rax\n\t"
+                   "movq %rax,0xf8(%rcx)\n\t"       /* context->Rip */
+                   "fxsave 0x100(%rcx)\n\t"         /* context->FtlSave */
+                   "movdqa %xmm0,0x1a0(%rcx)\n\t"   /* context->Xmm0 */
+                   "movdqa %xmm1,0x1b0(%rcx)\n\t"   /* context->Xmm1 */
+                   "movdqa %xmm2,0x1c0(%rcx)\n\t"   /* context->Xmm2 */
+                   "movdqa %xmm3,0x1d0(%rcx)\n\t"   /* context->Xmm3 */
+                   "movdqa %xmm4,0x1e0(%rcx)\n\t"   /* context->Xmm4 */
+                   "movdqa %xmm5,0x1f0(%rcx)\n\t"   /* context->Xmm5 */
+                   "movdqa %xmm6,0x200(%rcx)\n\t"   /* context->Xmm6 */
+                   "movdqa %xmm7,0x210(%rcx)\n\t"   /* context->Xmm7 */
+                   "movdqa %xmm8,0x220(%rcx)\n\t"   /* context->Xmm8 */
+                   "movdqa %xmm9,0x230(%rcx)\n\t"   /* context->Xmm9 */
+                   "movdqa %xmm10,0x240(%rcx)\n\t"  /* context->Xmm10 */
+                   "movdqa %xmm11,0x250(%rcx)\n\t"  /* context->Xmm11 */
+                   "movdqa %xmm12,0x260(%rcx)\n\t"  /* context->Xmm12 */
+                   "movdqa %xmm13,0x270(%rcx)\n\t"  /* context->Xmm13 */
+                   "movdqa %xmm14,0x280(%rcx)\n\t"  /* context->Xmm14 */
+                   "movdqa %xmm15,0x290(%rcx)\n\t"  /* context->Xmm15 */
+                   "ret" );
 
 /***********************************************************************
  *           set_cpu_context




More information about the wine-cvs mailing list