book3s_64_mmu_hv.c 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387
  1. /*
  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.
  5. *
  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.
  10. *
  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.
  14. *
  15. * Copyright 2010 Paul Mackerras, IBM Corp. <paulus@au1.ibm.com>
  16. */
  17. #include <linux/types.h>
  18. #include <linux/string.h>
  19. #include <linux/kvm.h>
  20. #include <linux/kvm_host.h>
  21. #include <linux/highmem.h>
  22. #include <linux/gfp.h>
  23. #include <linux/slab.h>
  24. #include <linux/hugetlb.h>
  25. #include <linux/vmalloc.h>
  26. #include <asm/tlbflush.h>
  27. #include <asm/kvm_ppc.h>
  28. #include <asm/kvm_book3s.h>
  29. #include <asm/mmu-hash64.h>
  30. #include <asm/hvcall.h>
  31. #include <asm/synch.h>
  32. #include <asm/ppc-opcode.h>
  33. #include <asm/cputable.h>
  34. #define VRMA_VSID 0x1ffffffUL /* 1TB VSID reserved for VRMA */
  35. /* POWER7 has 10-bit LPIDs, PPC970 has 6-bit LPIDs */
  36. #define MAX_LPID_970 63
  37. #define NR_LPIDS (LPID_RSVD + 1)
  38. unsigned long lpid_inuse[BITS_TO_LONGS(NR_LPIDS)];
  39. long kvmppc_alloc_hpt(struct kvm *kvm)
  40. {
  41. unsigned long hpt;
  42. unsigned long lpid;
  43. struct revmap_entry *rev;
  44. /* Allocate guest's hashed page table */
  45. hpt = __get_free_pages(GFP_KERNEL|__GFP_ZERO|__GFP_REPEAT|__GFP_NOWARN,
  46. HPT_ORDER - PAGE_SHIFT);
  47. if (!hpt) {
  48. pr_err("kvm_alloc_hpt: Couldn't alloc HPT\n");
  49. return -ENOMEM;
  50. }
  51. kvm->arch.hpt_virt = hpt;
  52. /* Allocate reverse map array */
  53. rev = vmalloc(sizeof(struct revmap_entry) * HPT_NPTE);
  54. if (!rev) {
  55. pr_err("kvmppc_alloc_hpt: Couldn't alloc reverse map array\n");
  56. goto out_freehpt;
  57. }
  58. kvm->arch.revmap = rev;
  59. /* Allocate the guest's logical partition ID */
  60. do {
  61. lpid = find_first_zero_bit(lpid_inuse, NR_LPIDS);
  62. if (lpid >= NR_LPIDS) {
  63. pr_err("kvm_alloc_hpt: No LPIDs free\n");
  64. goto out_freeboth;
  65. }
  66. } while (test_and_set_bit(lpid, lpid_inuse));
  67. kvm->arch.sdr1 = __pa(hpt) | (HPT_ORDER - 18);
  68. kvm->arch.lpid = lpid;
  69. pr_info("KVM guest htab at %lx, LPID %lx\n", hpt, lpid);
  70. return 0;
  71. out_freeboth:
  72. vfree(rev);
  73. out_freehpt:
  74. free_pages(hpt, HPT_ORDER - PAGE_SHIFT);
  75. return -ENOMEM;
  76. }
  77. void kvmppc_free_hpt(struct kvm *kvm)
  78. {
  79. clear_bit(kvm->arch.lpid, lpid_inuse);
  80. vfree(kvm->arch.revmap);
  81. free_pages(kvm->arch.hpt_virt, HPT_ORDER - PAGE_SHIFT);
  82. }
  83. /* Bits in first HPTE dword for pagesize 4k, 64k or 16M */
  84. static inline unsigned long hpte0_pgsize_encoding(unsigned long pgsize)
  85. {
  86. return (pgsize > 0x1000) ? HPTE_V_LARGE : 0;
  87. }
  88. /* Bits in second HPTE dword for pagesize 4k, 64k or 16M */
  89. static inline unsigned long hpte1_pgsize_encoding(unsigned long pgsize)
  90. {
  91. return (pgsize == 0x10000) ? 0x1000 : 0;
  92. }
  93. void kvmppc_map_vrma(struct kvm_vcpu *vcpu, struct kvm_memory_slot *memslot,
  94. unsigned long porder)
  95. {
  96. unsigned long i;
  97. unsigned long npages;
  98. unsigned long hp_v, hp_r;
  99. unsigned long addr, hash;
  100. unsigned long psize;
  101. unsigned long hp0, hp1;
  102. long ret;
  103. psize = 1ul << porder;
  104. npages = memslot->npages >> (porder - PAGE_SHIFT);
  105. /* VRMA can't be > 1TB */
  106. if (npages > 1ul << (40 - porder))
  107. npages = 1ul << (40 - porder);
  108. /* Can't use more than 1 HPTE per HPTEG */
  109. if (npages > HPT_NPTEG)
  110. npages = HPT_NPTEG;
  111. hp0 = HPTE_V_1TB_SEG | (VRMA_VSID << (40 - 16)) |
  112. HPTE_V_BOLTED | hpte0_pgsize_encoding(psize);
  113. hp1 = hpte1_pgsize_encoding(psize) |
  114. HPTE_R_R | HPTE_R_C | HPTE_R_M | PP_RWXX;
  115. for (i = 0; i < npages; ++i) {
  116. addr = i << porder;
  117. /* can't use hpt_hash since va > 64 bits */
  118. hash = (i ^ (VRMA_VSID ^ (VRMA_VSID << 25))) & HPT_HASH_MASK;
  119. /*
  120. * We assume that the hash table is empty and no
  121. * vcpus are using it at this stage. Since we create
  122. * at most one HPTE per HPTEG, we just assume entry 7
  123. * is available and use it.
  124. */
  125. hash = (hash << 3) + 7;
  126. hp_v = hp0 | ((addr >> 16) & ~0x7fUL);
  127. hp_r = hp1 | addr;
  128. ret = kvmppc_virtmode_h_enter(vcpu, H_EXACT, hash, hp_v, hp_r);
  129. if (ret != H_SUCCESS) {
  130. pr_err("KVM: map_vrma at %lx failed, ret=%ld\n",
  131. addr, ret);
  132. break;
  133. }
  134. }
  135. }
  136. int kvmppc_mmu_hv_init(void)
  137. {
  138. unsigned long host_lpid, rsvd_lpid;
  139. if (!cpu_has_feature(CPU_FTR_HVMODE))
  140. return -EINVAL;
  141. memset(lpid_inuse, 0, sizeof(lpid_inuse));
  142. if (cpu_has_feature(CPU_FTR_ARCH_206)) {
  143. host_lpid = mfspr(SPRN_LPID); /* POWER7 */
  144. rsvd_lpid = LPID_RSVD;
  145. } else {
  146. host_lpid = 0; /* PPC970 */
  147. rsvd_lpid = MAX_LPID_970;
  148. }
  149. set_bit(host_lpid, lpid_inuse);
  150. /* rsvd_lpid is reserved for use in partition switching */
  151. set_bit(rsvd_lpid, lpid_inuse);
  152. return 0;
  153. }
  154. void kvmppc_mmu_destroy(struct kvm_vcpu *vcpu)
  155. {
  156. }
  157. static void kvmppc_mmu_book3s_64_hv_reset_msr(struct kvm_vcpu *vcpu)
  158. {
  159. kvmppc_set_msr(vcpu, MSR_SF | MSR_ME);
  160. }
  161. /*
  162. * This is called to get a reference to a guest page if there isn't
  163. * one already in the kvm->arch.slot_phys[][] arrays.
  164. */
  165. static long kvmppc_get_guest_page(struct kvm *kvm, unsigned long gfn,
  166. struct kvm_memory_slot *memslot,
  167. unsigned long psize)
  168. {
  169. unsigned long start;
  170. long np, err;
  171. struct page *page, *hpage, *pages[1];
  172. unsigned long s, pgsize;
  173. unsigned long *physp;
  174. unsigned int is_io, got, pgorder;
  175. struct vm_area_struct *vma;
  176. unsigned long pfn, i, npages;
  177. physp = kvm->arch.slot_phys[memslot->id];
  178. if (!physp)
  179. return -EINVAL;
  180. if (physp[gfn - memslot->base_gfn])
  181. return 0;
  182. is_io = 0;
  183. got = 0;
  184. page = NULL;
  185. pgsize = psize;
  186. err = -EINVAL;
  187. start = gfn_to_hva_memslot(memslot, gfn);
  188. /* Instantiate and get the page we want access to */
  189. np = get_user_pages_fast(start, 1, 1, pages);
  190. if (np != 1) {
  191. /* Look up the vma for the page */
  192. down_read(&current->mm->mmap_sem);
  193. vma = find_vma(current->mm, start);
  194. if (!vma || vma->vm_start > start ||
  195. start + psize > vma->vm_end ||
  196. !(vma->vm_flags & VM_PFNMAP))
  197. goto up_err;
  198. is_io = hpte_cache_bits(pgprot_val(vma->vm_page_prot));
  199. pfn = vma->vm_pgoff + ((start - vma->vm_start) >> PAGE_SHIFT);
  200. /* check alignment of pfn vs. requested page size */
  201. if (psize > PAGE_SIZE && (pfn & ((psize >> PAGE_SHIFT) - 1)))
  202. goto up_err;
  203. up_read(&current->mm->mmap_sem);
  204. } else {
  205. page = pages[0];
  206. got = KVMPPC_GOT_PAGE;
  207. /* See if this is a large page */
  208. s = PAGE_SIZE;
  209. if (PageHuge(page)) {
  210. hpage = compound_head(page);
  211. s <<= compound_order(hpage);
  212. /* Get the whole large page if slot alignment is ok */
  213. if (s > psize && slot_is_aligned(memslot, s) &&
  214. !(memslot->userspace_addr & (s - 1))) {
  215. start &= ~(s - 1);
  216. pgsize = s;
  217. page = hpage;
  218. }
  219. }
  220. if (s < psize)
  221. goto out;
  222. pfn = page_to_pfn(page);
  223. }
  224. npages = pgsize >> PAGE_SHIFT;
  225. pgorder = __ilog2(npages);
  226. physp += (gfn - memslot->base_gfn) & ~(npages - 1);
  227. spin_lock(&kvm->arch.slot_phys_lock);
  228. for (i = 0; i < npages; ++i) {
  229. if (!physp[i]) {
  230. physp[i] = ((pfn + i) << PAGE_SHIFT) +
  231. got + is_io + pgorder;
  232. got = 0;
  233. }
  234. }
  235. spin_unlock(&kvm->arch.slot_phys_lock);
  236. err = 0;
  237. out:
  238. if (got) {
  239. if (PageHuge(page))
  240. page = compound_head(page);
  241. put_page(page);
  242. }
  243. return err;
  244. up_err:
  245. up_read(&current->mm->mmap_sem);
  246. return err;
  247. }
  248. /*
  249. * We come here on a H_ENTER call from the guest when
  250. * we don't have the requested page pinned already.
  251. */
  252. long kvmppc_virtmode_h_enter(struct kvm_vcpu *vcpu, unsigned long flags,
  253. long pte_index, unsigned long pteh, unsigned long ptel)
  254. {
  255. struct kvm *kvm = vcpu->kvm;
  256. unsigned long psize, gpa, gfn;
  257. struct kvm_memory_slot *memslot;
  258. long ret;
  259. psize = hpte_page_size(pteh, ptel);
  260. if (!psize)
  261. return H_PARAMETER;
  262. /* Find the memslot (if any) for this address */
  263. gpa = (ptel & HPTE_R_RPN) & ~(psize - 1);
  264. gfn = gpa >> PAGE_SHIFT;
  265. memslot = gfn_to_memslot(kvm, gfn);
  266. if (!memslot || (memslot->flags & KVM_MEMSLOT_INVALID))
  267. return H_PARAMETER;
  268. if (!slot_is_aligned(memslot, psize))
  269. return H_PARAMETER;
  270. if (kvmppc_get_guest_page(kvm, gfn, memslot, psize) < 0)
  271. return H_PARAMETER;
  272. preempt_disable();
  273. ret = kvmppc_h_enter(vcpu, flags, pte_index, pteh, ptel);
  274. preempt_enable();
  275. if (ret == H_TOO_HARD) {
  276. /* this can't happen */
  277. pr_err("KVM: Oops, kvmppc_h_enter returned too hard!\n");
  278. ret = H_RESOURCE; /* or something */
  279. }
  280. return ret;
  281. }
  282. static int kvmppc_mmu_book3s_64_hv_xlate(struct kvm_vcpu *vcpu, gva_t eaddr,
  283. struct kvmppc_pte *gpte, bool data)
  284. {
  285. return -ENOENT;
  286. }
  287. void *kvmppc_pin_guest_page(struct kvm *kvm, unsigned long gpa,
  288. unsigned long *nb_ret)
  289. {
  290. struct kvm_memory_slot *memslot;
  291. unsigned long gfn = gpa >> PAGE_SHIFT;
  292. struct page *page;
  293. unsigned long psize, offset;
  294. unsigned long pa;
  295. unsigned long *physp;
  296. memslot = gfn_to_memslot(kvm, gfn);
  297. if (!memslot || (memslot->flags & KVM_MEMSLOT_INVALID))
  298. return NULL;
  299. physp = kvm->arch.slot_phys[memslot->id];
  300. if (!physp)
  301. return NULL;
  302. physp += gfn - memslot->base_gfn;
  303. pa = *physp;
  304. if (!pa) {
  305. if (kvmppc_get_guest_page(kvm, gfn, memslot, PAGE_SIZE) < 0)
  306. return NULL;
  307. pa = *physp;
  308. }
  309. page = pfn_to_page(pa >> PAGE_SHIFT);
  310. psize = PAGE_SIZE;
  311. if (PageHuge(page)) {
  312. page = compound_head(page);
  313. psize <<= compound_order(page);
  314. }
  315. get_page(page);
  316. offset = gpa & (psize - 1);
  317. if (nb_ret)
  318. *nb_ret = psize - offset;
  319. return page_address(page) + offset;
  320. }
  321. void kvmppc_unpin_guest_page(struct kvm *kvm, void *va)
  322. {
  323. struct page *page = virt_to_page(va);
  324. page = compound_head(page);
  325. put_page(page);
  326. }
  327. void kvmppc_mmu_book3s_hv_init(struct kvm_vcpu *vcpu)
  328. {
  329. struct kvmppc_mmu *mmu = &vcpu->arch.mmu;
  330. if (cpu_has_feature(CPU_FTR_ARCH_206))
  331. vcpu->arch.slb_nr = 32; /* POWER7 */
  332. else
  333. vcpu->arch.slb_nr = 64;
  334. mmu->xlate = kvmppc_mmu_book3s_64_hv_xlate;
  335. mmu->reset_msr = kvmppc_mmu_book3s_64_hv_reset_msr;
  336. vcpu->arch.hflags |= BOOK3S_HFLAG_SLB;
  337. }