book3s_64_vio.c 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. *
  4. * Copyright 2010 Paul Mackerras, IBM Corp. <[email protected]>
  5. * Copyright 2011 David Gibson, IBM Corporation <[email protected]>
  6. * Copyright 2016 Alexey Kardashevskiy, IBM Corporation <[email protected]>
  7. */
  8. #include <linux/types.h>
  9. #include <linux/string.h>
  10. #include <linux/kvm.h>
  11. #include <linux/kvm_host.h>
  12. #include <linux/highmem.h>
  13. #include <linux/gfp.h>
  14. #include <linux/slab.h>
  15. #include <linux/sched/signal.h>
  16. #include <linux/hugetlb.h>
  17. #include <linux/list.h>
  18. #include <linux/anon_inodes.h>
  19. #include <linux/iommu.h>
  20. #include <linux/file.h>
  21. #include <linux/mm.h>
  22. #include <asm/kvm_ppc.h>
  23. #include <asm/kvm_book3s.h>
  24. #include <asm/book3s/64/mmu-hash.h>
  25. #include <asm/hvcall.h>
  26. #include <asm/synch.h>
  27. #include <asm/ppc-opcode.h>
  28. #include <asm/udbg.h>
  29. #include <asm/iommu.h>
  30. #include <asm/tce.h>
  31. #include <asm/mmu_context.h>
  32. static struct kvmppc_spapr_tce_table *kvmppc_find_table(struct kvm *kvm,
  33. unsigned long liobn)
  34. {
  35. struct kvmppc_spapr_tce_table *stt;
  36. list_for_each_entry_lockless(stt, &kvm->arch.spapr_tce_tables, list)
  37. if (stt->liobn == liobn)
  38. return stt;
  39. return NULL;
  40. }
  41. static unsigned long kvmppc_tce_pages(unsigned long iommu_pages)
  42. {
  43. return ALIGN(iommu_pages * sizeof(u64), PAGE_SIZE) / PAGE_SIZE;
  44. }
  45. static unsigned long kvmppc_stt_pages(unsigned long tce_pages)
  46. {
  47. unsigned long stt_bytes = sizeof(struct kvmppc_spapr_tce_table) +
  48. (tce_pages * sizeof(struct page *));
  49. return tce_pages + ALIGN(stt_bytes, PAGE_SIZE) / PAGE_SIZE;
  50. }
  51. static void kvm_spapr_tce_iommu_table_free(struct rcu_head *head)
  52. {
  53. struct kvmppc_spapr_tce_iommu_table *stit = container_of(head,
  54. struct kvmppc_spapr_tce_iommu_table, rcu);
  55. iommu_tce_table_put(stit->tbl);
  56. kfree(stit);
  57. }
  58. static void kvm_spapr_tce_liobn_put(struct kref *kref)
  59. {
  60. struct kvmppc_spapr_tce_iommu_table *stit = container_of(kref,
  61. struct kvmppc_spapr_tce_iommu_table, kref);
  62. list_del_rcu(&stit->next);
  63. call_rcu(&stit->rcu, kvm_spapr_tce_iommu_table_free);
  64. }
  65. extern void kvm_spapr_tce_release_iommu_group(struct kvm *kvm,
  66. struct iommu_group *grp)
  67. {
  68. int i;
  69. struct kvmppc_spapr_tce_table *stt;
  70. struct kvmppc_spapr_tce_iommu_table *stit, *tmp;
  71. struct iommu_table_group *table_group = NULL;
  72. rcu_read_lock();
  73. list_for_each_entry_rcu(stt, &kvm->arch.spapr_tce_tables, list) {
  74. table_group = iommu_group_get_iommudata(grp);
  75. if (WARN_ON(!table_group))
  76. continue;
  77. list_for_each_entry_safe(stit, tmp, &stt->iommu_tables, next) {
  78. for (i = 0; i < IOMMU_TABLE_GROUP_MAX_TABLES; ++i) {
  79. if (table_group->tables[i] != stit->tbl)
  80. continue;
  81. kref_put(&stit->kref, kvm_spapr_tce_liobn_put);
  82. }
  83. }
  84. cond_resched_rcu();
  85. }
  86. rcu_read_unlock();
  87. }
  88. extern long kvm_spapr_tce_attach_iommu_group(struct kvm *kvm, int tablefd,
  89. struct iommu_group *grp)
  90. {
  91. struct kvmppc_spapr_tce_table *stt = NULL;
  92. bool found = false;
  93. struct iommu_table *tbl = NULL;
  94. struct iommu_table_group *table_group;
  95. long i;
  96. struct kvmppc_spapr_tce_iommu_table *stit;
  97. struct fd f;
  98. f = fdget(tablefd);
  99. if (!f.file)
  100. return -EBADF;
  101. rcu_read_lock();
  102. list_for_each_entry_rcu(stt, &kvm->arch.spapr_tce_tables, list) {
  103. if (stt == f.file->private_data) {
  104. found = true;
  105. break;
  106. }
  107. }
  108. rcu_read_unlock();
  109. fdput(f);
  110. if (!found)
  111. return -EINVAL;
  112. table_group = iommu_group_get_iommudata(grp);
  113. if (WARN_ON(!table_group))
  114. return -EFAULT;
  115. for (i = 0; i < IOMMU_TABLE_GROUP_MAX_TABLES; ++i) {
  116. struct iommu_table *tbltmp = table_group->tables[i];
  117. if (!tbltmp)
  118. continue;
  119. /* Make sure hardware table parameters are compatible */
  120. if ((tbltmp->it_page_shift <= stt->page_shift) &&
  121. (tbltmp->it_offset << tbltmp->it_page_shift ==
  122. stt->offset << stt->page_shift) &&
  123. (tbltmp->it_size << tbltmp->it_page_shift >=
  124. stt->size << stt->page_shift)) {
  125. /*
  126. * Reference the table to avoid races with
  127. * add/remove DMA windows.
  128. */
  129. tbl = iommu_tce_table_get(tbltmp);
  130. break;
  131. }
  132. }
  133. if (!tbl)
  134. return -EINVAL;
  135. rcu_read_lock();
  136. list_for_each_entry_rcu(stit, &stt->iommu_tables, next) {
  137. if (tbl != stit->tbl)
  138. continue;
  139. if (!kref_get_unless_zero(&stit->kref)) {
  140. /* stit is being destroyed */
  141. iommu_tce_table_put(tbl);
  142. rcu_read_unlock();
  143. return -ENOTTY;
  144. }
  145. /*
  146. * The table is already known to this KVM, we just increased
  147. * its KVM reference counter and can return.
  148. */
  149. rcu_read_unlock();
  150. return 0;
  151. }
  152. rcu_read_unlock();
  153. stit = kzalloc(sizeof(*stit), GFP_KERNEL);
  154. if (!stit) {
  155. iommu_tce_table_put(tbl);
  156. return -ENOMEM;
  157. }
  158. stit->tbl = tbl;
  159. kref_init(&stit->kref);
  160. list_add_rcu(&stit->next, &stt->iommu_tables);
  161. return 0;
  162. }
  163. static void release_spapr_tce_table(struct rcu_head *head)
  164. {
  165. struct kvmppc_spapr_tce_table *stt = container_of(head,
  166. struct kvmppc_spapr_tce_table, rcu);
  167. unsigned long i, npages = kvmppc_tce_pages(stt->size);
  168. for (i = 0; i < npages; i++)
  169. if (stt->pages[i])
  170. __free_page(stt->pages[i]);
  171. kfree(stt);
  172. }
  173. static struct page *kvm_spapr_get_tce_page(struct kvmppc_spapr_tce_table *stt,
  174. unsigned long sttpage)
  175. {
  176. struct page *page = stt->pages[sttpage];
  177. if (page)
  178. return page;
  179. mutex_lock(&stt->alloc_lock);
  180. page = stt->pages[sttpage];
  181. if (!page) {
  182. page = alloc_page(GFP_KERNEL | __GFP_ZERO);
  183. WARN_ON_ONCE(!page);
  184. if (page)
  185. stt->pages[sttpage] = page;
  186. }
  187. mutex_unlock(&stt->alloc_lock);
  188. return page;
  189. }
  190. static vm_fault_t kvm_spapr_tce_fault(struct vm_fault *vmf)
  191. {
  192. struct kvmppc_spapr_tce_table *stt = vmf->vma->vm_file->private_data;
  193. struct page *page;
  194. if (vmf->pgoff >= kvmppc_tce_pages(stt->size))
  195. return VM_FAULT_SIGBUS;
  196. page = kvm_spapr_get_tce_page(stt, vmf->pgoff);
  197. if (!page)
  198. return VM_FAULT_OOM;
  199. get_page(page);
  200. vmf->page = page;
  201. return 0;
  202. }
  203. static const struct vm_operations_struct kvm_spapr_tce_vm_ops = {
  204. .fault = kvm_spapr_tce_fault,
  205. };
  206. static int kvm_spapr_tce_mmap(struct file *file, struct vm_area_struct *vma)
  207. {
  208. vma->vm_ops = &kvm_spapr_tce_vm_ops;
  209. return 0;
  210. }
  211. static int kvm_spapr_tce_release(struct inode *inode, struct file *filp)
  212. {
  213. struct kvmppc_spapr_tce_table *stt = filp->private_data;
  214. struct kvmppc_spapr_tce_iommu_table *stit, *tmp;
  215. struct kvm *kvm = stt->kvm;
  216. mutex_lock(&kvm->lock);
  217. list_del_rcu(&stt->list);
  218. mutex_unlock(&kvm->lock);
  219. list_for_each_entry_safe(stit, tmp, &stt->iommu_tables, next) {
  220. WARN_ON(!kref_read(&stit->kref));
  221. while (1) {
  222. if (kref_put(&stit->kref, kvm_spapr_tce_liobn_put))
  223. break;
  224. }
  225. }
  226. account_locked_vm(kvm->mm,
  227. kvmppc_stt_pages(kvmppc_tce_pages(stt->size)), false);
  228. kvm_put_kvm(stt->kvm);
  229. call_rcu(&stt->rcu, release_spapr_tce_table);
  230. return 0;
  231. }
  232. static const struct file_operations kvm_spapr_tce_fops = {
  233. .mmap = kvm_spapr_tce_mmap,
  234. .release = kvm_spapr_tce_release,
  235. };
  236. long kvm_vm_ioctl_create_spapr_tce(struct kvm *kvm,
  237. struct kvm_create_spapr_tce_64 *args)
  238. {
  239. struct kvmppc_spapr_tce_table *stt = NULL;
  240. struct kvmppc_spapr_tce_table *siter;
  241. struct mm_struct *mm = kvm->mm;
  242. unsigned long npages, size = args->size;
  243. int ret;
  244. if (!args->size || args->page_shift < 12 || args->page_shift > 34 ||
  245. (args->offset + args->size > (ULLONG_MAX >> args->page_shift)))
  246. return -EINVAL;
  247. npages = kvmppc_tce_pages(size);
  248. ret = account_locked_vm(mm, kvmppc_stt_pages(npages), true);
  249. if (ret)
  250. return ret;
  251. ret = -ENOMEM;
  252. stt = kzalloc(struct_size(stt, pages, npages), GFP_KERNEL | __GFP_NOWARN);
  253. if (!stt)
  254. goto fail_acct;
  255. stt->liobn = args->liobn;
  256. stt->page_shift = args->page_shift;
  257. stt->offset = args->offset;
  258. stt->size = size;
  259. stt->kvm = kvm;
  260. mutex_init(&stt->alloc_lock);
  261. INIT_LIST_HEAD_RCU(&stt->iommu_tables);
  262. mutex_lock(&kvm->lock);
  263. /* Check this LIOBN hasn't been previously allocated */
  264. ret = 0;
  265. list_for_each_entry(siter, &kvm->arch.spapr_tce_tables, list) {
  266. if (siter->liobn == args->liobn) {
  267. ret = -EBUSY;
  268. break;
  269. }
  270. }
  271. kvm_get_kvm(kvm);
  272. if (!ret)
  273. ret = anon_inode_getfd("kvm-spapr-tce", &kvm_spapr_tce_fops,
  274. stt, O_RDWR | O_CLOEXEC);
  275. if (ret >= 0)
  276. list_add_rcu(&stt->list, &kvm->arch.spapr_tce_tables);
  277. else
  278. kvm_put_kvm_no_destroy(kvm);
  279. mutex_unlock(&kvm->lock);
  280. if (ret >= 0)
  281. return ret;
  282. kfree(stt);
  283. fail_acct:
  284. account_locked_vm(mm, kvmppc_stt_pages(npages), false);
  285. return ret;
  286. }
  287. static long kvmppc_tce_to_ua(struct kvm *kvm, unsigned long tce,
  288. unsigned long *ua)
  289. {
  290. unsigned long gfn = tce >> PAGE_SHIFT;
  291. struct kvm_memory_slot *memslot;
  292. memslot = __gfn_to_memslot(kvm_memslots(kvm), gfn);
  293. if (!memslot)
  294. return -EINVAL;
  295. *ua = __gfn_to_hva_memslot(memslot, gfn) |
  296. (tce & ~(PAGE_MASK | TCE_PCI_READ | TCE_PCI_WRITE));
  297. return 0;
  298. }
  299. static long kvmppc_tce_validate(struct kvmppc_spapr_tce_table *stt,
  300. unsigned long tce)
  301. {
  302. unsigned long gpa = tce & ~(TCE_PCI_READ | TCE_PCI_WRITE);
  303. enum dma_data_direction dir = iommu_tce_direction(tce);
  304. struct kvmppc_spapr_tce_iommu_table *stit;
  305. unsigned long ua = 0;
  306. /* Allow userspace to poison TCE table */
  307. if (dir == DMA_NONE)
  308. return H_SUCCESS;
  309. if (iommu_tce_check_gpa(stt->page_shift, gpa))
  310. return H_TOO_HARD;
  311. if (kvmppc_tce_to_ua(stt->kvm, tce, &ua))
  312. return H_TOO_HARD;
  313. rcu_read_lock();
  314. list_for_each_entry_rcu(stit, &stt->iommu_tables, next) {
  315. unsigned long hpa = 0;
  316. struct mm_iommu_table_group_mem_t *mem;
  317. long shift = stit->tbl->it_page_shift;
  318. mem = mm_iommu_lookup(stt->kvm->mm, ua, 1ULL << shift);
  319. if (!mem || mm_iommu_ua_to_hpa(mem, ua, shift, &hpa)) {
  320. rcu_read_unlock();
  321. return H_TOO_HARD;
  322. }
  323. }
  324. rcu_read_unlock();
  325. return H_SUCCESS;
  326. }
  327. /*
  328. * Handles TCE requests for emulated devices.
  329. * Puts guest TCE values to the table and expects user space to convert them.
  330. * Cannot fail so kvmppc_tce_validate must be called before it.
  331. */
  332. static void kvmppc_tce_put(struct kvmppc_spapr_tce_table *stt,
  333. unsigned long idx, unsigned long tce)
  334. {
  335. struct page *page;
  336. u64 *tbl;
  337. unsigned long sttpage;
  338. idx -= stt->offset;
  339. sttpage = idx / TCES_PER_PAGE;
  340. page = stt->pages[sttpage];
  341. if (!page) {
  342. /* We allow any TCE, not just with read|write permissions */
  343. if (!tce)
  344. return;
  345. page = kvm_spapr_get_tce_page(stt, sttpage);
  346. if (!page)
  347. return;
  348. }
  349. tbl = page_to_virt(page);
  350. tbl[idx % TCES_PER_PAGE] = tce;
  351. }
  352. static void kvmppc_clear_tce(struct mm_struct *mm, struct kvmppc_spapr_tce_table *stt,
  353. struct iommu_table *tbl, unsigned long entry)
  354. {
  355. unsigned long i;
  356. unsigned long subpages = 1ULL << (stt->page_shift - tbl->it_page_shift);
  357. unsigned long io_entry = entry << (stt->page_shift - tbl->it_page_shift);
  358. for (i = 0; i < subpages; ++i) {
  359. unsigned long hpa = 0;
  360. enum dma_data_direction dir = DMA_NONE;
  361. iommu_tce_xchg_no_kill(mm, tbl, io_entry + i, &hpa, &dir);
  362. }
  363. }
  364. static long kvmppc_tce_iommu_mapped_dec(struct kvm *kvm,
  365. struct iommu_table *tbl, unsigned long entry)
  366. {
  367. struct mm_iommu_table_group_mem_t *mem = NULL;
  368. const unsigned long pgsize = 1ULL << tbl->it_page_shift;
  369. __be64 *pua = IOMMU_TABLE_USERSPACE_ENTRY_RO(tbl, entry);
  370. if (!pua)
  371. return H_SUCCESS;
  372. mem = mm_iommu_lookup(kvm->mm, be64_to_cpu(*pua), pgsize);
  373. if (!mem)
  374. return H_TOO_HARD;
  375. mm_iommu_mapped_dec(mem);
  376. *pua = cpu_to_be64(0);
  377. return H_SUCCESS;
  378. }
  379. static long kvmppc_tce_iommu_do_unmap(struct kvm *kvm,
  380. struct iommu_table *tbl, unsigned long entry)
  381. {
  382. enum dma_data_direction dir = DMA_NONE;
  383. unsigned long hpa = 0;
  384. long ret;
  385. if (WARN_ON_ONCE(iommu_tce_xchg_no_kill(kvm->mm, tbl, entry, &hpa,
  386. &dir)))
  387. return H_TOO_HARD;
  388. if (dir == DMA_NONE)
  389. return H_SUCCESS;
  390. ret = kvmppc_tce_iommu_mapped_dec(kvm, tbl, entry);
  391. if (ret != H_SUCCESS)
  392. iommu_tce_xchg_no_kill(kvm->mm, tbl, entry, &hpa, &dir);
  393. return ret;
  394. }
  395. static long kvmppc_tce_iommu_unmap(struct kvm *kvm,
  396. struct kvmppc_spapr_tce_table *stt, struct iommu_table *tbl,
  397. unsigned long entry)
  398. {
  399. unsigned long i, ret = H_SUCCESS;
  400. unsigned long subpages = 1ULL << (stt->page_shift - tbl->it_page_shift);
  401. unsigned long io_entry = entry * subpages;
  402. for (i = 0; i < subpages; ++i) {
  403. ret = kvmppc_tce_iommu_do_unmap(kvm, tbl, io_entry + i);
  404. if (ret != H_SUCCESS)
  405. break;
  406. }
  407. iommu_tce_kill(tbl, io_entry, subpages);
  408. return ret;
  409. }
  410. static long kvmppc_tce_iommu_do_map(struct kvm *kvm, struct iommu_table *tbl,
  411. unsigned long entry, unsigned long ua,
  412. enum dma_data_direction dir)
  413. {
  414. long ret;
  415. unsigned long hpa;
  416. __be64 *pua = IOMMU_TABLE_USERSPACE_ENTRY(tbl, entry);
  417. struct mm_iommu_table_group_mem_t *mem;
  418. if (!pua)
  419. /* it_userspace allocation might be delayed */
  420. return H_TOO_HARD;
  421. mem = mm_iommu_lookup(kvm->mm, ua, 1ULL << tbl->it_page_shift);
  422. if (!mem)
  423. /* This only handles v2 IOMMU type, v1 is handled via ioctl() */
  424. return H_TOO_HARD;
  425. if (WARN_ON_ONCE(mm_iommu_ua_to_hpa(mem, ua, tbl->it_page_shift, &hpa)))
  426. return H_TOO_HARD;
  427. if (mm_iommu_mapped_inc(mem))
  428. return H_TOO_HARD;
  429. ret = iommu_tce_xchg_no_kill(kvm->mm, tbl, entry, &hpa, &dir);
  430. if (WARN_ON_ONCE(ret)) {
  431. mm_iommu_mapped_dec(mem);
  432. return H_TOO_HARD;
  433. }
  434. if (dir != DMA_NONE)
  435. kvmppc_tce_iommu_mapped_dec(kvm, tbl, entry);
  436. *pua = cpu_to_be64(ua);
  437. return 0;
  438. }
  439. static long kvmppc_tce_iommu_map(struct kvm *kvm,
  440. struct kvmppc_spapr_tce_table *stt, struct iommu_table *tbl,
  441. unsigned long entry, unsigned long ua,
  442. enum dma_data_direction dir)
  443. {
  444. unsigned long i, pgoff, ret = H_SUCCESS;
  445. unsigned long subpages = 1ULL << (stt->page_shift - tbl->it_page_shift);
  446. unsigned long io_entry = entry * subpages;
  447. for (i = 0, pgoff = 0; i < subpages;
  448. ++i, pgoff += IOMMU_PAGE_SIZE(tbl)) {
  449. ret = kvmppc_tce_iommu_do_map(kvm, tbl,
  450. io_entry + i, ua + pgoff, dir);
  451. if (ret != H_SUCCESS)
  452. break;
  453. }
  454. iommu_tce_kill(tbl, io_entry, subpages);
  455. return ret;
  456. }
  457. long kvmppc_h_put_tce(struct kvm_vcpu *vcpu, unsigned long liobn,
  458. unsigned long ioba, unsigned long tce)
  459. {
  460. struct kvmppc_spapr_tce_table *stt;
  461. long ret, idx;
  462. struct kvmppc_spapr_tce_iommu_table *stit;
  463. unsigned long entry, ua = 0;
  464. enum dma_data_direction dir;
  465. /* udbg_printf("H_PUT_TCE(): liobn=0x%lx ioba=0x%lx, tce=0x%lx\n", */
  466. /* liobn, ioba, tce); */
  467. stt = kvmppc_find_table(vcpu->kvm, liobn);
  468. if (!stt)
  469. return H_TOO_HARD;
  470. ret = kvmppc_ioba_validate(stt, ioba, 1);
  471. if (ret != H_SUCCESS)
  472. return ret;
  473. idx = srcu_read_lock(&vcpu->kvm->srcu);
  474. ret = kvmppc_tce_validate(stt, tce);
  475. if (ret != H_SUCCESS)
  476. goto unlock_exit;
  477. dir = iommu_tce_direction(tce);
  478. if ((dir != DMA_NONE) && kvmppc_tce_to_ua(vcpu->kvm, tce, &ua)) {
  479. ret = H_PARAMETER;
  480. goto unlock_exit;
  481. }
  482. entry = ioba >> stt->page_shift;
  483. list_for_each_entry_lockless(stit, &stt->iommu_tables, next) {
  484. if (dir == DMA_NONE)
  485. ret = kvmppc_tce_iommu_unmap(vcpu->kvm, stt,
  486. stit->tbl, entry);
  487. else
  488. ret = kvmppc_tce_iommu_map(vcpu->kvm, stt, stit->tbl,
  489. entry, ua, dir);
  490. if (ret != H_SUCCESS) {
  491. kvmppc_clear_tce(vcpu->kvm->mm, stt, stit->tbl, entry);
  492. goto unlock_exit;
  493. }
  494. }
  495. kvmppc_tce_put(stt, entry, tce);
  496. unlock_exit:
  497. srcu_read_unlock(&vcpu->kvm->srcu, idx);
  498. return ret;
  499. }
  500. EXPORT_SYMBOL_GPL(kvmppc_h_put_tce);
  501. long kvmppc_h_put_tce_indirect(struct kvm_vcpu *vcpu,
  502. unsigned long liobn, unsigned long ioba,
  503. unsigned long tce_list, unsigned long npages)
  504. {
  505. struct kvmppc_spapr_tce_table *stt;
  506. long i, ret = H_SUCCESS, idx;
  507. unsigned long entry, ua = 0;
  508. u64 __user *tces;
  509. u64 tce;
  510. struct kvmppc_spapr_tce_iommu_table *stit;
  511. stt = kvmppc_find_table(vcpu->kvm, liobn);
  512. if (!stt)
  513. return H_TOO_HARD;
  514. entry = ioba >> stt->page_shift;
  515. /*
  516. * SPAPR spec says that the maximum size of the list is 512 TCEs
  517. * so the whole table fits in 4K page
  518. */
  519. if (npages > 512)
  520. return H_PARAMETER;
  521. if (tce_list & (SZ_4K - 1))
  522. return H_PARAMETER;
  523. ret = kvmppc_ioba_validate(stt, ioba, npages);
  524. if (ret != H_SUCCESS)
  525. return ret;
  526. idx = srcu_read_lock(&vcpu->kvm->srcu);
  527. if (kvmppc_tce_to_ua(vcpu->kvm, tce_list, &ua)) {
  528. ret = H_TOO_HARD;
  529. goto unlock_exit;
  530. }
  531. tces = (u64 __user *) ua;
  532. for (i = 0; i < npages; ++i) {
  533. if (get_user(tce, tces + i)) {
  534. ret = H_TOO_HARD;
  535. goto unlock_exit;
  536. }
  537. tce = be64_to_cpu(tce);
  538. ret = kvmppc_tce_validate(stt, tce);
  539. if (ret != H_SUCCESS)
  540. goto unlock_exit;
  541. }
  542. for (i = 0; i < npages; ++i) {
  543. /*
  544. * This looks unsafe, because we validate, then regrab
  545. * the TCE from userspace which could have been changed by
  546. * another thread.
  547. *
  548. * But it actually is safe, because the relevant checks will be
  549. * re-executed in the following code. If userspace tries to
  550. * change this dodgily it will result in a messier failure mode
  551. * but won't threaten the host.
  552. */
  553. if (get_user(tce, tces + i)) {
  554. ret = H_TOO_HARD;
  555. goto unlock_exit;
  556. }
  557. tce = be64_to_cpu(tce);
  558. if (kvmppc_tce_to_ua(vcpu->kvm, tce, &ua)) {
  559. ret = H_PARAMETER;
  560. goto unlock_exit;
  561. }
  562. list_for_each_entry_lockless(stit, &stt->iommu_tables, next) {
  563. ret = kvmppc_tce_iommu_map(vcpu->kvm, stt,
  564. stit->tbl, entry + i, ua,
  565. iommu_tce_direction(tce));
  566. if (ret != H_SUCCESS) {
  567. kvmppc_clear_tce(vcpu->kvm->mm, stt, stit->tbl,
  568. entry + i);
  569. goto unlock_exit;
  570. }
  571. }
  572. kvmppc_tce_put(stt, entry + i, tce);
  573. }
  574. unlock_exit:
  575. srcu_read_unlock(&vcpu->kvm->srcu, idx);
  576. return ret;
  577. }
  578. EXPORT_SYMBOL_GPL(kvmppc_h_put_tce_indirect);
  579. long kvmppc_h_stuff_tce(struct kvm_vcpu *vcpu,
  580. unsigned long liobn, unsigned long ioba,
  581. unsigned long tce_value, unsigned long npages)
  582. {
  583. struct kvmppc_spapr_tce_table *stt;
  584. long i, ret;
  585. struct kvmppc_spapr_tce_iommu_table *stit;
  586. stt = kvmppc_find_table(vcpu->kvm, liobn);
  587. if (!stt)
  588. return H_TOO_HARD;
  589. ret = kvmppc_ioba_validate(stt, ioba, npages);
  590. if (ret != H_SUCCESS)
  591. return ret;
  592. /* Check permission bits only to allow userspace poison TCE for debug */
  593. if (tce_value & (TCE_PCI_WRITE | TCE_PCI_READ))
  594. return H_PARAMETER;
  595. list_for_each_entry_lockless(stit, &stt->iommu_tables, next) {
  596. unsigned long entry = ioba >> stt->page_shift;
  597. for (i = 0; i < npages; ++i) {
  598. ret = kvmppc_tce_iommu_unmap(vcpu->kvm, stt,
  599. stit->tbl, entry + i);
  600. if (ret == H_SUCCESS)
  601. continue;
  602. if (ret == H_TOO_HARD)
  603. return ret;
  604. WARN_ON_ONCE(1);
  605. kvmppc_clear_tce(vcpu->kvm->mm, stt, stit->tbl, entry + i);
  606. }
  607. }
  608. for (i = 0; i < npages; ++i, ioba += (1ULL << stt->page_shift))
  609. kvmppc_tce_put(stt, ioba >> stt->page_shift, tce_value);
  610. return ret;
  611. }
  612. EXPORT_SYMBOL_GPL(kvmppc_h_stuff_tce);
  613. long kvmppc_h_get_tce(struct kvm_vcpu *vcpu, unsigned long liobn,
  614. unsigned long ioba)
  615. {
  616. struct kvmppc_spapr_tce_table *stt;
  617. long ret;
  618. unsigned long idx;
  619. struct page *page;
  620. u64 *tbl;
  621. stt = kvmppc_find_table(vcpu->kvm, liobn);
  622. if (!stt)
  623. return H_TOO_HARD;
  624. ret = kvmppc_ioba_validate(stt, ioba, 1);
  625. if (ret != H_SUCCESS)
  626. return ret;
  627. idx = (ioba >> stt->page_shift) - stt->offset;
  628. page = stt->pages[idx / TCES_PER_PAGE];
  629. if (!page) {
  630. vcpu->arch.regs.gpr[4] = 0;
  631. return H_SUCCESS;
  632. }
  633. tbl = (u64 *)page_address(page);
  634. vcpu->arch.regs.gpr[4] = tbl[idx % TCES_PER_PAGE];
  635. return H_SUCCESS;
  636. }
  637. EXPORT_SYMBOL_GPL(kvmppc_h_get_tce);