linux/tools/lib/traceevent/plugin_xen.c
<<
>>
Prefs
   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