diff options
author | Laurent Vivier <Laurent.Vivier@bull.net> | 2007-09-18 05:27:37 -0400 |
---|---|---|
committer | Avi Kivity <avi@qumranet.com> | 2008-01-30 10:52:47 -0500 |
commit | 3427318fd2244737a466a06a93c5fe579852f871 (patch) | |
tree | 7c6760dbbdd067498c470e6e4f711e5baeef491c /drivers/kvm/svm.c | |
parent | 1be3aa47182e94944e57b176a5c4ee4e74f1ce33 (diff) |
KVM: Call x86_decode_insn() only when needed
Move emulate_ctxt to kvm_vcpu to keep emulate context when we exit from kvm
module. Call x86_decode_insn() only when needed. Modify x86_emulate_insn() to
not modify the context if it must be re-entered.
Signed-off-by: Laurent Vivier <Laurent.Vivier@bull.net>
Signed-off-by: Avi Kivity <avi@qumranet.com>
Diffstat (limited to 'drivers/kvm/svm.c')
-rw-r--r-- | drivers/kvm/svm.c | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/drivers/kvm/svm.c b/drivers/kvm/svm.c index 794d95416f7b..f268bd51f337 100644 --- a/drivers/kvm/svm.c +++ b/drivers/kvm/svm.c | |||
@@ -960,7 +960,7 @@ static int pf_interception(struct vcpu_svm *svm, struct kvm_run *kvm_run) | |||
960 | return 1; | 960 | return 1; |
961 | } | 961 | } |
962 | er = emulate_instruction(&svm->vcpu, kvm_run, fault_address, | 962 | er = emulate_instruction(&svm->vcpu, kvm_run, fault_address, |
963 | error_code); | 963 | error_code, 0); |
964 | mutex_unlock(&kvm->lock); | 964 | mutex_unlock(&kvm->lock); |
965 | 965 | ||
966 | switch (er) { | 966 | switch (er) { |
@@ -984,7 +984,7 @@ static int ud_interception(struct vcpu_svm *svm, struct kvm_run *kvm_run) | |||
984 | { | 984 | { |
985 | int er; | 985 | int er; |
986 | 986 | ||
987 | er = emulate_instruction(&svm->vcpu, kvm_run, 0, 0); | 987 | er = emulate_instruction(&svm->vcpu, kvm_run, 0, 0, 0); |
988 | if (er != EMULATE_DONE) | 988 | if (er != EMULATE_DONE) |
989 | inject_ud(&svm->vcpu); | 989 | inject_ud(&svm->vcpu); |
990 | 990 | ||
@@ -1027,7 +1027,8 @@ static int io_interception(struct vcpu_svm *svm, struct kvm_run *kvm_run) | |||
1027 | string = (io_info & SVM_IOIO_STR_MASK) != 0; | 1027 | string = (io_info & SVM_IOIO_STR_MASK) != 0; |
1028 | 1028 | ||
1029 | if (string) { | 1029 | if (string) { |
1030 | if (emulate_instruction(&svm->vcpu, kvm_run, 0, 0) == EMULATE_DO_MMIO) | 1030 | if (emulate_instruction(&svm->vcpu, |
1031 | kvm_run, 0, 0, 0) == EMULATE_DO_MMIO) | ||
1031 | return 0; | 1032 | return 0; |
1032 | return 1; | 1033 | return 1; |
1033 | } | 1034 | } |
@@ -1086,7 +1087,7 @@ static int cpuid_interception(struct vcpu_svm *svm, struct kvm_run *kvm_run) | |||
1086 | static int emulate_on_interception(struct vcpu_svm *svm, | 1087 | static int emulate_on_interception(struct vcpu_svm *svm, |
1087 | struct kvm_run *kvm_run) | 1088 | struct kvm_run *kvm_run) |
1088 | { | 1089 | { |
1089 | if (emulate_instruction(&svm->vcpu, NULL, 0, 0) != EMULATE_DONE) | 1090 | if (emulate_instruction(&svm->vcpu, NULL, 0, 0, 0) != EMULATE_DONE) |
1090 | pr_unimpl(&svm->vcpu, "%s: failed\n", __FUNCTION__); | 1091 | pr_unimpl(&svm->vcpu, "%s: failed\n", __FUNCTION__); |
1091 | return 1; | 1092 | return 1; |
1092 | } | 1093 | } |