Alexandre Julliard : winedbg: Add dumping of floating point registers for x86_64.

Alexandre Julliard julliard at winehq.org
Fri Jan 28 12:30:11 CST 2011


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Thu Jan 27 21:08:45 2011 +0100

winedbg: Add dumping of floating point registers for x86_64.

---

 programs/winedbg/be_x86_64.c |   83 +++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 82 insertions(+), 1 deletions(-)

diff --git a/programs/winedbg/be_x86_64.c b/programs/winedbg/be_x86_64.c
index bd7a00a..253b4ac 100644
--- a/programs/winedbg/be_x86_64.c
+++ b/programs/winedbg/be_x86_64.c
@@ -73,6 +73,8 @@ static void be_x86_64_single_step(CONTEXT* ctx, unsigned enable)
 static void be_x86_64_print_context(HANDLE hThread, const CONTEXT* ctx,
                                     int all_regs)
 {
+    static const char mxcsr_flags[16][4] = { "IE", "DE", "ZE", "OE", "UE", "PE", "DAZ", "IM",
+                                             "DM", "ZM", "OM", "UM", "PM", "R-", "R+", "FZ" };
     static const char flags[] = "aVR-N--ODITSZ-A-P-C";
     char buf[33];
     int i;
@@ -92,7 +94,86 @@ static void be_x86_64_print_context(HANDLE hThread, const CONTEXT* ctx,
     dbg_printf(" r11:%016lx r12:%016lx r13:%016lx r14:%016lx r15:%016lx\n",
                ctx->R11, ctx->R12, ctx->R13, ctx->R14, ctx->R15 );
 
-    if (all_regs) dbg_printf( "Floating point x86_64 dump not implemented\n" );
+    if (!all_regs) return;
+
+    dbg_printf("  cs:%04x  ds:%04x  es:%04x  fs:%04x  gs:%04x  ss:%04x\n",
+               ctx->SegCs, ctx->SegDs, ctx->SegEs, ctx->SegFs, ctx->SegGs, ctx->SegSs );
+
+    dbg_printf("Debug:\n");
+    dbg_printf(" dr0:%016lx dr1:%016lx dr2:%016lx dr3:%016lx\n",
+               ctx->Dr0, ctx->Dr1, ctx->Dr2, ctx->Dr3 );
+    dbg_printf(" dr6:%016lx dr7:%016lx\n", ctx->Dr6, ctx->Dr7 );
+
+    dbg_printf("Floating point:\n");
+    dbg_printf(" flcw:%04x ", LOWORD(ctx->u.FltSave.ControlWord));
+    dbg_printf(" fltw:%04x ", LOWORD(ctx->u.FltSave.TagWord));
+    dbg_printf(" flsw:%04x", LOWORD(ctx->u.FltSave.StatusWord));
+
+    dbg_printf("(cc:%d%d%d%d", (ctx->u.FltSave.StatusWord & 0x00004000) >> 14,
+               (ctx->u.FltSave.StatusWord & 0x00000400) >> 10,
+               (ctx->u.FltSave.StatusWord & 0x00000200) >> 9,
+               (ctx->u.FltSave.StatusWord & 0x00000100) >> 8);
+
+    dbg_printf(" top:%01x", (unsigned int) (ctx->u.FltSave.StatusWord & 0x00003800) >> 11);
+
+    if (ctx->u.FltSave.StatusWord & 0x00000001)     /* Invalid Fl OP */
+    {
+       if (ctx->u.FltSave.StatusWord & 0x00000040)  /* Stack Fault */
+       {
+          if (ctx->u.FltSave.StatusWord & 0x00000200) /* C1 says Overflow */
+             dbg_printf(" #IE(Stack Overflow)");
+          else
+             dbg_printf(" #IE(Stack Underflow)");     /* Underflow */
+       }
+       else  dbg_printf(" #IE(Arithmetic error)");    /* Invalid Fl OP */
+    }
+    if (ctx->u.FltSave.StatusWord & 0x00000002) dbg_printf(" #DE"); /* Denormalised OP */
+    if (ctx->u.FltSave.StatusWord & 0x00000004) dbg_printf(" #ZE"); /* Zero Divide */
+    if (ctx->u.FltSave.StatusWord & 0x00000008) dbg_printf(" #OE"); /* Overflow */
+    if (ctx->u.FltSave.StatusWord & 0x00000010) dbg_printf(" #UE"); /* Underflow */
+    if (ctx->u.FltSave.StatusWord & 0x00000020) dbg_printf(" #PE"); /* Precision error */
+    if (ctx->u.FltSave.StatusWord & 0x00000040)
+       if (!(ctx->u.FltSave.StatusWord & 0x00000001))
+           dbg_printf(" #SE");                 /* Stack Fault (don't think this can occur) */
+    if (ctx->u.FltSave.StatusWord & 0x00000080) dbg_printf(" #ES"); /* Error Summary */
+    if (ctx->u.FltSave.StatusWord & 0x00008000) dbg_printf(" #FB"); /* FPU Busy */
+    dbg_printf(")\n");
+    dbg_printf(" flerr:%04x:%08x   fldata:%04x:%08x\n",
+               ctx->u.FltSave.ErrorSelector, ctx->u.FltSave.ErrorOffset,
+               ctx->u.FltSave.DataSelector, ctx->u.FltSave.DataOffset );
+
+    for (i = 0; i < 4; i++)
+    {
+        long double st;
+        memcpy(&st, &ctx->u.FltSave.FloatRegisters[i * 10], 10);
+        dbg_printf(" st%u:%-16Lg ", i, st);
+    }
+    dbg_printf("\n");
+    for (i = 4; i < 8; i++)
+    {
+        long double st;
+        memcpy(&st, &ctx->u.FltSave.FloatRegisters[i * 10], 10);
+        dbg_printf(" st%u:%-16Lg ", i, st);
+    }
+    dbg_printf("\n");
+
+    dbg_printf(" mxcsr: %04x (", ctx->u.FltSave.MxCsr );
+    for (i = 0; i < 16; i++)
+        if (ctx->u.FltSave.MxCsr & (1 << i)) dbg_printf( " %s", mxcsr_flags[i] );
+    dbg_printf(" )\n");
+
+    for (i = 0; i < 16; i++)
+    {
+        dbg_printf( " %sxmm%u: uint=%016lx%016lx", (i > 9) ? "" : " ", i,
+                    ctx->u.FltSave.XmmRegisters[i].High, ctx->u.FltSave.XmmRegisters[i].Low );
+        dbg_printf( " double={%g; %g}", *(double *)&ctx->u.FltSave.XmmRegisters[i].Low,
+                    *(double *)&ctx->u.FltSave.XmmRegisters[i].High );
+        dbg_printf( " float={%g; %g; %g; %g}\n",
+                    (double)*((float *)&ctx->u.FltSave.XmmRegisters[i] + 0),
+                    (double)*((float *)&ctx->u.FltSave.XmmRegisters[i] + 1),
+                    (double)*((float *)&ctx->u.FltSave.XmmRegisters[i] + 2),
+                    (double)*((float *)&ctx->u.FltSave.XmmRegisters[i] + 3) );
+    }
 }
 
 static void be_x86_64_print_segment_info(HANDLE hThread, const CONTEXT* ctx)




More information about the wine-cvs mailing list