0001
0002 #include <stdio.h>
0003 #include <stdlib.h>
0004 #include <string.h>
0005 #include "event-parse.h"
0006 #include "trace-seq.h"
0007
0008 #define __HYPERVISOR_set_trap_table 0
0009 #define __HYPERVISOR_mmu_update 1
0010 #define __HYPERVISOR_set_gdt 2
0011 #define __HYPERVISOR_stack_switch 3
0012 #define __HYPERVISOR_set_callbacks 4
0013 #define __HYPERVISOR_fpu_taskswitch 5
0014 #define __HYPERVISOR_sched_op_compat 6
0015 #define __HYPERVISOR_dom0_op 7
0016 #define __HYPERVISOR_set_debugreg 8
0017 #define __HYPERVISOR_get_debugreg 9
0018 #define __HYPERVISOR_update_descriptor 10
0019 #define __HYPERVISOR_memory_op 12
0020 #define __HYPERVISOR_multicall 13
0021 #define __HYPERVISOR_update_va_mapping 14
0022 #define __HYPERVISOR_set_timer_op 15
0023 #define __HYPERVISOR_event_channel_op_compat 16
0024 #define __HYPERVISOR_xen_version 17
0025 #define __HYPERVISOR_console_io 18
0026 #define __HYPERVISOR_physdev_op_compat 19
0027 #define __HYPERVISOR_grant_table_op 20
0028 #define __HYPERVISOR_vm_assist 21
0029 #define __HYPERVISOR_update_va_mapping_otherdomain 22
0030 #define __HYPERVISOR_iret 23
0031 #define __HYPERVISOR_vcpu_op 24
0032 #define __HYPERVISOR_set_segment_base 25
0033 #define __HYPERVISOR_mmuext_op 26
0034 #define __HYPERVISOR_acm_op 27
0035 #define __HYPERVISOR_nmi_op 28
0036 #define __HYPERVISOR_sched_op 29
0037 #define __HYPERVISOR_callback_op 30
0038 #define __HYPERVISOR_xenoprof_op 31
0039 #define __HYPERVISOR_event_channel_op 32
0040 #define __HYPERVISOR_physdev_op 33
0041 #define __HYPERVISOR_hvm_op 34
0042 #define __HYPERVISOR_tmem_op 38
0043
0044
0045 #define __HYPERVISOR_arch_0 48
0046 #define __HYPERVISOR_arch_1 49
0047 #define __HYPERVISOR_arch_2 50
0048 #define __HYPERVISOR_arch_3 51
0049 #define __HYPERVISOR_arch_4 52
0050 #define __HYPERVISOR_arch_5 53
0051 #define __HYPERVISOR_arch_6 54
0052 #define __HYPERVISOR_arch_7 55
0053
0054 #define N(x) [__HYPERVISOR_##x] = "("#x")"
0055 static const char *xen_hypercall_names[] = {
0056 N(set_trap_table),
0057 N(mmu_update),
0058 N(set_gdt),
0059 N(stack_switch),
0060 N(set_callbacks),
0061 N(fpu_taskswitch),
0062 N(sched_op_compat),
0063 N(dom0_op),
0064 N(set_debugreg),
0065 N(get_debugreg),
0066 N(update_descriptor),
0067 N(memory_op),
0068 N(multicall),
0069 N(update_va_mapping),
0070 N(set_timer_op),
0071 N(event_channel_op_compat),
0072 N(xen_version),
0073 N(console_io),
0074 N(physdev_op_compat),
0075 N(grant_table_op),
0076 N(vm_assist),
0077 N(update_va_mapping_otherdomain),
0078 N(iret),
0079 N(vcpu_op),
0080 N(set_segment_base),
0081 N(mmuext_op),
0082 N(acm_op),
0083 N(nmi_op),
0084 N(sched_op),
0085 N(callback_op),
0086 N(xenoprof_op),
0087 N(event_channel_op),
0088 N(physdev_op),
0089 N(hvm_op),
0090
0091
0092 N(arch_0),
0093 N(arch_1),
0094 N(arch_2),
0095 N(arch_3),
0096 N(arch_4),
0097 N(arch_5),
0098 N(arch_6),
0099 N(arch_7),
0100 };
0101 #undef N
0102
0103 #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
0104
0105 static const char *xen_hypercall_name(unsigned op)
0106 {
0107 if (op < ARRAY_SIZE(xen_hypercall_names) &&
0108 xen_hypercall_names[op] != NULL)
0109 return xen_hypercall_names[op];
0110
0111 return "";
0112 }
0113
0114 unsigned long long process_xen_hypercall_name(struct trace_seq *s,
0115 unsigned long long *args)
0116 {
0117 unsigned int op = args[0];
0118
0119 trace_seq_printf(s, "%s", xen_hypercall_name(op));
0120 return 0;
0121 }
0122
0123 int TEP_PLUGIN_LOADER(struct tep_handle *tep)
0124 {
0125 tep_register_print_function(tep,
0126 process_xen_hypercall_name,
0127 TEP_FUNC_ARG_STRING,
0128 "xen_hypercall_name",
0129 TEP_FUNC_ARG_INT,
0130 TEP_FUNC_ARG_VOID);
0131 return 0;
0132 }
0133
0134 void TEP_PLUGIN_UNLOADER(struct tep_handle *tep)
0135 {
0136 tep_unregister_print_function(tep, process_xen_hypercall_name,
0137 "xen_hypercall_name");
0138 }