File kvm-preXX-macos.patch of Package kvm-kmp
Index: kvm-kmod-2.6.30.1/x86/svm.c
===================================================================
--- kvm-kmod-2.6.30.1.orig/x86/svm.c
+++ kvm-kmod-2.6.30.1/x86/svm.c
@@ -1877,6 +1877,22 @@ static int clgi_interception(struct vcpu
return 1;
}
+static int monitor_interception(struct vcpu_svm *svm, struct kvm_run *kvm_run)
+{
+ svm->next_rip = kvm_rip_read(&svm->vcpu) + 3;
+ skip_emulated_instruction(&svm->vcpu);
+
+ return 1;
+}
+
+static int mwait_interception(struct vcpu_svm *svm, struct kvm_run *kvm_run)
+{
+ svm->next_rip = kvm_rip_read(&svm->vcpu) + 3;
+ skip_emulated_instruction(&svm->vcpu);
+
+ return kvm_emulate_halt(&svm->vcpu);
+}
+
static int invalid_op_interception(struct vcpu_svm *svm,
struct kvm_run *kvm_run)
{
@@ -2196,8 +2212,8 @@ static int (*svm_exit_handlers[])(struct
[SVM_EXIT_CLGI] = clgi_interception,
[SVM_EXIT_SKINIT] = invalid_op_interception,
[SVM_EXIT_WBINVD] = emulate_on_interception,
- [SVM_EXIT_MONITOR] = invalid_op_interception,
- [SVM_EXIT_MWAIT] = invalid_op_interception,
+ [SVM_EXIT_MONITOR] = monitor_interception,
+ [SVM_EXIT_MWAIT] = mwait_interception,
[SVM_EXIT_NPF] = pf_interception,
};
Index: kvm-kmod-2.6.30.1/x86/x86.c
===================================================================
--- kvm-kmod-2.6.30.1.orig/x86/x86.c
+++ kvm-kmod-2.6.30.1/x86/x86.c
@@ -813,6 +813,7 @@ int kvm_set_msr_common(struct kvm_vcpu *
case MSR_IA32_UCODE_REV:
case MSR_IA32_UCODE_WRITE:
case MSR_VM_HSAVE_PA:
+ case 0xe2:
break;
case 0x200 ... 0x2ff:
return set_msr_mtrr(vcpu, msr, data);
@@ -935,6 +936,7 @@ int kvm_get_msr_common(struct kvm_vcpu *
case MSR_IA32_LASTINTFROMIP:
case MSR_IA32_LASTINTTOIP:
case MSR_VM_HSAVE_PA:
+ case 0xe2:
data = 0;
break;
case MSR_MTRRcap:
@@ -1316,7 +1318,8 @@ static void do_cpuid_ent(struct kvm_cpui
bit(X86_FEATURE_3DNOWEXT) |
bit(X86_FEATURE_3DNOW);
const u32 kvm_supported_word3_x86_features =
- bit(X86_FEATURE_XMM3) | bit(X86_FEATURE_CX16);
+ bit(X86_FEATURE_XMM3) | bit(X86_FEATURE_CX16) |
+ bit((4*32+ 3)) /* MONITOR */;
const u32 kvm_supported_word6_x86_features =
bit(X86_FEATURE_LAHF_LM) | bit(X86_FEATURE_CMP_LEGACY) |
bit(X86_FEATURE_SVM);