162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci#if !defined(_TRACE_ARM_ARM64_KVM_H) || defined(TRACE_HEADER_MULTI_READ)
362306a36Sopenharmony_ci#define _TRACE_ARM_ARM64_KVM_H
462306a36Sopenharmony_ci
562306a36Sopenharmony_ci#include <asm/kvm_emulate.h>
662306a36Sopenharmony_ci#include <kvm/arm_arch_timer.h>
762306a36Sopenharmony_ci#include <linux/tracepoint.h>
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#undef TRACE_SYSTEM
1062306a36Sopenharmony_ci#define TRACE_SYSTEM kvm
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci/*
1362306a36Sopenharmony_ci * Tracepoints for entry/exit to guest
1462306a36Sopenharmony_ci */
1562306a36Sopenharmony_ciTRACE_EVENT(kvm_entry,
1662306a36Sopenharmony_ci	TP_PROTO(unsigned long vcpu_pc),
1762306a36Sopenharmony_ci	TP_ARGS(vcpu_pc),
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_ci	TP_STRUCT__entry(
2062306a36Sopenharmony_ci		__field(	unsigned long,	vcpu_pc		)
2162306a36Sopenharmony_ci	),
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_ci	TP_fast_assign(
2462306a36Sopenharmony_ci		__entry->vcpu_pc		= vcpu_pc;
2562306a36Sopenharmony_ci	),
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_ci	TP_printk("PC: 0x%016lx", __entry->vcpu_pc)
2862306a36Sopenharmony_ci);
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_ciTRACE_EVENT(kvm_exit,
3162306a36Sopenharmony_ci	TP_PROTO(int ret, unsigned int esr_ec, unsigned long vcpu_pc),
3262306a36Sopenharmony_ci	TP_ARGS(ret, esr_ec, vcpu_pc),
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ci	TP_STRUCT__entry(
3562306a36Sopenharmony_ci		__field(	int,		ret		)
3662306a36Sopenharmony_ci		__field(	unsigned int,	esr_ec		)
3762306a36Sopenharmony_ci		__field(	unsigned long,	vcpu_pc		)
3862306a36Sopenharmony_ci	),
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ci	TP_fast_assign(
4162306a36Sopenharmony_ci		__entry->ret			= ARM_EXCEPTION_CODE(ret);
4262306a36Sopenharmony_ci		__entry->esr_ec = ARM_EXCEPTION_IS_TRAP(ret) ? esr_ec : 0;
4362306a36Sopenharmony_ci		__entry->vcpu_pc		= vcpu_pc;
4462306a36Sopenharmony_ci	),
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_ci	TP_printk("%s: HSR_EC: 0x%04x (%s), PC: 0x%016lx",
4762306a36Sopenharmony_ci		  __print_symbolic(__entry->ret, kvm_arm_exception_type),
4862306a36Sopenharmony_ci		  __entry->esr_ec,
4962306a36Sopenharmony_ci		  __print_symbolic(__entry->esr_ec, kvm_arm_exception_class),
5062306a36Sopenharmony_ci		  __entry->vcpu_pc)
5162306a36Sopenharmony_ci);
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_ciTRACE_EVENT(kvm_guest_fault,
5462306a36Sopenharmony_ci	TP_PROTO(unsigned long vcpu_pc, unsigned long hsr,
5562306a36Sopenharmony_ci		 unsigned long hxfar,
5662306a36Sopenharmony_ci		 unsigned long long ipa),
5762306a36Sopenharmony_ci	TP_ARGS(vcpu_pc, hsr, hxfar, ipa),
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_ci	TP_STRUCT__entry(
6062306a36Sopenharmony_ci		__field(	unsigned long,	vcpu_pc		)
6162306a36Sopenharmony_ci		__field(	unsigned long,	hsr		)
6262306a36Sopenharmony_ci		__field(	unsigned long,	hxfar		)
6362306a36Sopenharmony_ci		__field(   unsigned long long,	ipa		)
6462306a36Sopenharmony_ci	),
6562306a36Sopenharmony_ci
6662306a36Sopenharmony_ci	TP_fast_assign(
6762306a36Sopenharmony_ci		__entry->vcpu_pc		= vcpu_pc;
6862306a36Sopenharmony_ci		__entry->hsr			= hsr;
6962306a36Sopenharmony_ci		__entry->hxfar			= hxfar;
7062306a36Sopenharmony_ci		__entry->ipa			= ipa;
7162306a36Sopenharmony_ci	),
7262306a36Sopenharmony_ci
7362306a36Sopenharmony_ci	TP_printk("ipa %#llx, hsr %#08lx, hxfar %#08lx, pc %#016lx",
7462306a36Sopenharmony_ci		  __entry->ipa, __entry->hsr,
7562306a36Sopenharmony_ci		  __entry->hxfar, __entry->vcpu_pc)
7662306a36Sopenharmony_ci);
7762306a36Sopenharmony_ci
7862306a36Sopenharmony_ciTRACE_EVENT(kvm_access_fault,
7962306a36Sopenharmony_ci	TP_PROTO(unsigned long ipa),
8062306a36Sopenharmony_ci	TP_ARGS(ipa),
8162306a36Sopenharmony_ci
8262306a36Sopenharmony_ci	TP_STRUCT__entry(
8362306a36Sopenharmony_ci		__field(	unsigned long,	ipa		)
8462306a36Sopenharmony_ci	),
8562306a36Sopenharmony_ci
8662306a36Sopenharmony_ci	TP_fast_assign(
8762306a36Sopenharmony_ci		__entry->ipa		= ipa;
8862306a36Sopenharmony_ci	),
8962306a36Sopenharmony_ci
9062306a36Sopenharmony_ci	TP_printk("IPA: %lx", __entry->ipa)
9162306a36Sopenharmony_ci);
9262306a36Sopenharmony_ci
9362306a36Sopenharmony_ciTRACE_EVENT(kvm_irq_line,
9462306a36Sopenharmony_ci	TP_PROTO(unsigned int type, int vcpu_idx, int irq_num, int level),
9562306a36Sopenharmony_ci	TP_ARGS(type, vcpu_idx, irq_num, level),
9662306a36Sopenharmony_ci
9762306a36Sopenharmony_ci	TP_STRUCT__entry(
9862306a36Sopenharmony_ci		__field(	unsigned int,	type		)
9962306a36Sopenharmony_ci		__field(	int,		vcpu_idx	)
10062306a36Sopenharmony_ci		__field(	int,		irq_num		)
10162306a36Sopenharmony_ci		__field(	int,		level		)
10262306a36Sopenharmony_ci	),
10362306a36Sopenharmony_ci
10462306a36Sopenharmony_ci	TP_fast_assign(
10562306a36Sopenharmony_ci		__entry->type		= type;
10662306a36Sopenharmony_ci		__entry->vcpu_idx	= vcpu_idx;
10762306a36Sopenharmony_ci		__entry->irq_num	= irq_num;
10862306a36Sopenharmony_ci		__entry->level		= level;
10962306a36Sopenharmony_ci	),
11062306a36Sopenharmony_ci
11162306a36Sopenharmony_ci	TP_printk("Inject %s interrupt (%d), vcpu->idx: %d, num: %d, level: %d",
11262306a36Sopenharmony_ci		  (__entry->type == KVM_ARM_IRQ_TYPE_CPU) ? "CPU" :
11362306a36Sopenharmony_ci		  (__entry->type == KVM_ARM_IRQ_TYPE_PPI) ? "VGIC PPI" :
11462306a36Sopenharmony_ci		  (__entry->type == KVM_ARM_IRQ_TYPE_SPI) ? "VGIC SPI" : "UNKNOWN",
11562306a36Sopenharmony_ci		  __entry->type, __entry->vcpu_idx, __entry->irq_num, __entry->level)
11662306a36Sopenharmony_ci);
11762306a36Sopenharmony_ci
11862306a36Sopenharmony_ciTRACE_EVENT(kvm_mmio_emulate,
11962306a36Sopenharmony_ci	TP_PROTO(unsigned long vcpu_pc, unsigned long instr,
12062306a36Sopenharmony_ci		 unsigned long cpsr),
12162306a36Sopenharmony_ci	TP_ARGS(vcpu_pc, instr, cpsr),
12262306a36Sopenharmony_ci
12362306a36Sopenharmony_ci	TP_STRUCT__entry(
12462306a36Sopenharmony_ci		__field(	unsigned long,	vcpu_pc		)
12562306a36Sopenharmony_ci		__field(	unsigned long,	instr		)
12662306a36Sopenharmony_ci		__field(	unsigned long,	cpsr		)
12762306a36Sopenharmony_ci	),
12862306a36Sopenharmony_ci
12962306a36Sopenharmony_ci	TP_fast_assign(
13062306a36Sopenharmony_ci		__entry->vcpu_pc		= vcpu_pc;
13162306a36Sopenharmony_ci		__entry->instr			= instr;
13262306a36Sopenharmony_ci		__entry->cpsr			= cpsr;
13362306a36Sopenharmony_ci	),
13462306a36Sopenharmony_ci
13562306a36Sopenharmony_ci	TP_printk("Emulate MMIO at: 0x%016lx (instr: %08lx, cpsr: %08lx)",
13662306a36Sopenharmony_ci		  __entry->vcpu_pc, __entry->instr, __entry->cpsr)
13762306a36Sopenharmony_ci);
13862306a36Sopenharmony_ci
13962306a36Sopenharmony_ciTRACE_EVENT(kvm_set_way_flush,
14062306a36Sopenharmony_ci	    TP_PROTO(unsigned long vcpu_pc, bool cache),
14162306a36Sopenharmony_ci	    TP_ARGS(vcpu_pc, cache),
14262306a36Sopenharmony_ci
14362306a36Sopenharmony_ci	    TP_STRUCT__entry(
14462306a36Sopenharmony_ci		    __field(	unsigned long,	vcpu_pc		)
14562306a36Sopenharmony_ci		    __field(	bool,		cache		)
14662306a36Sopenharmony_ci	    ),
14762306a36Sopenharmony_ci
14862306a36Sopenharmony_ci	    TP_fast_assign(
14962306a36Sopenharmony_ci		    __entry->vcpu_pc		= vcpu_pc;
15062306a36Sopenharmony_ci		    __entry->cache		= cache;
15162306a36Sopenharmony_ci	    ),
15262306a36Sopenharmony_ci
15362306a36Sopenharmony_ci	    TP_printk("S/W flush at 0x%016lx (cache %s)",
15462306a36Sopenharmony_ci		      __entry->vcpu_pc, __entry->cache ? "on" : "off")
15562306a36Sopenharmony_ci);
15662306a36Sopenharmony_ci
15762306a36Sopenharmony_ciTRACE_EVENT(kvm_toggle_cache,
15862306a36Sopenharmony_ci	    TP_PROTO(unsigned long vcpu_pc, bool was, bool now),
15962306a36Sopenharmony_ci	    TP_ARGS(vcpu_pc, was, now),
16062306a36Sopenharmony_ci
16162306a36Sopenharmony_ci	    TP_STRUCT__entry(
16262306a36Sopenharmony_ci		    __field(	unsigned long,	vcpu_pc		)
16362306a36Sopenharmony_ci		    __field(	bool,		was		)
16462306a36Sopenharmony_ci		    __field(	bool,		now		)
16562306a36Sopenharmony_ci	    ),
16662306a36Sopenharmony_ci
16762306a36Sopenharmony_ci	    TP_fast_assign(
16862306a36Sopenharmony_ci		    __entry->vcpu_pc		= vcpu_pc;
16962306a36Sopenharmony_ci		    __entry->was		= was;
17062306a36Sopenharmony_ci		    __entry->now		= now;
17162306a36Sopenharmony_ci	    ),
17262306a36Sopenharmony_ci
17362306a36Sopenharmony_ci	    TP_printk("VM op at 0x%016lx (cache was %s, now %s)",
17462306a36Sopenharmony_ci		      __entry->vcpu_pc, __entry->was ? "on" : "off",
17562306a36Sopenharmony_ci		      __entry->now ? "on" : "off")
17662306a36Sopenharmony_ci);
17762306a36Sopenharmony_ci
17862306a36Sopenharmony_ci/*
17962306a36Sopenharmony_ci * Tracepoints for arch_timer
18062306a36Sopenharmony_ci */
18162306a36Sopenharmony_ciTRACE_EVENT(kvm_timer_update_irq,
18262306a36Sopenharmony_ci	TP_PROTO(unsigned long vcpu_id, __u32 irq, int level),
18362306a36Sopenharmony_ci	TP_ARGS(vcpu_id, irq, level),
18462306a36Sopenharmony_ci
18562306a36Sopenharmony_ci	TP_STRUCT__entry(
18662306a36Sopenharmony_ci		__field(	unsigned long,	vcpu_id	)
18762306a36Sopenharmony_ci		__field(	__u32,		irq	)
18862306a36Sopenharmony_ci		__field(	int,		level	)
18962306a36Sopenharmony_ci	),
19062306a36Sopenharmony_ci
19162306a36Sopenharmony_ci	TP_fast_assign(
19262306a36Sopenharmony_ci		__entry->vcpu_id	= vcpu_id;
19362306a36Sopenharmony_ci		__entry->irq		= irq;
19462306a36Sopenharmony_ci		__entry->level		= level;
19562306a36Sopenharmony_ci	),
19662306a36Sopenharmony_ci
19762306a36Sopenharmony_ci	TP_printk("VCPU: %ld, IRQ %d, level %d",
19862306a36Sopenharmony_ci		  __entry->vcpu_id, __entry->irq, __entry->level)
19962306a36Sopenharmony_ci);
20062306a36Sopenharmony_ci
20162306a36Sopenharmony_ciTRACE_EVENT(kvm_get_timer_map,
20262306a36Sopenharmony_ci	TP_PROTO(unsigned long vcpu_id, struct timer_map *map),
20362306a36Sopenharmony_ci	TP_ARGS(vcpu_id, map),
20462306a36Sopenharmony_ci
20562306a36Sopenharmony_ci	TP_STRUCT__entry(
20662306a36Sopenharmony_ci		__field(	unsigned long,		vcpu_id	)
20762306a36Sopenharmony_ci		__field(	int,			direct_vtimer	)
20862306a36Sopenharmony_ci		__field(	int,			direct_ptimer	)
20962306a36Sopenharmony_ci		__field(	int,			emul_vtimer	)
21062306a36Sopenharmony_ci		__field(	int,			emul_ptimer	)
21162306a36Sopenharmony_ci	),
21262306a36Sopenharmony_ci
21362306a36Sopenharmony_ci	TP_fast_assign(
21462306a36Sopenharmony_ci		__entry->vcpu_id		= vcpu_id;
21562306a36Sopenharmony_ci		__entry->direct_vtimer		= arch_timer_ctx_index(map->direct_vtimer);
21662306a36Sopenharmony_ci		__entry->direct_ptimer =
21762306a36Sopenharmony_ci			(map->direct_ptimer) ? arch_timer_ctx_index(map->direct_ptimer) : -1;
21862306a36Sopenharmony_ci		__entry->emul_vtimer =
21962306a36Sopenharmony_ci			(map->emul_vtimer) ? arch_timer_ctx_index(map->emul_vtimer) : -1;
22062306a36Sopenharmony_ci		__entry->emul_ptimer =
22162306a36Sopenharmony_ci			(map->emul_ptimer) ? arch_timer_ctx_index(map->emul_ptimer) : -1;
22262306a36Sopenharmony_ci	),
22362306a36Sopenharmony_ci
22462306a36Sopenharmony_ci	TP_printk("VCPU: %ld, dv: %d, dp: %d, ev: %d, ep: %d",
22562306a36Sopenharmony_ci		  __entry->vcpu_id,
22662306a36Sopenharmony_ci		  __entry->direct_vtimer,
22762306a36Sopenharmony_ci		  __entry->direct_ptimer,
22862306a36Sopenharmony_ci		  __entry->emul_vtimer,
22962306a36Sopenharmony_ci		  __entry->emul_ptimer)
23062306a36Sopenharmony_ci);
23162306a36Sopenharmony_ci
23262306a36Sopenharmony_ciTRACE_EVENT(kvm_timer_save_state,
23362306a36Sopenharmony_ci	TP_PROTO(struct arch_timer_context *ctx),
23462306a36Sopenharmony_ci	TP_ARGS(ctx),
23562306a36Sopenharmony_ci
23662306a36Sopenharmony_ci	TP_STRUCT__entry(
23762306a36Sopenharmony_ci		__field(	unsigned long,		ctl		)
23862306a36Sopenharmony_ci		__field(	unsigned long long,	cval		)
23962306a36Sopenharmony_ci		__field(	int,			timer_idx	)
24062306a36Sopenharmony_ci	),
24162306a36Sopenharmony_ci
24262306a36Sopenharmony_ci	TP_fast_assign(
24362306a36Sopenharmony_ci		__entry->ctl			= timer_get_ctl(ctx);
24462306a36Sopenharmony_ci		__entry->cval			= timer_get_cval(ctx);
24562306a36Sopenharmony_ci		__entry->timer_idx		= arch_timer_ctx_index(ctx);
24662306a36Sopenharmony_ci	),
24762306a36Sopenharmony_ci
24862306a36Sopenharmony_ci	TP_printk("   CTL: %#08lx CVAL: %#16llx arch_timer_ctx_index: %d",
24962306a36Sopenharmony_ci		  __entry->ctl,
25062306a36Sopenharmony_ci		  __entry->cval,
25162306a36Sopenharmony_ci		  __entry->timer_idx)
25262306a36Sopenharmony_ci);
25362306a36Sopenharmony_ci
25462306a36Sopenharmony_ciTRACE_EVENT(kvm_timer_restore_state,
25562306a36Sopenharmony_ci	TP_PROTO(struct arch_timer_context *ctx),
25662306a36Sopenharmony_ci	TP_ARGS(ctx),
25762306a36Sopenharmony_ci
25862306a36Sopenharmony_ci	TP_STRUCT__entry(
25962306a36Sopenharmony_ci		__field(	unsigned long,		ctl		)
26062306a36Sopenharmony_ci		__field(	unsigned long long,	cval		)
26162306a36Sopenharmony_ci		__field(	int,			timer_idx	)
26262306a36Sopenharmony_ci	),
26362306a36Sopenharmony_ci
26462306a36Sopenharmony_ci	TP_fast_assign(
26562306a36Sopenharmony_ci		__entry->ctl			= timer_get_ctl(ctx);
26662306a36Sopenharmony_ci		__entry->cval			= timer_get_cval(ctx);
26762306a36Sopenharmony_ci		__entry->timer_idx		= arch_timer_ctx_index(ctx);
26862306a36Sopenharmony_ci	),
26962306a36Sopenharmony_ci
27062306a36Sopenharmony_ci	TP_printk("CTL: %#08lx CVAL: %#16llx arch_timer_ctx_index: %d",
27162306a36Sopenharmony_ci		  __entry->ctl,
27262306a36Sopenharmony_ci		  __entry->cval,
27362306a36Sopenharmony_ci		  __entry->timer_idx)
27462306a36Sopenharmony_ci);
27562306a36Sopenharmony_ci
27662306a36Sopenharmony_ciTRACE_EVENT(kvm_timer_hrtimer_expire,
27762306a36Sopenharmony_ci	TP_PROTO(struct arch_timer_context *ctx),
27862306a36Sopenharmony_ci	TP_ARGS(ctx),
27962306a36Sopenharmony_ci
28062306a36Sopenharmony_ci	TP_STRUCT__entry(
28162306a36Sopenharmony_ci		__field(	int,			timer_idx	)
28262306a36Sopenharmony_ci	),
28362306a36Sopenharmony_ci
28462306a36Sopenharmony_ci	TP_fast_assign(
28562306a36Sopenharmony_ci		__entry->timer_idx		= arch_timer_ctx_index(ctx);
28662306a36Sopenharmony_ci	),
28762306a36Sopenharmony_ci
28862306a36Sopenharmony_ci	TP_printk("arch_timer_ctx_index: %d", __entry->timer_idx)
28962306a36Sopenharmony_ci);
29062306a36Sopenharmony_ci
29162306a36Sopenharmony_ciTRACE_EVENT(kvm_timer_emulate,
29262306a36Sopenharmony_ci	TP_PROTO(struct arch_timer_context *ctx, bool should_fire),
29362306a36Sopenharmony_ci	TP_ARGS(ctx, should_fire),
29462306a36Sopenharmony_ci
29562306a36Sopenharmony_ci	TP_STRUCT__entry(
29662306a36Sopenharmony_ci		__field(	int,			timer_idx	)
29762306a36Sopenharmony_ci		__field(	bool,			should_fire	)
29862306a36Sopenharmony_ci	),
29962306a36Sopenharmony_ci
30062306a36Sopenharmony_ci	TP_fast_assign(
30162306a36Sopenharmony_ci		__entry->timer_idx		= arch_timer_ctx_index(ctx);
30262306a36Sopenharmony_ci		__entry->should_fire		= should_fire;
30362306a36Sopenharmony_ci	),
30462306a36Sopenharmony_ci
30562306a36Sopenharmony_ci	TP_printk("arch_timer_ctx_index: %d (should_fire: %d)",
30662306a36Sopenharmony_ci		  __entry->timer_idx, __entry->should_fire)
30762306a36Sopenharmony_ci);
30862306a36Sopenharmony_ci
30962306a36Sopenharmony_ciTRACE_EVENT(kvm_nested_eret,
31062306a36Sopenharmony_ci	TP_PROTO(struct kvm_vcpu *vcpu, unsigned long elr_el2,
31162306a36Sopenharmony_ci		 unsigned long spsr_el2),
31262306a36Sopenharmony_ci	TP_ARGS(vcpu, elr_el2, spsr_el2),
31362306a36Sopenharmony_ci
31462306a36Sopenharmony_ci	TP_STRUCT__entry(
31562306a36Sopenharmony_ci		__field(struct kvm_vcpu *,	vcpu)
31662306a36Sopenharmony_ci		__field(unsigned long,		elr_el2)
31762306a36Sopenharmony_ci		__field(unsigned long,		spsr_el2)
31862306a36Sopenharmony_ci		__field(unsigned long,		target_mode)
31962306a36Sopenharmony_ci		__field(unsigned long,		hcr_el2)
32062306a36Sopenharmony_ci	),
32162306a36Sopenharmony_ci
32262306a36Sopenharmony_ci	TP_fast_assign(
32362306a36Sopenharmony_ci		__entry->vcpu = vcpu;
32462306a36Sopenharmony_ci		__entry->elr_el2 = elr_el2;
32562306a36Sopenharmony_ci		__entry->spsr_el2 = spsr_el2;
32662306a36Sopenharmony_ci		__entry->target_mode = spsr_el2 & (PSR_MODE_MASK | PSR_MODE32_BIT);
32762306a36Sopenharmony_ci		__entry->hcr_el2 = __vcpu_sys_reg(vcpu, HCR_EL2);
32862306a36Sopenharmony_ci	),
32962306a36Sopenharmony_ci
33062306a36Sopenharmony_ci	TP_printk("elr_el2: 0x%lx spsr_el2: 0x%08lx (M: %s) hcr_el2: %lx",
33162306a36Sopenharmony_ci		  __entry->elr_el2, __entry->spsr_el2,
33262306a36Sopenharmony_ci		  __print_symbolic(__entry->target_mode, kvm_mode_names),
33362306a36Sopenharmony_ci		  __entry->hcr_el2)
33462306a36Sopenharmony_ci);
33562306a36Sopenharmony_ci
33662306a36Sopenharmony_ciTRACE_EVENT(kvm_inject_nested_exception,
33762306a36Sopenharmony_ci	TP_PROTO(struct kvm_vcpu *vcpu, u64 esr_el2, int type),
33862306a36Sopenharmony_ci	TP_ARGS(vcpu, esr_el2, type),
33962306a36Sopenharmony_ci
34062306a36Sopenharmony_ci	TP_STRUCT__entry(
34162306a36Sopenharmony_ci		__field(struct kvm_vcpu *,		vcpu)
34262306a36Sopenharmony_ci		__field(unsigned long,			esr_el2)
34362306a36Sopenharmony_ci		__field(int,				type)
34462306a36Sopenharmony_ci		__field(unsigned long,			spsr_el2)
34562306a36Sopenharmony_ci		__field(unsigned long,			pc)
34662306a36Sopenharmony_ci		__field(unsigned long,			source_mode)
34762306a36Sopenharmony_ci		__field(unsigned long,			hcr_el2)
34862306a36Sopenharmony_ci	),
34962306a36Sopenharmony_ci
35062306a36Sopenharmony_ci	TP_fast_assign(
35162306a36Sopenharmony_ci		__entry->vcpu = vcpu;
35262306a36Sopenharmony_ci		__entry->esr_el2 = esr_el2;
35362306a36Sopenharmony_ci		__entry->type = type;
35462306a36Sopenharmony_ci		__entry->spsr_el2 = *vcpu_cpsr(vcpu);
35562306a36Sopenharmony_ci		__entry->pc = *vcpu_pc(vcpu);
35662306a36Sopenharmony_ci		__entry->source_mode = *vcpu_cpsr(vcpu) & (PSR_MODE_MASK | PSR_MODE32_BIT);
35762306a36Sopenharmony_ci		__entry->hcr_el2 = __vcpu_sys_reg(vcpu, HCR_EL2);
35862306a36Sopenharmony_ci	),
35962306a36Sopenharmony_ci
36062306a36Sopenharmony_ci	TP_printk("%s: esr_el2 0x%lx elr_el2: 0x%lx spsr_el2: 0x%08lx (M: %s) hcr_el2: %lx",
36162306a36Sopenharmony_ci		  __print_symbolic(__entry->type, kvm_exception_type_names),
36262306a36Sopenharmony_ci		  __entry->esr_el2, __entry->pc, __entry->spsr_el2,
36362306a36Sopenharmony_ci		  __print_symbolic(__entry->source_mode, kvm_mode_names),
36462306a36Sopenharmony_ci		  __entry->hcr_el2)
36562306a36Sopenharmony_ci);
36662306a36Sopenharmony_ci
36762306a36Sopenharmony_ciTRACE_EVENT(kvm_forward_sysreg_trap,
36862306a36Sopenharmony_ci	    TP_PROTO(struct kvm_vcpu *vcpu, u32 sysreg, bool is_read),
36962306a36Sopenharmony_ci	    TP_ARGS(vcpu, sysreg, is_read),
37062306a36Sopenharmony_ci
37162306a36Sopenharmony_ci	    TP_STRUCT__entry(
37262306a36Sopenharmony_ci		__field(u64,	pc)
37362306a36Sopenharmony_ci		__field(u32,	sysreg)
37462306a36Sopenharmony_ci		__field(bool,	is_read)
37562306a36Sopenharmony_ci	    ),
37662306a36Sopenharmony_ci
37762306a36Sopenharmony_ci	    TP_fast_assign(
37862306a36Sopenharmony_ci		__entry->pc = *vcpu_pc(vcpu);
37962306a36Sopenharmony_ci		__entry->sysreg = sysreg;
38062306a36Sopenharmony_ci		__entry->is_read = is_read;
38162306a36Sopenharmony_ci	    ),
38262306a36Sopenharmony_ci
38362306a36Sopenharmony_ci	    TP_printk("%llx %c (%d,%d,%d,%d,%d)",
38462306a36Sopenharmony_ci		      __entry->pc,
38562306a36Sopenharmony_ci		      __entry->is_read ? 'R' : 'W',
38662306a36Sopenharmony_ci		      sys_reg_Op0(__entry->sysreg),
38762306a36Sopenharmony_ci		      sys_reg_Op1(__entry->sysreg),
38862306a36Sopenharmony_ci		      sys_reg_CRn(__entry->sysreg),
38962306a36Sopenharmony_ci		      sys_reg_CRm(__entry->sysreg),
39062306a36Sopenharmony_ci		      sys_reg_Op2(__entry->sysreg))
39162306a36Sopenharmony_ci);
39262306a36Sopenharmony_ci
39362306a36Sopenharmony_ci#endif /* _TRACE_ARM_ARM64_KVM_H */
39462306a36Sopenharmony_ci
39562306a36Sopenharmony_ci#undef TRACE_INCLUDE_PATH
39662306a36Sopenharmony_ci#define TRACE_INCLUDE_PATH .
39762306a36Sopenharmony_ci#undef TRACE_INCLUDE_FILE
39862306a36Sopenharmony_ci#define TRACE_INCLUDE_FILE trace_arm
39962306a36Sopenharmony_ci
40062306a36Sopenharmony_ci/* This part must be outside protection */
40162306a36Sopenharmony_ci#include <trace/define_trace.h>
402