mmio.c 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (C) 2012 - Virtual Open Systems and Columbia University
  4. * Author: Christoffer Dall <c.dall@virtualopensystems.com>
  5. */
  6. #include <linux/kvm_host.h>
  7. #include <asm/kvm_emulate.h>
  8. #include <trace/events/kvm.h>
  9. #include "trace.h"
  10. void kvm_mmio_write_buf(void *buf, unsigned int len, unsigned long data)
  11. {
  12. void *datap = NULL;
  13. union {
  14. u8 byte;
  15. u16 hword;
  16. u32 word;
  17. u64 dword;
  18. } tmp;
  19. switch (len) {
  20. case 1:
  21. tmp.byte = data;
  22. datap = &tmp.byte;
  23. break;
  24. case 2:
  25. tmp.hword = data;
  26. datap = &tmp.hword;
  27. break;
  28. case 4:
  29. tmp.word = data;
  30. datap = &tmp.word;
  31. break;
  32. case 8:
  33. tmp.dword = data;
  34. datap = &tmp.dword;
  35. break;
  36. }
  37. memcpy(buf, datap, len);
  38. }
  39. unsigned long kvm_mmio_read_buf(const void *buf, unsigned int len)
  40. {
  41. unsigned long data = 0;
  42. union {
  43. u16 hword;
  44. u32 word;
  45. u64 dword;
  46. } tmp;
  47. switch (len) {
  48. case 1:
  49. data = *(u8 *)buf;
  50. break;
  51. case 2:
  52. memcpy(&tmp.hword, buf, len);
  53. data = tmp.hword;
  54. break;
  55. case 4:
  56. memcpy(&tmp.word, buf, len);
  57. data = tmp.word;
  58. break;
  59. case 8:
  60. memcpy(&tmp.dword, buf, len);
  61. data = tmp.dword;
  62. break;
  63. }
  64. return data;
  65. }
  66. static bool kvm_pending_external_abort(struct kvm_vcpu *vcpu)
  67. {
  68. if (!vcpu_get_flag(vcpu, PENDING_EXCEPTION))
  69. return false;
  70. if (vcpu_el1_is_32bit(vcpu)) {
  71. switch (vcpu_get_flag(vcpu, EXCEPT_MASK)) {
  72. case unpack_vcpu_flag(EXCEPT_AA32_UND):
  73. case unpack_vcpu_flag(EXCEPT_AA32_IABT):
  74. case unpack_vcpu_flag(EXCEPT_AA32_DABT):
  75. return true;
  76. default:
  77. return false;
  78. }
  79. } else {
  80. switch (vcpu_get_flag(vcpu, EXCEPT_MASK)) {
  81. case unpack_vcpu_flag(EXCEPT_AA64_EL1_SYNC):
  82. case unpack_vcpu_flag(EXCEPT_AA64_EL2_SYNC):
  83. case unpack_vcpu_flag(EXCEPT_AA64_EL1_SERR):
  84. case unpack_vcpu_flag(EXCEPT_AA64_EL2_SERR):
  85. return true;
  86. default:
  87. return false;
  88. }
  89. }
  90. }
  91. /**
  92. * kvm_handle_mmio_return -- Handle MMIO loads after user space emulation
  93. * or in-kernel IO emulation
  94. *
  95. * @vcpu: The VCPU pointer
  96. */
  97. int kvm_handle_mmio_return(struct kvm_vcpu *vcpu)
  98. {
  99. unsigned long data;
  100. unsigned int len;
  101. int mask;
  102. /*
  103. * Detect if the MMIO return was already handled or if userspace aborted
  104. * the MMIO access.
  105. */
  106. if (unlikely(!vcpu->mmio_needed || kvm_pending_external_abort(vcpu)))
  107. return 1;
  108. vcpu->mmio_needed = 0;
  109. if (!kvm_vcpu_dabt_iswrite(vcpu)) {
  110. struct kvm_run *run = vcpu->run;
  111. len = kvm_vcpu_dabt_get_as(vcpu);
  112. data = kvm_mmio_read_buf(run->mmio.data, len);
  113. if (kvm_vcpu_dabt_issext(vcpu) &&
  114. len < sizeof(unsigned long)) {
  115. mask = 1U << ((len * 8) - 1);
  116. data = (data ^ mask) - mask;
  117. }
  118. if (!kvm_vcpu_dabt_issf(vcpu))
  119. data = data & 0xffffffff;
  120. trace_kvm_mmio(KVM_TRACE_MMIO_READ, len, run->mmio.phys_addr,
  121. &data);
  122. data = vcpu_data_host_to_guest(vcpu, data, len);
  123. vcpu_set_reg(vcpu, kvm_vcpu_dabt_get_rd(vcpu), data);
  124. }
  125. /*
  126. * The MMIO instruction is emulated and should not be re-executed
  127. * in the guest.
  128. */
  129. kvm_incr_pc(vcpu);
  130. return 1;
  131. }
  132. int io_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa)
  133. {
  134. struct kvm_run *run = vcpu->run;
  135. unsigned long data;
  136. unsigned long rt;
  137. int ret;
  138. bool is_write;
  139. int len;
  140. u8 data_buf[8];
  141. u64 esr;
  142. esr = kvm_vcpu_get_esr(vcpu);
  143. /*
  144. * No valid syndrome? Ask userspace for help if it has
  145. * volunteered to do so, and bail out otherwise.
  146. *
  147. * In the protected VM case, there isn't much userspace can do
  148. * though, so directly deliver an exception to the guest.
  149. */
  150. if (!kvm_vcpu_dabt_isvalid(vcpu)) {
  151. trace_kvm_mmio_nisv(*vcpu_pc(vcpu), esr,
  152. kvm_vcpu_get_hfar(vcpu), fault_ipa);
  153. if (vcpu_is_protected(vcpu))
  154. return kvm_inject_sea_dabt(vcpu, kvm_vcpu_get_hfar(vcpu));
  155. if (test_bit(KVM_ARCH_FLAG_RETURN_NISV_IO_ABORT_TO_USER,
  156. &vcpu->kvm->arch.flags)) {
  157. run->exit_reason = KVM_EXIT_ARM_NISV;
  158. run->arm_nisv.esr_iss = kvm_vcpu_dabt_iss_nisv_sanitized(vcpu);
  159. run->arm_nisv.fault_ipa = fault_ipa;
  160. return 0;
  161. }
  162. return -ENOSYS;
  163. }
  164. /*
  165. * When (DFSC == 0b00xxxx || DFSC == 0b10101x) && DFSC != 0b0000xx
  166. * ESR_EL2[12:11] describe the Load/Store Type. This allows us to
  167. * punt the LD64B/ST64B/ST64BV/ST64BV0 instructions to userspace,
  168. * which will have to provide a full emulation of these 4
  169. * instructions. No, we don't expect this do be fast.
  170. *
  171. * We rely on traps being set if the corresponding features are not
  172. * enabled, so if we get here, userspace has promised us to handle
  173. * it already.
  174. */
  175. switch (kvm_vcpu_trap_get_fault(vcpu)) {
  176. case 0b000100 ... 0b001111:
  177. case 0b101010 ... 0b101011:
  178. if (FIELD_GET(GENMASK(12, 11), esr)) {
  179. run->exit_reason = KVM_EXIT_ARM_LDST64B;
  180. run->arm_nisv.esr_iss = esr & ~(u64)ESR_ELx_FSC;
  181. run->arm_nisv.fault_ipa = fault_ipa;
  182. return 0;
  183. }
  184. }
  185. /*
  186. * Prepare MMIO operation. First decode the syndrome data we get
  187. * from the CPU. Then try if some in-kernel emulation feels
  188. * responsible, otherwise let user space do its magic.
  189. */
  190. is_write = kvm_vcpu_dabt_iswrite(vcpu);
  191. len = kvm_vcpu_dabt_get_as(vcpu);
  192. rt = kvm_vcpu_dabt_get_rd(vcpu);
  193. if (is_write) {
  194. data = vcpu_data_guest_to_host(vcpu, vcpu_get_reg(vcpu, rt),
  195. len);
  196. trace_kvm_mmio(KVM_TRACE_MMIO_WRITE, len, fault_ipa, &data);
  197. kvm_mmio_write_buf(data_buf, len, data);
  198. ret = kvm_io_bus_write(vcpu, KVM_MMIO_BUS, fault_ipa, len,
  199. data_buf);
  200. } else {
  201. trace_kvm_mmio(KVM_TRACE_MMIO_READ_UNSATISFIED, len,
  202. fault_ipa, NULL);
  203. ret = kvm_io_bus_read(vcpu, KVM_MMIO_BUS, fault_ipa, len,
  204. data_buf);
  205. }
  206. /* Now prepare kvm_run for the potential return to userland. */
  207. run->mmio.is_write = is_write;
  208. run->mmio.phys_addr = fault_ipa;
  209. run->mmio.len = len;
  210. vcpu->mmio_needed = 1;
  211. if (!ret) {
  212. /* We handled the access successfully in the kernel. */
  213. if (!is_write)
  214. memcpy(run->mmio.data, data_buf, len);
  215. vcpu->stat.mmio_exit_kernel++;
  216. kvm_handle_mmio_return(vcpu);
  217. return 1;
  218. }
  219. if (is_write)
  220. memcpy(run->mmio.data, data_buf, len);
  221. vcpu->stat.mmio_exit_user++;
  222. run->exit_reason = KVM_EXIT_MMIO;
  223. return 0;
  224. }