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);
openSUSE Build Service is sponsored by