@@ -734,6 +734,12 @@ static u32 msrs_to_save[] = {
734734
735735static unsigned num_msrs_to_save ;
736736
737+ static u32 emulated_msrs [] = {
738+ MSR_IA32_SMBASE ,
739+ };
740+
741+ static unsigned num_emulated_msrs ;
742+
737743bool kvm_valid_efer (struct kvm_vcpu * vcpu , u64 efer )
738744{
739745 if (efer & efer_reserved_bits )
@@ -1348,7 +1354,7 @@ long kvm_arch_dev_ioctl(struct gvm_device_extension *devext,
13481354
13491355 r = STATUS_SUCCESS ;
13501356 n = msr_list -> nmsrs ;
1351- __u32 nmsrs = num_msrs_to_save ;
1357+ __u32 nmsrs = num_msrs_to_save + num_emulated_msrs ;
13521358 r = gvmUpdateReturnBuffer (pIrp , 0 , & nmsrs , sizeof (nmsrs ));
13531359 if (r )
13541360 goto out ;
@@ -1360,6 +1366,9 @@ long kvm_arch_dev_ioctl(struct gvm_device_extension *devext,
13601366
13611367 r = gvmUpdateReturnBuffer (pIrp , sizeof (nmsrs ), & msrs_to_save ,
13621368 num_msrs_to_save * sizeof (u32 ));
1369+
1370+ r = gvmUpdateReturnBuffer (pIrp , sizeof (nmsrs ) + sizeof (u32 ) * num_msrs_to_save ,
1371+ & emulated_msrs , num_emulated_msrs * sizeof (u32 ));
13631372 break ;
13641373 }
13651374 case GVM_GET_SUPPORTED_CPUID :
@@ -2381,7 +2390,6 @@ static void kvm_init_msr_list(void)
23812390 }
23822391 num_msrs_to_save = j ;
23832392
2384- #if 0
23852393 for (i = j = 0 ; i < ARRAY_SIZE (emulated_msrs ); i ++ ) {
23862394 switch (emulated_msrs [i ]) {
23872395 case MSR_IA32_SMBASE :
@@ -2397,7 +2405,6 @@ static void kvm_init_msr_list(void)
23972405 j ++ ;
23982406 }
23992407 num_emulated_msrs = j ;
2400- #endif
24012408}
24022409
24032410static int vcpu_mmio_write (struct kvm_vcpu * vcpu , gpa_t addr , int len ,
@@ -4721,6 +4728,12 @@ static int vcpu_run(struct kvm_vcpu *vcpu)
47214728 vcpu -> srcu_idx = srcu_read_lock (& kvm -> srcu );
47224729
47234730 for (;;) {
4731+ if (test_and_clear_bit (0 , (size_t * )& vcpu -> run -> user_event_pending )) {
4732+ r = 0 ;
4733+ vcpu -> run -> exit_reason = GVM_EXIT_INTR ;
4734+ break ;
4735+ }
4736+
47244737 if (kvm_vcpu_running (vcpu )) {
47254738 r = vcpu_enter_guest (vcpu );
47264739 } else {
@@ -4741,11 +4754,6 @@ static int vcpu_run(struct kvm_vcpu *vcpu)
47414754 ++ vcpu -> stat .request_irq_exits ;
47424755 break ;
47434756 }
4744- if (test_and_clear_bit (0 , (size_t * )& vcpu -> run -> user_event_pending )) {
4745- r = 0 ;
4746- vcpu -> run -> exit_reason = GVM_EXIT_INTR ;
4747- break ;
4748- }
47494757 }
47504758
47514759 srcu_read_unlock (& kvm -> srcu , vcpu -> srcu_idx );
0 commit comments