Revision a3867ed2 target-i386/helper.c
b/target-i386/helper.c | ||
---|---|---|
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", |
Also available in: Unified diff