diff options
Diffstat (limited to 'arch/powerpc/include/asm/kvm_book3s_64.h')
| -rw-r--r-- | arch/powerpc/include/asm/kvm_book3s_64.h | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/arch/powerpc/include/asm/kvm_book3s_64.h b/arch/powerpc/include/asm/kvm_book3s_64.h index e43fe42b987..d0ac94f98f9 100644 --- a/arch/powerpc/include/asm/kvm_book3s_64.h +++ b/arch/powerpc/include/asm/kvm_book3s_64.h | |||
| @@ -29,4 +29,37 @@ static inline struct kvmppc_book3s_shadow_vcpu *to_svcpu(struct kvm_vcpu *vcpu) | |||
| 29 | 29 | ||
| 30 | #define SPAPR_TCE_SHIFT 12 | 30 | #define SPAPR_TCE_SHIFT 12 |
| 31 | 31 | ||
| 32 | static inline unsigned long compute_tlbie_rb(unsigned long v, unsigned long r, | ||
| 33 | unsigned long pte_index) | ||
| 34 | { | ||
| 35 | unsigned long rb, va_low; | ||
| 36 | |||
| 37 | rb = (v & ~0x7fUL) << 16; /* AVA field */ | ||
| 38 | va_low = pte_index >> 3; | ||
| 39 | if (v & HPTE_V_SECONDARY) | ||
| 40 | va_low = ~va_low; | ||
| 41 | /* xor vsid from AVA */ | ||
| 42 | if (!(v & HPTE_V_1TB_SEG)) | ||
| 43 | va_low ^= v >> 12; | ||
| 44 | else | ||
| 45 | va_low ^= v >> 24; | ||
| 46 | va_low &= 0x7ff; | ||
| 47 | if (v & HPTE_V_LARGE) { | ||
| 48 | rb |= 1; /* L field */ | ||
| 49 | if (cpu_has_feature(CPU_FTR_ARCH_206) && | ||
| 50 | (r & 0xff000)) { | ||
| 51 | /* non-16MB large page, must be 64k */ | ||
| 52 | /* (masks depend on page size) */ | ||
| 53 | rb |= 0x1000; /* page encoding in LP field */ | ||
| 54 | rb |= (va_low & 0x7f) << 16; /* 7b of VA in AVA/LP field */ | ||
| 55 | rb |= (va_low & 0xfe); /* AVAL field (P7 doesn't seem to care) */ | ||
| 56 | } | ||
| 57 | } else { | ||
| 58 | /* 4kB page */ | ||
| 59 | rb |= (va_low & 0x7ff) << 12; /* remaining 11b of VA */ | ||
| 60 | } | ||
| 61 | rb |= (v >> 54) & 0x300; /* B field */ | ||
| 62 | return rb; | ||
| 63 | } | ||
| 64 | |||
| 32 | #endif /* __ASM_KVM_BOOK3S_64_H__ */ | 65 | #endif /* __ASM_KVM_BOOK3S_64_H__ */ |
