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