Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0
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 /* x86 only */
0031 #define __HYPERVISOR_vcpu_op                24
0032 #define __HYPERVISOR_set_segment_base           25 /* x86/64 only */
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 /* Architecture-specific hypercall definitions. */
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 /* Architecture-specific hypercall definitions. */
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 }