book3s_64_vio.c 19 KB

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