book3s_64_mmu_hv.c 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364
  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 got, pgorder;
  175. unsigned long pfn, i, npages;
  176. physp = kvm->arch.slot_phys[memslot->id];
  177. if (!physp)
  178. return -EINVAL;
  179. if (physp[gfn - memslot->base_gfn])
  180. return 0;
  181. page = NULL;
  182. pgsize = psize;
  183. start = gfn_to_hva_memslot(memslot, gfn);
  184. /* Instantiate and get the page we want access to */
  185. np = get_user_pages_fast(start, 1, 1, pages);
  186. if (np != 1)
  187. return -EINVAL;
  188. page = pages[0];
  189. got = KVMPPC_GOT_PAGE;
  190. /* See if this is a large page */
  191. s = PAGE_SIZE;
  192. if (PageHuge(page)) {
  193. hpage = compound_head(page);
  194. s <<= compound_order(hpage);
  195. /* Get the whole large page if slot alignment is ok */
  196. if (s > psize && slot_is_aligned(memslot, s) &&
  197. !(memslot->userspace_addr & (s - 1))) {
  198. start &= ~(s - 1);
  199. pgsize = s;
  200. page = hpage;
  201. }
  202. }
  203. err = -EINVAL;
  204. if (s < psize)
  205. goto out;
  206. pfn = page_to_pfn(page);
  207. npages = pgsize >> PAGE_SHIFT;
  208. pgorder = __ilog2(npages);
  209. physp += (gfn - memslot->base_gfn) & ~(npages - 1);
  210. spin_lock(&kvm->arch.slot_phys_lock);
  211. for (i = 0; i < npages; ++i) {
  212. if (!physp[i]) {
  213. physp[i] = ((pfn + i) << PAGE_SHIFT) + got + pgorder;
  214. got = 0;
  215. }
  216. }
  217. spin_unlock(&kvm->arch.slot_phys_lock);
  218. err = 0;
  219. out:
  220. if (got) {
  221. if (PageHuge(page))
  222. page = compound_head(page);
  223. put_page(page);
  224. }
  225. return err;
  226. }
  227. /*
  228. * We come here on a H_ENTER call from the guest when
  229. * we don't have the requested page pinned already.
  230. */
  231. long kvmppc_virtmode_h_enter(struct kvm_vcpu *vcpu, unsigned long flags,
  232. long pte_index, unsigned long pteh, unsigned long ptel)
  233. {
  234. struct kvm *kvm = vcpu->kvm;
  235. unsigned long psize, gpa, gfn;
  236. struct kvm_memory_slot *memslot;
  237. long ret;
  238. psize = hpte_page_size(pteh, ptel);
  239. if (!psize)
  240. return H_PARAMETER;
  241. /* Find the memslot (if any) for this address */
  242. gpa = (ptel & HPTE_R_RPN) & ~(psize - 1);
  243. gfn = gpa >> PAGE_SHIFT;
  244. memslot = gfn_to_memslot(kvm, gfn);
  245. if (!memslot || (memslot->flags & KVM_MEMSLOT_INVALID))
  246. return H_PARAMETER;
  247. if (!slot_is_aligned(memslot, psize))
  248. return H_PARAMETER;
  249. if (kvmppc_get_guest_page(kvm, gfn, memslot, psize) < 0)
  250. return H_PARAMETER;
  251. preempt_disable();
  252. ret = kvmppc_h_enter(vcpu, flags, pte_index, pteh, ptel);
  253. preempt_enable();
  254. if (ret == H_TOO_HARD) {
  255. /* this can't happen */
  256. pr_err("KVM: Oops, kvmppc_h_enter returned too hard!\n");
  257. ret = H_RESOURCE; /* or something */
  258. }
  259. return ret;
  260. }
  261. static int kvmppc_mmu_book3s_64_hv_xlate(struct kvm_vcpu *vcpu, gva_t eaddr,
  262. struct kvmppc_pte *gpte, bool data)
  263. {
  264. return -ENOENT;
  265. }
  266. void *kvmppc_pin_guest_page(struct kvm *kvm, unsigned long gpa,
  267. unsigned long *nb_ret)
  268. {
  269. struct kvm_memory_slot *memslot;
  270. unsigned long gfn = gpa >> PAGE_SHIFT;
  271. struct page *page;
  272. unsigned long psize, offset;
  273. unsigned long pa;
  274. unsigned long *physp;
  275. memslot = gfn_to_memslot(kvm, gfn);
  276. if (!memslot || (memslot->flags & KVM_MEMSLOT_INVALID))
  277. return NULL;
  278. physp = kvm->arch.slot_phys[memslot->id];
  279. if (!physp)
  280. return NULL;
  281. physp += gfn - memslot->base_gfn;
  282. pa = *physp;
  283. if (!pa) {
  284. if (kvmppc_get_guest_page(kvm, gfn, memslot, PAGE_SIZE) < 0)
  285. return NULL;
  286. pa = *physp;
  287. }
  288. page = pfn_to_page(pa >> PAGE_SHIFT);
  289. psize = PAGE_SIZE;
  290. if (PageHuge(page)) {
  291. page = compound_head(page);
  292. psize <<= compound_order(page);
  293. }
  294. get_page(page);
  295. offset = gpa & (psize - 1);
  296. if (nb_ret)
  297. *nb_ret = psize - offset;
  298. return page_address(page) + offset;
  299. }
  300. void kvmppc_unpin_guest_page(struct kvm *kvm, void *va)
  301. {
  302. struct page *page = virt_to_page(va);
  303. page = compound_head(page);
  304. put_page(page);
  305. }
  306. void kvmppc_mmu_book3s_hv_init(struct kvm_vcpu *vcpu)
  307. {
  308. struct kvmppc_mmu *mmu = &vcpu->arch.mmu;
  309. if (cpu_has_feature(CPU_FTR_ARCH_206))
  310. vcpu->arch.slb_nr = 32; /* POWER7 */
  311. else
  312. vcpu->arch.slb_nr = 64;
  313. mmu->xlate = kvmppc_mmu_book3s_64_hv_xlate;
  314. mmu->reset_msr = kvmppc_mmu_book3s_64_hv_reset_msr;
  315. vcpu->arch.hflags |= BOOK3S_HFLAG_SLB;
  316. }