mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-26 02:39:48 +00:00
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
3 changed files with 12 additions and 2 deletions
|
@ -347,6 +347,7 @@ struct kvm_vcpu {
|
|||
u32 ar;
|
||||
} tr, es, ds, fs, gs;
|
||||
} rmode;
|
||||
int halt_request; /* real mode on Intel only */
|
||||
|
||||
int cpuid_nent;
|
||||
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 &&
|
||||
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;
|
||||
}
|
||||
|
||||
if ((intr_info & (INTR_INFO_INTR_TYPE_MASK | INTR_INFO_VECTOR_MASK)) == (INTR_TYPE_EXCEPTION | 1)) {
|
||||
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,
|
||||
/* 0xF0 - 0xF7 */
|
||||
0, 0, 0, 0,
|
||||
0, 0, ByteOp | DstMem | SrcNone | ModRM, DstMem | SrcNone | ModRM,
|
||||
ImplicitOps, 0,
|
||||
ByteOp | DstMem | SrcNone | ModRM, DstMem | SrcNone | ModRM,
|
||||
/* 0xF8 - 0xFF */
|
||||
0, 0, 0, 0,
|
||||
0, 0, ByteOp | DstMem | SrcNone | ModRM, DstMem | SrcNone | ModRM
|
||||
|
@ -1149,6 +1150,9 @@ x86_emulate_memop(struct x86_emulate_ctxt *ctxt, struct x86_emulate_ops *ops)
|
|||
case 0xae ... 0xaf: /* scas */
|
||||
DPRINTF("Urk! I don't handle SCAS.\n");
|
||||
goto cannot_emulate;
|
||||
case 0xf4: /* hlt */
|
||||
ctxt->vcpu->halt_request = 1;
|
||||
goto done;
|
||||
}
|
||||
goto writeback;
|
||||
|
||||
|
|
Loading…
Reference in a new issue