1#include <stdio.h>
2#include <stdlib.h>
3#include <string.h>
4#include "event-parse.h"
5
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
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
52#define N(x)	[__HYPERVISOR_##x] = "("#x")"
53static const char *xen_hypercall_names[] = {
54	N(set_trap_table),
55	N(mmu_update),
56	N(set_gdt),
57	N(stack_switch),
58	N(set_callbacks),
59	N(fpu_taskswitch),
60	N(sched_op_compat),
61	N(dom0_op),
62	N(set_debugreg),
63	N(get_debugreg),
64	N(update_descriptor),
65	N(memory_op),
66	N(multicall),
67	N(update_va_mapping),
68	N(set_timer_op),
69	N(event_channel_op_compat),
70	N(xen_version),
71	N(console_io),
72	N(physdev_op_compat),
73	N(grant_table_op),
74	N(vm_assist),
75	N(update_va_mapping_otherdomain),
76	N(iret),
77	N(vcpu_op),
78	N(set_segment_base),
79	N(mmuext_op),
80	N(acm_op),
81	N(nmi_op),
82	N(sched_op),
83	N(callback_op),
84	N(xenoprof_op),
85	N(event_channel_op),
86	N(physdev_op),
87	N(hvm_op),
88
89/* Architecture-specific hypercall definitions. */
90	N(arch_0),
91	N(arch_1),
92	N(arch_2),
93	N(arch_3),
94	N(arch_4),
95	N(arch_5),
96	N(arch_6),
97	N(arch_7),
98};
99#undef N
100
101#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
102
103static const char *xen_hypercall_name(unsigned op)
104{
105	if (op < ARRAY_SIZE(xen_hypercall_names) &&
106	    xen_hypercall_names[op] != NULL)
107		return xen_hypercall_names[op];
108
109	return "";
110}
111
112unsigned long long process_xen_hypercall_name(struct trace_seq *s,
113					      unsigned long long *args)
114{
115	unsigned int op = args[0];
116
117	trace_seq_printf(s, "%s", xen_hypercall_name(op));
118	return 0;
119}
120
121int PEVENT_PLUGIN_LOADER(struct pevent *pevent)
122{
123	pevent_register_print_function(pevent,
124				       process_xen_hypercall_name,
125				       PEVENT_FUNC_ARG_STRING,
126				       "xen_hypercall_name",
127				       PEVENT_FUNC_ARG_INT,
128				       PEVENT_FUNC_ARG_VOID);
129	return 0;
130}
131
132void PEVENT_PLUGIN_UNLOADER(struct pevent *pevent)
133{
134	pevent_unregister_print_function(pevent, process_xen_hypercall_name,
135					 "xen_hypercall_name");
136}
137