| 105 |
|
|
| 106 |
void cpu_x86_dump_state(CPUX86State *env, FILE *f, int flags) |
void cpu_x86_dump_state(CPUX86State *env, FILE *f, int flags) |
| 107 |
{ |
{ |
| 108 |
int eflags; |
int eflags, i; |
| 109 |
char cc_op_name[32]; |
char cc_op_name[32]; |
| 110 |
|
static const char *seg_name[6] = { "ES", "CS", "SS", "DS", "FS", "GS" }; |
| 111 |
|
|
| 112 |
eflags = env->eflags; |
eflags = env->eflags; |
| 113 |
fprintf(f, "EAX=%08x EBX=%08x ECX=%08x EDX=%08x\n" |
fprintf(f, "EAX=%08x EBX=%08x ECX=%08x EDX=%08x\n" |
| 114 |
"ESI=%08x EDI=%08x EBP=%08x ESP=%08x\n" |
"ESI=%08x EDI=%08x EBP=%08x ESP=%08x\n" |
| 115 |
"EIP=%08x EFL=%08x [%c%c%c%c%c%c%c]\n", |
"EIP=%08x EFL=%08x [%c%c%c%c%c%c%c] CPL=%d\n", |
| 116 |
env->regs[R_EAX], env->regs[R_EBX], env->regs[R_ECX], env->regs[R_EDX], |
env->regs[R_EAX], env->regs[R_EBX], env->regs[R_ECX], env->regs[R_EDX], |
| 117 |
env->regs[R_ESI], env->regs[R_EDI], env->regs[R_EBP], env->regs[R_ESP], |
env->regs[R_ESI], env->regs[R_EDI], env->regs[R_EBP], env->regs[R_ESP], |
| 118 |
env->eip, eflags, |
env->eip, eflags, |
| 122 |
eflags & CC_Z ? 'Z' : '-', |
eflags & CC_Z ? 'Z' : '-', |
| 123 |
eflags & CC_A ? 'A' : '-', |
eflags & CC_A ? 'A' : '-', |
| 124 |
eflags & CC_P ? 'P' : '-', |
eflags & CC_P ? 'P' : '-', |
| 125 |
eflags & CC_C ? 'C' : '-'); |
eflags & CC_C ? 'C' : '-', |
| 126 |
fprintf(f, "CS=%04x SS=%04x DS=%04x ES=%04x FS=%04x GS=%04x\n", |
env->hflags & HF_CPL_MASK); |
| 127 |
env->segs[R_CS].selector, |
for(i = 0; i < 6; i++) { |
| 128 |
env->segs[R_SS].selector, |
SegmentCache *sc = &env->segs[i]; |
| 129 |
env->segs[R_DS].selector, |
fprintf(f, "%s =%04x %08x %08x %08x\n", |
| 130 |
env->segs[R_ES].selector, |
seg_name[i], |
| 131 |
env->segs[R_FS].selector, |
sc->selector, |
| 132 |
env->segs[R_GS].selector); |
(int)sc->base, |
| 133 |
|
sc->limit, |
| 134 |
|
sc->flags); |
| 135 |
|
} |
| 136 |
|
fprintf(f, "LDT=%04x %08x %08x %08x\n", |
| 137 |
|
env->ldt.selector, |
| 138 |
|
(int)env->ldt.base, |
| 139 |
|
env->ldt.limit, |
| 140 |
|
env->ldt.flags); |
| 141 |
|
fprintf(f, "TR =%04x %08x %08x %08x\n", |
| 142 |
|
env->tr.selector, |
| 143 |
|
(int)env->tr.base, |
| 144 |
|
env->tr.limit, |
| 145 |
|
env->tr.flags); |
| 146 |
|
fprintf(f, "GDT= %08x %08x\n", |
| 147 |
|
(int)env->gdt.base, env->gdt.limit); |
| 148 |
|
fprintf(f, "IDT= %08x %08x\n", |
| 149 |
|
(int)env->idt.base, env->idt.limit); |
| 150 |
|
fprintf(f, "CR0=%08x CR2=%08x CR3=%08x CR4=%08x\n", |
| 151 |
|
env->cr[0], env->cr[2], env->cr[3], env->cr[4]); |
| 152 |
|
|
| 153 |
if (flags & X86_DUMP_CCOP) { |
if (flags & X86_DUMP_CCOP) { |
| 154 |
if ((unsigned)env->cc_op < CC_OP_NB) |
if ((unsigned)env->cc_op < CC_OP_NB) |
| 155 |
strcpy(cc_op_name, cc_op_str[env->cc_op]); |
strcpy(cc_op_name, cc_op_str[env->cc_op]); |