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