0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016 #ifndef KVM_E500_H
0017 #define KVM_E500_H
0018
0019 #include <linux/kvm_host.h>
0020 #include <asm/nohash/mmu-book3e.h>
0021 #include <asm/tlb.h>
0022 #include <asm/cputhreads.h>
0023
0024 enum vcpu_ftr {
0025 VCPU_FTR_MMU_V2
0026 };
0027
0028 #define E500_PID_NUM 3
0029 #define E500_TLB_NUM 2
0030
0031
0032 #define E500_TLB_VALID (1 << 31)
0033
0034 #define E500_TLB_BITMAP (1 << 30)
0035
0036 #define E500_TLB_TLB0 (1 << 29)
0037
0038 #define E500_TLB_MAS2_ATTR (0x7f)
0039
0040 struct tlbe_ref {
0041 kvm_pfn_t pfn;
0042 unsigned int flags;
0043 };
0044
0045 struct tlbe_priv {
0046 struct tlbe_ref ref;
0047 };
0048
0049 #ifdef CONFIG_KVM_E500V2
0050 struct vcpu_id_table;
0051 #endif
0052
0053 struct kvmppc_e500_tlb_params {
0054 int entries, ways, sets;
0055 };
0056
0057 struct kvmppc_vcpu_e500 {
0058 struct kvm_vcpu vcpu;
0059
0060
0061 struct kvm_book3e_206_tlb_entry *gtlb_arch;
0062
0063
0064 int gtlb_offset[E500_TLB_NUM];
0065
0066
0067 struct tlbe_priv *gtlb_priv[E500_TLB_NUM];
0068
0069 struct kvmppc_e500_tlb_params gtlb_params[E500_TLB_NUM];
0070
0071 unsigned int gtlb_nv[E500_TLB_NUM];
0072
0073 unsigned int host_tlb1_nv;
0074
0075 u32 svr;
0076 u32 l1csr0;
0077 u32 l1csr1;
0078 u32 hid0;
0079 u32 hid1;
0080 u64 mcar;
0081
0082 struct page **shared_tlb_pages;
0083 int num_shared_tlb_pages;
0084
0085 u64 *g2h_tlb1_map;
0086 unsigned int *h2g_tlb1_rmap;
0087
0088
0089 unsigned long tlb1_min_eaddr;
0090 unsigned long tlb1_max_eaddr;
0091
0092 #ifdef CONFIG_KVM_E500V2
0093 u32 pid[E500_PID_NUM];
0094
0095
0096 struct vcpu_id_table *idt;
0097 #endif
0098 };
0099
0100 static inline struct kvmppc_vcpu_e500 *to_e500(struct kvm_vcpu *vcpu)
0101 {
0102 return container_of(vcpu, struct kvmppc_vcpu_e500, vcpu);
0103 }
0104
0105
0106
0107 #define KVM_E500_TLB0_WAY_SIZE 128
0108 #define KVM_E500_TLB0_WAY_NUM 2
0109
0110 #define KVM_E500_TLB0_SIZE (KVM_E500_TLB0_WAY_SIZE * KVM_E500_TLB0_WAY_NUM)
0111 #define KVM_E500_TLB1_SIZE 16
0112
0113 #define index_of(tlbsel, esel) (((tlbsel) << 16) | ((esel) & 0xFFFF))
0114 #define tlbsel_of(index) ((index) >> 16)
0115 #define esel_of(index) ((index) & 0xFFFF)
0116
0117 #define E500_TLB_USER_PERM_MASK (MAS3_UX|MAS3_UR|MAS3_UW)
0118 #define E500_TLB_SUPER_PERM_MASK (MAS3_SX|MAS3_SR|MAS3_SW)
0119 #define MAS2_ATTRIB_MASK \
0120 (MAS2_X0 | MAS2_X1 | MAS2_E | MAS2_G)
0121 #define MAS3_ATTRIB_MASK \
0122 (MAS3_U0 | MAS3_U1 | MAS3_U2 | MAS3_U3 \
0123 | E500_TLB_USER_PERM_MASK | E500_TLB_SUPER_PERM_MASK)
0124
0125 int kvmppc_e500_emul_mt_mmucsr0(struct kvmppc_vcpu_e500 *vcpu_e500,
0126 ulong value);
0127 int kvmppc_e500_emul_tlbwe(struct kvm_vcpu *vcpu);
0128 int kvmppc_e500_emul_tlbre(struct kvm_vcpu *vcpu);
0129 int kvmppc_e500_emul_tlbivax(struct kvm_vcpu *vcpu, gva_t ea);
0130 int kvmppc_e500_emul_tlbilx(struct kvm_vcpu *vcpu, int type, gva_t ea);
0131 int kvmppc_e500_emul_tlbsx(struct kvm_vcpu *vcpu, gva_t ea);
0132 int kvmppc_e500_tlb_init(struct kvmppc_vcpu_e500 *vcpu_e500);
0133 void kvmppc_e500_tlb_uninit(struct kvmppc_vcpu_e500 *vcpu_e500);
0134
0135 void kvmppc_get_sregs_e500_tlb(struct kvm_vcpu *vcpu, struct kvm_sregs *sregs);
0136 int kvmppc_set_sregs_e500_tlb(struct kvm_vcpu *vcpu, struct kvm_sregs *sregs);
0137
0138 int kvmppc_get_one_reg_e500_tlb(struct kvm_vcpu *vcpu, u64 id,
0139 union kvmppc_one_reg *val);
0140 int kvmppc_set_one_reg_e500_tlb(struct kvm_vcpu *vcpu, u64 id,
0141 union kvmppc_one_reg *val);
0142
0143 #ifdef CONFIG_KVM_E500V2
0144 unsigned int kvmppc_e500_get_sid(struct kvmppc_vcpu_e500 *vcpu_e500,
0145 unsigned int as, unsigned int gid,
0146 unsigned int pr, int avoid_recursion);
0147 #endif
0148
0149
0150 static inline unsigned int
0151 get_tlb_size(const struct kvm_book3e_206_tlb_entry *tlbe)
0152 {
0153 return (tlbe->mas1 >> 7) & 0x1f;
0154 }
0155
0156 static inline gva_t get_tlb_eaddr(const struct kvm_book3e_206_tlb_entry *tlbe)
0157 {
0158 return tlbe->mas2 & MAS2_EPN;
0159 }
0160
0161 static inline u64 get_tlb_bytes(const struct kvm_book3e_206_tlb_entry *tlbe)
0162 {
0163 unsigned int pgsize = get_tlb_size(tlbe);
0164 return 1ULL << 10 << pgsize;
0165 }
0166
0167 static inline gva_t get_tlb_end(const struct kvm_book3e_206_tlb_entry *tlbe)
0168 {
0169 u64 bytes = get_tlb_bytes(tlbe);
0170 return get_tlb_eaddr(tlbe) + bytes - 1;
0171 }
0172
0173 static inline u64 get_tlb_raddr(const struct kvm_book3e_206_tlb_entry *tlbe)
0174 {
0175 return tlbe->mas7_3 & ~0xfffULL;
0176 }
0177
0178 static inline unsigned int
0179 get_tlb_tid(const struct kvm_book3e_206_tlb_entry *tlbe)
0180 {
0181 return (tlbe->mas1 >> 16) & 0xff;
0182 }
0183
0184 static inline unsigned int
0185 get_tlb_ts(const struct kvm_book3e_206_tlb_entry *tlbe)
0186 {
0187 return (tlbe->mas1 >> 12) & 0x1;
0188 }
0189
0190 static inline unsigned int
0191 get_tlb_v(const struct kvm_book3e_206_tlb_entry *tlbe)
0192 {
0193 return (tlbe->mas1 >> 31) & 0x1;
0194 }
0195
0196 static inline unsigned int
0197 get_tlb_iprot(const struct kvm_book3e_206_tlb_entry *tlbe)
0198 {
0199 return (tlbe->mas1 >> 30) & 0x1;
0200 }
0201
0202 static inline unsigned int
0203 get_tlb_tsize(const struct kvm_book3e_206_tlb_entry *tlbe)
0204 {
0205 return (tlbe->mas1 & MAS1_TSIZE_MASK) >> MAS1_TSIZE_SHIFT;
0206 }
0207
0208 static inline unsigned int get_cur_pid(struct kvm_vcpu *vcpu)
0209 {
0210 return vcpu->arch.pid & 0xff;
0211 }
0212
0213 static inline unsigned int get_cur_as(struct kvm_vcpu *vcpu)
0214 {
0215 return !!(vcpu->arch.shared->msr & (MSR_IS | MSR_DS));
0216 }
0217
0218 static inline unsigned int get_cur_pr(struct kvm_vcpu *vcpu)
0219 {
0220 return !!(vcpu->arch.shared->msr & MSR_PR);
0221 }
0222
0223 static inline unsigned int get_cur_spid(const struct kvm_vcpu *vcpu)
0224 {
0225 return (vcpu->arch.shared->mas6 >> 16) & 0xff;
0226 }
0227
0228 static inline unsigned int get_cur_sas(const struct kvm_vcpu *vcpu)
0229 {
0230 return vcpu->arch.shared->mas6 & 0x1;
0231 }
0232
0233 static inline unsigned int get_tlb_tlbsel(const struct kvm_vcpu *vcpu)
0234 {
0235
0236
0237
0238
0239 return (vcpu->arch.shared->mas0 >> 28) & 0x1;
0240 }
0241
0242 static inline unsigned int get_tlb_nv_bit(const struct kvm_vcpu *vcpu)
0243 {
0244 return vcpu->arch.shared->mas0 & 0xfff;
0245 }
0246
0247 static inline unsigned int get_tlb_esel_bit(const struct kvm_vcpu *vcpu)
0248 {
0249 return (vcpu->arch.shared->mas0 >> 16) & 0xfff;
0250 }
0251
0252 static inline int tlbe_is_host_safe(const struct kvm_vcpu *vcpu,
0253 const struct kvm_book3e_206_tlb_entry *tlbe)
0254 {
0255 gpa_t gpa;
0256
0257 if (!get_tlb_v(tlbe))
0258 return 0;
0259
0260 #ifndef CONFIG_KVM_BOOKE_HV
0261
0262
0263 if (get_tlb_ts(tlbe) != !!(vcpu->arch.shared->msr & MSR_IS))
0264 return 0;
0265 #endif
0266
0267 gpa = get_tlb_raddr(tlbe);
0268 if (!gfn_to_memslot(vcpu->kvm, gpa >> PAGE_SHIFT))
0269
0270 return 0;
0271
0272 return 1;
0273 }
0274
0275 static inline struct kvm_book3e_206_tlb_entry *get_entry(
0276 struct kvmppc_vcpu_e500 *vcpu_e500, int tlbsel, int entry)
0277 {
0278 int offset = vcpu_e500->gtlb_offset[tlbsel];
0279 return &vcpu_e500->gtlb_arch[offset + entry];
0280 }
0281
0282 void kvmppc_e500_tlbil_one(struct kvmppc_vcpu_e500 *vcpu_e500,
0283 struct kvm_book3e_206_tlb_entry *gtlbe);
0284 void kvmppc_e500_tlbil_all(struct kvmppc_vcpu_e500 *vcpu_e500);
0285
0286 #ifdef CONFIG_KVM_BOOKE_HV
0287 #define kvmppc_e500_get_tlb_stid(vcpu, gtlbe) get_tlb_tid(gtlbe)
0288 #define get_tlbmiss_tid(vcpu) get_cur_pid(vcpu)
0289 #define get_tlb_sts(gtlbe) (gtlbe->mas1 & MAS1_TS)
0290
0291
0292
0293
0294
0295 static inline int get_thread_specific_lpid(int vm_lpid)
0296 {
0297 int vcpu_lpid = vm_lpid;
0298
0299 if (threads_per_core == 2)
0300 vcpu_lpid |= smp_processor_id() & 1;
0301
0302 return vcpu_lpid;
0303 }
0304
0305 static inline int get_lpid(struct kvm_vcpu *vcpu)
0306 {
0307 return get_thread_specific_lpid(vcpu->kvm->arch.lpid);
0308 }
0309 #else
0310 unsigned int kvmppc_e500_get_tlb_stid(struct kvm_vcpu *vcpu,
0311 struct kvm_book3e_206_tlb_entry *gtlbe);
0312
0313 static inline unsigned int get_tlbmiss_tid(struct kvm_vcpu *vcpu)
0314 {
0315 struct kvmppc_vcpu_e500 *vcpu_e500 = to_e500(vcpu);
0316 unsigned int tidseld = (vcpu->arch.shared->mas4 >> 16) & 0xf;
0317
0318 return vcpu_e500->pid[tidseld];
0319 }
0320
0321
0322 #define get_tlb_sts(gtlbe) (MAS1_TS)
0323 #endif
0324
0325 static inline bool has_feature(const struct kvm_vcpu *vcpu,
0326 enum vcpu_ftr ftr)
0327 {
0328 bool has_ftr;
0329 switch (ftr) {
0330 case VCPU_FTR_MMU_V2:
0331 has_ftr = ((vcpu->arch.mmucfg & MMUCFG_MAVN) == MMUCFG_MAVN_V2);
0332 break;
0333 default:
0334 return false;
0335 }
0336 return has_ftr;
0337 }
0338
0339 #endif