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