diff options
author | Alexander Graf <agraf@suse.de> | 2012-02-16 09:53:04 -0500 |
---|---|---|
committer | Avi Kivity <avi@redhat.com> | 2012-04-08 05:55:14 -0400 |
commit | e9ba39c1f3dff93efddacbd4569ada05633e2a9b (patch) | |
tree | 06006536ab6f4da04a82e47b593dc20bad8a291d /arch/powerpc/kvm/bookehv_interrupts.S | |
parent | 8a3da55784cf2aea8ef6acdd1f50e5ad52f76574 (diff) |
KVM: PPC: bookehv: disable MAS register updates early
We need to make sure that no MAS updates happen automatically while we
have the guest MAS registers loaded. So move the disabling code a bit
higher up so that it covers the full time we have guest values in MAS
registers.
The race this patch fixes should never occur, but it makes the code a
bit more logical to do it this way around.
Signed-off-by: Alexander Graf <agraf@suse.de>
Signed-off-by: Avi Kivity <avi@redhat.com>
Diffstat (limited to 'arch/powerpc/kvm/bookehv_interrupts.S')
-rw-r--r-- | arch/powerpc/kvm/bookehv_interrupts.S | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/arch/powerpc/kvm/bookehv_interrupts.S b/arch/powerpc/kvm/bookehv_interrupts.S index dfa606dedb47..3a1db909947f 100644 --- a/arch/powerpc/kvm/bookehv_interrupts.S +++ b/arch/powerpc/kvm/bookehv_interrupts.S | |||
@@ -358,6 +358,7 @@ _GLOBAL(kvmppc_resume_host) | |||
358 | mtspr SPRN_MAS4, r6 | 358 | mtspr SPRN_MAS4, r6 |
359 | stw r5, VCPU_SHARED_MAS7_3+0(r11) | 359 | stw r5, VCPU_SHARED_MAS7_3+0(r11) |
360 | mtspr SPRN_MAS6, r8 | 360 | mtspr SPRN_MAS6, r8 |
361 | /* Enable MAS register updates via exception */ | ||
361 | mfspr r3, SPRN_EPCR | 362 | mfspr r3, SPRN_EPCR |
362 | rlwinm r3, r3, 0, ~SPRN_EPCR_DMIUH | 363 | rlwinm r3, r3, 0, ~SPRN_EPCR_DMIUH |
363 | mtspr SPRN_EPCR, r3 | 364 | mtspr SPRN_EPCR, r3 |
@@ -515,6 +516,11 @@ lightweight_exit: | |||
515 | mtspr SPRN_PID, r3 | 516 | mtspr SPRN_PID, r3 |
516 | 517 | ||
517 | PPC_LL r11, VCPU_SHARED(r4) | 518 | PPC_LL r11, VCPU_SHARED(r4) |
519 | /* Disable MAS register updates via exception */ | ||
520 | mfspr r3, SPRN_EPCR | ||
521 | oris r3, r3, SPRN_EPCR_DMIUH@h | ||
522 | mtspr SPRN_EPCR, r3 | ||
523 | isync | ||
518 | /* Save host mas4 and mas6 and load guest MAS registers */ | 524 | /* Save host mas4 and mas6 and load guest MAS registers */ |
519 | mfspr r3, SPRN_MAS4 | 525 | mfspr r3, SPRN_MAS4 |
520 | stw r3, VCPU_HOST_MAS4(r4) | 526 | stw r3, VCPU_HOST_MAS4(r4) |
@@ -538,10 +544,6 @@ lightweight_exit: | |||
538 | lwz r5, VCPU_SHARED_MAS7_3+0(r11) | 544 | lwz r5, VCPU_SHARED_MAS7_3+0(r11) |
539 | mtspr SPRN_MAS6, r3 | 545 | mtspr SPRN_MAS6, r3 |
540 | mtspr SPRN_MAS7, r5 | 546 | mtspr SPRN_MAS7, r5 |
541 | /* Disable MAS register updates via exception */ | ||
542 | mfspr r3, SPRN_EPCR | ||
543 | oris r3, r3, SPRN_EPCR_DMIUH@h | ||
544 | mtspr SPRN_EPCR, r3 | ||
545 | 547 | ||
546 | /* | 548 | /* |
547 | * Host interrupt handlers may have clobbered these guest-readable | 549 | * Host interrupt handlers may have clobbered these guest-readable |