diff options
Diffstat (limited to 'arch/powerpc/kvm/book3s_hv_rmhandlers.S')
-rw-r--r-- | arch/powerpc/kvm/book3s_hv_rmhandlers.S | 54 |
1 files changed, 37 insertions, 17 deletions
diff --git a/arch/powerpc/kvm/book3s_hv_rmhandlers.S b/arch/powerpc/kvm/book3s_hv_rmhandlers.S index edb2ccdbb2ba..65c105b17a25 100644 --- a/arch/powerpc/kvm/book3s_hv_rmhandlers.S +++ b/arch/powerpc/kvm/book3s_hv_rmhandlers.S | |||
@@ -201,8 +201,6 @@ kvmppc_primary_no_guest: | |||
201 | bge kvm_novcpu_exit /* another thread already exiting */ | 201 | bge kvm_novcpu_exit /* another thread already exiting */ |
202 | li r3, NAPPING_NOVCPU | 202 | li r3, NAPPING_NOVCPU |
203 | stb r3, HSTATE_NAPPING(r13) | 203 | stb r3, HSTATE_NAPPING(r13) |
204 | li r3, 1 | ||
205 | stb r3, HSTATE_HWTHREAD_REQ(r13) | ||
206 | 204 | ||
207 | b kvm_do_nap | 205 | b kvm_do_nap |
208 | 206 | ||
@@ -293,6 +291,8 @@ kvm_start_guest: | |||
293 | /* if we have no vcpu to run, go back to sleep */ | 291 | /* if we have no vcpu to run, go back to sleep */ |
294 | beq kvm_no_guest | 292 | beq kvm_no_guest |
295 | 293 | ||
294 | kvm_secondary_got_guest: | ||
295 | |||
296 | /* Set HSTATE_DSCR(r13) to something sensible */ | 296 | /* Set HSTATE_DSCR(r13) to something sensible */ |
297 | ld r6, PACA_DSCR(r13) | 297 | ld r6, PACA_DSCR(r13) |
298 | std r6, HSTATE_DSCR(r13) | 298 | std r6, HSTATE_DSCR(r13) |
@@ -318,27 +318,46 @@ kvm_start_guest: | |||
318 | stwcx. r3, 0, r4 | 318 | stwcx. r3, 0, r4 |
319 | bne 51b | 319 | bne 51b |
320 | 320 | ||
321 | /* | ||
322 | * At this point we have finished executing in the guest. | ||
323 | * We need to wait for hwthread_req to become zero, since | ||
324 | * we may not turn on the MMU while hwthread_req is non-zero. | ||
325 | * While waiting we also need to check if we get given a vcpu to run. | ||
326 | */ | ||
321 | kvm_no_guest: | 327 | kvm_no_guest: |
322 | li r0, KVM_HWTHREAD_IN_NAP | 328 | lbz r3, HSTATE_HWTHREAD_REQ(r13) |
329 | cmpwi r3, 0 | ||
330 | bne 53f | ||
331 | HMT_MEDIUM | ||
332 | li r0, KVM_HWTHREAD_IN_KERNEL | ||
323 | stb r0, HSTATE_HWTHREAD_STATE(r13) | 333 | stb r0, HSTATE_HWTHREAD_STATE(r13) |
324 | kvm_do_nap: | 334 | /* need to recheck hwthread_req after a barrier, to avoid race */ |
325 | /* Clear the runlatch bit before napping */ | 335 | sync |
326 | mfspr r2, SPRN_CTRLF | 336 | lbz r3, HSTATE_HWTHREAD_REQ(r13) |
327 | clrrdi r2, r2, 1 | 337 | cmpwi r3, 0 |
328 | mtspr SPRN_CTRLT, r2 | 338 | bne 54f |
329 | 339 | /* | |
340 | * We jump to power7_wakeup_loss, which will return to the caller | ||
341 | * of power7_nap in the powernv cpu offline loop. The value we | ||
342 | * put in r3 becomes the return value for power7_nap. | ||
343 | */ | ||
330 | li r3, LPCR_PECE0 | 344 | li r3, LPCR_PECE0 |
331 | mfspr r4, SPRN_LPCR | 345 | mfspr r4, SPRN_LPCR |
332 | rlwimi r4, r3, 0, LPCR_PECE0 | LPCR_PECE1 | 346 | rlwimi r4, r3, 0, LPCR_PECE0 | LPCR_PECE1 |
333 | mtspr SPRN_LPCR, r4 | 347 | mtspr SPRN_LPCR, r4 |
334 | isync | 348 | li r3, 0 |
335 | std r0, HSTATE_SCRATCH0(r13) | 349 | b power7_wakeup_loss |
336 | ptesync | 350 | |
337 | ld r0, HSTATE_SCRATCH0(r13) | 351 | 53: HMT_LOW |
338 | 1: cmpd r0, r0 | 352 | ld r4, HSTATE_KVM_VCPU(r13) |
339 | bne 1b | 353 | cmpdi r4, 0 |
340 | nap | 354 | beq kvm_no_guest |
341 | b . | 355 | HMT_MEDIUM |
356 | b kvm_secondary_got_guest | ||
357 | |||
358 | 54: li r0, KVM_HWTHREAD_IN_KVM | ||
359 | stb r0, HSTATE_HWTHREAD_STATE(r13) | ||
360 | b kvm_no_guest | ||
342 | 361 | ||
343 | /****************************************************************************** | 362 | /****************************************************************************** |
344 | * * | 363 | * * |
@@ -2172,6 +2191,7 @@ END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_206) | |||
2172 | * occurs, with PECE1, PECE0 and PECEDP set in LPCR. Also clear the | 2191 | * occurs, with PECE1, PECE0 and PECEDP set in LPCR. Also clear the |
2173 | * runlatch bit before napping. | 2192 | * runlatch bit before napping. |
2174 | */ | 2193 | */ |
2194 | kvm_do_nap: | ||
2175 | mfspr r2, SPRN_CTRLF | 2195 | mfspr r2, SPRN_CTRLF |
2176 | clrrdi r2, r2, 1 | 2196 | clrrdi r2, r2, 1 |
2177 | mtspr SPRN_CTRLT, r2 | 2197 | mtspr SPRN_CTRLT, r2 |