diff options
author | Gleb Natapov <gleb@redhat.com> | 2010-04-28 12:15:31 -0400 |
---|---|---|
committer | Avi Kivity <avi@redhat.com> | 2010-08-01 03:35:31 -0400 |
commit | 0f12244fe70e8a94a491f6cd7ed70a352ab6c26c (patch) | |
tree | a42fa2fd198e187c90abbed62ef35cd8acc9ff7e /arch/x86/kvm/emulate.c | |
parent | 79168fd1a307ffee46ee03b7f8711559241738c7 (diff) |
KVM: x86 emulator: make set_cr() callback return error if it fails
Make set_cr() callback return error if it fails instead of injecting #GP
behind emulator's back.
Signed-off-by: Gleb Natapov <gleb@redhat.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
Diffstat (limited to 'arch/x86/kvm/emulate.c')
-rw-r--r-- | arch/x86/kvm/emulate.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c index f56ec486393e..061f7d37c9f7 100644 --- a/arch/x86/kvm/emulate.c +++ b/arch/x86/kvm/emulate.c | |||
@@ -2272,7 +2272,10 @@ static int load_state_from_tss32(struct x86_emulate_ctxt *ctxt, | |||
2272 | struct decode_cache *c = &ctxt->decode; | 2272 | struct decode_cache *c = &ctxt->decode; |
2273 | int ret; | 2273 | int ret; |
2274 | 2274 | ||
2275 | ops->set_cr(3, tss->cr3, ctxt->vcpu); | 2275 | if (ops->set_cr(3, tss->cr3, ctxt->vcpu)) { |
2276 | kvm_inject_gp(ctxt->vcpu, 0); | ||
2277 | return X86EMUL_PROPAGATE_FAULT; | ||
2278 | } | ||
2276 | c->eip = tss->eip; | 2279 | c->eip = tss->eip; |
2277 | ctxt->eflags = tss->eflags | 2; | 2280 | ctxt->eflags = tss->eflags | 2; |
2278 | c->regs[VCPU_REGS_RAX] = tss->eax; | 2281 | c->regs[VCPU_REGS_RAX] = tss->eax; |
@@ -3135,7 +3138,10 @@ twobyte_insn: | |||
3135 | c->dst.type = OP_NONE; /* no writeback */ | 3138 | c->dst.type = OP_NONE; /* no writeback */ |
3136 | break; | 3139 | break; |
3137 | case 0x22: /* mov reg, cr */ | 3140 | case 0x22: /* mov reg, cr */ |
3138 | ops->set_cr(c->modrm_reg, c->modrm_val, ctxt->vcpu); | 3141 | if (ops->set_cr(c->modrm_reg, c->modrm_val, ctxt->vcpu)) { |
3142 | kvm_inject_gp(ctxt->vcpu, 0); | ||
3143 | goto done; | ||
3144 | } | ||
3139 | c->dst.type = OP_NONE; | 3145 | c->dst.type = OP_NONE; |
3140 | break; | 3146 | break; |
3141 | case 0x23: /* mov from reg to dr */ | 3147 | case 0x23: /* mov from reg to dr */ |