Commit d2ac63e03e21b1a4be24615792b36ec4e953333b

Authored by bellard
1 parent ad49ff9d

added HF_HALTED bit


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