plugin_xen.c 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. // SPDX-License-Identifier: GPL-2.0
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include "event-parse.h"
  6. #define __HYPERVISOR_set_trap_table 0
  7. #define __HYPERVISOR_mmu_update 1
  8. #define __HYPERVISOR_set_gdt 2
  9. #define __HYPERVISOR_stack_switch 3
  10. #define __HYPERVISOR_set_callbacks 4
  11. #define __HYPERVISOR_fpu_taskswitch 5
  12. #define __HYPERVISOR_sched_op_compat 6
  13. #define __HYPERVISOR_dom0_op 7
  14. #define __HYPERVISOR_set_debugreg 8
  15. #define __HYPERVISOR_get_debugreg 9
  16. #define __HYPERVISOR_update_descriptor 10
  17. #define __HYPERVISOR_memory_op 12
  18. #define __HYPERVISOR_multicall 13
  19. #define __HYPERVISOR_update_va_mapping 14
  20. #define __HYPERVISOR_set_timer_op 15
  21. #define __HYPERVISOR_event_channel_op_compat 16
  22. #define __HYPERVISOR_xen_version 17
  23. #define __HYPERVISOR_console_io 18
  24. #define __HYPERVISOR_physdev_op_compat 19
  25. #define __HYPERVISOR_grant_table_op 20
  26. #define __HYPERVISOR_vm_assist 21
  27. #define __HYPERVISOR_update_va_mapping_otherdomain 22
  28. #define __HYPERVISOR_iret 23 /* x86 only */
  29. #define __HYPERVISOR_vcpu_op 24
  30. #define __HYPERVISOR_set_segment_base 25 /* x86/64 only */
  31. #define __HYPERVISOR_mmuext_op 26
  32. #define __HYPERVISOR_acm_op 27
  33. #define __HYPERVISOR_nmi_op 28
  34. #define __HYPERVISOR_sched_op 29
  35. #define __HYPERVISOR_callback_op 30
  36. #define __HYPERVISOR_xenoprof_op 31
  37. #define __HYPERVISOR_event_channel_op 32
  38. #define __HYPERVISOR_physdev_op 33
  39. #define __HYPERVISOR_hvm_op 34
  40. #define __HYPERVISOR_tmem_op 38
  41. /* Architecture-specific hypercall definitions. */
  42. #define __HYPERVISOR_arch_0 48
  43. #define __HYPERVISOR_arch_1 49
  44. #define __HYPERVISOR_arch_2 50
  45. #define __HYPERVISOR_arch_3 51
  46. #define __HYPERVISOR_arch_4 52
  47. #define __HYPERVISOR_arch_5 53
  48. #define __HYPERVISOR_arch_6 54
  49. #define __HYPERVISOR_arch_7 55
  50. #define N(x) [__HYPERVISOR_##x] = "("#x")"
  51. static const char *xen_hypercall_names[] = {
  52. N(set_trap_table),
  53. N(mmu_update),
  54. N(set_gdt),
  55. N(stack_switch),
  56. N(set_callbacks),
  57. N(fpu_taskswitch),
  58. N(sched_op_compat),
  59. N(dom0_op),
  60. N(set_debugreg),
  61. N(get_debugreg),
  62. N(update_descriptor),
  63. N(memory_op),
  64. N(multicall),
  65. N(update_va_mapping),
  66. N(set_timer_op),
  67. N(event_channel_op_compat),
  68. N(xen_version),
  69. N(console_io),
  70. N(physdev_op_compat),
  71. N(grant_table_op),
  72. N(vm_assist),
  73. N(update_va_mapping_otherdomain),
  74. N(iret),
  75. N(vcpu_op),
  76. N(set_segment_base),
  77. N(mmuext_op),
  78. N(acm_op),
  79. N(nmi_op),
  80. N(sched_op),
  81. N(callback_op),
  82. N(xenoprof_op),
  83. N(event_channel_op),
  84. N(physdev_op),
  85. N(hvm_op),
  86. /* Architecture-specific hypercall definitions. */
  87. N(arch_0),
  88. N(arch_1),
  89. N(arch_2),
  90. N(arch_3),
  91. N(arch_4),
  92. N(arch_5),
  93. N(arch_6),
  94. N(arch_7),
  95. };
  96. #undef N
  97. #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
  98. static const char *xen_hypercall_name(unsigned op)
  99. {
  100. if (op < ARRAY_SIZE(xen_hypercall_names) &&
  101. xen_hypercall_names[op] != NULL)
  102. return xen_hypercall_names[op];
  103. return "";
  104. }
  105. unsigned long long process_xen_hypercall_name(struct trace_seq *s,
  106. unsigned long long *args)
  107. {
  108. unsigned int op = args[0];
  109. trace_seq_printf(s, "%s", xen_hypercall_name(op));
  110. return 0;
  111. }
  112. int PEVENT_PLUGIN_LOADER(struct pevent *pevent)
  113. {
  114. pevent_register_print_function(pevent,
  115. process_xen_hypercall_name,
  116. PEVENT_FUNC_ARG_STRING,
  117. "xen_hypercall_name",
  118. PEVENT_FUNC_ARG_INT,
  119. PEVENT_FUNC_ARG_VOID);
  120. return 0;
  121. }
  122. void PEVENT_PLUGIN_UNLOADER(struct pevent *pevent)
  123. {
  124. pevent_unregister_print_function(pevent, process_xen_hypercall_name,
  125. "xen_hypercall_name");
  126. }