kvm.h 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  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 0
  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. };
  39. /* CORE registers for KVM_GET_ONE_REG and KVM_SET_ONE_REG */
  40. struct kvm_riscv_core {
  41. struct user_regs_struct regs;
  42. unsigned long mode;
  43. };
  44. /* Possible privilege modes for kvm_riscv_core */
  45. #define KVM_RISCV_MODE_S 1
  46. #define KVM_RISCV_MODE_U 0
  47. /* CSR registers for KVM_GET_ONE_REG and KVM_SET_ONE_REG */
  48. struct kvm_riscv_csr {
  49. unsigned long sstatus;
  50. unsigned long sie;
  51. unsigned long stvec;
  52. unsigned long sscratch;
  53. unsigned long sepc;
  54. unsigned long scause;
  55. unsigned long stval;
  56. unsigned long sip;
  57. unsigned long satp;
  58. unsigned long scounteren;
  59. };
  60. /* TIMER registers for KVM_GET_ONE_REG and KVM_SET_ONE_REG */
  61. struct kvm_riscv_timer {
  62. __u64 frequency;
  63. __u64 time;
  64. __u64 compare;
  65. __u64 state;
  66. };
  67. /* Possible states for kvm_riscv_timer */
  68. #define KVM_RISCV_TIMER_STATE_OFF 0
  69. #define KVM_RISCV_TIMER_STATE_ON 1
  70. #define KVM_REG_SIZE(id) \
  71. (1U << (((id) & KVM_REG_SIZE_MASK) >> KVM_REG_SIZE_SHIFT))
  72. /* If you need to interpret the index values, here is the key: */
  73. #define KVM_REG_RISCV_TYPE_MASK 0x00000000FF000000
  74. #define KVM_REG_RISCV_TYPE_SHIFT 24
  75. /* Config registers are mapped as type 1 */
  76. #define KVM_REG_RISCV_CONFIG (0x01 << KVM_REG_RISCV_TYPE_SHIFT)
  77. #define KVM_REG_RISCV_CONFIG_REG(name) \
  78. (offsetof(struct kvm_riscv_config, name) / sizeof(unsigned long))
  79. /* Core registers are mapped as type 2 */
  80. #define KVM_REG_RISCV_CORE (0x02 << KVM_REG_RISCV_TYPE_SHIFT)
  81. #define KVM_REG_RISCV_CORE_REG(name) \
  82. (offsetof(struct kvm_riscv_core, name) / sizeof(unsigned long))
  83. /* Control and status registers are mapped as type 3 */
  84. #define KVM_REG_RISCV_CSR (0x03 << KVM_REG_RISCV_TYPE_SHIFT)
  85. #define KVM_REG_RISCV_CSR_REG(name) \
  86. (offsetof(struct kvm_riscv_csr, name) / sizeof(unsigned long))
  87. /* Timer registers are mapped as type 4 */
  88. #define KVM_REG_RISCV_TIMER (0x04 << KVM_REG_RISCV_TYPE_SHIFT)
  89. #define KVM_REG_RISCV_TIMER_REG(name) \
  90. (offsetof(struct kvm_riscv_timer, name) / sizeof(__u64))
  91. /* F extension registers are mapped as type 5 */
  92. #define KVM_REG_RISCV_FP_F (0x05 << KVM_REG_RISCV_TYPE_SHIFT)
  93. #define KVM_REG_RISCV_FP_F_REG(name) \
  94. (offsetof(struct __riscv_f_ext_state, name) / sizeof(__u32))
  95. /* D extension registers are mapped as type 6 */
  96. #define KVM_REG_RISCV_FP_D (0x06 << KVM_REG_RISCV_TYPE_SHIFT)
  97. #define KVM_REG_RISCV_FP_D_REG(name) \
  98. (offsetof(struct __riscv_d_ext_state, name) / sizeof(__u64))
  99. #endif
  100. #endif /* __LINUX_KVM_RISCV_H */