@@ -9917,51 +9917,6 @@ void kvm_x86_vendor_exit(void)
9917
9917
}
9918
9918
EXPORT_SYMBOL_GPL (kvm_x86_vendor_exit );
9919
9919
9920
- static int __kvm_emulate_halt (struct kvm_vcpu * vcpu , int state , int reason )
9921
- {
9922
- /*
9923
- * The vCPU has halted, e.g. executed HLT. Update the run state if the
9924
- * local APIC is in-kernel, the run loop will detect the non-runnable
9925
- * state and halt the vCPU. Exit to userspace if the local APIC is
9926
- * managed by userspace, in which case userspace is responsible for
9927
- * handling wake events.
9928
- */
9929
- ++ vcpu -> stat .halt_exits ;
9930
- if (lapic_in_kernel (vcpu )) {
9931
- vcpu -> arch .mp_state = state ;
9932
- return 1 ;
9933
- } else {
9934
- vcpu -> run -> exit_reason = reason ;
9935
- return 0 ;
9936
- }
9937
- }
9938
-
9939
- int kvm_emulate_halt_noskip (struct kvm_vcpu * vcpu )
9940
- {
9941
- return __kvm_emulate_halt (vcpu , KVM_MP_STATE_HALTED , KVM_EXIT_HLT );
9942
- }
9943
- EXPORT_SYMBOL_GPL (kvm_emulate_halt_noskip );
9944
-
9945
- int kvm_emulate_halt (struct kvm_vcpu * vcpu )
9946
- {
9947
- int ret = kvm_skip_emulated_instruction (vcpu );
9948
- /*
9949
- * TODO: we might be squashing a GUESTDBG_SINGLESTEP-triggered
9950
- * KVM_EXIT_DEBUG here.
9951
- */
9952
- return kvm_emulate_halt_noskip (vcpu ) && ret ;
9953
- }
9954
- EXPORT_SYMBOL_GPL (kvm_emulate_halt );
9955
-
9956
- int kvm_emulate_ap_reset_hold (struct kvm_vcpu * vcpu )
9957
- {
9958
- int ret = kvm_skip_emulated_instruction (vcpu );
9959
-
9960
- return __kvm_emulate_halt (vcpu , KVM_MP_STATE_AP_RESET_HOLD ,
9961
- KVM_EXIT_AP_RESET_HOLD ) && ret ;
9962
- }
9963
- EXPORT_SYMBOL_GPL (kvm_emulate_ap_reset_hold );
9964
-
9965
9920
#ifdef CONFIG_X86_64
9966
9921
static int kvm_pv_clock_pairing (struct kvm_vcpu * vcpu , gpa_t paddr ,
9967
9922
unsigned long clock_type )
@@ -11214,6 +11169,67 @@ static int vcpu_enter_guest(struct kvm_vcpu *vcpu)
11214
11169
return r ;
11215
11170
}
11216
11171
11172
+ static bool kvm_vcpu_running (struct kvm_vcpu * vcpu )
11173
+ {
11174
+ return (vcpu -> arch .mp_state == KVM_MP_STATE_RUNNABLE &&
11175
+ !vcpu -> arch .apf .halted );
11176
+ }
11177
+
11178
+ static bool kvm_vcpu_has_events (struct kvm_vcpu * vcpu )
11179
+ {
11180
+ if (!list_empty_careful (& vcpu -> async_pf .done ))
11181
+ return true;
11182
+
11183
+ if (kvm_apic_has_pending_init_or_sipi (vcpu ) &&
11184
+ kvm_apic_init_sipi_allowed (vcpu ))
11185
+ return true;
11186
+
11187
+ if (vcpu -> arch .pv .pv_unhalted )
11188
+ return true;
11189
+
11190
+ if (kvm_is_exception_pending (vcpu ))
11191
+ return true;
11192
+
11193
+ if (kvm_test_request (KVM_REQ_NMI , vcpu ) ||
11194
+ (vcpu -> arch .nmi_pending &&
11195
+ kvm_x86_call (nmi_allowed )(vcpu , false)))
11196
+ return true;
11197
+
11198
+ #ifdef CONFIG_KVM_SMM
11199
+ if (kvm_test_request (KVM_REQ_SMI , vcpu ) ||
11200
+ (vcpu -> arch .smi_pending &&
11201
+ kvm_x86_call (smi_allowed )(vcpu , false)))
11202
+ return true;
11203
+ #endif
11204
+
11205
+ if (kvm_test_request (KVM_REQ_PMI , vcpu ))
11206
+ return true;
11207
+
11208
+ if (kvm_test_request (KVM_REQ_UPDATE_PROTECTED_GUEST_STATE , vcpu ))
11209
+ return true;
11210
+
11211
+ if (kvm_arch_interrupt_allowed (vcpu ) && kvm_cpu_has_interrupt (vcpu ))
11212
+ return true;
11213
+
11214
+ if (kvm_hv_has_stimer_pending (vcpu ))
11215
+ return true;
11216
+
11217
+ if (is_guest_mode (vcpu ) &&
11218
+ kvm_x86_ops .nested_ops -> has_events &&
11219
+ kvm_x86_ops .nested_ops -> has_events (vcpu , false))
11220
+ return true;
11221
+
11222
+ if (kvm_xen_has_pending_events (vcpu ))
11223
+ return true;
11224
+
11225
+ return false;
11226
+ }
11227
+
11228
+ int kvm_arch_vcpu_runnable (struct kvm_vcpu * vcpu )
11229
+ {
11230
+ return kvm_vcpu_running (vcpu ) || kvm_vcpu_has_events (vcpu );
11231
+ }
11232
+
11217
11233
/* Called within kvm->srcu read side. */
11218
11234
static inline int vcpu_block (struct kvm_vcpu * vcpu )
11219
11235
{
@@ -11285,12 +11301,6 @@ static inline int vcpu_block(struct kvm_vcpu *vcpu)
11285
11301
return 1 ;
11286
11302
}
11287
11303
11288
- static inline bool kvm_vcpu_running (struct kvm_vcpu * vcpu )
11289
- {
11290
- return (vcpu -> arch .mp_state == KVM_MP_STATE_RUNNABLE &&
11291
- !vcpu -> arch .apf .halted );
11292
- }
11293
-
11294
11304
/* Called within kvm->srcu read side. */
11295
11305
static int vcpu_run (struct kvm_vcpu * vcpu )
11296
11306
{
@@ -11342,6 +11352,77 @@ static int vcpu_run(struct kvm_vcpu *vcpu)
11342
11352
return r ;
11343
11353
}
11344
11354
11355
+ static int __kvm_emulate_halt (struct kvm_vcpu * vcpu , int state , int reason )
11356
+ {
11357
+ /*
11358
+ * The vCPU has halted, e.g. executed HLT. Update the run state if the
11359
+ * local APIC is in-kernel, the run loop will detect the non-runnable
11360
+ * state and halt the vCPU. Exit to userspace if the local APIC is
11361
+ * managed by userspace, in which case userspace is responsible for
11362
+ * handling wake events.
11363
+ */
11364
+ ++ vcpu -> stat .halt_exits ;
11365
+ if (lapic_in_kernel (vcpu )) {
11366
+ vcpu -> arch .mp_state = state ;
11367
+ return 1 ;
11368
+ } else {
11369
+ vcpu -> run -> exit_reason = reason ;
11370
+ return 0 ;
11371
+ }
11372
+ }
11373
+
11374
+ int kvm_emulate_halt_noskip (struct kvm_vcpu * vcpu )
11375
+ {
11376
+ return __kvm_emulate_halt (vcpu , KVM_MP_STATE_HALTED , KVM_EXIT_HLT );
11377
+ }
11378
+ EXPORT_SYMBOL_GPL (kvm_emulate_halt_noskip );
11379
+
11380
+ int kvm_emulate_halt (struct kvm_vcpu * vcpu )
11381
+ {
11382
+ int ret = kvm_skip_emulated_instruction (vcpu );
11383
+ /*
11384
+ * TODO: we might be squashing a GUESTDBG_SINGLESTEP-triggered
11385
+ * KVM_EXIT_DEBUG here.
11386
+ */
11387
+ return kvm_emulate_halt_noskip (vcpu ) && ret ;
11388
+ }
11389
+ EXPORT_SYMBOL_GPL (kvm_emulate_halt );
11390
+
11391
+ int kvm_emulate_ap_reset_hold (struct kvm_vcpu * vcpu )
11392
+ {
11393
+ int ret = kvm_skip_emulated_instruction (vcpu );
11394
+
11395
+ return __kvm_emulate_halt (vcpu , KVM_MP_STATE_AP_RESET_HOLD ,
11396
+ KVM_EXIT_AP_RESET_HOLD ) && ret ;
11397
+ }
11398
+ EXPORT_SYMBOL_GPL (kvm_emulate_ap_reset_hold );
11399
+
11400
+ bool kvm_arch_dy_has_pending_interrupt (struct kvm_vcpu * vcpu )
11401
+ {
11402
+ return kvm_vcpu_apicv_active (vcpu ) &&
11403
+ kvm_x86_call (dy_apicv_has_pending_interrupt )(vcpu );
11404
+ }
11405
+
11406
+ bool kvm_arch_vcpu_preempted_in_kernel (struct kvm_vcpu * vcpu )
11407
+ {
11408
+ return vcpu -> arch .preempted_in_kernel ;
11409
+ }
11410
+
11411
+ bool kvm_arch_dy_runnable (struct kvm_vcpu * vcpu )
11412
+ {
11413
+ if (READ_ONCE (vcpu -> arch .pv .pv_unhalted ))
11414
+ return true;
11415
+
11416
+ if (kvm_test_request (KVM_REQ_NMI , vcpu ) ||
11417
+ #ifdef CONFIG_KVM_SMM
11418
+ kvm_test_request (KVM_REQ_SMI , vcpu ) ||
11419
+ #endif
11420
+ kvm_test_request (KVM_REQ_EVENT , vcpu ))
11421
+ return true;
11422
+
11423
+ return kvm_arch_dy_has_pending_interrupt (vcpu );
11424
+ }
11425
+
11345
11426
static inline int complete_emulated_io (struct kvm_vcpu * vcpu )
11346
11427
{
11347
11428
return kvm_emulate_instruction (vcpu , EMULTYPE_NO_DECODE );
@@ -13156,87 +13237,6 @@ void kvm_arch_commit_memory_region(struct kvm *kvm,
13156
13237
kvm_arch_free_memslot (kvm , old );
13157
13238
}
13158
13239
13159
- static inline bool kvm_vcpu_has_events (struct kvm_vcpu * vcpu )
13160
- {
13161
- if (!list_empty_careful (& vcpu -> async_pf .done ))
13162
- return true;
13163
-
13164
- if (kvm_apic_has_pending_init_or_sipi (vcpu ) &&
13165
- kvm_apic_init_sipi_allowed (vcpu ))
13166
- return true;
13167
-
13168
- if (vcpu -> arch .pv .pv_unhalted )
13169
- return true;
13170
-
13171
- if (kvm_is_exception_pending (vcpu ))
13172
- return true;
13173
-
13174
- if (kvm_test_request (KVM_REQ_NMI , vcpu ) ||
13175
- (vcpu -> arch .nmi_pending &&
13176
- kvm_x86_call (nmi_allowed )(vcpu , false)))
13177
- return true;
13178
-
13179
- #ifdef CONFIG_KVM_SMM
13180
- if (kvm_test_request (KVM_REQ_SMI , vcpu ) ||
13181
- (vcpu -> arch .smi_pending &&
13182
- kvm_x86_call (smi_allowed )(vcpu , false)))
13183
- return true;
13184
- #endif
13185
-
13186
- if (kvm_test_request (KVM_REQ_PMI , vcpu ))
13187
- return true;
13188
-
13189
- if (kvm_test_request (KVM_REQ_UPDATE_PROTECTED_GUEST_STATE , vcpu ))
13190
- return true;
13191
-
13192
- if (kvm_arch_interrupt_allowed (vcpu ) && kvm_cpu_has_interrupt (vcpu ))
13193
- return true;
13194
-
13195
- if (kvm_hv_has_stimer_pending (vcpu ))
13196
- return true;
13197
-
13198
- if (is_guest_mode (vcpu ) &&
13199
- kvm_x86_ops .nested_ops -> has_events &&
13200
- kvm_x86_ops .nested_ops -> has_events (vcpu , false))
13201
- return true;
13202
-
13203
- if (kvm_xen_has_pending_events (vcpu ))
13204
- return true;
13205
-
13206
- return false;
13207
- }
13208
-
13209
- int kvm_arch_vcpu_runnable (struct kvm_vcpu * vcpu )
13210
- {
13211
- return kvm_vcpu_running (vcpu ) || kvm_vcpu_has_events (vcpu );
13212
- }
13213
-
13214
- bool kvm_arch_dy_has_pending_interrupt (struct kvm_vcpu * vcpu )
13215
- {
13216
- return kvm_vcpu_apicv_active (vcpu ) &&
13217
- kvm_x86_call (dy_apicv_has_pending_interrupt )(vcpu );
13218
- }
13219
-
13220
- bool kvm_arch_vcpu_preempted_in_kernel (struct kvm_vcpu * vcpu )
13221
- {
13222
- return vcpu -> arch .preempted_in_kernel ;
13223
- }
13224
-
13225
- bool kvm_arch_dy_runnable (struct kvm_vcpu * vcpu )
13226
- {
13227
- if (READ_ONCE (vcpu -> arch .pv .pv_unhalted ))
13228
- return true;
13229
-
13230
- if (kvm_test_request (KVM_REQ_NMI , vcpu ) ||
13231
- #ifdef CONFIG_KVM_SMM
13232
- kvm_test_request (KVM_REQ_SMI , vcpu ) ||
13233
- #endif
13234
- kvm_test_request (KVM_REQ_EVENT , vcpu ))
13235
- return true;
13236
-
13237
- return kvm_arch_dy_has_pending_interrupt (vcpu );
13238
- }
13239
-
13240
13240
bool kvm_arch_vcpu_in_kernel (struct kvm_vcpu * vcpu )
13241
13241
{
13242
13242
if (vcpu -> arch .guest_state_protected )
0 commit comments