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