570 |
570 |
"SARQ",
|
571 |
571 |
};
|
572 |
572 |
|
|
573 |
static void
|
|
574 |
cpu_x86_dump_seg_cache(CPUState *env, FILE *f,
|
|
575 |
int (*cpu_fprintf)(FILE *f, const char *fmt, ...),
|
|
576 |
const char *name, struct SegmentCache *sc)
|
|
577 |
{
|
|
578 |
#ifdef TARGET_X86_64
|
|
579 |
if (env->hflags & HF_CS64_MASK) {
|
|
580 |
cpu_fprintf(f, "%-3s=%04x %016" PRIx64 " %08x %08x", name,
|
|
581 |
sc->selector, sc->base, sc->limit, sc->flags);
|
|
582 |
} else
|
|
583 |
#endif
|
|
584 |
{
|
|
585 |
cpu_fprintf(f, "%-3s=%04x %08x %08x %08x", name, sc->selector,
|
|
586 |
(uint32_t)sc->base, sc->limit, sc->flags);
|
|
587 |
}
|
|
588 |
|
|
589 |
if (!(env->hflags & HF_PE_MASK) || !(sc->flags & DESC_P_MASK))
|
|
590 |
goto done;
|
|
591 |
|
|
592 |
cpu_fprintf(f, " DPL=%d ", (sc->flags & DESC_DPL_MASK) >> DESC_DPL_SHIFT);
|
|
593 |
if (sc->flags & DESC_S_MASK) {
|
|
594 |
if (sc->flags & DESC_CS_MASK) {
|
|
595 |
cpu_fprintf(f, (sc->flags & DESC_L_MASK) ? "CS64" :
|
|
596 |
((sc->flags & DESC_B_MASK) ? "CS32" : "CS16"));
|
|
597 |
cpu_fprintf(f, " [%c%c", (sc->flags & DESC_C_MASK) ? 'C' : '-',
|
|
598 |
(sc->flags & DESC_R_MASK) ? 'R' : '-');
|
|
599 |
} else {
|
|
600 |
cpu_fprintf(f, (sc->flags & DESC_B_MASK) ? "DS " : "DS16");
|
|
601 |
cpu_fprintf(f, " [%c%c", (sc->flags & DESC_E_MASK) ? 'E' : '-',
|
|
602 |
(sc->flags & DESC_W_MASK) ? 'W' : '-');
|
|
603 |
}
|
|
604 |
cpu_fprintf(f, "%c]", (sc->flags & DESC_A_MASK) ? 'A' : '-');
|
|
605 |
} else {
|
|
606 |
static const char *sys_type_name[2][16] = {
|
|
607 |
{ /* 32 bit mode */
|
|
608 |
"Reserved", "TSS16-avl", "LDT", "TSS16-busy",
|
|
609 |
"CallGate16", "TaskGate", "IntGate16", "TrapGate16",
|
|
610 |
"Reserved", "TSS32-avl", "Reserved", "TSS32-busy",
|
|
611 |
"CallGate32", "Reserved", "IntGate32", "TrapGate32"
|
|
612 |
},
|
|
613 |
{ /* 64 bit mode */
|
|
614 |
"<hiword>", "Reserved", "LDT", "Reserved", "Reserved",
|
|
615 |
"Reserved", "Reserved", "Reserved", "Reserved",
|
|
616 |
"TSS64-avl", "Reserved", "TSS64-busy", "CallGate64",
|
|
617 |
"Reserved", "IntGate64", "TrapGate64"
|
|
618 |
}
|
|
619 |
};
|
|
620 |
cpu_fprintf(f, sys_type_name[(env->hflags & HF_LMA_MASK) ? 1 : 0]
|
|
621 |
[(sc->flags & DESC_TYPE_MASK)
|
|
622 |
>> DESC_TYPE_SHIFT]);
|
|
623 |
}
|
|
624 |
done:
|
|
625 |
cpu_fprintf(f, "\n");
|
|
626 |
}
|
|
627 |
|
573 |
628 |
void cpu_dump_state(CPUState *env, FILE *f,
|
574 |
629 |
int (*cpu_fprintf)(FILE *f, const char *fmt, ...),
|
575 |
630 |
int flags)
|
... | ... | |
648 |
703 |
env->halted);
|
649 |
704 |
}
|
650 |
705 |
|
|
706 |
for(i = 0; i < 6; i++) {
|
|
707 |
cpu_x86_dump_seg_cache(env, f, cpu_fprintf, seg_name[i],
|
|
708 |
&env->segs[i]);
|
|
709 |
}
|
|
710 |
cpu_x86_dump_seg_cache(env, f, cpu_fprintf, "LDT", &env->ldt);
|
|
711 |
cpu_x86_dump_seg_cache(env, f, cpu_fprintf, "TR", &env->tr);
|
|
712 |
|
651 |
713 |
#ifdef TARGET_X86_64
|
652 |
714 |
if (env->hflags & HF_LMA_MASK) {
|
653 |
|
for(i = 0; i < 6; i++) {
|
654 |
|
SegmentCache *sc = &env->segs[i];
|
655 |
|
cpu_fprintf(f, "%s =%04x %016" PRIx64 " %08x %08x\n",
|
656 |
|
seg_name[i],
|
657 |
|
sc->selector,
|
658 |
|
sc->base,
|
659 |
|
sc->limit,
|
660 |
|
sc->flags);
|
661 |
|
}
|
662 |
|
cpu_fprintf(f, "LDT=%04x %016" PRIx64 " %08x %08x\n",
|
663 |
|
env->ldt.selector,
|
664 |
|
env->ldt.base,
|
665 |
|
env->ldt.limit,
|
666 |
|
env->ldt.flags);
|
667 |
|
cpu_fprintf(f, "TR =%04x %016" PRIx64 " %08x %08x\n",
|
668 |
|
env->tr.selector,
|
669 |
|
env->tr.base,
|
670 |
|
env->tr.limit,
|
671 |
|
env->tr.flags);
|
672 |
715 |
cpu_fprintf(f, "GDT= %016" PRIx64 " %08x\n",
|
673 |
716 |
env->gdt.base, env->gdt.limit);
|
674 |
717 |
cpu_fprintf(f, "IDT= %016" PRIx64 " %08x\n",
|
... | ... | |
685 |
728 |
} else
|
686 |
729 |
#endif
|
687 |
730 |
{
|
688 |
|
for(i = 0; i < 6; i++) {
|
689 |
|
SegmentCache *sc = &env->segs[i];
|
690 |
|
cpu_fprintf(f, "%s =%04x %08x %08x %08x\n",
|
691 |
|
seg_name[i],
|
692 |
|
sc->selector,
|
693 |
|
(uint32_t)sc->base,
|
694 |
|
sc->limit,
|
695 |
|
sc->flags);
|
696 |
|
}
|
697 |
|
cpu_fprintf(f, "LDT=%04x %08x %08x %08x\n",
|
698 |
|
env->ldt.selector,
|
699 |
|
(uint32_t)env->ldt.base,
|
700 |
|
env->ldt.limit,
|
701 |
|
env->ldt.flags);
|
702 |
|
cpu_fprintf(f, "TR =%04x %08x %08x %08x\n",
|
703 |
|
env->tr.selector,
|
704 |
|
(uint32_t)env->tr.base,
|
705 |
|
env->tr.limit,
|
706 |
|
env->tr.flags);
|
707 |
731 |
cpu_fprintf(f, "GDT= %08x %08x\n",
|
708 |
732 |
(uint32_t)env->gdt.base, env->gdt.limit);
|
709 |
733 |
cpu_fprintf(f, "IDT= %08x %08x\n",
|