@@ -99,11 +99,45 @@ static int kvm_check_cpuid(struct kvm_cpuid_entry2 *entries, int nent)
9999 return 0 ;
100100}
101101
102- void kvm_update_pv_runtime (struct kvm_vcpu * vcpu )
102+ static void kvm_update_kvm_cpuid_base (struct kvm_vcpu * vcpu )
103103{
104- struct kvm_cpuid_entry2 * best ;
104+ u32 function ;
105+ struct kvm_cpuid_entry2 * entry ;
106+
107+ vcpu -> arch .kvm_cpuid_base = 0 ;
108+
109+ for_each_possible_hypervisor_cpuid_base (function ) {
110+ entry = kvm_find_cpuid_entry (vcpu , function , 0 );
105111
106- best = kvm_find_cpuid_entry (vcpu , KVM_CPUID_FEATURES , 0 );
112+ if (entry ) {
113+ u32 signature [3 ];
114+
115+ signature [0 ] = entry -> ebx ;
116+ signature [1 ] = entry -> ecx ;
117+ signature [2 ] = entry -> edx ;
118+
119+ BUILD_BUG_ON (sizeof (signature ) > sizeof (KVM_SIGNATURE ));
120+ if (!memcmp (signature , KVM_SIGNATURE , sizeof (signature ))) {
121+ vcpu -> arch .kvm_cpuid_base = function ;
122+ break ;
123+ }
124+ }
125+ }
126+ }
127+
128+ struct kvm_cpuid_entry2 * kvm_find_kvm_cpuid_features (struct kvm_vcpu * vcpu )
129+ {
130+ u32 base = vcpu -> arch .kvm_cpuid_base ;
131+
132+ if (!base )
133+ return NULL ;
134+
135+ return kvm_find_cpuid_entry (vcpu , base | KVM_CPUID_FEATURES , 0 );
136+ }
137+
138+ void kvm_update_pv_runtime (struct kvm_vcpu * vcpu )
139+ {
140+ struct kvm_cpuid_entry2 * best = kvm_find_kvm_cpuid_features (vcpu );
107141
108142 /*
109143 * save the feature bitmap to avoid cpuid lookup for every PV
@@ -142,7 +176,7 @@ void kvm_update_cpuid_runtime(struct kvm_vcpu *vcpu)
142176 cpuid_entry_has (best , X86_FEATURE_XSAVEC )))
143177 best -> ebx = xstate_required_size (vcpu -> arch .xcr0 , true);
144178
145- best = kvm_find_cpuid_entry (vcpu , KVM_CPUID_FEATURES , 0 );
179+ best = kvm_find_kvm_cpuid_features (vcpu );
146180 if (kvm_hlt_in_guest (vcpu -> kvm ) && best &&
147181 (best -> eax & (1 << KVM_FEATURE_PV_UNHALT )))
148182 best -> eax &= ~(1 << KVM_FEATURE_PV_UNHALT );
@@ -239,6 +273,26 @@ u64 kvm_vcpu_reserved_gpa_bits_raw(struct kvm_vcpu *vcpu)
239273 return rsvd_bits (cpuid_maxphyaddr (vcpu ), 63 );
240274}
241275
276+ static int kvm_set_cpuid (struct kvm_vcpu * vcpu , struct kvm_cpuid_entry2 * e2 ,
277+ int nent )
278+ {
279+ int r ;
280+
281+ r = kvm_check_cpuid (e2 , nent );
282+ if (r )
283+ return r ;
284+
285+ kvfree (vcpu -> arch .cpuid_entries );
286+ vcpu -> arch .cpuid_entries = e2 ;
287+ vcpu -> arch .cpuid_nent = nent ;
288+
289+ kvm_update_kvm_cpuid_base (vcpu );
290+ kvm_update_cpuid_runtime (vcpu );
291+ kvm_vcpu_after_set_cpuid (vcpu );
292+
293+ return 0 ;
294+ }
295+
242296/* when an old userspace process fills a new kernel module */
243297int kvm_vcpu_ioctl_set_cpuid (struct kvm_vcpu * vcpu ,
244298 struct kvm_cpuid * cpuid ,
@@ -275,18 +329,9 @@ int kvm_vcpu_ioctl_set_cpuid(struct kvm_vcpu *vcpu,
275329 e2 [i ].padding [2 ] = 0 ;
276330 }
277331
278- r = kvm_check_cpuid ( e2 , cpuid -> nent );
279- if (r ) {
332+ r = kvm_set_cpuid ( vcpu , e2 , cpuid -> nent );
333+ if (r )
280334 kvfree (e2 );
281- goto out_free_cpuid ;
282- }
283-
284- kvfree (vcpu -> arch .cpuid_entries );
285- vcpu -> arch .cpuid_entries = e2 ;
286- vcpu -> arch .cpuid_nent = cpuid -> nent ;
287-
288- kvm_update_cpuid_runtime (vcpu );
289- kvm_vcpu_after_set_cpuid (vcpu );
290335
291336out_free_cpuid :
292337 kvfree (e );
@@ -310,20 +355,11 @@ int kvm_vcpu_ioctl_set_cpuid2(struct kvm_vcpu *vcpu,
310355 return PTR_ERR (e2 );
311356 }
312357
313- r = kvm_check_cpuid ( e2 , cpuid -> nent );
314- if (r ) {
358+ r = kvm_set_cpuid ( vcpu , e2 , cpuid -> nent );
359+ if (r )
315360 kvfree (e2 );
316- return r ;
317- }
318361
319- kvfree (vcpu -> arch .cpuid_entries );
320- vcpu -> arch .cpuid_entries = e2 ;
321- vcpu -> arch .cpuid_nent = cpuid -> nent ;
322-
323- kvm_update_cpuid_runtime (vcpu );
324- kvm_vcpu_after_set_cpuid (vcpu );
325-
326- return 0 ;
362+ return r ;
327363}
328364
329365int kvm_vcpu_ioctl_get_cpuid2 (struct kvm_vcpu * vcpu ,
@@ -871,8 +907,7 @@ static inline int __do_cpuid_func(struct kvm_cpuid_array *array, u32 function)
871907 }
872908 break ;
873909 case KVM_CPUID_SIGNATURE : {
874- static const char signature [12 ] = "KVMKVMKVM\0\0" ;
875- const u32 * sigptr = (const u32 * )signature ;
910+ const u32 * sigptr = (const u32 * )KVM_SIGNATURE ;
876911 entry -> eax = KVM_CPUID_FEATURES ;
877912 entry -> ebx = sigptr [0 ];
878913 entry -> ecx = sigptr [1 ];
0 commit comments