vm.c 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Copyright (C) 2019 Western Digital Corporation or its affiliates.
  4. *
  5. * Authors:
  6. * Anup Patel <anup.patel@wdc.com>
  7. */
  8. #include <linux/errno.h>
  9. #include <linux/err.h>
  10. #include <linux/module.h>
  11. #include <linux/uaccess.h>
  12. #include <linux/kvm_host.h>
  13. #include <asm/kvm_mmu.h>
  14. const struct kvm_stats_desc kvm_vm_stats_desc[] = {
  15. KVM_GENERIC_VM_STATS()
  16. };
  17. static_assert(ARRAY_SIZE(kvm_vm_stats_desc) ==
  18. sizeof(struct kvm_vm_stat) / sizeof(u64));
  19. const struct kvm_stats_header kvm_vm_stats_header = {
  20. .name_size = KVM_STATS_NAME_SIZE,
  21. .num_desc = ARRAY_SIZE(kvm_vm_stats_desc),
  22. .id_offset = sizeof(struct kvm_stats_header),
  23. .desc_offset = sizeof(struct kvm_stats_header) + KVM_STATS_NAME_SIZE,
  24. .data_offset = sizeof(struct kvm_stats_header) + KVM_STATS_NAME_SIZE +
  25. sizeof(kvm_vm_stats_desc),
  26. };
  27. int kvm_arch_init_vm(struct kvm *kvm, unsigned long type)
  28. {
  29. int r;
  30. r = kvm_riscv_mmu_alloc_pgd(kvm);
  31. if (r)
  32. return r;
  33. r = kvm_riscv_gstage_vmid_init(kvm);
  34. if (r) {
  35. kvm_riscv_mmu_free_pgd(kvm);
  36. return r;
  37. }
  38. kvm_riscv_aia_init_vm(kvm);
  39. kvm_riscv_guest_timer_init(kvm);
  40. return 0;
  41. }
  42. void kvm_arch_destroy_vm(struct kvm *kvm)
  43. {
  44. kvm_destroy_vcpus(kvm);
  45. kvm_riscv_aia_destroy_vm(kvm);
  46. }
  47. int kvm_vm_ioctl_irq_line(struct kvm *kvm, struct kvm_irq_level *irql,
  48. bool line_status)
  49. {
  50. if (!irqchip_in_kernel(kvm))
  51. return -ENXIO;
  52. return kvm_riscv_aia_inject_irq(kvm, irql->irq, irql->level);
  53. }
  54. int kvm_set_msi(struct kvm_kernel_irq_routing_entry *e,
  55. struct kvm *kvm, int irq_source_id,
  56. int level, bool line_status)
  57. {
  58. struct kvm_msi msi;
  59. if (!level)
  60. return -1;
  61. msi.address_lo = e->msi.address_lo;
  62. msi.address_hi = e->msi.address_hi;
  63. msi.data = e->msi.data;
  64. msi.flags = e->msi.flags;
  65. msi.devid = e->msi.devid;
  66. return kvm_riscv_aia_inject_msi(kvm, &msi);
  67. }
  68. static int kvm_riscv_set_irq(struct kvm_kernel_irq_routing_entry *e,
  69. struct kvm *kvm, int irq_source_id,
  70. int level, bool line_status)
  71. {
  72. return kvm_riscv_aia_inject_irq(kvm, e->irqchip.pin, level);
  73. }
  74. int kvm_riscv_setup_default_irq_routing(struct kvm *kvm, u32 lines)
  75. {
  76. struct kvm_irq_routing_entry *ents;
  77. int i, rc;
  78. ents = kzalloc_objs(*ents, lines);
  79. if (!ents)
  80. return -ENOMEM;
  81. for (i = 0; i < lines; i++) {
  82. ents[i].gsi = i;
  83. ents[i].type = KVM_IRQ_ROUTING_IRQCHIP;
  84. ents[i].u.irqchip.irqchip = 0;
  85. ents[i].u.irqchip.pin = i;
  86. }
  87. rc = kvm_set_irq_routing(kvm, ents, lines, 0);
  88. kfree(ents);
  89. return rc;
  90. }
  91. bool kvm_arch_can_set_irq_routing(struct kvm *kvm)
  92. {
  93. return irqchip_in_kernel(kvm);
  94. }
  95. int kvm_set_routing_entry(struct kvm *kvm,
  96. struct kvm_kernel_irq_routing_entry *e,
  97. const struct kvm_irq_routing_entry *ue)
  98. {
  99. int r = -EINVAL;
  100. switch (ue->type) {
  101. case KVM_IRQ_ROUTING_IRQCHIP:
  102. e->set = kvm_riscv_set_irq;
  103. e->irqchip.irqchip = ue->u.irqchip.irqchip;
  104. e->irqchip.pin = ue->u.irqchip.pin;
  105. if ((e->irqchip.pin >= KVM_IRQCHIP_NUM_PINS) ||
  106. (e->irqchip.irqchip >= KVM_NR_IRQCHIPS))
  107. goto out;
  108. break;
  109. case KVM_IRQ_ROUTING_MSI:
  110. e->set = kvm_set_msi;
  111. e->msi.address_lo = ue->u.msi.address_lo;
  112. e->msi.address_hi = ue->u.msi.address_hi;
  113. e->msi.data = ue->u.msi.data;
  114. e->msi.flags = ue->flags;
  115. e->msi.devid = ue->u.msi.devid;
  116. break;
  117. default:
  118. goto out;
  119. }
  120. r = 0;
  121. out:
  122. return r;
  123. }
  124. int kvm_arch_set_irq_inatomic(struct kvm_kernel_irq_routing_entry *e,
  125. struct kvm *kvm, int irq_source_id, int level,
  126. bool line_status)
  127. {
  128. if (!level)
  129. return -EWOULDBLOCK;
  130. switch (e->type) {
  131. case KVM_IRQ_ROUTING_MSI:
  132. return kvm_set_msi(e, kvm, irq_source_id, level, line_status);
  133. case KVM_IRQ_ROUTING_IRQCHIP:
  134. return kvm_riscv_set_irq(e, kvm, irq_source_id,
  135. level, line_status);
  136. }
  137. return -EWOULDBLOCK;
  138. }
  139. bool kvm_arch_irqchip_in_kernel(struct kvm *kvm)
  140. {
  141. return irqchip_in_kernel(kvm);
  142. }
  143. int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext)
  144. {
  145. int r;
  146. switch (ext) {
  147. case KVM_CAP_IRQCHIP:
  148. r = kvm_riscv_aia_available();
  149. break;
  150. case KVM_CAP_IOEVENTFD:
  151. case KVM_CAP_USER_MEMORY:
  152. case KVM_CAP_DESTROY_MEMORY_REGION_WORKS:
  153. case KVM_CAP_ONE_REG:
  154. case KVM_CAP_READONLY_MEM:
  155. case KVM_CAP_MP_STATE:
  156. case KVM_CAP_IMMEDIATE_EXIT:
  157. case KVM_CAP_SET_GUEST_DEBUG:
  158. r = 1;
  159. break;
  160. case KVM_CAP_NR_VCPUS:
  161. r = min_t(unsigned int, num_online_cpus(), KVM_MAX_VCPUS);
  162. break;
  163. case KVM_CAP_MAX_VCPUS:
  164. r = KVM_MAX_VCPUS;
  165. break;
  166. case KVM_CAP_NR_MEMSLOTS:
  167. r = KVM_USER_MEM_SLOTS;
  168. break;
  169. case KVM_CAP_VM_GPA_BITS:
  170. r = kvm_riscv_gstage_gpa_bits;
  171. break;
  172. default:
  173. r = 0;
  174. break;
  175. }
  176. return r;
  177. }
  178. int kvm_vm_ioctl_enable_cap(struct kvm *kvm, struct kvm_enable_cap *cap)
  179. {
  180. switch (cap->cap) {
  181. case KVM_CAP_RISCV_MP_STATE_RESET:
  182. if (cap->flags)
  183. return -EINVAL;
  184. kvm->arch.mp_state_reset = true;
  185. return 0;
  186. default:
  187. return -EINVAL;
  188. }
  189. }
  190. int kvm_arch_vm_ioctl(struct file *filp, unsigned int ioctl, unsigned long arg)
  191. {
  192. return -EINVAL;
  193. }