Commit d2ac63e03e21b1a4be24615792b36ec4e953333b
1 parent
ad49ff9d
added HF_HALTED bit
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1651 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
3 changed files
with
10 additions
and
5 deletions
target-i386/cpu.h
| ... | ... | @@ -116,7 +116,7 @@ |
| 116 | 116 | #define ID_MASK 0x00200000 |
| 117 | 117 | |
| 118 | 118 | /* hidden flags - used internally by qemu to represent additionnal cpu |
| 119 | - states. Only the CPL and INHIBIT_IRQ are not redundant. We avoid | |
| 119 | + states. Only the CPL, INHIBIT_IRQ and HALTED are not redundant. We avoid | |
| 120 | 120 | using the IOPL_MASK, TF_MASK and VM_MASK bit position to ease oring |
| 121 | 121 | with eflags. */ |
| 122 | 122 | /* current cpl */ |
| ... | ... | @@ -141,6 +141,7 @@ |
| 141 | 141 | #define HF_CS64_SHIFT 15 /* only used on x86_64: 64 bit code segment */ |
| 142 | 142 | #define HF_OSFXSR_SHIFT 16 /* CR4.OSFXSR */ |
| 143 | 143 | #define HF_VM_SHIFT 17 /* must be same as eflags */ |
| 144 | +#define HF_HALTED_SHIFT 18 /* CPU halted */ | |
| 144 | 145 | |
| 145 | 146 | #define HF_CPL_MASK (3 << HF_CPL_SHIFT) |
| 146 | 147 | #define HF_SOFTMMU_MASK (1 << HF_SOFTMMU_SHIFT) |
| ... | ... | @@ -156,6 +157,7 @@ |
| 156 | 157 | #define HF_LMA_MASK (1 << HF_LMA_SHIFT) |
| 157 | 158 | #define HF_CS64_MASK (1 << HF_CS64_SHIFT) |
| 158 | 159 | #define HF_OSFXSR_MASK (1 << HF_OSFXSR_SHIFT) |
| 160 | +#define HF_HALTED_MASK (1 << HF_HALTED_SHIFT) | |
| 159 | 161 | |
| 160 | 162 | #define CR0_PE_MASK (1 << 0) |
| 161 | 163 | #define CR0_MP_MASK (1 << 1) | ... | ... |
target-i386/helper2.c
| ... | ... | @@ -265,7 +265,7 @@ void cpu_dump_state(CPUState *env, FILE *f, |
| 265 | 265 | "RSI=%016llx RDI=%016llx RBP=%016llx RSP=%016llx\n" |
| 266 | 266 | "R8 =%016llx R9 =%016llx R10=%016llx R11=%016llx\n" |
| 267 | 267 | "R12=%016llx R13=%016llx R14=%016llx R15=%016llx\n" |
| 268 | - "RIP=%016llx RFL=%08x [%c%c%c%c%c%c%c] CPL=%d II=%d A20=%d\n", | |
| 268 | + "RIP=%016llx RFL=%08x [%c%c%c%c%c%c%c] CPL=%d II=%d A20=%d HLT=%d\n", | |
| 269 | 269 | env->regs[R_EAX], |
| 270 | 270 | env->regs[R_EBX], |
| 271 | 271 | env->regs[R_ECX], |
| ... | ... | @@ -292,13 +292,14 @@ void cpu_dump_state(CPUState *env, FILE *f, |
| 292 | 292 | eflags & CC_C ? 'C' : '-', |
| 293 | 293 | env->hflags & HF_CPL_MASK, |
| 294 | 294 | (env->hflags >> HF_INHIBIT_IRQ_SHIFT) & 1, |
| 295 | - (env->a20_mask >> 20) & 1); | |
| 295 | + (env->a20_mask >> 20) & 1, | |
| 296 | + (env->hflags >> HF_HALTED_SHIFT) & 1); | |
| 296 | 297 | } else |
| 297 | 298 | #endif |
| 298 | 299 | { |
| 299 | 300 | cpu_fprintf(f, "EAX=%08x EBX=%08x ECX=%08x EDX=%08x\n" |
| 300 | 301 | "ESI=%08x EDI=%08x EBP=%08x ESP=%08x\n" |
| 301 | - "EIP=%08x EFL=%08x [%c%c%c%c%c%c%c] CPL=%d II=%d A20=%d\n", | |
| 302 | + "EIP=%08x EFL=%08x [%c%c%c%c%c%c%c] CPL=%d II=%d A20=%d HLT=%d\n", | |
| 302 | 303 | (uint32_t)env->regs[R_EAX], |
| 303 | 304 | (uint32_t)env->regs[R_EBX], |
| 304 | 305 | (uint32_t)env->regs[R_ECX], |
| ... | ... | @@ -317,7 +318,8 @@ void cpu_dump_state(CPUState *env, FILE *f, |
| 317 | 318 | eflags & CC_C ? 'C' : '-', |
| 318 | 319 | env->hflags & HF_CPL_MASK, |
| 319 | 320 | (env->hflags >> HF_INHIBIT_IRQ_SHIFT) & 1, |
| 320 | - (env->a20_mask >> 20) & 1); | |
| 321 | + (env->a20_mask >> 20) & 1, | |
| 322 | + (env->hflags >> HF_HALTED_SHIFT) & 1); | |
| 321 | 323 | } |
| 322 | 324 | |
| 323 | 325 | #ifdef TARGET_X86_64 | ... | ... |
target-i386/op.c
| ... | ... | @@ -615,6 +615,7 @@ void OPPROTO op_movq_eip_im64(void) |
| 615 | 615 | void OPPROTO op_hlt(void) |
| 616 | 616 | { |
| 617 | 617 | env->hflags &= ~HF_INHIBIT_IRQ_MASK; /* needed if sti is just before */ |
| 618 | + env->hflags |= HF_HALTED_MASK; | |
| 618 | 619 | env->exception_index = EXCP_HLT; |
| 619 | 620 | cpu_loop_exit(); |
| 620 | 621 | } | ... | ... |