diff options
author | Avi Kivity <avi@redhat.com> | 2011-04-20 08:43:05 -0400 |
---|---|---|
committer | Avi Kivity <avi@redhat.com> | 2011-05-22 08:39:17 -0400 |
commit | 6c3287f7c5050076b554145f11bdba058de287d1 (patch) | |
tree | a2acca73938e6937cbad6cc34bd8586e91973030 /arch | |
parent | 3cb16fe78ce91991a876c74fc5dc99419b737b7a (diff) |
KVM: x86 emulator: add new ->halt() callback
Instead of reaching into vcpu internals.
Signed-off-by: Avi Kivity <avi@redhat.com>
Diffstat (limited to 'arch')
-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, |