]> git.ipfire.org Git - thirdparty/kernel/linux.git/blob - tools/lib/traceevent/plugin_xen.c
License cleanup: add SPDX GPL-2.0 license identifier to files with no license
[thirdparty/kernel/linux.git] / tools / lib / traceevent / plugin_xen.c
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
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
43 /* Architecture-specific hypercall definitions. */
44 #define __HYPERVISOR_arch_0 48
45 #define __HYPERVISOR_arch_1 49
46 #define __HYPERVISOR_arch_2 50
47 #define __HYPERVISOR_arch_3 51
48 #define __HYPERVISOR_arch_4 52
49 #define __HYPERVISOR_arch_5 53
50 #define __HYPERVISOR_arch_6 54
51 #define __HYPERVISOR_arch_7 55
52
53 #define N(x) [__HYPERVISOR_##x] = "("#x")"
54 static const char *xen_hypercall_names[] = {
55 N(set_trap_table),
56 N(mmu_update),
57 N(set_gdt),
58 N(stack_switch),
59 N(set_callbacks),
60 N(fpu_taskswitch),
61 N(sched_op_compat),
62 N(dom0_op),
63 N(set_debugreg),
64 N(get_debugreg),
65 N(update_descriptor),
66 N(memory_op),
67 N(multicall),
68 N(update_va_mapping),
69 N(set_timer_op),
70 N(event_channel_op_compat),
71 N(xen_version),
72 N(console_io),
73 N(physdev_op_compat),
74 N(grant_table_op),
75 N(vm_assist),
76 N(update_va_mapping_otherdomain),
77 N(iret),
78 N(vcpu_op),
79 N(set_segment_base),
80 N(mmuext_op),
81 N(acm_op),
82 N(nmi_op),
83 N(sched_op),
84 N(callback_op),
85 N(xenoprof_op),
86 N(event_channel_op),
87 N(physdev_op),
88 N(hvm_op),
89
90 /* Architecture-specific hypercall definitions. */
91 N(arch_0),
92 N(arch_1),
93 N(arch_2),
94 N(arch_3),
95 N(arch_4),
96 N(arch_5),
97 N(arch_6),
98 N(arch_7),
99 };
100 #undef N
101
102 #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
103
104 static const char *xen_hypercall_name(unsigned op)
105 {
106 if (op < ARRAY_SIZE(xen_hypercall_names) &&
107 xen_hypercall_names[op] != NULL)
108 return xen_hypercall_names[op];
109
110 return "";
111 }
112
113 unsigned long long process_xen_hypercall_name(struct trace_seq *s,
114 unsigned long long *args)
115 {
116 unsigned int op = args[0];
117
118 trace_seq_printf(s, "%s", xen_hypercall_name(op));
119 return 0;
120 }
121
122 int PEVENT_PLUGIN_LOADER(struct pevent *pevent)
123 {
124 pevent_register_print_function(pevent,
125 process_xen_hypercall_name,
126 PEVENT_FUNC_ARG_STRING,
127 "xen_hypercall_name",
128 PEVENT_FUNC_ARG_INT,
129 PEVENT_FUNC_ARG_VOID);
130 return 0;
131 }
132
133 void PEVENT_PLUGIN_UNLOADER(struct pevent *pevent)
134 {
135 pevent_unregister_print_function(pevent, process_xen_hypercall_name,
136 "xen_hypercall_name");
137 }