diff options
-rw-r--r-- | arch/x86/include/asm/kvm_emulate.h | 1 | ||||
-rw-r--r-- | arch/x86/kvm/emulate.c | 2 | ||||
-rw-r--r-- | arch/x86/kvm/x86.c | 6 |
3 files changed, 8 insertions, 1 deletions
diff --git a/arch/x86/include/asm/kvm_emulate.h b/arch/x86/include/asm/kvm_emulate.h index f89076943701..d30f1e9b7544 100644 --- a/arch/x86/include/asm/kvm_emulate.h +++ b/arch/x86/include/asm/kvm_emulate.h | |||
@@ -186,6 +186,7 @@ struct x86_emulate_ops { | |||
186 | int (*set_dr)(struct x86_emulate_ctxt *ctxt, int dr, ulong value); | 186 | int (*set_dr)(struct x86_emulate_ctxt *ctxt, int dr, ulong value); |
187 | int (*set_msr)(struct x86_emulate_ctxt *ctxt, u32 msr_index, u64 data); | 187 | int (*set_msr)(struct x86_emulate_ctxt *ctxt, u32 msr_index, u64 data); |
188 | int (*get_msr)(struct x86_emulate_ctxt *ctxt, u32 msr_index, u64 *pdata); | 188 | int (*get_msr)(struct x86_emulate_ctxt *ctxt, u32 msr_index, u64 *pdata); |
189 | void (*halt)(struct x86_emulate_ctxt *ctxt); | ||
189 | void (*get_fpu)(struct x86_emulate_ctxt *ctxt); /* disables preempt */ | 190 | void (*get_fpu)(struct x86_emulate_ctxt *ctxt); /* disables preempt */ |
190 | void (*put_fpu)(struct x86_emulate_ctxt *ctxt); /* reenables preempt */ | 191 | void (*put_fpu)(struct x86_emulate_ctxt *ctxt); /* reenables preempt */ |
191 | int (*intercept)(struct x86_emulate_ctxt *ctxt, | 192 | int (*intercept)(struct x86_emulate_ctxt *ctxt, |
diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c index 5d774e91388e..210df51b76a4 100644 --- a/arch/x86/kvm/emulate.c +++ b/arch/x86/kvm/emulate.c | |||
@@ -3913,7 +3913,7 @@ special_insn: | |||
3913 | c->dst.type = OP_NONE; /* Disable writeback. */ | 3913 | c->dst.type = OP_NONE; /* Disable writeback. */ |
3914 | break; | 3914 | break; |
3915 | case 0xf4: /* hlt */ | 3915 | case 0xf4: /* hlt */ |
3916 | ctxt->vcpu->arch.halt_request = 1; | 3916 | ctxt->ops->halt(ctxt); |
3917 | break; | 3917 | break; |
3918 | case 0xf5: /* cmc */ | 3918 | case 0xf5: /* cmc */ |
3919 | /* complement carry flag from eflags reg */ | 3919 | /* complement carry flag from eflags reg */ |
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 8af49b3df675..2246cf1a4ee0 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c | |||
@@ -4351,6 +4351,11 @@ static int emulator_set_msr(struct x86_emulate_ctxt *ctxt, | |||
4351 | return kvm_set_msr(emul_to_vcpu(ctxt), msr_index, data); | 4351 | return kvm_set_msr(emul_to_vcpu(ctxt), msr_index, data); |
4352 | } | 4352 | } |
4353 | 4353 | ||
4354 | static void emulator_halt(struct x86_emulate_ctxt *ctxt) | ||
4355 | { | ||
4356 | emul_to_vcpu(ctxt)->arch.halt_request = 1; | ||
4357 | } | ||
4358 | |||
4354 | static void emulator_get_fpu(struct x86_emulate_ctxt *ctxt) | 4359 | static void emulator_get_fpu(struct x86_emulate_ctxt *ctxt) |
4355 | { | 4360 | { |
4356 | preempt_disable(); | 4361 | preempt_disable(); |
@@ -4400,6 +4405,7 @@ static struct x86_emulate_ops emulate_ops = { | |||
4400 | .set_dr = emulator_set_dr, | 4405 | .set_dr = emulator_set_dr, |
4401 | .set_msr = emulator_set_msr, | 4406 | .set_msr = emulator_set_msr, |
4402 | .get_msr = emulator_get_msr, | 4407 | .get_msr = emulator_get_msr, |
4408 | .halt = emulator_halt, | ||
4403 | .get_fpu = emulator_get_fpu, | 4409 | .get_fpu = emulator_get_fpu, |
4404 | .put_fpu = emulator_put_fpu, | 4410 | .put_fpu = emulator_put_fpu, |
4405 | .intercept = emulator_intercept, | 4411 | .intercept = emulator_intercept, |