1*436bf2bcSAndroid Build Coastguard Worker // SPDX-License-Identifier: LGPL-2.1
2*436bf2bcSAndroid Build Coastguard Worker /*
3*436bf2bcSAndroid Build Coastguard Worker * Copyright (C) 2009 Red Hat Inc, Steven Rostedt <[email protected]>
4*436bf2bcSAndroid Build Coastguard Worker */
5*436bf2bcSAndroid Build Coastguard Worker #include <stdio.h>
6*436bf2bcSAndroid Build Coastguard Worker #include <stdlib.h>
7*436bf2bcSAndroid Build Coastguard Worker #include <string.h>
8*436bf2bcSAndroid Build Coastguard Worker #include <stdint.h>
9*436bf2bcSAndroid Build Coastguard Worker
10*436bf2bcSAndroid Build Coastguard Worker #include "event-parse.h"
11*436bf2bcSAndroid Build Coastguard Worker #include "trace-seq.h"
12*436bf2bcSAndroid Build Coastguard Worker
13*436bf2bcSAndroid Build Coastguard Worker #define __weak __attribute__((weak))
14*436bf2bcSAndroid Build Coastguard Worker
15*436bf2bcSAndroid Build Coastguard Worker #ifdef HAVE_UDIS86
16*436bf2bcSAndroid Build Coastguard Worker
17*436bf2bcSAndroid Build Coastguard Worker #include <udis86.h>
18*436bf2bcSAndroid Build Coastguard Worker
19*436bf2bcSAndroid Build Coastguard Worker static ud_t ud;
20*436bf2bcSAndroid Build Coastguard Worker
init_disassembler(void)21*436bf2bcSAndroid Build Coastguard Worker static void init_disassembler(void)
22*436bf2bcSAndroid Build Coastguard Worker {
23*436bf2bcSAndroid Build Coastguard Worker ud_init(&ud);
24*436bf2bcSAndroid Build Coastguard Worker ud_set_syntax(&ud, UD_SYN_ATT);
25*436bf2bcSAndroid Build Coastguard Worker }
26*436bf2bcSAndroid Build Coastguard Worker
disassemble(unsigned char * insn,int len,uint64_t rip,int cr0_pe,int eflags_vm,int cs_d,int cs_l)27*436bf2bcSAndroid Build Coastguard Worker static const char *disassemble(unsigned char *insn, int len, uint64_t rip,
28*436bf2bcSAndroid Build Coastguard Worker int cr0_pe, int eflags_vm,
29*436bf2bcSAndroid Build Coastguard Worker int cs_d, int cs_l)
30*436bf2bcSAndroid Build Coastguard Worker {
31*436bf2bcSAndroid Build Coastguard Worker int mode;
32*436bf2bcSAndroid Build Coastguard Worker
33*436bf2bcSAndroid Build Coastguard Worker if (!cr0_pe)
34*436bf2bcSAndroid Build Coastguard Worker mode = 16;
35*436bf2bcSAndroid Build Coastguard Worker else if (eflags_vm)
36*436bf2bcSAndroid Build Coastguard Worker mode = 16;
37*436bf2bcSAndroid Build Coastguard Worker else if (cs_l)
38*436bf2bcSAndroid Build Coastguard Worker mode = 64;
39*436bf2bcSAndroid Build Coastguard Worker else if (cs_d)
40*436bf2bcSAndroid Build Coastguard Worker mode = 32;
41*436bf2bcSAndroid Build Coastguard Worker else
42*436bf2bcSAndroid Build Coastguard Worker mode = 16;
43*436bf2bcSAndroid Build Coastguard Worker
44*436bf2bcSAndroid Build Coastguard Worker ud_set_pc(&ud, rip);
45*436bf2bcSAndroid Build Coastguard Worker ud_set_mode(&ud, mode);
46*436bf2bcSAndroid Build Coastguard Worker ud_set_input_buffer(&ud, insn, len);
47*436bf2bcSAndroid Build Coastguard Worker ud_disassemble(&ud);
48*436bf2bcSAndroid Build Coastguard Worker return ud_insn_asm(&ud);
49*436bf2bcSAndroid Build Coastguard Worker }
50*436bf2bcSAndroid Build Coastguard Worker
51*436bf2bcSAndroid Build Coastguard Worker #else
52*436bf2bcSAndroid Build Coastguard Worker
init_disassembler(void)53*436bf2bcSAndroid Build Coastguard Worker static void init_disassembler(void)
54*436bf2bcSAndroid Build Coastguard Worker {
55*436bf2bcSAndroid Build Coastguard Worker }
56*436bf2bcSAndroid Build Coastguard Worker
disassemble(unsigned char * insn,int len,uint64_t rip,int cr0_pe,int eflags_vm,int cs_d,int cs_l)57*436bf2bcSAndroid Build Coastguard Worker static const char *disassemble(unsigned char *insn, int len, uint64_t rip,
58*436bf2bcSAndroid Build Coastguard Worker int cr0_pe, int eflags_vm,
59*436bf2bcSAndroid Build Coastguard Worker int cs_d, int cs_l)
60*436bf2bcSAndroid Build Coastguard Worker {
61*436bf2bcSAndroid Build Coastguard Worker static char out[15*3+1];
62*436bf2bcSAndroid Build Coastguard Worker int i;
63*436bf2bcSAndroid Build Coastguard Worker
64*436bf2bcSAndroid Build Coastguard Worker for (i = 0; i < len; ++i)
65*436bf2bcSAndroid Build Coastguard Worker sprintf(out + i * 3, "%02x ", insn[i]);
66*436bf2bcSAndroid Build Coastguard Worker out[len*3-1] = '\0';
67*436bf2bcSAndroid Build Coastguard Worker return out;
68*436bf2bcSAndroid Build Coastguard Worker }
69*436bf2bcSAndroid Build Coastguard Worker
70*436bf2bcSAndroid Build Coastguard Worker #endif
71*436bf2bcSAndroid Build Coastguard Worker
72*436bf2bcSAndroid Build Coastguard Worker
73*436bf2bcSAndroid Build Coastguard Worker #define VMX_EXIT_REASONS \
74*436bf2bcSAndroid Build Coastguard Worker _ER(EXCEPTION_NMI, 0) \
75*436bf2bcSAndroid Build Coastguard Worker _ER(EXTERNAL_INTERRUPT, 1) \
76*436bf2bcSAndroid Build Coastguard Worker _ER(TRIPLE_FAULT, 2) \
77*436bf2bcSAndroid Build Coastguard Worker _ER(PENDING_INTERRUPT, 7) \
78*436bf2bcSAndroid Build Coastguard Worker _ER(NMI_WINDOW, 8) \
79*436bf2bcSAndroid Build Coastguard Worker _ER(TASK_SWITCH, 9) \
80*436bf2bcSAndroid Build Coastguard Worker _ER(CPUID, 10) \
81*436bf2bcSAndroid Build Coastguard Worker _ER(HLT, 12) \
82*436bf2bcSAndroid Build Coastguard Worker _ER(INVD, 13) \
83*436bf2bcSAndroid Build Coastguard Worker _ER(INVLPG, 14) \
84*436bf2bcSAndroid Build Coastguard Worker _ER(RDPMC, 15) \
85*436bf2bcSAndroid Build Coastguard Worker _ER(RDTSC, 16) \
86*436bf2bcSAndroid Build Coastguard Worker _ER(VMCALL, 18) \
87*436bf2bcSAndroid Build Coastguard Worker _ER(VMCLEAR, 19) \
88*436bf2bcSAndroid Build Coastguard Worker _ER(VMLAUNCH, 20) \
89*436bf2bcSAndroid Build Coastguard Worker _ER(VMPTRLD, 21) \
90*436bf2bcSAndroid Build Coastguard Worker _ER(VMPTRST, 22) \
91*436bf2bcSAndroid Build Coastguard Worker _ER(VMREAD, 23) \
92*436bf2bcSAndroid Build Coastguard Worker _ER(VMRESUME, 24) \
93*436bf2bcSAndroid Build Coastguard Worker _ER(VMWRITE, 25) \
94*436bf2bcSAndroid Build Coastguard Worker _ER(VMOFF, 26) \
95*436bf2bcSAndroid Build Coastguard Worker _ER(VMON, 27) \
96*436bf2bcSAndroid Build Coastguard Worker _ER(CR_ACCESS, 28) \
97*436bf2bcSAndroid Build Coastguard Worker _ER(DR_ACCESS, 29) \
98*436bf2bcSAndroid Build Coastguard Worker _ER(IO_INSTRUCTION, 30) \
99*436bf2bcSAndroid Build Coastguard Worker _ER(MSR_READ, 31) \
100*436bf2bcSAndroid Build Coastguard Worker _ER(MSR_WRITE, 32) \
101*436bf2bcSAndroid Build Coastguard Worker _ER(MWAIT_INSTRUCTION, 36) \
102*436bf2bcSAndroid Build Coastguard Worker _ER(MONITOR_INSTRUCTION, 39) \
103*436bf2bcSAndroid Build Coastguard Worker _ER(PAUSE_INSTRUCTION, 40) \
104*436bf2bcSAndroid Build Coastguard Worker _ER(MCE_DURING_VMENTRY, 41) \
105*436bf2bcSAndroid Build Coastguard Worker _ER(TPR_BELOW_THRESHOLD, 43) \
106*436bf2bcSAndroid Build Coastguard Worker _ER(APIC_ACCESS, 44) \
107*436bf2bcSAndroid Build Coastguard Worker _ER(EOI_INDUCED, 45) \
108*436bf2bcSAndroid Build Coastguard Worker _ER(EPT_VIOLATION, 48) \
109*436bf2bcSAndroid Build Coastguard Worker _ER(EPT_MISCONFIG, 49) \
110*436bf2bcSAndroid Build Coastguard Worker _ER(INVEPT, 50) \
111*436bf2bcSAndroid Build Coastguard Worker _ER(PREEMPTION_TIMER, 52) \
112*436bf2bcSAndroid Build Coastguard Worker _ER(WBINVD, 54) \
113*436bf2bcSAndroid Build Coastguard Worker _ER(XSETBV, 55) \
114*436bf2bcSAndroid Build Coastguard Worker _ER(APIC_WRITE, 56) \
115*436bf2bcSAndroid Build Coastguard Worker _ER(INVPCID, 58) \
116*436bf2bcSAndroid Build Coastguard Worker _ER(PML_FULL, 62) \
117*436bf2bcSAndroid Build Coastguard Worker _ER(XSAVES, 63) \
118*436bf2bcSAndroid Build Coastguard Worker _ER(XRSTORS, 64)
119*436bf2bcSAndroid Build Coastguard Worker
120*436bf2bcSAndroid Build Coastguard Worker #define SVM_EXIT_REASONS \
121*436bf2bcSAndroid Build Coastguard Worker _ER(EXIT_READ_CR0, 0x000) \
122*436bf2bcSAndroid Build Coastguard Worker _ER(EXIT_READ_CR3, 0x003) \
123*436bf2bcSAndroid Build Coastguard Worker _ER(EXIT_READ_CR4, 0x004) \
124*436bf2bcSAndroid Build Coastguard Worker _ER(EXIT_READ_CR8, 0x008) \
125*436bf2bcSAndroid Build Coastguard Worker _ER(EXIT_WRITE_CR0, 0x010) \
126*436bf2bcSAndroid Build Coastguard Worker _ER(EXIT_WRITE_CR3, 0x013) \
127*436bf2bcSAndroid Build Coastguard Worker _ER(EXIT_WRITE_CR4, 0x014) \
128*436bf2bcSAndroid Build Coastguard Worker _ER(EXIT_WRITE_CR8, 0x018) \
129*436bf2bcSAndroid Build Coastguard Worker _ER(EXIT_READ_DR0, 0x020) \
130*436bf2bcSAndroid Build Coastguard Worker _ER(EXIT_READ_DR1, 0x021) \
131*436bf2bcSAndroid Build Coastguard Worker _ER(EXIT_READ_DR2, 0x022) \
132*436bf2bcSAndroid Build Coastguard Worker _ER(EXIT_READ_DR3, 0x023) \
133*436bf2bcSAndroid Build Coastguard Worker _ER(EXIT_READ_DR4, 0x024) \
134*436bf2bcSAndroid Build Coastguard Worker _ER(EXIT_READ_DR5, 0x025) \
135*436bf2bcSAndroid Build Coastguard Worker _ER(EXIT_READ_DR6, 0x026) \
136*436bf2bcSAndroid Build Coastguard Worker _ER(EXIT_READ_DR7, 0x027) \
137*436bf2bcSAndroid Build Coastguard Worker _ER(EXIT_WRITE_DR0, 0x030) \
138*436bf2bcSAndroid Build Coastguard Worker _ER(EXIT_WRITE_DR1, 0x031) \
139*436bf2bcSAndroid Build Coastguard Worker _ER(EXIT_WRITE_DR2, 0x032) \
140*436bf2bcSAndroid Build Coastguard Worker _ER(EXIT_WRITE_DR3, 0x033) \
141*436bf2bcSAndroid Build Coastguard Worker _ER(EXIT_WRITE_DR4, 0x034) \
142*436bf2bcSAndroid Build Coastguard Worker _ER(EXIT_WRITE_DR5, 0x035) \
143*436bf2bcSAndroid Build Coastguard Worker _ER(EXIT_WRITE_DR6, 0x036) \
144*436bf2bcSAndroid Build Coastguard Worker _ER(EXIT_WRITE_DR7, 0x037) \
145*436bf2bcSAndroid Build Coastguard Worker _ER(EXIT_EXCP_DE, 0x040) \
146*436bf2bcSAndroid Build Coastguard Worker _ER(EXIT_EXCP_DB, 0x041) \
147*436bf2bcSAndroid Build Coastguard Worker _ER(EXIT_EXCP_BP, 0x043) \
148*436bf2bcSAndroid Build Coastguard Worker _ER(EXIT_EXCP_OF, 0x044) \
149*436bf2bcSAndroid Build Coastguard Worker _ER(EXIT_EXCP_BR, 0x045) \
150*436bf2bcSAndroid Build Coastguard Worker _ER(EXIT_EXCP_UD, 0x046) \
151*436bf2bcSAndroid Build Coastguard Worker _ER(EXIT_EXCP_NM, 0x047) \
152*436bf2bcSAndroid Build Coastguard Worker _ER(EXIT_EXCP_DF, 0x048) \
153*436bf2bcSAndroid Build Coastguard Worker _ER(EXIT_EXCP_TS, 0x04a) \
154*436bf2bcSAndroid Build Coastguard Worker _ER(EXIT_EXCP_NP, 0x04b) \
155*436bf2bcSAndroid Build Coastguard Worker _ER(EXIT_EXCP_SS, 0x04c) \
156*436bf2bcSAndroid Build Coastguard Worker _ER(EXIT_EXCP_GP, 0x04d) \
157*436bf2bcSAndroid Build Coastguard Worker _ER(EXIT_EXCP_PF, 0x04e) \
158*436bf2bcSAndroid Build Coastguard Worker _ER(EXIT_EXCP_MF, 0x050) \
159*436bf2bcSAndroid Build Coastguard Worker _ER(EXIT_EXCP_AC, 0x051) \
160*436bf2bcSAndroid Build Coastguard Worker _ER(EXIT_EXCP_MC, 0x052) \
161*436bf2bcSAndroid Build Coastguard Worker _ER(EXIT_EXCP_XF, 0x053) \
162*436bf2bcSAndroid Build Coastguard Worker _ER(EXIT_INTR, 0x060) \
163*436bf2bcSAndroid Build Coastguard Worker _ER(EXIT_NMI, 0x061) \
164*436bf2bcSAndroid Build Coastguard Worker _ER(EXIT_SMI, 0x062) \
165*436bf2bcSAndroid Build Coastguard Worker _ER(EXIT_INIT, 0x063) \
166*436bf2bcSAndroid Build Coastguard Worker _ER(EXIT_VINTR, 0x064) \
167*436bf2bcSAndroid Build Coastguard Worker _ER(EXIT_CR0_SEL_WRITE, 0x065) \
168*436bf2bcSAndroid Build Coastguard Worker _ER(EXIT_IDTR_READ, 0x066) \
169*436bf2bcSAndroid Build Coastguard Worker _ER(EXIT_GDTR_READ, 0x067) \
170*436bf2bcSAndroid Build Coastguard Worker _ER(EXIT_LDTR_READ, 0x068) \
171*436bf2bcSAndroid Build Coastguard Worker _ER(EXIT_TR_READ, 0x069) \
172*436bf2bcSAndroid Build Coastguard Worker _ER(EXIT_IDTR_WRITE, 0x06a) \
173*436bf2bcSAndroid Build Coastguard Worker _ER(EXIT_GDTR_WRITE, 0x06b) \
174*436bf2bcSAndroid Build Coastguard Worker _ER(EXIT_LDTR_WRITE, 0x06c) \
175*436bf2bcSAndroid Build Coastguard Worker _ER(EXIT_TR_WRITE, 0x06d) \
176*436bf2bcSAndroid Build Coastguard Worker _ER(EXIT_RDTSC, 0x06e) \
177*436bf2bcSAndroid Build Coastguard Worker _ER(EXIT_RDPMC, 0x06f) \
178*436bf2bcSAndroid Build Coastguard Worker _ER(EXIT_PUSHF, 0x070) \
179*436bf2bcSAndroid Build Coastguard Worker _ER(EXIT_POPF, 0x071) \
180*436bf2bcSAndroid Build Coastguard Worker _ER(EXIT_CPUID, 0x072) \
181*436bf2bcSAndroid Build Coastguard Worker _ER(EXIT_RSM, 0x073) \
182*436bf2bcSAndroid Build Coastguard Worker _ER(EXIT_IRET, 0x074) \
183*436bf2bcSAndroid Build Coastguard Worker _ER(EXIT_SWINT, 0x075) \
184*436bf2bcSAndroid Build Coastguard Worker _ER(EXIT_INVD, 0x076) \
185*436bf2bcSAndroid Build Coastguard Worker _ER(EXIT_PAUSE, 0x077) \
186*436bf2bcSAndroid Build Coastguard Worker _ER(EXIT_HLT, 0x078) \
187*436bf2bcSAndroid Build Coastguard Worker _ER(EXIT_INVLPG, 0x079) \
188*436bf2bcSAndroid Build Coastguard Worker _ER(EXIT_INVLPGA, 0x07a) \
189*436bf2bcSAndroid Build Coastguard Worker _ER(EXIT_IOIO, 0x07b) \
190*436bf2bcSAndroid Build Coastguard Worker _ER(EXIT_MSR, 0x07c) \
191*436bf2bcSAndroid Build Coastguard Worker _ER(EXIT_TASK_SWITCH, 0x07d) \
192*436bf2bcSAndroid Build Coastguard Worker _ER(EXIT_FERR_FREEZE, 0x07e) \
193*436bf2bcSAndroid Build Coastguard Worker _ER(EXIT_SHUTDOWN, 0x07f) \
194*436bf2bcSAndroid Build Coastguard Worker _ER(EXIT_VMRUN, 0x080) \
195*436bf2bcSAndroid Build Coastguard Worker _ER(EXIT_VMMCALL, 0x081) \
196*436bf2bcSAndroid Build Coastguard Worker _ER(EXIT_VMLOAD, 0x082) \
197*436bf2bcSAndroid Build Coastguard Worker _ER(EXIT_VMSAVE, 0x083) \
198*436bf2bcSAndroid Build Coastguard Worker _ER(EXIT_STGI, 0x084) \
199*436bf2bcSAndroid Build Coastguard Worker _ER(EXIT_CLGI, 0x085) \
200*436bf2bcSAndroid Build Coastguard Worker _ER(EXIT_SKINIT, 0x086) \
201*436bf2bcSAndroid Build Coastguard Worker _ER(EXIT_RDTSCP, 0x087) \
202*436bf2bcSAndroid Build Coastguard Worker _ER(EXIT_ICEBP, 0x088) \
203*436bf2bcSAndroid Build Coastguard Worker _ER(EXIT_WBINVD, 0x089) \
204*436bf2bcSAndroid Build Coastguard Worker _ER(EXIT_MONITOR, 0x08a) \
205*436bf2bcSAndroid Build Coastguard Worker _ER(EXIT_MWAIT, 0x08b) \
206*436bf2bcSAndroid Build Coastguard Worker _ER(EXIT_MWAIT_COND, 0x08c) \
207*436bf2bcSAndroid Build Coastguard Worker _ER(EXIT_XSETBV, 0x08d) \
208*436bf2bcSAndroid Build Coastguard Worker _ER(EXIT_NPF, 0x400) \
209*436bf2bcSAndroid Build Coastguard Worker _ER(EXIT_AVIC_INCOMPLETE_IPI, 0x401) \
210*436bf2bcSAndroid Build Coastguard Worker _ER(EXIT_AVIC_UNACCELERATED_ACCESS, 0x402) \
211*436bf2bcSAndroid Build Coastguard Worker _ER(EXIT_ERR, -1)
212*436bf2bcSAndroid Build Coastguard Worker
213*436bf2bcSAndroid Build Coastguard Worker #define _ER(reason, val) { #reason, val },
214*436bf2bcSAndroid Build Coastguard Worker struct str_values {
215*436bf2bcSAndroid Build Coastguard Worker const char *str;
216*436bf2bcSAndroid Build Coastguard Worker int val;
217*436bf2bcSAndroid Build Coastguard Worker };
218*436bf2bcSAndroid Build Coastguard Worker
219*436bf2bcSAndroid Build Coastguard Worker static struct str_values vmx_exit_reasons[] = {
220*436bf2bcSAndroid Build Coastguard Worker VMX_EXIT_REASONS
221*436bf2bcSAndroid Build Coastguard Worker { NULL, -1}
222*436bf2bcSAndroid Build Coastguard Worker };
223*436bf2bcSAndroid Build Coastguard Worker
224*436bf2bcSAndroid Build Coastguard Worker static struct str_values svm_exit_reasons[] = {
225*436bf2bcSAndroid Build Coastguard Worker SVM_EXIT_REASONS
226*436bf2bcSAndroid Build Coastguard Worker { NULL, -1}
227*436bf2bcSAndroid Build Coastguard Worker };
228*436bf2bcSAndroid Build Coastguard Worker
229*436bf2bcSAndroid Build Coastguard Worker static struct isa_exit_reasons {
230*436bf2bcSAndroid Build Coastguard Worker unsigned isa;
231*436bf2bcSAndroid Build Coastguard Worker struct str_values *strings;
232*436bf2bcSAndroid Build Coastguard Worker } isa_exit_reasons[] = {
233*436bf2bcSAndroid Build Coastguard Worker { .isa = 1, .strings = vmx_exit_reasons },
234*436bf2bcSAndroid Build Coastguard Worker { .isa = 2, .strings = svm_exit_reasons },
235*436bf2bcSAndroid Build Coastguard Worker { }
236*436bf2bcSAndroid Build Coastguard Worker };
237*436bf2bcSAndroid Build Coastguard Worker
find_exit_reason(unsigned isa,int val)238*436bf2bcSAndroid Build Coastguard Worker static const char *find_exit_reason(unsigned isa, int val)
239*436bf2bcSAndroid Build Coastguard Worker {
240*436bf2bcSAndroid Build Coastguard Worker struct str_values *strings = NULL;
241*436bf2bcSAndroid Build Coastguard Worker int i;
242*436bf2bcSAndroid Build Coastguard Worker
243*436bf2bcSAndroid Build Coastguard Worker for (i = 0; isa_exit_reasons[i].strings; ++i)
244*436bf2bcSAndroid Build Coastguard Worker if (isa_exit_reasons[i].isa == isa) {
245*436bf2bcSAndroid Build Coastguard Worker strings = isa_exit_reasons[i].strings;
246*436bf2bcSAndroid Build Coastguard Worker break;
247*436bf2bcSAndroid Build Coastguard Worker }
248*436bf2bcSAndroid Build Coastguard Worker if (!strings)
249*436bf2bcSAndroid Build Coastguard Worker return "UNKNOWN-ISA";
250*436bf2bcSAndroid Build Coastguard Worker for (i = 0; strings[i].str; i++)
251*436bf2bcSAndroid Build Coastguard Worker if (strings[i].val == val)
252*436bf2bcSAndroid Build Coastguard Worker break;
253*436bf2bcSAndroid Build Coastguard Worker
254*436bf2bcSAndroid Build Coastguard Worker return strings[i].str;
255*436bf2bcSAndroid Build Coastguard Worker }
256*436bf2bcSAndroid Build Coastguard Worker
print_exit_reason(struct trace_seq * s,struct tep_record * record,struct tep_event * event,const char * field)257*436bf2bcSAndroid Build Coastguard Worker static int print_exit_reason(struct trace_seq *s, struct tep_record *record,
258*436bf2bcSAndroid Build Coastguard Worker struct tep_event *event, const char *field)
259*436bf2bcSAndroid Build Coastguard Worker {
260*436bf2bcSAndroid Build Coastguard Worker unsigned long long isa;
261*436bf2bcSAndroid Build Coastguard Worker unsigned long long val;
262*436bf2bcSAndroid Build Coastguard Worker const char *reason;
263*436bf2bcSAndroid Build Coastguard Worker
264*436bf2bcSAndroid Build Coastguard Worker if (tep_get_field_val(s, event, field, record, &val, 1) < 0)
265*436bf2bcSAndroid Build Coastguard Worker return -1;
266*436bf2bcSAndroid Build Coastguard Worker
267*436bf2bcSAndroid Build Coastguard Worker if (tep_get_field_val(s, event, "isa", record, &isa, 0) < 0)
268*436bf2bcSAndroid Build Coastguard Worker isa = 1;
269*436bf2bcSAndroid Build Coastguard Worker
270*436bf2bcSAndroid Build Coastguard Worker reason = find_exit_reason(isa, val);
271*436bf2bcSAndroid Build Coastguard Worker if (reason)
272*436bf2bcSAndroid Build Coastguard Worker trace_seq_printf(s, "reason %s", reason);
273*436bf2bcSAndroid Build Coastguard Worker else
274*436bf2bcSAndroid Build Coastguard Worker trace_seq_printf(s, "reason UNKNOWN (%llu)", val);
275*436bf2bcSAndroid Build Coastguard Worker return 0;
276*436bf2bcSAndroid Build Coastguard Worker }
277*436bf2bcSAndroid Build Coastguard Worker
tep_plugin_kvm_get_func(struct tep_event * event,struct tep_record * record,unsigned long long * val)278*436bf2bcSAndroid Build Coastguard Worker __weak const char *tep_plugin_kvm_get_func(struct tep_event *event,
279*436bf2bcSAndroid Build Coastguard Worker struct tep_record *record,
280*436bf2bcSAndroid Build Coastguard Worker unsigned long long *val)
281*436bf2bcSAndroid Build Coastguard Worker {
282*436bf2bcSAndroid Build Coastguard Worker return NULL;
283*436bf2bcSAndroid Build Coastguard Worker }
284*436bf2bcSAndroid Build Coastguard Worker
tep_plugin_kvm_put_func(const char * func)285*436bf2bcSAndroid Build Coastguard Worker __weak void tep_plugin_kvm_put_func(const char *func)
286*436bf2bcSAndroid Build Coastguard Worker {
287*436bf2bcSAndroid Build Coastguard Worker }
288*436bf2bcSAndroid Build Coastguard Worker
289*436bf2bcSAndroid Build Coastguard Worker
add_rip_function(struct trace_seq * s,struct tep_record * record,struct tep_event * event,unsigned long long rip)290*436bf2bcSAndroid Build Coastguard Worker static void add_rip_function(struct trace_seq *s, struct tep_record *record,
291*436bf2bcSAndroid Build Coastguard Worker struct tep_event *event, unsigned long long rip)
292*436bf2bcSAndroid Build Coastguard Worker {
293*436bf2bcSAndroid Build Coastguard Worker unsigned long long ip = rip;
294*436bf2bcSAndroid Build Coastguard Worker const char *func;
295*436bf2bcSAndroid Build Coastguard Worker
296*436bf2bcSAndroid Build Coastguard Worker func = tep_plugin_kvm_get_func(event, record, &ip);
297*436bf2bcSAndroid Build Coastguard Worker if (func) {
298*436bf2bcSAndroid Build Coastguard Worker trace_seq_printf(s, " %s", func);
299*436bf2bcSAndroid Build Coastguard Worker /* The application may upate ip to the start of the function */
300*436bf2bcSAndroid Build Coastguard Worker if (ip != rip)
301*436bf2bcSAndroid Build Coastguard Worker trace_seq_printf(s, "+0x%0llx", rip - ip);
302*436bf2bcSAndroid Build Coastguard Worker tep_plugin_kvm_put_func(func);
303*436bf2bcSAndroid Build Coastguard Worker }
304*436bf2bcSAndroid Build Coastguard Worker }
305*436bf2bcSAndroid Build Coastguard Worker
kvm_exit_handler(struct trace_seq * s,struct tep_record * record,struct tep_event * event,void * context)306*436bf2bcSAndroid Build Coastguard Worker static int kvm_exit_handler(struct trace_seq *s, struct tep_record *record,
307*436bf2bcSAndroid Build Coastguard Worker struct tep_event *event, void *context)
308*436bf2bcSAndroid Build Coastguard Worker {
309*436bf2bcSAndroid Build Coastguard Worker unsigned long long info1 = 0, info2 = 0;
310*436bf2bcSAndroid Build Coastguard Worker unsigned long long rip;
311*436bf2bcSAndroid Build Coastguard Worker
312*436bf2bcSAndroid Build Coastguard Worker if (print_exit_reason(s, record, event, "exit_reason") < 0)
313*436bf2bcSAndroid Build Coastguard Worker return -1;
314*436bf2bcSAndroid Build Coastguard Worker
315*436bf2bcSAndroid Build Coastguard Worker if (tep_get_field_val(s, event, "guest_rip", record, &rip, 1) < 0)
316*436bf2bcSAndroid Build Coastguard Worker return -1;
317*436bf2bcSAndroid Build Coastguard Worker
318*436bf2bcSAndroid Build Coastguard Worker trace_seq_printf(s, " rip 0x%llx", rip);
319*436bf2bcSAndroid Build Coastguard Worker
320*436bf2bcSAndroid Build Coastguard Worker add_rip_function(s, record, event, rip);
321*436bf2bcSAndroid Build Coastguard Worker
322*436bf2bcSAndroid Build Coastguard Worker if (tep_get_field_val(s, event, "info1", record, &info1, 0) >= 0
323*436bf2bcSAndroid Build Coastguard Worker && tep_get_field_val(s, event, "info2", record, &info2, 0) >= 0)
324*436bf2bcSAndroid Build Coastguard Worker trace_seq_printf(s, " info %llx %llx", info1, info2);
325*436bf2bcSAndroid Build Coastguard Worker
326*436bf2bcSAndroid Build Coastguard Worker return 0;
327*436bf2bcSAndroid Build Coastguard Worker }
328*436bf2bcSAndroid Build Coastguard Worker
kvm_entry_handler(struct trace_seq * s,struct tep_record * record,struct tep_event * event,void * context)329*436bf2bcSAndroid Build Coastguard Worker static int kvm_entry_handler(struct trace_seq *s, struct tep_record *record,
330*436bf2bcSAndroid Build Coastguard Worker struct tep_event *event, void *context)
331*436bf2bcSAndroid Build Coastguard Worker {
332*436bf2bcSAndroid Build Coastguard Worker unsigned long long rip;
333*436bf2bcSAndroid Build Coastguard Worker
334*436bf2bcSAndroid Build Coastguard Worker tep_print_num_field(s, " vcpu %u", event, "vcpu_id", record, 1);
335*436bf2bcSAndroid Build Coastguard Worker
336*436bf2bcSAndroid Build Coastguard Worker if (tep_get_field_val(s, event, "rip", record, &rip, 1) < 0)
337*436bf2bcSAndroid Build Coastguard Worker return -1;
338*436bf2bcSAndroid Build Coastguard Worker
339*436bf2bcSAndroid Build Coastguard Worker trace_seq_printf(s, " rip 0x%llx", rip);
340*436bf2bcSAndroid Build Coastguard Worker add_rip_function(s, record, event, rip);
341*436bf2bcSAndroid Build Coastguard Worker
342*436bf2bcSAndroid Build Coastguard Worker return 0;
343*436bf2bcSAndroid Build Coastguard Worker }
344*436bf2bcSAndroid Build Coastguard Worker
345*436bf2bcSAndroid Build Coastguard Worker #define KVM_EMUL_INSN_F_CR0_PE (1 << 0)
346*436bf2bcSAndroid Build Coastguard Worker #define KVM_EMUL_INSN_F_EFL_VM (1 << 1)
347*436bf2bcSAndroid Build Coastguard Worker #define KVM_EMUL_INSN_F_CS_D (1 << 2)
348*436bf2bcSAndroid Build Coastguard Worker #define KVM_EMUL_INSN_F_CS_L (1 << 3)
349*436bf2bcSAndroid Build Coastguard Worker
kvm_emulate_insn_handler(struct trace_seq * s,struct tep_record * record,struct tep_event * event,void * context)350*436bf2bcSAndroid Build Coastguard Worker static int kvm_emulate_insn_handler(struct trace_seq *s,
351*436bf2bcSAndroid Build Coastguard Worker struct tep_record *record,
352*436bf2bcSAndroid Build Coastguard Worker struct tep_event *event, void *context)
353*436bf2bcSAndroid Build Coastguard Worker {
354*436bf2bcSAndroid Build Coastguard Worker unsigned long long rip, csbase, len, flags, failed;
355*436bf2bcSAndroid Build Coastguard Worker int llen;
356*436bf2bcSAndroid Build Coastguard Worker uint8_t *insn;
357*436bf2bcSAndroid Build Coastguard Worker const char *disasm;
358*436bf2bcSAndroid Build Coastguard Worker
359*436bf2bcSAndroid Build Coastguard Worker if (tep_get_field_val(s, event, "rip", record, &rip, 1) < 0)
360*436bf2bcSAndroid Build Coastguard Worker return -1;
361*436bf2bcSAndroid Build Coastguard Worker
362*436bf2bcSAndroid Build Coastguard Worker if (tep_get_field_val(s, event, "csbase", record, &csbase, 1) < 0)
363*436bf2bcSAndroid Build Coastguard Worker return -1;
364*436bf2bcSAndroid Build Coastguard Worker
365*436bf2bcSAndroid Build Coastguard Worker if (tep_get_field_val(s, event, "len", record, &len, 1) < 0)
366*436bf2bcSAndroid Build Coastguard Worker return -1;
367*436bf2bcSAndroid Build Coastguard Worker
368*436bf2bcSAndroid Build Coastguard Worker if (tep_get_field_val(s, event, "flags", record, &flags, 1) < 0)
369*436bf2bcSAndroid Build Coastguard Worker return -1;
370*436bf2bcSAndroid Build Coastguard Worker
371*436bf2bcSAndroid Build Coastguard Worker if (tep_get_field_val(s, event, "failed", record, &failed, 1) < 0)
372*436bf2bcSAndroid Build Coastguard Worker return -1;
373*436bf2bcSAndroid Build Coastguard Worker
374*436bf2bcSAndroid Build Coastguard Worker insn = tep_get_field_raw(s, event, "insn", record, &llen, 1);
375*436bf2bcSAndroid Build Coastguard Worker if (!insn)
376*436bf2bcSAndroid Build Coastguard Worker return -1;
377*436bf2bcSAndroid Build Coastguard Worker
378*436bf2bcSAndroid Build Coastguard Worker disasm = disassemble(insn, len, rip,
379*436bf2bcSAndroid Build Coastguard Worker flags & KVM_EMUL_INSN_F_CR0_PE,
380*436bf2bcSAndroid Build Coastguard Worker flags & KVM_EMUL_INSN_F_EFL_VM,
381*436bf2bcSAndroid Build Coastguard Worker flags & KVM_EMUL_INSN_F_CS_D,
382*436bf2bcSAndroid Build Coastguard Worker flags & KVM_EMUL_INSN_F_CS_L);
383*436bf2bcSAndroid Build Coastguard Worker
384*436bf2bcSAndroid Build Coastguard Worker trace_seq_printf(s, "%llx:%llx", csbase, rip);
385*436bf2bcSAndroid Build Coastguard Worker add_rip_function(s, record, event, rip);
386*436bf2bcSAndroid Build Coastguard Worker trace_seq_printf(s, ": %s%s", disasm, failed ? " FAIL" : "");
387*436bf2bcSAndroid Build Coastguard Worker return 0;
388*436bf2bcSAndroid Build Coastguard Worker }
389*436bf2bcSAndroid Build Coastguard Worker
kvm_nested_vmexit_inject_handler(struct trace_seq * s,struct tep_record * record,struct tep_event * event,void * context)390*436bf2bcSAndroid Build Coastguard Worker static int kvm_nested_vmexit_inject_handler(struct trace_seq *s, struct tep_record *record,
391*436bf2bcSAndroid Build Coastguard Worker struct tep_event *event, void *context)
392*436bf2bcSAndroid Build Coastguard Worker {
393*436bf2bcSAndroid Build Coastguard Worker if (print_exit_reason(s, record, event, "exit_code") < 0)
394*436bf2bcSAndroid Build Coastguard Worker return -1;
395*436bf2bcSAndroid Build Coastguard Worker
396*436bf2bcSAndroid Build Coastguard Worker tep_print_num_field(s, " info1 %llx", event, "exit_info1", record, 1);
397*436bf2bcSAndroid Build Coastguard Worker tep_print_num_field(s, " info2 %llx", event, "exit_info2", record, 1);
398*436bf2bcSAndroid Build Coastguard Worker tep_print_num_field(s, " int_info %llx", event, "exit_int_info", record, 1);
399*436bf2bcSAndroid Build Coastguard Worker tep_print_num_field(s, " int_info_err %llx", event, "exit_int_info_err", record, 1);
400*436bf2bcSAndroid Build Coastguard Worker
401*436bf2bcSAndroid Build Coastguard Worker return 0;
402*436bf2bcSAndroid Build Coastguard Worker }
403*436bf2bcSAndroid Build Coastguard Worker
kvm_nested_vmexit_handler(struct trace_seq * s,struct tep_record * record,struct tep_event * event,void * context)404*436bf2bcSAndroid Build Coastguard Worker static int kvm_nested_vmexit_handler(struct trace_seq *s, struct tep_record *record,
405*436bf2bcSAndroid Build Coastguard Worker struct tep_event *event, void *context)
406*436bf2bcSAndroid Build Coastguard Worker {
407*436bf2bcSAndroid Build Coastguard Worker unsigned long long rip;
408*436bf2bcSAndroid Build Coastguard Worker
409*436bf2bcSAndroid Build Coastguard Worker if (tep_get_field_val(s, event, "rip", record, &rip, 1) < 0)
410*436bf2bcSAndroid Build Coastguard Worker return -1;
411*436bf2bcSAndroid Build Coastguard Worker
412*436bf2bcSAndroid Build Coastguard Worker trace_seq_printf(s, " rip %llx", rip);
413*436bf2bcSAndroid Build Coastguard Worker add_rip_function(s, record, event, rip);
414*436bf2bcSAndroid Build Coastguard Worker
415*436bf2bcSAndroid Build Coastguard Worker return kvm_nested_vmexit_inject_handler(s, record, event, context);
416*436bf2bcSAndroid Build Coastguard Worker }
417*436bf2bcSAndroid Build Coastguard Worker
418*436bf2bcSAndroid Build Coastguard Worker union kvm_mmu_page_role {
419*436bf2bcSAndroid Build Coastguard Worker unsigned word;
420*436bf2bcSAndroid Build Coastguard Worker struct {
421*436bf2bcSAndroid Build Coastguard Worker unsigned level:4;
422*436bf2bcSAndroid Build Coastguard Worker unsigned cr4_pae:1;
423*436bf2bcSAndroid Build Coastguard Worker unsigned quadrant:2;
424*436bf2bcSAndroid Build Coastguard Worker unsigned direct:1;
425*436bf2bcSAndroid Build Coastguard Worker unsigned access:3;
426*436bf2bcSAndroid Build Coastguard Worker unsigned invalid:1;
427*436bf2bcSAndroid Build Coastguard Worker unsigned nxe:1;
428*436bf2bcSAndroid Build Coastguard Worker unsigned cr0_wp:1;
429*436bf2bcSAndroid Build Coastguard Worker unsigned smep_and_not_wp:1;
430*436bf2bcSAndroid Build Coastguard Worker unsigned smap_and_not_wp:1;
431*436bf2bcSAndroid Build Coastguard Worker unsigned pad_for_nice_hex_output:8;
432*436bf2bcSAndroid Build Coastguard Worker unsigned smm:8;
433*436bf2bcSAndroid Build Coastguard Worker };
434*436bf2bcSAndroid Build Coastguard Worker };
435*436bf2bcSAndroid Build Coastguard Worker
kvm_mmu_print_role(struct trace_seq * s,struct tep_record * record,struct tep_event * event,void * context)436*436bf2bcSAndroid Build Coastguard Worker static int kvm_mmu_print_role(struct trace_seq *s, struct tep_record *record,
437*436bf2bcSAndroid Build Coastguard Worker struct tep_event *event, void *context)
438*436bf2bcSAndroid Build Coastguard Worker {
439*436bf2bcSAndroid Build Coastguard Worker unsigned long long val;
440*436bf2bcSAndroid Build Coastguard Worker static const char *access_str[] = {
441*436bf2bcSAndroid Build Coastguard Worker "---", "--x", "w--", "w-x", "-u-", "-ux", "wu-", "wux"
442*436bf2bcSAndroid Build Coastguard Worker };
443*436bf2bcSAndroid Build Coastguard Worker union kvm_mmu_page_role role;
444*436bf2bcSAndroid Build Coastguard Worker
445*436bf2bcSAndroid Build Coastguard Worker if (tep_get_field_val(s, event, "role", record, &val, 1) < 0)
446*436bf2bcSAndroid Build Coastguard Worker return -1;
447*436bf2bcSAndroid Build Coastguard Worker
448*436bf2bcSAndroid Build Coastguard Worker role.word = (int)val;
449*436bf2bcSAndroid Build Coastguard Worker
450*436bf2bcSAndroid Build Coastguard Worker /*
451*436bf2bcSAndroid Build Coastguard Worker * We can only use the structure if file is of the same
452*436bf2bcSAndroid Build Coastguard Worker * endianness.
453*436bf2bcSAndroid Build Coastguard Worker */
454*436bf2bcSAndroid Build Coastguard Worker if (tep_is_file_bigendian(event->tep) ==
455*436bf2bcSAndroid Build Coastguard Worker tep_is_local_bigendian(event->tep)) {
456*436bf2bcSAndroid Build Coastguard Worker
457*436bf2bcSAndroid Build Coastguard Worker trace_seq_printf(s, "%u q%u%s %s%s %spae %snxe %swp%s%s%s",
458*436bf2bcSAndroid Build Coastguard Worker role.level,
459*436bf2bcSAndroid Build Coastguard Worker role.quadrant,
460*436bf2bcSAndroid Build Coastguard Worker role.direct ? " direct" : "",
461*436bf2bcSAndroid Build Coastguard Worker access_str[role.access],
462*436bf2bcSAndroid Build Coastguard Worker role.invalid ? " invalid" : "",
463*436bf2bcSAndroid Build Coastguard Worker role.cr4_pae ? "" : "!",
464*436bf2bcSAndroid Build Coastguard Worker role.nxe ? "" : "!",
465*436bf2bcSAndroid Build Coastguard Worker role.cr0_wp ? "" : "!",
466*436bf2bcSAndroid Build Coastguard Worker role.smep_and_not_wp ? " smep" : "",
467*436bf2bcSAndroid Build Coastguard Worker role.smap_and_not_wp ? " smap" : "",
468*436bf2bcSAndroid Build Coastguard Worker role.smm ? " smm" : "");
469*436bf2bcSAndroid Build Coastguard Worker } else
470*436bf2bcSAndroid Build Coastguard Worker trace_seq_printf(s, "WORD: %08x", role.word);
471*436bf2bcSAndroid Build Coastguard Worker
472*436bf2bcSAndroid Build Coastguard Worker tep_print_num_field(s, " root %u ", event,
473*436bf2bcSAndroid Build Coastguard Worker "root_count", record, 1);
474*436bf2bcSAndroid Build Coastguard Worker
475*436bf2bcSAndroid Build Coastguard Worker if (tep_get_field_val(s, event, "unsync", record, &val, 1) < 0)
476*436bf2bcSAndroid Build Coastguard Worker return -1;
477*436bf2bcSAndroid Build Coastguard Worker
478*436bf2bcSAndroid Build Coastguard Worker trace_seq_printf(s, "%s%c", val ? "unsync" : "sync", 0);
479*436bf2bcSAndroid Build Coastguard Worker return 0;
480*436bf2bcSAndroid Build Coastguard Worker }
481*436bf2bcSAndroid Build Coastguard Worker
kvm_mmu_get_page_handler(struct trace_seq * s,struct tep_record * record,struct tep_event * event,void * context)482*436bf2bcSAndroid Build Coastguard Worker static int kvm_mmu_get_page_handler(struct trace_seq *s,
483*436bf2bcSAndroid Build Coastguard Worker struct tep_record *record,
484*436bf2bcSAndroid Build Coastguard Worker struct tep_event *event, void *context)
485*436bf2bcSAndroid Build Coastguard Worker {
486*436bf2bcSAndroid Build Coastguard Worker unsigned long long val;
487*436bf2bcSAndroid Build Coastguard Worker
488*436bf2bcSAndroid Build Coastguard Worker if (tep_get_field_val(s, event, "created", record, &val, 1) < 0)
489*436bf2bcSAndroid Build Coastguard Worker return -1;
490*436bf2bcSAndroid Build Coastguard Worker
491*436bf2bcSAndroid Build Coastguard Worker trace_seq_printf(s, "%s ", val ? "new" : "existing");
492*436bf2bcSAndroid Build Coastguard Worker
493*436bf2bcSAndroid Build Coastguard Worker if (tep_get_field_val(s, event, "gfn", record, &val, 1) < 0)
494*436bf2bcSAndroid Build Coastguard Worker return -1;
495*436bf2bcSAndroid Build Coastguard Worker
496*436bf2bcSAndroid Build Coastguard Worker trace_seq_printf(s, "sp gfn %llx ", val);
497*436bf2bcSAndroid Build Coastguard Worker return kvm_mmu_print_role(s, record, event, context);
498*436bf2bcSAndroid Build Coastguard Worker }
499*436bf2bcSAndroid Build Coastguard Worker
500*436bf2bcSAndroid Build Coastguard Worker #define PT_WRITABLE_SHIFT 1
501*436bf2bcSAndroid Build Coastguard Worker #define PT_WRITABLE_MASK (1ULL << PT_WRITABLE_SHIFT)
502*436bf2bcSAndroid Build Coastguard Worker
503*436bf2bcSAndroid Build Coastguard Worker static unsigned long long
process_is_writable_pte(struct trace_seq * s,unsigned long long * args)504*436bf2bcSAndroid Build Coastguard Worker process_is_writable_pte(struct trace_seq *s, unsigned long long *args)
505*436bf2bcSAndroid Build Coastguard Worker {
506*436bf2bcSAndroid Build Coastguard Worker unsigned long pte = args[0];
507*436bf2bcSAndroid Build Coastguard Worker return pte & PT_WRITABLE_MASK;
508*436bf2bcSAndroid Build Coastguard Worker }
509*436bf2bcSAndroid Build Coastguard Worker
TEP_PLUGIN_LOADER(struct tep_handle * tep)510*436bf2bcSAndroid Build Coastguard Worker int TEP_PLUGIN_LOADER(struct tep_handle *tep)
511*436bf2bcSAndroid Build Coastguard Worker {
512*436bf2bcSAndroid Build Coastguard Worker init_disassembler();
513*436bf2bcSAndroid Build Coastguard Worker
514*436bf2bcSAndroid Build Coastguard Worker tep_register_event_handler(tep, -1, "kvm", "kvm_exit",
515*436bf2bcSAndroid Build Coastguard Worker kvm_exit_handler, NULL);
516*436bf2bcSAndroid Build Coastguard Worker
517*436bf2bcSAndroid Build Coastguard Worker tep_register_event_handler(tep, -1, "kvm", "kvm_entry",
518*436bf2bcSAndroid Build Coastguard Worker kvm_entry_handler, NULL);
519*436bf2bcSAndroid Build Coastguard Worker
520*436bf2bcSAndroid Build Coastguard Worker tep_register_event_handler(tep, -1, "kvm", "kvm_emulate_insn",
521*436bf2bcSAndroid Build Coastguard Worker kvm_emulate_insn_handler, NULL);
522*436bf2bcSAndroid Build Coastguard Worker
523*436bf2bcSAndroid Build Coastguard Worker tep_register_event_handler(tep, -1, "kvm", "kvm_nested_vmexit",
524*436bf2bcSAndroid Build Coastguard Worker kvm_nested_vmexit_handler, NULL);
525*436bf2bcSAndroid Build Coastguard Worker
526*436bf2bcSAndroid Build Coastguard Worker tep_register_event_handler(tep, -1, "kvm", "kvm_nested_vmexit_inject",
527*436bf2bcSAndroid Build Coastguard Worker kvm_nested_vmexit_inject_handler, NULL);
528*436bf2bcSAndroid Build Coastguard Worker
529*436bf2bcSAndroid Build Coastguard Worker tep_register_event_handler(tep, -1, "kvmmmu", "kvm_mmu_get_page",
530*436bf2bcSAndroid Build Coastguard Worker kvm_mmu_get_page_handler, NULL);
531*436bf2bcSAndroid Build Coastguard Worker
532*436bf2bcSAndroid Build Coastguard Worker tep_register_event_handler(tep, -1, "kvmmmu", "kvm_mmu_sync_page",
533*436bf2bcSAndroid Build Coastguard Worker kvm_mmu_print_role, NULL);
534*436bf2bcSAndroid Build Coastguard Worker
535*436bf2bcSAndroid Build Coastguard Worker tep_register_event_handler(tep, -1,
536*436bf2bcSAndroid Build Coastguard Worker "kvmmmu", "kvm_mmu_unsync_page",
537*436bf2bcSAndroid Build Coastguard Worker kvm_mmu_print_role, NULL);
538*436bf2bcSAndroid Build Coastguard Worker
539*436bf2bcSAndroid Build Coastguard Worker tep_register_event_handler(tep, -1, "kvmmmu", "kvm_mmu_zap_page",
540*436bf2bcSAndroid Build Coastguard Worker kvm_mmu_print_role, NULL);
541*436bf2bcSAndroid Build Coastguard Worker
542*436bf2bcSAndroid Build Coastguard Worker tep_register_event_handler(tep, -1, "kvmmmu",
543*436bf2bcSAndroid Build Coastguard Worker "kvm_mmu_prepare_zap_page", kvm_mmu_print_role,
544*436bf2bcSAndroid Build Coastguard Worker NULL);
545*436bf2bcSAndroid Build Coastguard Worker
546*436bf2bcSAndroid Build Coastguard Worker tep_register_print_function(tep,
547*436bf2bcSAndroid Build Coastguard Worker process_is_writable_pte,
548*436bf2bcSAndroid Build Coastguard Worker TEP_FUNC_ARG_INT,
549*436bf2bcSAndroid Build Coastguard Worker "is_writable_pte",
550*436bf2bcSAndroid Build Coastguard Worker TEP_FUNC_ARG_LONG,
551*436bf2bcSAndroid Build Coastguard Worker TEP_FUNC_ARG_VOID);
552*436bf2bcSAndroid Build Coastguard Worker return 0;
553*436bf2bcSAndroid Build Coastguard Worker }
554*436bf2bcSAndroid Build Coastguard Worker
TEP_PLUGIN_UNLOADER(struct tep_handle * tep)555*436bf2bcSAndroid Build Coastguard Worker void TEP_PLUGIN_UNLOADER(struct tep_handle *tep)
556*436bf2bcSAndroid Build Coastguard Worker {
557*436bf2bcSAndroid Build Coastguard Worker tep_unregister_event_handler(tep, -1, "kvm", "kvm_exit",
558*436bf2bcSAndroid Build Coastguard Worker kvm_exit_handler, NULL);
559*436bf2bcSAndroid Build Coastguard Worker
560*436bf2bcSAndroid Build Coastguard Worker tep_unregister_event_handler(tep, -1, "kvm", "kvm_entry",
561*436bf2bcSAndroid Build Coastguard Worker kvm_entry_handler, NULL);
562*436bf2bcSAndroid Build Coastguard Worker
563*436bf2bcSAndroid Build Coastguard Worker tep_unregister_event_handler(tep, -1, "kvm", "kvm_emulate_insn",
564*436bf2bcSAndroid Build Coastguard Worker kvm_emulate_insn_handler, NULL);
565*436bf2bcSAndroid Build Coastguard Worker
566*436bf2bcSAndroid Build Coastguard Worker tep_unregister_event_handler(tep, -1, "kvm", "kvm_nested_vmexit",
567*436bf2bcSAndroid Build Coastguard Worker kvm_nested_vmexit_handler, NULL);
568*436bf2bcSAndroid Build Coastguard Worker
569*436bf2bcSAndroid Build Coastguard Worker tep_unregister_event_handler(tep, -1, "kvm", "kvm_nested_vmexit_inject",
570*436bf2bcSAndroid Build Coastguard Worker kvm_nested_vmexit_inject_handler, NULL);
571*436bf2bcSAndroid Build Coastguard Worker
572*436bf2bcSAndroid Build Coastguard Worker tep_unregister_event_handler(tep, -1, "kvmmmu", "kvm_mmu_get_page",
573*436bf2bcSAndroid Build Coastguard Worker kvm_mmu_get_page_handler, NULL);
574*436bf2bcSAndroid Build Coastguard Worker
575*436bf2bcSAndroid Build Coastguard Worker tep_unregister_event_handler(tep, -1, "kvmmmu", "kvm_mmu_sync_page",
576*436bf2bcSAndroid Build Coastguard Worker kvm_mmu_print_role, NULL);
577*436bf2bcSAndroid Build Coastguard Worker
578*436bf2bcSAndroid Build Coastguard Worker tep_unregister_event_handler(tep, -1,
579*436bf2bcSAndroid Build Coastguard Worker "kvmmmu", "kvm_mmu_unsync_page",
580*436bf2bcSAndroid Build Coastguard Worker kvm_mmu_print_role, NULL);
581*436bf2bcSAndroid Build Coastguard Worker
582*436bf2bcSAndroid Build Coastguard Worker tep_unregister_event_handler(tep, -1, "kvmmmu", "kvm_mmu_zap_page",
583*436bf2bcSAndroid Build Coastguard Worker kvm_mmu_print_role, NULL);
584*436bf2bcSAndroid Build Coastguard Worker
585*436bf2bcSAndroid Build Coastguard Worker tep_unregister_event_handler(tep, -1, "kvmmmu",
586*436bf2bcSAndroid Build Coastguard Worker "kvm_mmu_prepare_zap_page", kvm_mmu_print_role,
587*436bf2bcSAndroid Build Coastguard Worker NULL);
588*436bf2bcSAndroid Build Coastguard Worker
589*436bf2bcSAndroid Build Coastguard Worker tep_unregister_print_function(tep, process_is_writable_pte,
590*436bf2bcSAndroid Build Coastguard Worker "is_writable_pte");
591*436bf2bcSAndroid Build Coastguard Worker }
592