1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * Copyright (C) 2020-2022 Loongson Technology Corporation Limited
4  */
5 
6 #if !defined(_TRACE_KVM_H) || defined(TRACE_HEADER_MULTI_READ)
7 #define _TRACE_KVM_H
8 
9 #include <linux/tracepoint.h>
10 #include "kvm_compat.h"
11 #include "kvmcsr.h"
12 
13 #undef	TRACE_SYSTEM
14 #define TRACE_SYSTEM kvm
15 #define TRACE_INCLUDE_PATH .
16 #define TRACE_INCLUDE_FILE trace
17 
18 /*
19  * arch/loongarch/kvm/loongarch.c
20  */
21 extern bool kvm_trace_guest_mode_change;
22 int kvm_guest_mode_change_trace_reg(void);
23 void kvm_guest_mode_change_trace_unreg(void);
24 
25 /*
26  * Tracepoints for VM enters
27  */
28 DECLARE_EVENT_CLASS(kvm_transition,
29 	TP_PROTO(struct kvm_vcpu *vcpu),
30 	TP_ARGS(vcpu),
31 	TP_STRUCT__entry(
32 		__field(unsigned long, pc)
33 	),
34 
35 	TP_fast_assign(
36 		__entry->pc = vcpu->arch.pc;
37 	),
38 
39 	TP_printk("PC: 0x%08lx",
40 		  __entry->pc)
41 );
42 
43 DEFINE_EVENT(kvm_transition, kvm_enter,
44 	     TP_PROTO(struct kvm_vcpu *vcpu),
45 	     TP_ARGS(vcpu));
46 
47 DEFINE_EVENT(kvm_transition, kvm_reenter,
48 	     TP_PROTO(struct kvm_vcpu *vcpu),
49 	     TP_ARGS(vcpu));
50 
51 DEFINE_EVENT(kvm_transition, kvm_out,
52 	     TP_PROTO(struct kvm_vcpu *vcpu),
53 	     TP_ARGS(vcpu));
54 
55 /* The first 32 exit reasons correspond to Cause.ExcCode */
56 #define KVM_TRACE_EXIT_INT	0
57 #define KVM_TRACE_EXIT_TLBLD	(EXCCODE_TLBL)
58 #define KVM_TRACE_EXIT_TLBST	(EXCCODE_TLBS)
59 #define KVM_TRACE_EXIT_TLBI	(EXCCODE_TLBI)
60 #define KVM_TRACE_EXIT_TLBMOD	(EXCCODE_TLBM)
61 #define KVM_TRACE_EXIT_TLBNR	(EXCCODE_TLBNR)
62 #define KVM_TRACE_EXIT_TLBNX	(EXCCODE_TLBNX)
63 #define KVM_TRACE_EXIT_TLBPE	(EXCCODE_TLBPE)
64 #define KVM_TRACE_EXIT_ADDE	(EXCCODE_ADE)
65 #define KVM_TRACE_EXIT_UNALIGN	(EXCCODE_ALE)
66 #define KVM_TRACE_EXIT_ODB	(EXCCODE_BCE)
67 #define KVM_TRACE_EXIT_SYSCALL	(EXCCODE_SYS)
68 #define KVM_TRACE_EXIT_BP	(EXCCODE_BP)
69 #define KVM_TRACE_EXIT_INE	(EXCCODE_INE)
70 #define KVM_TRACE_EXIT_IPE	(EXCCODE_IPE)
71 #define KVM_TRACE_EXIT_FPDIS	(EXCCODE_FPDIS)
72 #define KVM_TRACE_EXIT_LSXDIS	(EXCCODE_LSXDIS)
73 #define KVM_TRACE_EXIT_LASXDIS	(EXCCODE_LASXDIS)
74 #define KVM_TRACE_EXIT_FPE	(EXCCODE_FPE)
75 #define KVM_TRACE_EXIT_WATCH	(EXCCODE_WATCH)
76 #define KVM_TRACE_EXIT_GSPR	(EXCCODE_GSPR)
77 #define KVM_TRACE_EXIT_HC	(EXCCODE_HVC)
78 #define KVM_TRACE_EXIT_GCM	(EXCCODE_GCM)
79 
80 /* Further exit reasons */
81 #define KVM_TRACE_EXIT_IDLE	64
82 #define KVM_TRACE_EXIT_CACHE	65
83 #define KVM_TRACE_EXIT_SIGNAL	66
84 
85 /* Tracepoints for VM exits */
86 #define kvm_trace_symbol_exit_types					\
87 	{ KVM_TRACE_EXIT_INT,		"Interrupt" },		\
88 	{ KVM_TRACE_EXIT_TLBLD,		"TLB (LD)" },		\
89 	{ KVM_TRACE_EXIT_TLBST,		"TLB (ST)" },		\
90 	{ KVM_TRACE_EXIT_TLBI,		"TLB Ifetch" },		\
91 	{ KVM_TRACE_EXIT_TLBMOD,	"TLB Mod" },		\
92 	{ KVM_TRACE_EXIT_TLBNR,		"TLB RI" },		\
93 	{ KVM_TRACE_EXIT_TLBNX,		"TLB XI" },		\
94 	{ KVM_TRACE_EXIT_TLBPE,		"TLB Previlege Error" },\
95 	{ KVM_TRACE_EXIT_ADDE,		"Address Error" },	\
96 	{ KVM_TRACE_EXIT_UNALIGN,	"Address unalign" },	\
97 	{ KVM_TRACE_EXIT_ODB,		"Out boundary" },	\
98 	{ KVM_TRACE_EXIT_SYSCALL,	"System Call" },	\
99 	{ KVM_TRACE_EXIT_BP,		"Breakpoint" },		\
100 	{ KVM_TRACE_EXIT_INE,		"Reserved Inst" },	\
101 	{ KVM_TRACE_EXIT_IPE,		"Inst prev error" },	\
102 	{ KVM_TRACE_EXIT_FPDIS,		"FPU disable" },	\
103 	{ KVM_TRACE_EXIT_LSXDIS,	"LSX disable" },	\
104 	{ KVM_TRACE_EXIT_LASXDIS,	"LASX disable" },	\
105 	{ KVM_TRACE_EXIT_FPE,		"FPE" },		\
106 	{ KVM_TRACE_EXIT_WATCH,		"DEBUG" },		\
107 	{ KVM_TRACE_EXIT_GSPR,		"GSPR" },		\
108 	{ KVM_TRACE_EXIT_HC,		"Hypercall" },		\
109 	{ KVM_TRACE_EXIT_GCM,		"CSR Mod" },		\
110 	{ KVM_TRACE_EXIT_IDLE,		"IDLE" },		\
111 	{ KVM_TRACE_EXIT_CACHE,		"CACHE" },		\
112 	{ KVM_TRACE_EXIT_SIGNAL,	"Signal" }
113 
114 TRACE_EVENT(kvm_exit,
115 	    TP_PROTO(struct kvm_vcpu *vcpu, unsigned int reason),
116 	    TP_ARGS(vcpu, reason),
117 	    TP_STRUCT__entry(
118 			__field(unsigned long, pc)
119 			__field(unsigned int, reason)
120 	    ),
121 
122 	    TP_fast_assign(
123 			__entry->pc = vcpu->arch.pc;
124 			__entry->reason = reason;
125 	    ),
126 
127 	    TP_printk("[%s]PC: 0x%08lx",
128 		      __print_symbolic(__entry->reason,
129 				       kvm_trace_symbol_exit_types),
130 		      __entry->pc)
131 );
132 
133 #define KVM_TRACE_AUX_RESTORE		0
134 #define KVM_TRACE_AUX_SAVE		1
135 #define KVM_TRACE_AUX_ENABLE		2
136 #define KVM_TRACE_AUX_DISABLE		3
137 #define KVM_TRACE_AUX_DISCARD		4
138 
139 #define KVM_TRACE_AUX_FPU		1
140 #define KVM_TRACE_AUX_LSX		2
141 #define KVM_TRACE_AUX_FPU_LSX		3
142 #define KVM_TRACE_AUX_LASX		4
143 #define KVM_TRACE_AUX_FPU_LSX_LASX	7
144 
145 #define kvm_trace_symbol_aux_op		\
146 	{ KVM_TRACE_AUX_RESTORE, "restore" },	\
147 	{ KVM_TRACE_AUX_SAVE,    "save" },	\
148 	{ KVM_TRACE_AUX_ENABLE,  "enable" },	\
149 	{ KVM_TRACE_AUX_DISABLE, "disable" },	\
150 	{ KVM_TRACE_AUX_DISCARD, "discard" }
151 
152 #define kvm_trace_symbol_aux_state		\
153 	{ KVM_TRACE_AUX_FPU,     "FPU" },	\
154 	{ KVM_TRACE_AUX_LSX,     "LSX" },	\
155 	{ KVM_TRACE_AUX_LASX,    "LASX" },	\
156 	{ KVM_TRACE_AUX_FPU_LSX, "FPU & LSX" }, \
157 	{ KVM_TRACE_AUX_FPU_LSX_LASX, "FPU & LSX & LASX" }
158 
159 TRACE_EVENT(kvm_aux,
160 	    TP_PROTO(struct kvm_vcpu *vcpu, unsigned int op,
161 		     unsigned int state),
162 	    TP_ARGS(vcpu, op, state),
163 	    TP_STRUCT__entry(
164 			__field(unsigned long, pc)
165 			__field(u8, op)
166 			__field(u8, state)
167 	    ),
168 
169 	    TP_fast_assign(
170 			__entry->pc = vcpu->arch.pc;
171 			__entry->op = op;
172 			__entry->state = state;
173 	    ),
174 
175 	    TP_printk("%s %s PC: 0x%08lx",
176 		      __print_symbolic(__entry->op,
177 				       kvm_trace_symbol_aux_op),
178 		      __print_symbolic(__entry->state,
179 				       kvm_trace_symbol_aux_state),
180 		      __entry->pc)
181 );
182 
183 TRACE_EVENT(kvm_vpid_change,
184 	    TP_PROTO(struct kvm_vcpu *vcpu, unsigned long vpid),
185 	    TP_ARGS(vcpu, vpid),
186 	    TP_STRUCT__entry(
187 			__field(unsigned long, vpid)
188 	    ),
189 
190 	    TP_fast_assign(
191 			__entry->vpid = vpid;
192 	    ),
193 
194 	    TP_printk("vpid: 0x%08lx",
195 		      __entry->vpid)
196 );
197 
198 #endif /* _TRACE_KVM_H */
199 
200 /* This part must be outside protection */
201 #include <trace/define_trace.h>
202