Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0-only */
0002 /*
0003  * Copyright (C) 2008-2011 Freescale Semiconductor, Inc. All rights reserved.
0004  *
0005  * Author: Yu Liu <yu.liu@freescale.com>
0006  *         Scott Wood <scottwood@freescale.com>
0007  *         Ashish Kalra <ashish.kalra@freescale.com>
0008  *         Varun Sethi <varun.sethi@freescale.com>
0009  *
0010  * Description:
0011  * This file is based on arch/powerpc/kvm/44x_tlb.h and
0012  * arch/powerpc/include/asm/kvm_44x.h by Hollis Blanchard <hollisb@us.ibm.com>,
0013  * Copyright IBM Corp. 2007-2008
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 /* entry is mapped somewhere in host TLB */
0032 #define E500_TLB_VALID      (1 << 31)
0033 /* TLB1 entry is mapped by host TLB1, tracked by bitmaps */
0034 #define E500_TLB_BITMAP     (1 << 30)
0035 /* TLB1 entry is mapped by host TLB0 */
0036 #define E500_TLB_TLB0       (1 << 29)
0037 /* bits [6-5] MAS2_X1 and MAS2_X0 and [4-0] bits for WIMGE */
0038 #define E500_TLB_MAS2_ATTR  (0x7f)
0039 
0040 struct tlbe_ref {
0041     kvm_pfn_t pfn;      /* valid only for TLB0, except briefly */
0042     unsigned int flags; /* E500_TLB_* */
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     /* Unmodified copy of the guest's TLB -- shared with host userspace. */
0061     struct kvm_book3e_206_tlb_entry *gtlb_arch;
0062 
0063     /* Starting entry number in gtlb_arch[] */
0064     int gtlb_offset[E500_TLB_NUM];
0065 
0066     /* KVM internal information associated with each guest TLB entry */
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     /* Minimum and maximum address mapped my TLB1 */
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     /* vcpu id table */
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 /* This geometry is the legacy default -- can be overridden by userspace */
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 /* TLB helper functions */
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      * Manual says that tlbsel has 2 bits wide.
0237      * Since we only have two TLBs, only lower bit is used.
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     /* Does it match current guest AS? */
0262     /* XXX what about IS != DS? */
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         /* Mapping is not for RAM. */
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  * These functions should be called with preemption disabled
0293  * and the returned value is valid only in that context
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 /* Force TS=1 for all guest mappings. */
0322 #define get_tlb_sts(gtlbe)              (MAS1_TS)
0323 #endif /* !BOOKE_HV */
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 /* KVM_E500_H */