KVM: Emulate hlt on real mode for Intel
This has two use cases: the bios can't boot from disk, and guest smp bootstrap. Signed-off-by: Avi Kivity <avi@qumranet.com>
This commit is contained in:
parent
d3bef15f84
commit
72d6e5a08a
|
@ -347,6 +347,7 @@ struct kvm_vcpu {
|
||||||
u32 ar;
|
u32 ar;
|
||||||
} tr, es, ds, fs, gs;
|
} tr, es, ds, fs, gs;
|
||||||
} rmode;
|
} rmode;
|
||||||
|
int halt_request; /* real mode on Intel only */
|
||||||
|
|
||||||
int cpuid_nent;
|
int cpuid_nent;
|
||||||
struct kvm_cpuid_entry cpuid_entries[KVM_MAX_CPUID_ENTRIES];
|
struct kvm_cpuid_entry cpuid_entries[KVM_MAX_CPUID_ENTRIES];
|
||||||
|
|
|
@ -1608,8 +1608,13 @@ static int handle_exception(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
|
||||||
|
|
||||||
if (vcpu->rmode.active &&
|
if (vcpu->rmode.active &&
|
||||||
handle_rmode_exception(vcpu, intr_info & INTR_INFO_VECTOR_MASK,
|
handle_rmode_exception(vcpu, intr_info & INTR_INFO_VECTOR_MASK,
|
||||||
error_code))
|
error_code)) {
|
||||||
|
if (vcpu->halt_request) {
|
||||||
|
vcpu->halt_request = 0;
|
||||||
|
return kvm_emulate_halt(vcpu);
|
||||||
|
}
|
||||||
return 1;
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
if ((intr_info & (INTR_INFO_INTR_TYPE_MASK | INTR_INFO_VECTOR_MASK)) == (INTR_TYPE_EXCEPTION | 1)) {
|
if ((intr_info & (INTR_INFO_INTR_TYPE_MASK | INTR_INFO_VECTOR_MASK)) == (INTR_TYPE_EXCEPTION | 1)) {
|
||||||
kvm_run->exit_reason = KVM_EXIT_DEBUG;
|
kvm_run->exit_reason = KVM_EXIT_DEBUG;
|
||||||
|
|
|
@ -143,7 +143,8 @@ static u8 opcode_table[256] = {
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
/* 0xF0 - 0xF7 */
|
/* 0xF0 - 0xF7 */
|
||||||
0, 0, 0, 0,
|
0, 0, 0, 0,
|
||||||
0, 0, ByteOp | DstMem | SrcNone | ModRM, DstMem | SrcNone | ModRM,
|
ImplicitOps, 0,
|
||||||
|
ByteOp | DstMem | SrcNone | ModRM, DstMem | SrcNone | ModRM,
|
||||||
/* 0xF8 - 0xFF */
|
/* 0xF8 - 0xFF */
|
||||||
0, 0, 0, 0,
|
0, 0, 0, 0,
|
||||||
0, 0, ByteOp | DstMem | SrcNone | ModRM, DstMem | SrcNone | ModRM
|
0, 0, ByteOp | DstMem | SrcNone | ModRM, DstMem | SrcNone | ModRM
|
||||||
|
@ -1149,6 +1150,9 @@ special_insn:
|
||||||
case 0xae ... 0xaf: /* scas */
|
case 0xae ... 0xaf: /* scas */
|
||||||
DPRINTF("Urk! I don't handle SCAS.\n");
|
DPRINTF("Urk! I don't handle SCAS.\n");
|
||||||
goto cannot_emulate;
|
goto cannot_emulate;
|
||||||
|
case 0xf4: /* hlt */
|
||||||
|
ctxt->vcpu->halt_request = 1;
|
||||||
|
goto done;
|
||||||
}
|
}
|
||||||
goto writeback;
|
goto writeback;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue