vgic-debug.c 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (C) 2016 Linaro
  4. * Author: Christoffer Dall <christoffer.dall@linaro.org>
  5. */
  6. #include <linux/cpu.h>
  7. #include <linux/debugfs.h>
  8. #include <linux/interrupt.h>
  9. #include <linux/kvm_host.h>
  10. #include <linux/seq_file.h>
  11. #include <kvm/arm_vgic.h>
  12. #include <asm/kvm_mmu.h>
  13. #include "vgic.h"
  14. /*
  15. * Structure to control looping through the entire vgic state. We start at
  16. * zero for each field and move upwards. So, if dist_id is 0 we print the
  17. * distributor info. When dist_id is 1, we have already printed it and move
  18. * on.
  19. *
  20. * When vcpu_id < nr_cpus we print the vcpu info until vcpu_id == nr_cpus and
  21. * so on.
  22. */
  23. struct vgic_state_iter {
  24. int nr_cpus;
  25. int nr_spis;
  26. int nr_lpis;
  27. int dist_id;
  28. int vcpu_id;
  29. unsigned long intid;
  30. int lpi_idx;
  31. };
  32. static void iter_next(struct kvm *kvm, struct vgic_state_iter *iter)
  33. {
  34. struct vgic_dist *dist = &kvm->arch.vgic;
  35. if (iter->dist_id == 0) {
  36. iter->dist_id++;
  37. return;
  38. }
  39. /*
  40. * Let the xarray drive the iterator after the last SPI, as the iterator
  41. * has exhausted the sequentially-allocated INTID space.
  42. */
  43. if (iter->intid >= (iter->nr_spis + VGIC_NR_PRIVATE_IRQS - 1) &&
  44. iter->nr_lpis) {
  45. if (iter->lpi_idx < iter->nr_lpis)
  46. xa_find_after(&dist->lpi_xa, &iter->intid,
  47. VGIC_LPI_MAX_INTID,
  48. LPI_XA_MARK_DEBUG_ITER);
  49. iter->lpi_idx++;
  50. return;
  51. }
  52. iter->intid++;
  53. if (iter->intid == VGIC_NR_PRIVATE_IRQS &&
  54. ++iter->vcpu_id < iter->nr_cpus)
  55. iter->intid = 0;
  56. }
  57. static int iter_mark_lpis(struct kvm *kvm)
  58. {
  59. struct vgic_dist *dist = &kvm->arch.vgic;
  60. struct vgic_irq *irq;
  61. unsigned long intid;
  62. int nr_lpis = 0;
  63. xa_for_each(&dist->lpi_xa, intid, irq) {
  64. if (!vgic_try_get_irq_kref(irq))
  65. continue;
  66. xa_set_mark(&dist->lpi_xa, intid, LPI_XA_MARK_DEBUG_ITER);
  67. nr_lpis++;
  68. }
  69. return nr_lpis;
  70. }
  71. static void iter_unmark_lpis(struct kvm *kvm)
  72. {
  73. struct vgic_dist *dist = &kvm->arch.vgic;
  74. struct vgic_irq *irq;
  75. unsigned long intid;
  76. xa_for_each_marked(&dist->lpi_xa, intid, irq, LPI_XA_MARK_DEBUG_ITER) {
  77. xa_clear_mark(&dist->lpi_xa, intid, LPI_XA_MARK_DEBUG_ITER);
  78. vgic_put_irq(kvm, irq);
  79. }
  80. }
  81. static void iter_init(struct kvm *kvm, struct vgic_state_iter *iter,
  82. loff_t pos)
  83. {
  84. int nr_cpus = atomic_read(&kvm->online_vcpus);
  85. memset(iter, 0, sizeof(*iter));
  86. iter->nr_cpus = nr_cpus;
  87. iter->nr_spis = kvm->arch.vgic.nr_spis;
  88. if (kvm->arch.vgic.vgic_model == KVM_DEV_TYPE_ARM_VGIC_V3)
  89. iter->nr_lpis = iter_mark_lpis(kvm);
  90. /* Fast forward to the right position if needed */
  91. while (pos--)
  92. iter_next(kvm, iter);
  93. }
  94. static bool end_of_vgic(struct vgic_state_iter *iter)
  95. {
  96. return iter->dist_id > 0 &&
  97. iter->vcpu_id == iter->nr_cpus &&
  98. iter->intid >= (iter->nr_spis + VGIC_NR_PRIVATE_IRQS) &&
  99. (!iter->nr_lpis || iter->lpi_idx > iter->nr_lpis);
  100. }
  101. static void *vgic_debug_start(struct seq_file *s, loff_t *pos)
  102. {
  103. struct kvm *kvm = s->private;
  104. struct vgic_state_iter *iter;
  105. mutex_lock(&kvm->arch.config_lock);
  106. iter = kvm->arch.vgic.iter;
  107. if (iter) {
  108. iter = ERR_PTR(-EBUSY);
  109. goto out;
  110. }
  111. iter = kmalloc(sizeof(*iter), GFP_KERNEL);
  112. if (!iter) {
  113. iter = ERR_PTR(-ENOMEM);
  114. goto out;
  115. }
  116. iter_init(kvm, iter, *pos);
  117. kvm->arch.vgic.iter = iter;
  118. if (end_of_vgic(iter))
  119. iter = NULL;
  120. out:
  121. mutex_unlock(&kvm->arch.config_lock);
  122. return iter;
  123. }
  124. static void *vgic_debug_next(struct seq_file *s, void *v, loff_t *pos)
  125. {
  126. struct kvm *kvm = s->private;
  127. struct vgic_state_iter *iter = kvm->arch.vgic.iter;
  128. ++*pos;
  129. iter_next(kvm, iter);
  130. if (end_of_vgic(iter))
  131. iter = NULL;
  132. return iter;
  133. }
  134. static void vgic_debug_stop(struct seq_file *s, void *v)
  135. {
  136. struct kvm *kvm = s->private;
  137. struct vgic_state_iter *iter;
  138. /*
  139. * If the seq file wasn't properly opened, there's nothing to clearn
  140. * up.
  141. */
  142. if (IS_ERR(v))
  143. return;
  144. mutex_lock(&kvm->arch.config_lock);
  145. iter = kvm->arch.vgic.iter;
  146. iter_unmark_lpis(kvm);
  147. kfree(iter);
  148. kvm->arch.vgic.iter = NULL;
  149. mutex_unlock(&kvm->arch.config_lock);
  150. }
  151. static void print_dist_state(struct seq_file *s, struct vgic_dist *dist,
  152. struct vgic_state_iter *iter)
  153. {
  154. bool v3 = dist->vgic_model == KVM_DEV_TYPE_ARM_VGIC_V3;
  155. seq_printf(s, "Distributor\n");
  156. seq_printf(s, "===========\n");
  157. seq_printf(s, "vgic_model:\t%s\n", v3 ? "GICv3" : "GICv2");
  158. seq_printf(s, "nr_spis:\t%d\n", dist->nr_spis);
  159. if (v3)
  160. seq_printf(s, "nr_lpis:\t%d\n", iter->nr_lpis);
  161. seq_printf(s, "enabled:\t%d\n", dist->enabled);
  162. seq_printf(s, "\n");
  163. seq_printf(s, "P=pending_latch, L=line_level, A=active\n");
  164. seq_printf(s, "E=enabled, H=hw, C=config (level=1, edge=0)\n");
  165. seq_printf(s, "G=group\n");
  166. }
  167. static void print_header(struct seq_file *s, struct vgic_irq *irq,
  168. struct kvm_vcpu *vcpu)
  169. {
  170. int id = 0;
  171. char *hdr = "SPI ";
  172. if (vcpu) {
  173. hdr = "VCPU";
  174. id = vcpu->vcpu_idx;
  175. }
  176. seq_printf(s, "\n");
  177. seq_printf(s, "%s%2d TYP ID TGT_ID PLAEHCG HWID TARGET SRC PRI VCPU_ID\n", hdr, id);
  178. seq_printf(s, "----------------------------------------------------------------\n");
  179. }
  180. static void print_irq_state(struct seq_file *s, struct vgic_irq *irq,
  181. struct kvm_vcpu *vcpu)
  182. {
  183. char *type;
  184. bool pending;
  185. if (irq->intid < VGIC_NR_SGIS)
  186. type = "SGI";
  187. else if (irq->intid < VGIC_NR_PRIVATE_IRQS)
  188. type = "PPI";
  189. else if (irq->intid < VGIC_MAX_SPI)
  190. type = "SPI";
  191. else
  192. type = "LPI";
  193. if (irq->intid ==0 || irq->intid == VGIC_NR_PRIVATE_IRQS)
  194. print_header(s, irq, vcpu);
  195. pending = irq->pending_latch;
  196. if (irq->hw && vgic_irq_is_sgi(irq->intid)) {
  197. int err;
  198. err = irq_get_irqchip_state(irq->host_irq,
  199. IRQCHIP_STATE_PENDING,
  200. &pending);
  201. WARN_ON_ONCE(err);
  202. }
  203. seq_printf(s, " %s %4d "
  204. " %2d "
  205. "%d%d%d%d%d%d%d "
  206. "%8d "
  207. "%8x "
  208. " %2x "
  209. "%3d "
  210. " %2d "
  211. "\n",
  212. type, irq->intid,
  213. (irq->target_vcpu) ? irq->target_vcpu->vcpu_idx : -1,
  214. pending,
  215. irq->line_level,
  216. irq->active,
  217. irq->enabled,
  218. irq->hw,
  219. irq->config == VGIC_CONFIG_LEVEL,
  220. irq->group,
  221. irq->hwintid,
  222. irq->mpidr,
  223. irq->source,
  224. irq->priority,
  225. (irq->vcpu) ? irq->vcpu->vcpu_idx : -1);
  226. }
  227. static int vgic_debug_show(struct seq_file *s, void *v)
  228. {
  229. struct kvm *kvm = s->private;
  230. struct vgic_state_iter *iter = v;
  231. struct vgic_irq *irq;
  232. struct kvm_vcpu *vcpu = NULL;
  233. unsigned long flags;
  234. if (iter->dist_id == 0) {
  235. print_dist_state(s, &kvm->arch.vgic, iter);
  236. return 0;
  237. }
  238. if (!kvm->arch.vgic.initialized)
  239. return 0;
  240. if (iter->vcpu_id < iter->nr_cpus)
  241. vcpu = kvm_get_vcpu(kvm, iter->vcpu_id);
  242. /*
  243. * Expect this to succeed, as iter_mark_lpis() takes a reference on
  244. * every LPI to be visited.
  245. */
  246. irq = vgic_get_irq(kvm, vcpu, iter->intid);
  247. if (WARN_ON_ONCE(!irq))
  248. return -EINVAL;
  249. raw_spin_lock_irqsave(&irq->irq_lock, flags);
  250. print_irq_state(s, irq, vcpu);
  251. raw_spin_unlock_irqrestore(&irq->irq_lock, flags);
  252. vgic_put_irq(kvm, irq);
  253. return 0;
  254. }
  255. static const struct seq_operations vgic_debug_sops = {
  256. .start = vgic_debug_start,
  257. .next = vgic_debug_next,
  258. .stop = vgic_debug_stop,
  259. .show = vgic_debug_show
  260. };
  261. DEFINE_SEQ_ATTRIBUTE(vgic_debug);
  262. void vgic_debug_init(struct kvm *kvm)
  263. {
  264. debugfs_create_file("vgic-state", 0444, kvm->debugfs_dentry, kvm,
  265. &vgic_debug_fops);
  266. }
  267. void vgic_debug_destroy(struct kvm *kvm)
  268. {
  269. }