xref: /aosp_15_r20/external/libtraceevent/plugins/plugin_kvm.c (revision 436bf2bcd5202612ffffe471bbcc1f277cc8d28e)
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