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