Marcus Meissner : ntoskrnl.exe: Emulate some more mov eax -> drX.

Alexandre Julliard julliard at wine.codeweavers.com
Mon Sep 8 14:01:39 CDT 2014


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

Author: Marcus Meissner <marcus at jet.franken.de>
Date:   Sun Sep  7 20:22:33 2014 +0200

ntoskrnl.exe: Emulate some more mov eax -> drX.

---

 dlls/ntoskrnl.exe/instr.c | 20 ++++++++++++++++++--
 1 file changed, 18 insertions(+), 2 deletions(-)

diff --git a/dlls/ntoskrnl.exe/instr.c b/dlls/ntoskrnl.exe/instr.c
index dd33085..85ab9eb 100644
--- a/dlls/ntoskrnl.exe/instr.c
+++ b/dlls/ntoskrnl.exe/instr.c
@@ -366,18 +366,34 @@ static DWORD emulate_instruction( EXCEPTION_RECORD *rec, CONTEXT *context )
                 context->Eip += prefixlen+3;
                 return ExceptionContinueExecution;
             }
-            ERR("Unsupported DR register, eip+2 is %02x\n", instr[2]);
+            ERR("Unsupported DR register -> EAX, eip+2 is %02x\n", instr[2]);
             /* fallthrough to illegal instruction */
             break;
         case 0x23: /* mov eax drX */
             switch (instr[2])
             {
+            case 0xc0: /* mov eax, dr0 */
+                context->Dr0 = context->Eax;
+                context->Eip += prefixlen+3;
+                return ExceptionContinueExecution;
             case 0xc8: /* mov eax, dr1 */
                 context->Dr1 = context->Eax;
                 context->Eip += prefixlen+3;
                 return ExceptionContinueExecution;
+            case 0xd0: /* mov eax, dr2 */
+                context->Dr2 = context->Eax;
+                context->Eip += prefixlen+3;
+                return ExceptionContinueExecution;
+            case 0xd8: /* mov eax, dr3 */
+                context->Dr3 = context->Eax;
+                context->Eip += prefixlen+3;
+                return ExceptionContinueExecution;
+            case 0xf8: /* mov eax, dr7 */
+                context->Dr7 = context->Eax;
+                context->Eip += prefixlen+3;
+                return ExceptionContinueExecution;
             }
-            ERR("Unsupported DR register, eip+2 is %02x\n", instr[2]);
+            ERR("Unsupported EAX -> DR register, eip+2 is %02x\n", instr[2]);
             /* fallthrough to illegal instruction */
             break;
         }




More information about the wine-cvs mailing list