cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

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}