Lines Matching refs:vcpu_e500
126 static inline void write_host_tlbe(struct kvmppc_vcpu_e500 *vcpu_e500, in write_host_tlbe() argument
133 __write_host_tlbe(stlbe, mas0, vcpu_e500->vcpu.kvm->arch.lpid); in write_host_tlbe()
138 vcpu_e500->vcpu.kvm->arch.lpid); in write_host_tlbe()
143 static void write_stlbe(struct kvmppc_vcpu_e500 *vcpu_e500, in write_stlbe() argument
151 stid = kvmppc_e500_get_tlb_stid(&vcpu_e500->vcpu, gtlbe); in write_stlbe()
154 write_host_tlbe(vcpu_e500, stlbsel, sesel, stlbe); in write_stlbe()
162 struct kvmppc_vcpu_e500 *vcpu_e500 = to_e500(vcpu); in kvmppc_map_magic() local
172 stid = kvmppc_e500_get_sid(vcpu_e500, 0, 0, 0, 0); in kvmppc_map_magic()
186 void inval_gtlbe_on_host(struct kvmppc_vcpu_e500 *vcpu_e500, int tlbsel, in inval_gtlbe_on_host() argument
190 get_entry(vcpu_e500, tlbsel, esel); in inval_gtlbe_on_host()
191 struct tlbe_ref *ref = &vcpu_e500->gtlb_priv[tlbsel][esel].ref; in inval_gtlbe_on_host()
197 WARN_ON(tlbsel == 1 && vcpu_e500->g2h_tlb1_map[esel]); in inval_gtlbe_on_host()
201 u64 tmp = vcpu_e500->g2h_tlb1_map[esel]; in inval_gtlbe_on_host()
213 vcpu_e500->h2g_tlb1_rmap[hw_tlb_indx] = 0; in inval_gtlbe_on_host()
217 vcpu_e500->g2h_tlb1_map[esel] = 0; in inval_gtlbe_on_host()
227 kvmppc_e500_tlbil_all(vcpu_e500); in inval_gtlbe_on_host()
236 kvmppc_e500_tlbil_one(vcpu_e500, gtlbe); in inval_gtlbe_on_host()
273 static void clear_tlb1_bitmap(struct kvmppc_vcpu_e500 *vcpu_e500) in clear_tlb1_bitmap() argument
275 if (vcpu_e500->g2h_tlb1_map) in clear_tlb1_bitmap()
276 memset(vcpu_e500->g2h_tlb1_map, 0, in clear_tlb1_bitmap()
277 sizeof(u64) * vcpu_e500->gtlb_params[1].entries); in clear_tlb1_bitmap()
278 if (vcpu_e500->h2g_tlb1_rmap) in clear_tlb1_bitmap()
279 memset(vcpu_e500->h2g_tlb1_rmap, 0, in clear_tlb1_bitmap()
283 static void clear_tlb_privs(struct kvmppc_vcpu_e500 *vcpu_e500) in clear_tlb_privs() argument
289 for (i = 0; i < vcpu_e500->gtlb_params[tlbsel].entries; i++) { in clear_tlb_privs()
291 &vcpu_e500->gtlb_priv[tlbsel][i].ref; in clear_tlb_privs()
299 struct kvmppc_vcpu_e500 *vcpu_e500 = to_e500(vcpu); in kvmppc_core_flush_tlb() local
300 kvmppc_e500_tlbil_all(vcpu_e500); in kvmppc_core_flush_tlb()
301 clear_tlb_privs(vcpu_e500); in kvmppc_core_flush_tlb()
302 clear_tlb1_bitmap(vcpu_e500); in kvmppc_core_flush_tlb()
324 static inline int kvmppc_e500_shadow_map(struct kvmppc_vcpu_e500 *vcpu_e500, in kvmppc_e500_shadow_map() argument
336 struct kvm *kvm = vcpu_e500->vcpu.kvm; in kvmppc_e500_shadow_map()
355 slot = gfn_to_memslot(vcpu_e500->vcpu.kvm, gfn); in kvmppc_e500_shadow_map()
471 pgdir = vcpu_e500->vcpu.arch.pgdir; in kvmppc_e500_shadow_map()
497 kvmppc_e500_setup_stlbe(&vcpu_e500->vcpu, gtlbe, tsize, in kvmppc_e500_shadow_map()
513 static int kvmppc_e500_tlb0_map(struct kvmppc_vcpu_e500 *vcpu_e500, int esel, in kvmppc_e500_tlb0_map() argument
522 gtlbe = get_entry(vcpu_e500, 0, esel); in kvmppc_e500_tlb0_map()
523 ref = &vcpu_e500->gtlb_priv[0][esel].ref; in kvmppc_e500_tlb0_map()
525 r = kvmppc_e500_shadow_map(vcpu_e500, get_tlb_eaddr(gtlbe), in kvmppc_e500_tlb0_map()
531 write_stlbe(vcpu_e500, gtlbe, stlbe, stlbsel, sesel); in kvmppc_e500_tlb0_map()
536 static int kvmppc_e500_tlb1_map_tlb1(struct kvmppc_vcpu_e500 *vcpu_e500, in kvmppc_e500_tlb1_map_tlb1() argument
540 unsigned int sesel = vcpu_e500->host_tlb1_nv++; in kvmppc_e500_tlb1_map_tlb1()
542 if (unlikely(vcpu_e500->host_tlb1_nv >= tlb1_max_shadow_size())) in kvmppc_e500_tlb1_map_tlb1()
543 vcpu_e500->host_tlb1_nv = 0; in kvmppc_e500_tlb1_map_tlb1()
545 if (vcpu_e500->h2g_tlb1_rmap[sesel]) { in kvmppc_e500_tlb1_map_tlb1()
546 unsigned int idx = vcpu_e500->h2g_tlb1_rmap[sesel] - 1; in kvmppc_e500_tlb1_map_tlb1()
547 vcpu_e500->g2h_tlb1_map[idx] &= ~(1ULL << sesel); in kvmppc_e500_tlb1_map_tlb1()
550 vcpu_e500->gtlb_priv[1][esel].ref.flags |= E500_TLB_BITMAP; in kvmppc_e500_tlb1_map_tlb1()
551 vcpu_e500->g2h_tlb1_map[esel] |= (u64)1 << sesel; in kvmppc_e500_tlb1_map_tlb1()
552 vcpu_e500->h2g_tlb1_rmap[sesel] = esel + 1; in kvmppc_e500_tlb1_map_tlb1()
561 static int kvmppc_e500_tlb1_map(struct kvmppc_vcpu_e500 *vcpu_e500, in kvmppc_e500_tlb1_map() argument
565 struct tlbe_ref *ref = &vcpu_e500->gtlb_priv[1][esel].ref; in kvmppc_e500_tlb1_map()
569 r = kvmppc_e500_shadow_map(vcpu_e500, gvaddr, gfn, gtlbe, 1, stlbe, in kvmppc_e500_tlb1_map()
576 vcpu_e500->gtlb_priv[1][esel].ref.flags |= E500_TLB_TLB0; in kvmppc_e500_tlb1_map()
577 write_stlbe(vcpu_e500, gtlbe, stlbe, 0, 0); in kvmppc_e500_tlb1_map()
582 sesel = kvmppc_e500_tlb1_map_tlb1(vcpu_e500, ref, esel); in kvmppc_e500_tlb1_map()
583 write_stlbe(vcpu_e500, gtlbe, stlbe, 1, sesel); in kvmppc_e500_tlb1_map()
591 struct kvmppc_vcpu_e500 *vcpu_e500 = to_e500(vcpu); in kvmppc_mmu_map() local
597 gtlbe = get_entry(vcpu_e500, tlbsel, esel); in kvmppc_mmu_map()
601 priv = &vcpu_e500->gtlb_priv[tlbsel][esel]; in kvmppc_mmu_map()
605 kvmppc_e500_tlb0_map(vcpu_e500, esel, &stlbe); in kvmppc_mmu_map()
609 write_stlbe(vcpu_e500, gtlbe, &stlbe, 0, 0); in kvmppc_mmu_map()
615 kvmppc_e500_tlb1_map(vcpu_e500, eaddr, gfn, gtlbe, &stlbe, in kvmppc_mmu_map()
767 int e500_mmu_host_init(struct kvmppc_vcpu_e500 *vcpu_e500) in e500_mmu_host_init() argument
801 vcpu_e500->h2g_tlb1_rmap = kzalloc(sizeof(unsigned int) * in e500_mmu_host_init()
804 if (!vcpu_e500->h2g_tlb1_rmap) in e500_mmu_host_init()
810 void e500_mmu_host_uninit(struct kvmppc_vcpu_e500 *vcpu_e500) in e500_mmu_host_uninit() argument
812 kfree(vcpu_e500->h2g_tlb1_rmap); in e500_mmu_host_uninit()