Alexandre Julliard : ntdll: Save all segment registers on x86_64. Implement set_cpu_context.

Alexandre Julliard julliard at winehq.org
Mon May 4 09:06:36 CDT 2009


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Fri May  1 18:01:51 2009 +0200

ntdll: Save all segment registers on x86_64. Implement set_cpu_context.

---

 dlls/ntdll/signal_x86_64.c |   30 ++++++++++++++++++++++++++----
 1 files changed, 26 insertions(+), 4 deletions(-)

diff --git a/dlls/ntdll/signal_x86_64.c b/dlls/ntdll/signal_x86_64.c
index 8e9b8c4..15785e5 100644
--- a/dlls/ntdll/signal_x86_64.c
+++ b/dlls/ntdll/signal_x86_64.c
@@ -195,9 +195,21 @@ static void save_context( CONTEXT *context, const ucontext_t *sigcontext )
     context->SegFs  = FS_sig(sigcontext);
     context->SegGs  = GS_sig(sigcontext);
     context->EFlags = EFL_sig(sigcontext);
-    context->SegDs  = 0;  /* FIXME */
-    context->SegEs  = 0;  /* FIXME */
-    context->SegSs  = 0;  /* FIXME */
+#ifdef DS_sig
+    context->SegDs  = DS_sig(sigcontext);
+#else
+    __asm__("movw %%ds,%0" : "=m" (context->SegDs));
+#endif
+#ifdef ES_sig
+    context->SegEs  = ES_sig(sigcontext);
+#else
+    __asm__("movw %%es,%0" : "=m" (context->SegEs));
+#endif
+#ifdef SS_sig
+    context->SegSs  = SS_sig(sigcontext);
+#else
+    __asm__("movw %%ss,%0" : "=m" (context->SegSs));
+#endif
     context->MxCsr  = 0;  /* FIXME */
     if (FPU_sig(sigcontext))
     {
@@ -235,6 +247,15 @@ static void restore_context( const CONTEXT *context, ucontext_t *sigcontext )
     FS_sig(sigcontext)  = context->SegFs;
     GS_sig(sigcontext)  = context->SegGs;
     EFL_sig(sigcontext) = context->EFlags;
+#ifdef DS_sig
+    DS_sig(sigcontext) = context->SegDs;
+#endif
+#ifdef ES_sig
+    ES_sig(sigcontext) = context->SegEs;
+#endif
+#ifdef SS_sig
+    SS_sig(sigcontext) = context->SegSs;
+#endif
     if (FPU_sig(sigcontext)) *FPU_sig(sigcontext) = context->u.FltSave;
 }
 
@@ -256,7 +277,8 @@ DEFINE_REGS_ENTRYPOINT( RtlCaptureContext, 1 )
  */
 void set_cpu_context( const CONTEXT *context )
 {
-    FIXME("not implemented\n");
+    extern void CDECL __wine_restore_regs( const CONTEXT * ) DECLSPEC_NORETURN;
+    __wine_restore_regs( context );
 }
 
 




More information about the wine-cvs mailing list