vm.c 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Copyright (C) 2019 Western Digital Corporation or its affiliates.
  4. *
  5. * Authors:
  6. * Anup Patel <[email protected]>
  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. const struct _kvm_stats_desc kvm_vm_stats_desc[] = {
  14. KVM_GENERIC_VM_STATS()
  15. };
  16. static_assert(ARRAY_SIZE(kvm_vm_stats_desc) ==
  17. sizeof(struct kvm_vm_stat) / sizeof(u64));
  18. const struct kvm_stats_header kvm_vm_stats_header = {
  19. .name_size = KVM_STATS_NAME_SIZE,
  20. .num_desc = ARRAY_SIZE(kvm_vm_stats_desc),
  21. .id_offset = sizeof(struct kvm_stats_header),
  22. .desc_offset = sizeof(struct kvm_stats_header) + KVM_STATS_NAME_SIZE,
  23. .data_offset = sizeof(struct kvm_stats_header) + KVM_STATS_NAME_SIZE +
  24. sizeof(kvm_vm_stats_desc),
  25. };
  26. int kvm_arch_init_vm(struct kvm *kvm, unsigned long type)
  27. {
  28. int r;
  29. r = kvm_riscv_gstage_alloc_pgd(kvm);
  30. if (r)
  31. return r;
  32. r = kvm_riscv_gstage_vmid_init(kvm);
  33. if (r) {
  34. kvm_riscv_gstage_free_pgd(kvm);
  35. return r;
  36. }
  37. kvm_riscv_guest_timer_init(kvm);
  38. return 0;
  39. }
  40. void kvm_arch_destroy_vm(struct kvm *kvm)
  41. {
  42. kvm_destroy_vcpus(kvm);
  43. }
  44. int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext)
  45. {
  46. int r;
  47. switch (ext) {
  48. case KVM_CAP_IOEVENTFD:
  49. case KVM_CAP_DEVICE_CTRL:
  50. case KVM_CAP_USER_MEMORY:
  51. case KVM_CAP_SYNC_MMU:
  52. case KVM_CAP_DESTROY_MEMORY_REGION_WORKS:
  53. case KVM_CAP_ONE_REG:
  54. case KVM_CAP_READONLY_MEM:
  55. case KVM_CAP_MP_STATE:
  56. case KVM_CAP_IMMEDIATE_EXIT:
  57. r = 1;
  58. break;
  59. case KVM_CAP_NR_VCPUS:
  60. r = min_t(unsigned int, num_online_cpus(), KVM_MAX_VCPUS);
  61. break;
  62. case KVM_CAP_MAX_VCPUS:
  63. r = KVM_MAX_VCPUS;
  64. break;
  65. case KVM_CAP_NR_MEMSLOTS:
  66. r = KVM_USER_MEM_SLOTS;
  67. break;
  68. case KVM_CAP_VM_GPA_BITS:
  69. r = kvm_riscv_gstage_gpa_bits();
  70. break;
  71. default:
  72. r = 0;
  73. break;
  74. }
  75. return r;
  76. }
  77. long kvm_arch_vm_ioctl(struct file *filp,
  78. unsigned int ioctl, unsigned long arg)
  79. {
  80. return -EINVAL;
  81. }