Commit d91cb39f authored by Nicholas Piggin's avatar Nicholas Piggin Committed by Paul Mackerras

KVM: PPC: Book3S HV: Make radix use the Linux translation flush functions for partition scope

This has the advantage of consolidating TLB flush code in fewer
places, and it also implements powerpc:tlbie trace events.
Signed-off-by: default avatarNicholas Piggin <npiggin@gmail.com>
Signed-off-by: default avatarPaul Mackerras <paulus@ozlabs.org>
parent a5704e83
...@@ -139,41 +139,21 @@ int kvmppc_mmu_radix_xlate(struct kvm_vcpu *vcpu, gva_t eaddr, ...@@ -139,41 +139,21 @@ int kvmppc_mmu_radix_xlate(struct kvm_vcpu *vcpu, gva_t eaddr,
return 0; return 0;
} }
#ifdef CONFIG_PPC_64K_PAGES
#define MMU_BASE_PSIZE MMU_PAGE_64K
#else
#define MMU_BASE_PSIZE MMU_PAGE_4K
#endif
static void kvmppc_radix_tlbie_page(struct kvm *kvm, unsigned long addr, static void kvmppc_radix_tlbie_page(struct kvm *kvm, unsigned long addr,
unsigned int pshift) unsigned int pshift)
{ {
int psize = MMU_BASE_PSIZE; unsigned long psize = PAGE_SIZE;
if (pshift >= PUD_SHIFT) if (pshift)
psize = MMU_PAGE_1G; psize = 1UL << pshift;
else if (pshift >= PMD_SHIFT)
psize = MMU_PAGE_2M; addr &= ~(psize - 1);
addr &= ~0xfffUL; radix__flush_tlb_lpid_page(kvm->arch.lpid, addr, psize);
addr |= mmu_psize_defs[psize].ap << 5;
asm volatile("ptesync": : :"memory");
asm volatile(PPC_TLBIE_5(%0, %1, 0, 0, 1)
: : "r" (addr), "r" (kvm->arch.lpid) : "memory");
if (cpu_has_feature(CPU_FTR_P9_TLBIE_BUG))
asm volatile(PPC_TLBIE_5(%0, %1, 0, 0, 1)
: : "r" (addr), "r" (kvm->arch.lpid) : "memory");
asm volatile("eieio ; tlbsync ; ptesync": : :"memory");
} }
static void kvmppc_radix_flush_pwc(struct kvm *kvm) static void kvmppc_radix_flush_pwc(struct kvm *kvm)
{ {
unsigned long rb = 0x2 << PPC_BITLSHIFT(53); /* IS = 2 */ radix__flush_pwc_lpid(kvm->arch.lpid);
asm volatile("ptesync": : :"memory");
/* RIC=1 PRS=0 R=1 IS=2 */
asm volatile(PPC_TLBIE_5(%0, %1, 1, 0, 1)
: : "r" (rb), "r" (kvm->arch.lpid) : "memory");
asm volatile("eieio ; tlbsync ; ptesync": : :"memory");
} }
unsigned long kvmppc_radix_update_pte(struct kvm *kvm, pte_t *ptep, unsigned long kvmppc_radix_update_pte(struct kvm *kvm, pte_t *ptep,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment