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 */
21extern bool kvm_trace_guest_mode_change;
22int kvm_guest_mode_change_trace_reg(void);
23void kvm_guest_mode_change_trace_unreg(void);
24
25/*
26 * Tracepoints for VM enters
27 */
28DECLARE_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
43DEFINE_EVENT(kvm_transition, kvm_enter,
44	     TP_PROTO(struct kvm_vcpu *vcpu),
45	     TP_ARGS(vcpu));
46
47DEFINE_EVENT(kvm_transition, kvm_reenter,
48	     TP_PROTO(struct kvm_vcpu *vcpu),
49	     TP_ARGS(vcpu));
50
51DEFINE_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
114TRACE_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
159TRACE_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
183TRACE_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