2 * This program is free software; you can redistribute it and/or modify
3 * it under the terms of the GNU General Public License, version 2, as
4 * published by the Free Software Foundation.
6 * This program is distributed in the hope that it will be useful,
7 * but WITHOUT ANY WARRANTY; without even the implied warranty of
8 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
9 * GNU General Public License for more details.
11 * You should have received a copy of the GNU General Public License
12 * along with this program; if not, write to the Free Software
13 * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
15 * Copyright 2010 Paul Mackerras, IBM Corp. <paulus@au1.ibm.com>
18 #include <linux/types.h>
19 #include <linux/string.h>
20 #include <linux/kvm.h>
21 #include <linux/kvm_host.h>
22 #include <linux/highmem.h>
23 #include <linux/gfp.h>
24 #include <linux/slab.h>
25 #include <linux/hugetlb.h>
27 #include <asm/tlbflush.h>
28 #include <asm/kvm_ppc.h>
29 #include <asm/kvm_book3s.h>
30 #include <asm/mmu-hash64.h>
31 #include <asm/hvcall.h>
32 #include <asm/synch.h>
33 #include <asm/ppc-opcode.h>
34 #include <asm/cputable.h>
36 /* For now use fixed-size 16MB page table */
38 #define HPT_NPTEG (1ul << (HPT_ORDER - 7)) /* 128B per pteg */
39 #define HPT_HASH_MASK (HPT_NPTEG - 1)
41 /* Pages in the VRMA are 16MB pages */
42 #define VRMA_PAGE_ORDER 24
43 #define VRMA_VSID 0x1ffffffUL /* 1TB VSID reserved for VRMA */
45 /* POWER7 has 10-bit LPIDs, PPC970 has 6-bit LPIDs */
46 #define MAX_LPID_970 63
47 #define NR_LPIDS (LPID_RSVD + 1)
48 unsigned long lpid_inuse
[BITS_TO_LONGS(NR_LPIDS
)];
50 long kvmppc_alloc_hpt(struct kvm
*kvm
)
55 hpt
= __get_free_pages(GFP_KERNEL
|__GFP_ZERO
|__GFP_REPEAT
|__GFP_NOWARN
,
56 HPT_ORDER
- PAGE_SHIFT
);
58 pr_err("kvm_alloc_hpt: Couldn't alloc HPT\n");
61 kvm
->arch
.hpt_virt
= hpt
;
64 lpid
= find_first_zero_bit(lpid_inuse
, NR_LPIDS
);
65 if (lpid
>= NR_LPIDS
) {
66 pr_err("kvm_alloc_hpt: No LPIDs free\n");
67 free_pages(hpt
, HPT_ORDER
- PAGE_SHIFT
);
70 } while (test_and_set_bit(lpid
, lpid_inuse
));
72 kvm
->arch
.sdr1
= __pa(hpt
) | (HPT_ORDER
- 18);
73 kvm
->arch
.lpid
= lpid
;
75 pr_info("KVM guest htab at %lx, LPID %lx\n", hpt
, lpid
);
79 void kvmppc_free_hpt(struct kvm
*kvm
)
81 clear_bit(kvm
->arch
.lpid
, lpid_inuse
);
82 free_pages(kvm
->arch
.hpt_virt
, HPT_ORDER
- PAGE_SHIFT
);
85 void kvmppc_map_vrma(struct kvm
*kvm
, struct kvm_userspace_memory_region
*mem
)
88 unsigned long npages
= kvm
->arch
.ram_npages
;
92 struct kvmppc_pginfo
*pginfo
= kvm
->arch
.ram_pginfo
;
97 /* VRMA can't be > 1TB */
98 if (npages
> 1ul << (40 - kvm
->arch
.ram_porder
))
99 npages
= 1ul << (40 - kvm
->arch
.ram_porder
);
100 /* Can't use more than 1 HPTE per HPTEG */
101 if (npages
> HPT_NPTEG
)
104 for (i
= 0; i
< npages
; ++i
) {
108 /* can't use hpt_hash since va > 64 bits */
109 hash
= (i
^ (VRMA_VSID
^ (VRMA_VSID
<< 25))) & HPT_HASH_MASK
;
111 * We assume that the hash table is empty and no
112 * vcpus are using it at this stage. Since we create
113 * at most one HPTE per HPTEG, we just assume entry 7
114 * is available and use it.
116 hpte
= (unsigned long *) (kvm
->arch
.hpt_virt
+ (hash
<< 7));
118 /* HPTE low word - RPN, protection, etc. */
119 hpte
[1] = (pfn
<< PAGE_SHIFT
) | HPTE_R_R
| HPTE_R_C
|
122 hpte
[0] = HPTE_V_1TB_SEG
| (VRMA_VSID
<< (40 - 16)) |
123 (i
<< (VRMA_PAGE_ORDER
- 16)) | HPTE_V_BOLTED
|
124 HPTE_V_LARGE
| HPTE_V_VALID
;
128 int kvmppc_mmu_hv_init(void)
130 unsigned long host_lpid
, rsvd_lpid
;
132 if (!cpu_has_feature(CPU_FTR_HVMODE
))
135 memset(lpid_inuse
, 0, sizeof(lpid_inuse
));
137 if (cpu_has_feature(CPU_FTR_ARCH_206
)) {
138 host_lpid
= mfspr(SPRN_LPID
); /* POWER7 */
139 rsvd_lpid
= LPID_RSVD
;
141 host_lpid
= 0; /* PPC970 */
142 rsvd_lpid
= MAX_LPID_970
;
145 set_bit(host_lpid
, lpid_inuse
);
146 /* rsvd_lpid is reserved for use in partition switching */
147 set_bit(rsvd_lpid
, lpid_inuse
);
152 void kvmppc_mmu_destroy(struct kvm_vcpu
*vcpu
)
156 static void kvmppc_mmu_book3s_64_hv_reset_msr(struct kvm_vcpu
*vcpu
)
158 kvmppc_set_msr(vcpu
, MSR_SF
| MSR_ME
);
161 static int kvmppc_mmu_book3s_64_hv_xlate(struct kvm_vcpu
*vcpu
, gva_t eaddr
,
162 struct kvmppc_pte
*gpte
, bool data
)
167 void kvmppc_mmu_book3s_hv_init(struct kvm_vcpu
*vcpu
)
169 struct kvmppc_mmu
*mmu
= &vcpu
->arch
.mmu
;
171 if (cpu_has_feature(CPU_FTR_ARCH_206
))
172 vcpu
->arch
.slb_nr
= 32; /* POWER7 */
174 vcpu
->arch
.slb_nr
= 64;
176 mmu
->xlate
= kvmppc_mmu_book3s_64_hv_xlate
;
177 mmu
->reset_msr
= kvmppc_mmu_book3s_64_hv_reset_msr
;
179 vcpu
->arch
.hflags
|= BOOK3S_HFLAG_SLB
;