162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci#if !defined(_TRACE_HANDLE_EXIT_ARM64_KVM_H) || defined(TRACE_HEADER_MULTI_READ) 362306a36Sopenharmony_ci#define _TRACE_HANDLE_EXIT_ARM64_KVM_H 462306a36Sopenharmony_ci 562306a36Sopenharmony_ci#include <linux/tracepoint.h> 662306a36Sopenharmony_ci#include "sys_regs.h" 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#undef TRACE_SYSTEM 962306a36Sopenharmony_ci#define TRACE_SYSTEM kvm 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ciTRACE_EVENT(kvm_wfx_arm64, 1262306a36Sopenharmony_ci TP_PROTO(unsigned long vcpu_pc, bool is_wfe), 1362306a36Sopenharmony_ci TP_ARGS(vcpu_pc, is_wfe), 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci TP_STRUCT__entry( 1662306a36Sopenharmony_ci __field(unsigned long, vcpu_pc) 1762306a36Sopenharmony_ci __field(bool, is_wfe) 1862306a36Sopenharmony_ci ), 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_ci TP_fast_assign( 2162306a36Sopenharmony_ci __entry->vcpu_pc = vcpu_pc; 2262306a36Sopenharmony_ci __entry->is_wfe = is_wfe; 2362306a36Sopenharmony_ci ), 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_ci TP_printk("guest executed wf%c at: 0x%016lx", 2662306a36Sopenharmony_ci __entry->is_wfe ? 'e' : 'i', __entry->vcpu_pc) 2762306a36Sopenharmony_ci); 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_ciTRACE_EVENT(kvm_hvc_arm64, 3062306a36Sopenharmony_ci TP_PROTO(unsigned long vcpu_pc, unsigned long r0, unsigned long imm), 3162306a36Sopenharmony_ci TP_ARGS(vcpu_pc, r0, imm), 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_ci TP_STRUCT__entry( 3462306a36Sopenharmony_ci __field(unsigned long, vcpu_pc) 3562306a36Sopenharmony_ci __field(unsigned long, r0) 3662306a36Sopenharmony_ci __field(unsigned long, imm) 3762306a36Sopenharmony_ci ), 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_ci TP_fast_assign( 4062306a36Sopenharmony_ci __entry->vcpu_pc = vcpu_pc; 4162306a36Sopenharmony_ci __entry->r0 = r0; 4262306a36Sopenharmony_ci __entry->imm = imm; 4362306a36Sopenharmony_ci ), 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_ci TP_printk("HVC at 0x%016lx (r0: 0x%016lx, imm: 0x%lx)", 4662306a36Sopenharmony_ci __entry->vcpu_pc, __entry->r0, __entry->imm) 4762306a36Sopenharmony_ci); 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_ciTRACE_EVENT(kvm_arm_setup_debug, 5062306a36Sopenharmony_ci TP_PROTO(struct kvm_vcpu *vcpu, __u32 guest_debug), 5162306a36Sopenharmony_ci TP_ARGS(vcpu, guest_debug), 5262306a36Sopenharmony_ci 5362306a36Sopenharmony_ci TP_STRUCT__entry( 5462306a36Sopenharmony_ci __field(struct kvm_vcpu *, vcpu) 5562306a36Sopenharmony_ci __field(__u32, guest_debug) 5662306a36Sopenharmony_ci ), 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_ci TP_fast_assign( 5962306a36Sopenharmony_ci __entry->vcpu = vcpu; 6062306a36Sopenharmony_ci __entry->guest_debug = guest_debug; 6162306a36Sopenharmony_ci ), 6262306a36Sopenharmony_ci 6362306a36Sopenharmony_ci TP_printk("vcpu: %p, flags: 0x%08x", __entry->vcpu, __entry->guest_debug) 6462306a36Sopenharmony_ci); 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_ciTRACE_EVENT(kvm_arm_clear_debug, 6762306a36Sopenharmony_ci TP_PROTO(__u32 guest_debug), 6862306a36Sopenharmony_ci TP_ARGS(guest_debug), 6962306a36Sopenharmony_ci 7062306a36Sopenharmony_ci TP_STRUCT__entry( 7162306a36Sopenharmony_ci __field(__u32, guest_debug) 7262306a36Sopenharmony_ci ), 7362306a36Sopenharmony_ci 7462306a36Sopenharmony_ci TP_fast_assign( 7562306a36Sopenharmony_ci __entry->guest_debug = guest_debug; 7662306a36Sopenharmony_ci ), 7762306a36Sopenharmony_ci 7862306a36Sopenharmony_ci TP_printk("flags: 0x%08x", __entry->guest_debug) 7962306a36Sopenharmony_ci); 8062306a36Sopenharmony_ci 8162306a36Sopenharmony_ci/* 8262306a36Sopenharmony_ci * The dreg32 name is a leftover from a distant past. This will really 8362306a36Sopenharmony_ci * output a 64bit value... 8462306a36Sopenharmony_ci */ 8562306a36Sopenharmony_ciTRACE_EVENT(kvm_arm_set_dreg32, 8662306a36Sopenharmony_ci TP_PROTO(const char *name, __u64 value), 8762306a36Sopenharmony_ci TP_ARGS(name, value), 8862306a36Sopenharmony_ci 8962306a36Sopenharmony_ci TP_STRUCT__entry( 9062306a36Sopenharmony_ci __field(const char *, name) 9162306a36Sopenharmony_ci __field(__u64, value) 9262306a36Sopenharmony_ci ), 9362306a36Sopenharmony_ci 9462306a36Sopenharmony_ci TP_fast_assign( 9562306a36Sopenharmony_ci __entry->name = name; 9662306a36Sopenharmony_ci __entry->value = value; 9762306a36Sopenharmony_ci ), 9862306a36Sopenharmony_ci 9962306a36Sopenharmony_ci TP_printk("%s: 0x%llx", __entry->name, __entry->value) 10062306a36Sopenharmony_ci); 10162306a36Sopenharmony_ci 10262306a36Sopenharmony_ciTRACE_DEFINE_SIZEOF(__u64); 10362306a36Sopenharmony_ci 10462306a36Sopenharmony_ciTRACE_EVENT(kvm_arm_set_regset, 10562306a36Sopenharmony_ci TP_PROTO(const char *type, int len, __u64 *control, __u64 *value), 10662306a36Sopenharmony_ci TP_ARGS(type, len, control, value), 10762306a36Sopenharmony_ci TP_STRUCT__entry( 10862306a36Sopenharmony_ci __field(const char *, name) 10962306a36Sopenharmony_ci __field(int, len) 11062306a36Sopenharmony_ci __array(u64, ctrls, 16) 11162306a36Sopenharmony_ci __array(u64, values, 16) 11262306a36Sopenharmony_ci ), 11362306a36Sopenharmony_ci TP_fast_assign( 11462306a36Sopenharmony_ci __entry->name = type; 11562306a36Sopenharmony_ci __entry->len = len; 11662306a36Sopenharmony_ci memcpy(__entry->ctrls, control, len << 3); 11762306a36Sopenharmony_ci memcpy(__entry->values, value, len << 3); 11862306a36Sopenharmony_ci ), 11962306a36Sopenharmony_ci TP_printk("%d %s CTRL:%s VALUE:%s", __entry->len, __entry->name, 12062306a36Sopenharmony_ci __print_array(__entry->ctrls, __entry->len, sizeof(__u64)), 12162306a36Sopenharmony_ci __print_array(__entry->values, __entry->len, sizeof(__u64))) 12262306a36Sopenharmony_ci); 12362306a36Sopenharmony_ci 12462306a36Sopenharmony_ciTRACE_EVENT(trap_reg, 12562306a36Sopenharmony_ci TP_PROTO(const char *fn, int reg, bool is_write, u64 write_value), 12662306a36Sopenharmony_ci TP_ARGS(fn, reg, is_write, write_value), 12762306a36Sopenharmony_ci 12862306a36Sopenharmony_ci TP_STRUCT__entry( 12962306a36Sopenharmony_ci __field(const char *, fn) 13062306a36Sopenharmony_ci __field(int, reg) 13162306a36Sopenharmony_ci __field(bool, is_write) 13262306a36Sopenharmony_ci __field(u64, write_value) 13362306a36Sopenharmony_ci ), 13462306a36Sopenharmony_ci 13562306a36Sopenharmony_ci TP_fast_assign( 13662306a36Sopenharmony_ci __entry->fn = fn; 13762306a36Sopenharmony_ci __entry->reg = reg; 13862306a36Sopenharmony_ci __entry->is_write = is_write; 13962306a36Sopenharmony_ci __entry->write_value = write_value; 14062306a36Sopenharmony_ci ), 14162306a36Sopenharmony_ci 14262306a36Sopenharmony_ci TP_printk("%s %s reg %d (0x%016llx)", __entry->fn, __entry->is_write?"write to":"read from", __entry->reg, __entry->write_value) 14362306a36Sopenharmony_ci); 14462306a36Sopenharmony_ci 14562306a36Sopenharmony_ciTRACE_EVENT(kvm_handle_sys_reg, 14662306a36Sopenharmony_ci TP_PROTO(unsigned long hsr), 14762306a36Sopenharmony_ci TP_ARGS(hsr), 14862306a36Sopenharmony_ci 14962306a36Sopenharmony_ci TP_STRUCT__entry( 15062306a36Sopenharmony_ci __field(unsigned long, hsr) 15162306a36Sopenharmony_ci ), 15262306a36Sopenharmony_ci 15362306a36Sopenharmony_ci TP_fast_assign( 15462306a36Sopenharmony_ci __entry->hsr = hsr; 15562306a36Sopenharmony_ci ), 15662306a36Sopenharmony_ci 15762306a36Sopenharmony_ci TP_printk("HSR 0x%08lx", __entry->hsr) 15862306a36Sopenharmony_ci); 15962306a36Sopenharmony_ci 16062306a36Sopenharmony_ciTRACE_EVENT(kvm_sys_access, 16162306a36Sopenharmony_ci TP_PROTO(unsigned long vcpu_pc, struct sys_reg_params *params, const struct sys_reg_desc *reg), 16262306a36Sopenharmony_ci TP_ARGS(vcpu_pc, params, reg), 16362306a36Sopenharmony_ci 16462306a36Sopenharmony_ci TP_STRUCT__entry( 16562306a36Sopenharmony_ci __field(unsigned long, vcpu_pc) 16662306a36Sopenharmony_ci __field(bool, is_write) 16762306a36Sopenharmony_ci __field(const char *, name) 16862306a36Sopenharmony_ci __field(u8, Op0) 16962306a36Sopenharmony_ci __field(u8, Op1) 17062306a36Sopenharmony_ci __field(u8, CRn) 17162306a36Sopenharmony_ci __field(u8, CRm) 17262306a36Sopenharmony_ci __field(u8, Op2) 17362306a36Sopenharmony_ci ), 17462306a36Sopenharmony_ci 17562306a36Sopenharmony_ci TP_fast_assign( 17662306a36Sopenharmony_ci __entry->vcpu_pc = vcpu_pc; 17762306a36Sopenharmony_ci __entry->is_write = params->is_write; 17862306a36Sopenharmony_ci __entry->name = reg->name; 17962306a36Sopenharmony_ci __entry->Op0 = reg->Op0; 18062306a36Sopenharmony_ci __entry->Op0 = reg->Op0; 18162306a36Sopenharmony_ci __entry->Op1 = reg->Op1; 18262306a36Sopenharmony_ci __entry->CRn = reg->CRn; 18362306a36Sopenharmony_ci __entry->CRm = reg->CRm; 18462306a36Sopenharmony_ci __entry->Op2 = reg->Op2; 18562306a36Sopenharmony_ci ), 18662306a36Sopenharmony_ci 18762306a36Sopenharmony_ci TP_printk("PC: %lx %s (%d,%d,%d,%d,%d) %s", 18862306a36Sopenharmony_ci __entry->vcpu_pc, __entry->name ?: "UNKN", 18962306a36Sopenharmony_ci __entry->Op0, __entry->Op1, __entry->CRn, 19062306a36Sopenharmony_ci __entry->CRm, __entry->Op2, 19162306a36Sopenharmony_ci __entry->is_write ? "write" : "read") 19262306a36Sopenharmony_ci); 19362306a36Sopenharmony_ci 19462306a36Sopenharmony_ciTRACE_EVENT(kvm_set_guest_debug, 19562306a36Sopenharmony_ci TP_PROTO(struct kvm_vcpu *vcpu, __u32 guest_debug), 19662306a36Sopenharmony_ci TP_ARGS(vcpu, guest_debug), 19762306a36Sopenharmony_ci 19862306a36Sopenharmony_ci TP_STRUCT__entry( 19962306a36Sopenharmony_ci __field(struct kvm_vcpu *, vcpu) 20062306a36Sopenharmony_ci __field(__u32, guest_debug) 20162306a36Sopenharmony_ci ), 20262306a36Sopenharmony_ci 20362306a36Sopenharmony_ci TP_fast_assign( 20462306a36Sopenharmony_ci __entry->vcpu = vcpu; 20562306a36Sopenharmony_ci __entry->guest_debug = guest_debug; 20662306a36Sopenharmony_ci ), 20762306a36Sopenharmony_ci 20862306a36Sopenharmony_ci TP_printk("vcpu: %p, flags: 0x%08x", __entry->vcpu, __entry->guest_debug) 20962306a36Sopenharmony_ci); 21062306a36Sopenharmony_ci 21162306a36Sopenharmony_ci#endif /* _TRACE_HANDLE_EXIT_ARM64_KVM_H */ 21262306a36Sopenharmony_ci 21362306a36Sopenharmony_ci#undef TRACE_INCLUDE_PATH 21462306a36Sopenharmony_ci#define TRACE_INCLUDE_PATH . 21562306a36Sopenharmony_ci#undef TRACE_INCLUDE_FILE 21662306a36Sopenharmony_ci#define TRACE_INCLUDE_FILE trace_handle_exit 21762306a36Sopenharmony_ci 21862306a36Sopenharmony_ci/* This part must be outside protection */ 21962306a36Sopenharmony_ci#include <trace/define_trace.h> 220