kvm.h 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
  2. /*
  3. * Copyright (C) 2019 Western Digital Corporation or its affiliates.
  4. *
  5. * Authors:
  6. * Anup Patel <anup.patel@wdc.com>
  7. */
  8. #ifndef __LINUX_KVM_RISCV_H
  9. #define __LINUX_KVM_RISCV_H
  10. #ifndef __ASSEMBLY__
  11. #include <linux/types.h>
  12. #include <asm/ptrace.h>
  13. #define __KVM_HAVE_READONLY_MEM
  14. #define KVM_COALESCED_MMIO_PAGE_OFFSET 1
  15. #define KVM_INTERRUPT_SET -1U
  16. #define KVM_INTERRUPT_UNSET -2U
  17. /* for KVM_GET_REGS and KVM_SET_REGS */
  18. struct kvm_regs {
  19. };
  20. /* for KVM_GET_FPU and KVM_SET_FPU */
  21. struct kvm_fpu {
  22. };
  23. /* KVM Debug exit structure */
  24. struct kvm_debug_exit_arch {
  25. };
  26. /* for KVM_SET_GUEST_DEBUG */
  27. struct kvm_guest_debug_arch {
  28. };
  29. /* definition of registers in kvm_run */
  30. struct kvm_sync_regs {
  31. };
  32. /* for KVM_GET_SREGS and KVM_SET_SREGS */
  33. struct kvm_sregs {
  34. };
  35. /* CONFIG registers for KVM_GET_ONE_REG and KVM_SET_ONE_REG */
  36. struct kvm_riscv_config {
  37. unsigned long isa;
  38. unsigned long zicbom_block_size;
  39. unsigned long mvendorid;
  40. unsigned long marchid;
  41. unsigned long mimpid;
  42. };
  43. /* CORE registers for KVM_GET_ONE_REG and KVM_SET_ONE_REG */
  44. struct kvm_riscv_core {
  45. struct user_regs_struct regs;
  46. unsigned long mode;
  47. };
  48. /* Possible privilege modes for kvm_riscv_core */
  49. #define KVM_RISCV_MODE_S 1
  50. #define KVM_RISCV_MODE_U 0
  51. /* CSR registers for KVM_GET_ONE_REG and KVM_SET_ONE_REG */
  52. struct kvm_riscv_csr {
  53. unsigned long sstatus;
  54. unsigned long sie;
  55. unsigned long stvec;
  56. unsigned long sscratch;
  57. unsigned long sepc;
  58. unsigned long scause;
  59. unsigned long stval;
  60. unsigned long sip;
  61. unsigned long satp;
  62. unsigned long scounteren;
  63. };
  64. /* TIMER registers for KVM_GET_ONE_REG and KVM_SET_ONE_REG */
  65. struct kvm_riscv_timer {
  66. __u64 frequency;
  67. __u64 time;
  68. __u64 compare;
  69. __u64 state;
  70. };
  71. /*
  72. * ISA extension IDs specific to KVM. This is not the same as the host ISA
  73. * extension IDs as that is internal to the host and should not be exposed
  74. * to the guest. This should always be contiguous to keep the mapping simple
  75. * in KVM implementation.
  76. */
  77. enum KVM_RISCV_ISA_EXT_ID {
  78. KVM_RISCV_ISA_EXT_A = 0,
  79. KVM_RISCV_ISA_EXT_C,
  80. KVM_RISCV_ISA_EXT_D,
  81. KVM_RISCV_ISA_EXT_F,
  82. KVM_RISCV_ISA_EXT_H,
  83. KVM_RISCV_ISA_EXT_I,
  84. KVM_RISCV_ISA_EXT_M,
  85. KVM_RISCV_ISA_EXT_SVPBMT,
  86. KVM_RISCV_ISA_EXT_SSTC,
  87. KVM_RISCV_ISA_EXT_SVINVAL,
  88. KVM_RISCV_ISA_EXT_ZIHINTPAUSE,
  89. KVM_RISCV_ISA_EXT_ZICBOM,
  90. KVM_RISCV_ISA_EXT_MAX,
  91. };
  92. /* Possible states for kvm_riscv_timer */
  93. #define KVM_RISCV_TIMER_STATE_OFF 0
  94. #define KVM_RISCV_TIMER_STATE_ON 1
  95. #define KVM_REG_SIZE(id) \
  96. (1U << (((id) & KVM_REG_SIZE_MASK) >> KVM_REG_SIZE_SHIFT))
  97. /* If you need to interpret the index values, here is the key: */
  98. #define KVM_REG_RISCV_TYPE_MASK 0x00000000FF000000
  99. #define KVM_REG_RISCV_TYPE_SHIFT 24
  100. /* Config registers are mapped as type 1 */
  101. #define KVM_REG_RISCV_CONFIG (0x01 << KVM_REG_RISCV_TYPE_SHIFT)
  102. #define KVM_REG_RISCV_CONFIG_REG(name) \
  103. (offsetof(struct kvm_riscv_config, name) / sizeof(unsigned long))
  104. /* Core registers are mapped as type 2 */
  105. #define KVM_REG_RISCV_CORE (0x02 << KVM_REG_RISCV_TYPE_SHIFT)
  106. #define KVM_REG_RISCV_CORE_REG(name) \
  107. (offsetof(struct kvm_riscv_core, name) / sizeof(unsigned long))
  108. /* Control and status registers are mapped as type 3 */
  109. #define KVM_REG_RISCV_CSR (0x03 << KVM_REG_RISCV_TYPE_SHIFT)
  110. #define KVM_REG_RISCV_CSR_REG(name) \
  111. (offsetof(struct kvm_riscv_csr, name) / sizeof(unsigned long))
  112. /* Timer registers are mapped as type 4 */
  113. #define KVM_REG_RISCV_TIMER (0x04 << KVM_REG_RISCV_TYPE_SHIFT)
  114. #define KVM_REG_RISCV_TIMER_REG(name) \
  115. (offsetof(struct kvm_riscv_timer, name) / sizeof(__u64))
  116. /* F extension registers are mapped as type 5 */
  117. #define KVM_REG_RISCV_FP_F (0x05 << KVM_REG_RISCV_TYPE_SHIFT)
  118. #define KVM_REG_RISCV_FP_F_REG(name) \
  119. (offsetof(struct __riscv_f_ext_state, name) / sizeof(__u32))
  120. /* D extension registers are mapped as type 6 */
  121. #define KVM_REG_RISCV_FP_D (0x06 << KVM_REG_RISCV_TYPE_SHIFT)
  122. #define KVM_REG_RISCV_FP_D_REG(name) \
  123. (offsetof(struct __riscv_d_ext_state, name) / sizeof(__u64))
  124. /* ISA Extension registers are mapped as type 7 */
  125. #define KVM_REG_RISCV_ISA_EXT (0x07 << KVM_REG_RISCV_TYPE_SHIFT)
  126. #endif
  127. #endif /* __LINUX_KVM_RISCV_H */