kvm.h 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  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 <[email protected]>
  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. };
  40. /* CORE registers for KVM_GET_ONE_REG and KVM_SET_ONE_REG */
  41. struct kvm_riscv_core {
  42. struct user_regs_struct regs;
  43. unsigned long mode;
  44. };
  45. /* Possible privilege modes for kvm_riscv_core */
  46. #define KVM_RISCV_MODE_S 1
  47. #define KVM_RISCV_MODE_U 0
  48. /* CSR registers for KVM_GET_ONE_REG and KVM_SET_ONE_REG */
  49. struct kvm_riscv_csr {
  50. unsigned long sstatus;
  51. unsigned long sie;
  52. unsigned long stvec;
  53. unsigned long sscratch;
  54. unsigned long sepc;
  55. unsigned long scause;
  56. unsigned long stval;
  57. unsigned long sip;
  58. unsigned long satp;
  59. unsigned long scounteren;
  60. };
  61. /* TIMER registers for KVM_GET_ONE_REG and KVM_SET_ONE_REG */
  62. struct kvm_riscv_timer {
  63. __u64 frequency;
  64. __u64 time;
  65. __u64 compare;
  66. __u64 state;
  67. };
  68. /*
  69. * ISA extension IDs specific to KVM. This is not the same as the host ISA
  70. * extension IDs as that is internal to the host and should not be exposed
  71. * to the guest. This should always be contiguous to keep the mapping simple
  72. * in KVM implementation.
  73. */
  74. enum KVM_RISCV_ISA_EXT_ID {
  75. KVM_RISCV_ISA_EXT_A = 0,
  76. KVM_RISCV_ISA_EXT_C,
  77. KVM_RISCV_ISA_EXT_D,
  78. KVM_RISCV_ISA_EXT_F,
  79. KVM_RISCV_ISA_EXT_H,
  80. KVM_RISCV_ISA_EXT_I,
  81. KVM_RISCV_ISA_EXT_M,
  82. KVM_RISCV_ISA_EXT_SVPBMT,
  83. KVM_RISCV_ISA_EXT_SSTC,
  84. KVM_RISCV_ISA_EXT_SVINVAL,
  85. KVM_RISCV_ISA_EXT_ZIHINTPAUSE,
  86. KVM_RISCV_ISA_EXT_ZICBOM,
  87. KVM_RISCV_ISA_EXT_MAX,
  88. };
  89. /* Possible states for kvm_riscv_timer */
  90. #define KVM_RISCV_TIMER_STATE_OFF 0
  91. #define KVM_RISCV_TIMER_STATE_ON 1
  92. #define KVM_REG_SIZE(id) \
  93. (1U << (((id) & KVM_REG_SIZE_MASK) >> KVM_REG_SIZE_SHIFT))
  94. /* If you need to interpret the index values, here is the key: */
  95. #define KVM_REG_RISCV_TYPE_MASK 0x00000000FF000000
  96. #define KVM_REG_RISCV_TYPE_SHIFT 24
  97. /* Config registers are mapped as type 1 */
  98. #define KVM_REG_RISCV_CONFIG (0x01 << KVM_REG_RISCV_TYPE_SHIFT)
  99. #define KVM_REG_RISCV_CONFIG_REG(name) \
  100. (offsetof(struct kvm_riscv_config, name) / sizeof(unsigned long))
  101. /* Core registers are mapped as type 2 */
  102. #define KVM_REG_RISCV_CORE (0x02 << KVM_REG_RISCV_TYPE_SHIFT)
  103. #define KVM_REG_RISCV_CORE_REG(name) \
  104. (offsetof(struct kvm_riscv_core, name) / sizeof(unsigned long))
  105. /* Control and status registers are mapped as type 3 */
  106. #define KVM_REG_RISCV_CSR (0x03 << KVM_REG_RISCV_TYPE_SHIFT)
  107. #define KVM_REG_RISCV_CSR_REG(name) \
  108. (offsetof(struct kvm_riscv_csr, name) / sizeof(unsigned long))
  109. /* Timer registers are mapped as type 4 */
  110. #define KVM_REG_RISCV_TIMER (0x04 << KVM_REG_RISCV_TYPE_SHIFT)
  111. #define KVM_REG_RISCV_TIMER_REG(name) \
  112. (offsetof(struct kvm_riscv_timer, name) / sizeof(__u64))
  113. /* F extension registers are mapped as type 5 */
  114. #define KVM_REG_RISCV_FP_F (0x05 << KVM_REG_RISCV_TYPE_SHIFT)
  115. #define KVM_REG_RISCV_FP_F_REG(name) \
  116. (offsetof(struct __riscv_f_ext_state, name) / sizeof(__u32))
  117. /* D extension registers are mapped as type 6 */
  118. #define KVM_REG_RISCV_FP_D (0x06 << KVM_REG_RISCV_TYPE_SHIFT)
  119. #define KVM_REG_RISCV_FP_D_REG(name) \
  120. (offsetof(struct __riscv_d_ext_state, name) / sizeof(__u64))
  121. /* ISA Extension registers are mapped as type 7 */
  122. #define KVM_REG_RISCV_ISA_EXT (0x07 << KVM_REG_RISCV_TYPE_SHIFT)
  123. #endif
  124. #endif /* __LINUX_KVM_RISCV_H */