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