Commit 2157fa0682e3b2a1cb0b4864e6f4b86f88b1fae2
1 parent
d24b15a8
better fpu state dump
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1503 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
49 additions
and
11 deletions
target-i386/helper2.c
@@ -250,7 +250,7 @@ void cpu_dump_state(CPUState *env, FILE *f, | @@ -250,7 +250,7 @@ void cpu_dump_state(CPUState *env, FILE *f, | ||
250 | int (*cpu_fprintf)(FILE *f, const char *fmt, ...), | 250 | int (*cpu_fprintf)(FILE *f, const char *fmt, ...), |
251 | int flags) | 251 | int flags) |
252 | { | 252 | { |
253 | - int eflags, i; | 253 | + int eflags, i, nb; |
254 | char cc_op_name[32]; | 254 | char cc_op_name[32]; |
255 | static const char *seg_name[6] = { "ES", "CS", "SS", "DS", "FS", "GS" }; | 255 | static const char *seg_name[6] = { "ES", "CS", "SS", "DS", "FS", "GS" }; |
256 | 256 | ||
@@ -398,16 +398,54 @@ void cpu_dump_state(CPUState *env, FILE *f, | @@ -398,16 +398,54 @@ void cpu_dump_state(CPUState *env, FILE *f, | ||
398 | } | 398 | } |
399 | } | 399 | } |
400 | if (flags & X86_DUMP_FPU) { | 400 | if (flags & X86_DUMP_FPU) { |
401 | - cpu_fprintf(f, "ST0=%f ST1=%f ST2=%f ST3=%f\n", | ||
402 | - (double)env->fpregs[0].d, | ||
403 | - (double)env->fpregs[1].d, | ||
404 | - (double)env->fpregs[2].d, | ||
405 | - (double)env->fpregs[3].d); | ||
406 | - cpu_fprintf(f, "ST4=%f ST5=%f ST6=%f ST7=%f\n", | ||
407 | - (double)env->fpregs[4].d, | ||
408 | - (double)env->fpregs[5].d, | ||
409 | - (double)env->fpregs[7].d, | ||
410 | - (double)env->fpregs[8].d); | 401 | + int fptag; |
402 | + fptag = 0; | ||
403 | + for(i = 0; i < 8; i++) { | ||
404 | + fptag |= ((!env->fptags[i]) << i); | ||
405 | + } | ||
406 | + cpu_fprintf(f, "FCW=%04x FSW=%04x [ST=%d] FTW=%02x MXCSR=%08x\n", | ||
407 | + env->fpuc, | ||
408 | + (env->fpus & ~0x3800) | (env->fpstt & 0x7) << 11, | ||
409 | + env->fpstt, | ||
410 | + fptag, | ||
411 | + env->mxcsr); | ||
412 | + for(i=0;i<8;i++) { | ||
413 | +#if defined(USE_X86LDOUBLE) | ||
414 | + union { | ||
415 | + long double d; | ||
416 | + struct { | ||
417 | + uint64_t lower; | ||
418 | + uint16_t upper; | ||
419 | + } l; | ||
420 | + } tmp; | ||
421 | + tmp.d = env->fpregs[i].d; | ||
422 | + cpu_fprintf(f, "FPR%d=%016llx %04x", | ||
423 | + i, tmp.l.lower, tmp.l.upper); | ||
424 | +#else | ||
425 | + cpu_fprintf(f, "FPR%d=%016llx", | ||
426 | + i, env->fpregs[i].mmx.q); | ||
427 | +#endif | ||
428 | + if ((i & 1) == 1) | ||
429 | + cpu_fprintf(f, "\n"); | ||
430 | + else | ||
431 | + cpu_fprintf(f, " "); | ||
432 | + } | ||
433 | + if (env->hflags & HF_CS64_MASK) | ||
434 | + nb = 16; | ||
435 | + else | ||
436 | + nb = 8; | ||
437 | + for(i=0;i<nb;i++) { | ||
438 | + cpu_fprintf(f, "XMM%02d=%08x%08x%08x%08x", | ||
439 | + i, | ||
440 | + env->xmm_regs[i].XMM_L(3), | ||
441 | + env->xmm_regs[i].XMM_L(2), | ||
442 | + env->xmm_regs[i].XMM_L(1), | ||
443 | + env->xmm_regs[i].XMM_L(0)); | ||
444 | + if ((i & 1) == 1) | ||
445 | + cpu_fprintf(f, "\n"); | ||
446 | + else | ||
447 | + cpu_fprintf(f, " "); | ||
448 | + } | ||
411 | } | 449 | } |
412 | } | 450 | } |
413 | 451 |