aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc/kvm
diff options
context:
space:
mode:
authorAlexander Graf <agraf@suse.de>2010-03-24 16:48:34 -0400
committerAvi Kivity <avi@redhat.com>2010-05-17 05:17:17 -0400
commita1eda280ccd5fee71a89a94030f96bca5faebe21 (patch)
treeb5517e5bd4662fadff15cb874229ae6c01a66359 /arch/powerpc/kvm
parentbd7cdbb7fcd135a399ebb855dc9106747ee2e6ba (diff)
KVM: PPC: Add check if pte was mapped secondary
Some HTAB providers (namely the PS3) ignore the SECONDARY flag. They just put an entry in the htab as secondary when they see fit. So we need to check the return value of htab_insert to remember the correct slot id so we can actually invalidate the entry again. Fixes KVM on the PS3. Signed-off-by: Alexander Graf <agraf@suse.de> Signed-off-by: Avi Kivity <avi@redhat.com>
Diffstat (limited to 'arch/powerpc/kvm')
-rw-r--r--arch/powerpc/kvm/book3s_64_mmu_host.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/arch/powerpc/kvm/book3s_64_mmu_host.c b/arch/powerpc/kvm/book3s_64_mmu_host.c
index 25bd4ede722c..a01e9c5a3fc7 100644
--- a/arch/powerpc/kvm/book3s_64_mmu_host.c
+++ b/arch/powerpc/kvm/book3s_64_mmu_host.c
@@ -270,6 +270,13 @@ map_again:
270 (rflags & HPTE_R_N) ? '-' : 'x', 270 (rflags & HPTE_R_N) ? '-' : 'x',
271 orig_pte->eaddr, hpteg, va, orig_pte->vpage, hpaddr); 271 orig_pte->eaddr, hpteg, va, orig_pte->vpage, hpaddr);
272 272
273 /* The ppc_md code may give us a secondary entry even though we
274 asked for a primary. Fix up. */
275 if ((ret & _PTEIDX_SECONDARY) && !(vflags & HPTE_V_SECONDARY)) {
276 hash = ~hash;
277 hpteg = ((hash & htab_hash_mask) * HPTES_PER_GROUP);
278 }
279
273 pte->slot = hpteg + (ret & 7); 280 pte->slot = hpteg + (ret & 7);
274 pte->host_va = va; 281 pte->host_va = va;
275 pte->pte = *orig_pte; 282 pte->pte = *orig_pte;