debugging longman dictionary

Eric Pouech eric.pouech at wanadoo.fr
Thu Mar 21 16:19:09 CST 2002


> I haven't noticed any access to DR7. The code looks like DR2 should be
> written at some point, but I haven't been able to find where. I think it
> would help if we could implement an exception handler for DR0..3 read/write
> accesses which would just store the value somewhere in memory and return it
> when the DR registers are read.

let me know if this helps
A+
-------------- next part --------------
Index: memory/instr.c
===================================================================
RCS file: /home/cvs/cvsroot/wine/wine/memory/instr.c,v
retrieving revision 1.14
diff -u -r1.14 instr.c
--- memory/instr.c	10 Mar 2002 00:18:34 -0000	1.14
+++ memory/instr.c	21 Mar 2002 22:17:01 -0000
@@ -525,6 +525,52 @@
 		}
 		/* fallthrough to illegal instruction */
 		break;
+            case 0x23: /* mov e?a, drX */
+                {
+                    BYTE *addr = INSTR_GetOperandAddr(context, instr + 2,
+                                                      long_addr, segprefix, &len );
+                    unsigned dr_idx = (instr[2]-0xC0)/8;
+
+                    if (addr && dr_idx <= 7 && dr_idx != 4 && dr_idx != 5)
+                    {
+                        switch (dr_idx)
+                        {
+                        case 0: context->Dr0 = *(DWORD*)addr; break;
+                        case 1: context->Dr1 = *(DWORD*)addr; break;
+                        case 2: context->Dr2 = *(DWORD*)addr; break;
+                        case 3: context->Dr3 = *(DWORD*)addr; break;
+                        case 6: context->Dr6 = *(DWORD*)addr; break;
+                        case 7: context->Dr7 = *(DWORD*)addr; break;
+                        }
+                        context->Eip += prefixlen+3;
+                        return TRUE;
+                    }
+                }
+		/* fallthrough to illegal instruction */
+                break;
+            case 0x21: /* mov drX, e?x */
+                {
+                    BYTE *addr = INSTR_GetOperandAddr(context, instr + 2,
+                                                      long_addr, segprefix, &len );
+                    int dr_idx = (instr[2]-0xC0)/8;
+
+                    if (addr && dr_idx <= 7 && dr_idx != 4 && dr_idx != 5)
+                    {
+                        switch (dr_idx)
+                        {
+                        case 0: *(DWORD*)addr = context->Dr0; break;
+                        case 1: *(DWORD*)addr = context->Dr1; break;
+                        case 2: *(DWORD*)addr = context->Dr2; break;
+                        case 3: *(DWORD*)addr = context->Dr3; break;
+                        case 6: *(DWORD*)addr = context->Dr6; break;
+                        case 7: *(DWORD*)addr = context->Dr7; break;
+                        }
+                        context->Eip += prefixlen+3;
+                        return TRUE;
+                    }
+                }
+		/* fallthrough to illegal instruction */
+                break;
             case 0xa1: /* pop fs */
                 {
                     WORD seg = *(WORD *)get_stack( context );


More information about the wine-devel mailing list