gzvm_vm.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Copyright (c) 2023 MediaTek Inc.
  4. */
  5. #include <linux/anon_inodes.h>
  6. #include <linux/file.h>
  7. #include <linux/kdev_t.h>
  8. #include <linux/mm.h>
  9. #include <linux/module.h>
  10. #include <linux/platform_device.h>
  11. #include <linux/slab.h>
  12. #include <linux/gzvm_drv.h>
  13. #include "gzvm_common.h"
  14. static DEFINE_MUTEX(gzvm_list_lock);
  15. static LIST_HEAD(gzvm_list);
  16. u64 gzvm_gfn_to_hva_memslot(struct gzvm_memslot *memslot, u64 gfn)
  17. {
  18. u64 offset = gfn - memslot->base_gfn;
  19. return memslot->userspace_addr + offset * PAGE_SIZE;
  20. }
  21. /**
  22. * gzvm_find_memslot() - Find memslot containing this @gpa
  23. * @vm: Pointer to struct gzvm
  24. * @gfn: Guest frame number
  25. *
  26. * Return:
  27. * * >=0 - Index of memslot
  28. * * -EFAULT - Not found
  29. */
  30. int gzvm_find_memslot(struct gzvm *vm, u64 gfn)
  31. {
  32. int i;
  33. for (i = 0; i < GZVM_MAX_MEM_REGION; i++) {
  34. if (vm->memslot[i].npages == 0)
  35. continue;
  36. if (gfn >= vm->memslot[i].base_gfn &&
  37. gfn < vm->memslot[i].base_gfn + vm->memslot[i].npages)
  38. return i;
  39. }
  40. return -EFAULT;
  41. }
  42. /**
  43. * register_memslot_addr_range() - Register memory region to GenieZone
  44. * @gzvm: Pointer to struct gzvm
  45. * @memslot: Pointer to struct gzvm_memslot
  46. *
  47. * Return: 0 for success, negative number for error
  48. */
  49. static int
  50. register_memslot_addr_range(struct gzvm *gzvm, struct gzvm_memslot *memslot)
  51. {
  52. struct gzvm_memory_region_ranges *region;
  53. u32 buf_size = PAGE_SIZE * 2;
  54. u64 gfn;
  55. region = alloc_pages_exact(buf_size, GFP_KERNEL);
  56. if (!region)
  57. return -ENOMEM;
  58. region->slot = memslot->slot_id;
  59. region->total_pages = memslot->npages;
  60. gfn = memslot->base_gfn;
  61. region->gpa = PFN_PHYS(gfn);
  62. if (gzvm_arch_set_memregion(gzvm->vm_id, buf_size,
  63. virt_to_phys(region))) {
  64. pr_err("Failed to register memregion to hypervisor\n");
  65. free_pages_exact(region, buf_size);
  66. return -EFAULT;
  67. }
  68. free_pages_exact(region, buf_size);
  69. return 0;
  70. }
  71. /**
  72. * gzvm_vm_ioctl_set_memory_region() - Set memory region of guest
  73. * @gzvm: Pointer to struct gzvm.
  74. * @mem: Input memory region from user.
  75. *
  76. * Return: 0 for success, negative number for error
  77. *
  78. * -EXIO - The memslot is out-of-range
  79. * -EFAULT - Cannot find corresponding vma
  80. * -EINVAL - Region size and VMA size mismatch
  81. */
  82. static int
  83. gzvm_vm_ioctl_set_memory_region(struct gzvm *gzvm,
  84. struct gzvm_userspace_memory_region *mem)
  85. {
  86. int ret;
  87. struct vm_area_struct *vma;
  88. struct gzvm_memslot *memslot;
  89. unsigned long size;
  90. __u32 slot;
  91. slot = mem->slot;
  92. if (slot >= GZVM_MAX_MEM_REGION)
  93. return -ENXIO;
  94. memslot = &gzvm->memslot[slot];
  95. vma = vma_lookup(gzvm->mm, mem->userspace_addr);
  96. if (!vma)
  97. return -EFAULT;
  98. size = vma->vm_end - vma->vm_start;
  99. if (size != mem->memory_size)
  100. return -EINVAL;
  101. memslot->base_gfn = __phys_to_pfn(mem->guest_phys_addr);
  102. memslot->npages = size >> PAGE_SHIFT;
  103. memslot->userspace_addr = mem->userspace_addr;
  104. memslot->vma = vma;
  105. memslot->flags = mem->flags;
  106. memslot->slot_id = mem->slot;
  107. ret = gzvm_arch_memregion_purpose(gzvm, mem);
  108. if (ret) {
  109. pr_err("Failed to config memory region for the specified purpose\n");
  110. return -EFAULT;
  111. }
  112. return register_memslot_addr_range(gzvm, memslot);
  113. }
  114. int gzvm_irqchip_inject_irq(struct gzvm *gzvm, unsigned int vcpu_idx,
  115. u32 irq, bool level)
  116. {
  117. return gzvm_arch_inject_irq(gzvm, vcpu_idx, irq, level);
  118. }
  119. static int gzvm_vm_ioctl_irq_line(struct gzvm *gzvm,
  120. struct gzvm_irq_level *irq_level)
  121. {
  122. u32 irq = irq_level->irq;
  123. u32 vcpu_idx, vcpu2_idx, irq_num;
  124. bool level = irq_level->level;
  125. vcpu_idx = FIELD_GET(GZVM_IRQ_LINE_VCPU, irq);
  126. vcpu2_idx = FIELD_GET(GZVM_IRQ_LINE_VCPU2, irq) * (GZVM_IRQ_VCPU_MASK + 1);
  127. irq_num = FIELD_GET(GZVM_IRQ_LINE_NUM, irq);
  128. return gzvm_irqchip_inject_irq(gzvm, vcpu_idx + vcpu2_idx, irq_num,
  129. level);
  130. }
  131. static int gzvm_vm_ioctl_create_device(struct gzvm *gzvm, void __user *argp)
  132. {
  133. struct gzvm_create_device *gzvm_dev;
  134. void *dev_data = NULL;
  135. int ret;
  136. gzvm_dev = (struct gzvm_create_device *)alloc_pages_exact(PAGE_SIZE,
  137. GFP_KERNEL);
  138. if (!gzvm_dev)
  139. return -ENOMEM;
  140. if (copy_from_user(gzvm_dev, argp, sizeof(*gzvm_dev))) {
  141. ret = -EFAULT;
  142. goto err_free_dev;
  143. }
  144. if (gzvm_dev->attr_addr != 0 && gzvm_dev->attr_size != 0) {
  145. size_t attr_size = gzvm_dev->attr_size;
  146. void __user *attr_addr = (void __user *)gzvm_dev->attr_addr;
  147. /* Size of device specific data should not be over a page. */
  148. if (attr_size > PAGE_SIZE)
  149. return -EINVAL;
  150. dev_data = alloc_pages_exact(attr_size, GFP_KERNEL);
  151. if (!dev_data) {
  152. ret = -ENOMEM;
  153. goto err_free_dev;
  154. }
  155. if (copy_from_user(dev_data, attr_addr, attr_size)) {
  156. ret = -EFAULT;
  157. goto err_free_dev_data;
  158. }
  159. gzvm_dev->attr_addr = virt_to_phys(dev_data);
  160. }
  161. ret = gzvm_arch_create_device(gzvm->vm_id, gzvm_dev);
  162. err_free_dev_data:
  163. if (dev_data)
  164. free_pages_exact(dev_data, 0);
  165. err_free_dev:
  166. free_pages_exact(gzvm_dev, 0);
  167. return ret;
  168. }
  169. static int gzvm_vm_ioctl_enable_cap(struct gzvm *gzvm,
  170. struct gzvm_enable_cap *cap,
  171. void __user *argp)
  172. {
  173. return gzvm_vm_ioctl_arch_enable_cap(gzvm, cap, argp);
  174. }
  175. /* gzvm_vm_ioctl() - Ioctl handler of VM FD */
  176. static long gzvm_vm_ioctl(struct file *filp, unsigned int ioctl,
  177. unsigned long arg)
  178. {
  179. long ret;
  180. void __user *argp = (void __user *)arg;
  181. struct gzvm *gzvm = filp->private_data;
  182. switch (ioctl) {
  183. case GZVM_CHECK_EXTENSION: {
  184. ret = gzvm_dev_ioctl_check_extension(gzvm, arg);
  185. break;
  186. }
  187. case GZVM_CREATE_VCPU: {
  188. ret = gzvm_vm_ioctl_create_vcpu(gzvm, arg);
  189. break;
  190. }
  191. case GZVM_SET_USER_MEMORY_REGION: {
  192. struct gzvm_userspace_memory_region userspace_mem;
  193. if (copy_from_user(&userspace_mem, argp, sizeof(userspace_mem))) {
  194. ret = -EFAULT;
  195. goto out;
  196. }
  197. ret = gzvm_vm_ioctl_set_memory_region(gzvm, &userspace_mem);
  198. break;
  199. }
  200. case GZVM_IRQ_LINE: {
  201. struct gzvm_irq_level irq_event;
  202. if (copy_from_user(&irq_event, argp, sizeof(irq_event))) {
  203. ret = -EFAULT;
  204. goto out;
  205. }
  206. ret = gzvm_vm_ioctl_irq_line(gzvm, &irq_event);
  207. break;
  208. }
  209. case GZVM_CREATE_DEVICE: {
  210. ret = gzvm_vm_ioctl_create_device(gzvm, argp);
  211. break;
  212. }
  213. case GZVM_IRQFD: {
  214. struct gzvm_irqfd data;
  215. if (copy_from_user(&data, argp, sizeof(data))) {
  216. ret = -EFAULT;
  217. goto out;
  218. }
  219. ret = gzvm_irqfd(gzvm, &data);
  220. break;
  221. }
  222. case GZVM_IOEVENTFD: {
  223. struct gzvm_ioeventfd data;
  224. if (copy_from_user(&data, argp, sizeof(data))) {
  225. ret = -EFAULT;
  226. goto out;
  227. }
  228. ret = gzvm_ioeventfd(gzvm, &data);
  229. break;
  230. }
  231. case GZVM_ENABLE_CAP: {
  232. struct gzvm_enable_cap cap;
  233. if (copy_from_user(&cap, argp, sizeof(cap))) {
  234. ret = -EFAULT;
  235. goto out;
  236. }
  237. ret = gzvm_vm_ioctl_enable_cap(gzvm, &cap, argp);
  238. break;
  239. }
  240. case GZVM_SET_DTB_CONFIG: {
  241. struct gzvm_dtb_config cfg;
  242. if (copy_from_user(&cfg, argp, sizeof(cfg))) {
  243. ret = -EFAULT;
  244. goto out;
  245. }
  246. ret = gzvm_arch_set_dtb_config(gzvm, &cfg);
  247. break;
  248. }
  249. default:
  250. ret = -ENOTTY;
  251. }
  252. out:
  253. return ret;
  254. }
  255. static void gzvm_destroy_ppage(struct gzvm *gzvm)
  256. {
  257. struct gzvm_pinned_page *ppage;
  258. struct rb_node *node;
  259. node = rb_first(&gzvm->pinned_pages);
  260. while (node) {
  261. ppage = rb_entry(node, struct gzvm_pinned_page, node);
  262. unpin_user_pages_dirty_lock(&ppage->page, 1, true);
  263. node = rb_next(node);
  264. rb_erase(&ppage->node, &gzvm->pinned_pages);
  265. kfree(ppage);
  266. }
  267. }
  268. static void gzvm_destroy_vm(struct gzvm *gzvm)
  269. {
  270. size_t allocated_size;
  271. pr_debug("VM-%u is going to be destroyed\n", gzvm->vm_id);
  272. mutex_lock(&gzvm->lock);
  273. gzvm_vm_irqfd_release(gzvm);
  274. gzvm_destroy_vcpus(gzvm);
  275. gzvm_arch_destroy_vm(gzvm->vm_id);
  276. mutex_lock(&gzvm_list_lock);
  277. list_del(&gzvm->vm_list);
  278. mutex_unlock(&gzvm_list_lock);
  279. if (gzvm->demand_page_buffer) {
  280. allocated_size = GZVM_BLOCK_BASED_DEMAND_PAGE_SIZE / PAGE_SIZE * sizeof(u64);
  281. free_pages_exact(gzvm->demand_page_buffer, allocated_size);
  282. }
  283. mutex_unlock(&gzvm->lock);
  284. gzvm_destroy_ppage(gzvm);
  285. kfree(gzvm);
  286. }
  287. static int gzvm_vm_release(struct inode *inode, struct file *filp)
  288. {
  289. struct gzvm *gzvm = filp->private_data;
  290. gzvm_destroy_vm(gzvm);
  291. return 0;
  292. }
  293. static const struct file_operations gzvm_vm_fops = {
  294. .release = gzvm_vm_release,
  295. .unlocked_ioctl = gzvm_vm_ioctl,
  296. .llseek = noop_llseek,
  297. };
  298. /**
  299. * setup_vm_demand_paging - Query hypervisor suitable demand page size and set
  300. * @vm: gzvm instance for setting up demand page size
  301. *
  302. * Return: void
  303. */
  304. static void setup_vm_demand_paging(struct gzvm *vm)
  305. {
  306. u32 buf_size = GZVM_BLOCK_BASED_DEMAND_PAGE_SIZE / PAGE_SIZE * sizeof(u64);
  307. struct gzvm_enable_cap cap = {0};
  308. void *buffer;
  309. int ret;
  310. mutex_init(&vm->demand_paging_lock);
  311. buffer = alloc_pages_exact(buf_size, GFP_KERNEL);
  312. if (!buffer) {
  313. /* Fall back to use default page size for demand paging */
  314. vm->demand_page_gran = PAGE_SIZE;
  315. vm->demand_page_buffer = NULL;
  316. return;
  317. }
  318. cap.cap = GZVM_CAP_BLOCK_BASED_DEMAND_PAGING;
  319. cap.args[0] = GZVM_BLOCK_BASED_DEMAND_PAGE_SIZE;
  320. cap.args[1] = (__u64)virt_to_phys(buffer);
  321. /* demand_page_buffer is freed when destroy VM */
  322. vm->demand_page_buffer = buffer;
  323. ret = gzvm_vm_ioctl_enable_cap(vm, &cap, NULL);
  324. if (ret == 0) {
  325. vm->demand_page_gran = GZVM_BLOCK_BASED_DEMAND_PAGE_SIZE;
  326. /* freed when destroy vm */
  327. vm->demand_page_buffer = buffer;
  328. } else {
  329. vm->demand_page_gran = PAGE_SIZE;
  330. vm->demand_page_buffer = NULL;
  331. free_pages_exact(buffer, buf_size);
  332. }
  333. }
  334. static struct gzvm *gzvm_create_vm(unsigned long vm_type)
  335. {
  336. int ret;
  337. struct gzvm *gzvm;
  338. gzvm = kzalloc(sizeof(*gzvm), GFP_KERNEL);
  339. if (!gzvm)
  340. return ERR_PTR(-ENOMEM);
  341. ret = gzvm_arch_create_vm(vm_type);
  342. if (ret < 0) {
  343. kfree(gzvm);
  344. return ERR_PTR(ret);
  345. }
  346. gzvm->vm_id = ret;
  347. gzvm->mm = current->mm;
  348. mutex_init(&gzvm->lock);
  349. gzvm->pinned_pages = RB_ROOT;
  350. ret = gzvm_vm_irqfd_init(gzvm);
  351. if (ret) {
  352. pr_err("Failed to initialize irqfd\n");
  353. kfree(gzvm);
  354. return ERR_PTR(ret);
  355. }
  356. ret = gzvm_init_ioeventfd(gzvm);
  357. if (ret) {
  358. pr_err("Failed to initialize ioeventfd\n");
  359. kfree(gzvm);
  360. return ERR_PTR(ret);
  361. }
  362. setup_vm_demand_paging(gzvm);
  363. mutex_lock(&gzvm_list_lock);
  364. list_add(&gzvm->vm_list, &gzvm_list);
  365. mutex_unlock(&gzvm_list_lock);
  366. pr_debug("VM-%u is created\n", gzvm->vm_id);
  367. return gzvm;
  368. }
  369. /**
  370. * gzvm_dev_ioctl_create_vm - Create vm fd
  371. * @vm_type: VM type. Only supports Linux VM now.
  372. *
  373. * Return: fd of vm, negative if error
  374. */
  375. int gzvm_dev_ioctl_create_vm(unsigned long vm_type)
  376. {
  377. struct gzvm *gzvm;
  378. gzvm = gzvm_create_vm(vm_type);
  379. if (IS_ERR(gzvm))
  380. return PTR_ERR(gzvm);
  381. return anon_inode_getfd("gzvm-vm", &gzvm_vm_fops, gzvm,
  382. O_RDWR | O_CLOEXEC);
  383. }
  384. void gzvm_destroy_all_vms(void)
  385. {
  386. struct gzvm *gzvm, *tmp;
  387. mutex_lock(&gzvm_list_lock);
  388. if (list_empty(&gzvm_list))
  389. goto out;
  390. list_for_each_entry_safe(gzvm, tmp, &gzvm_list, vm_list)
  391. gzvm_destroy_vm(gzvm);
  392. out:
  393. mutex_unlock(&gzvm_list_lock);
  394. }