1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * Tracepoints for RISC-V KVM 4 * 5 * Copyright 2024 Beijing ESWIN Computing Technology Co., Ltd. 6 * 7 */ 8 #if !defined(_TRACE_KVM_H) || defined(TRACE_HEADER_MULTI_READ) 9 #define _TRACE_KVM_H 10 11 #include <linux/tracepoint.h> 12 13 #undef TRACE_SYSTEM 14 #define TRACE_SYSTEM kvm 15 16 TRACE_EVENT(kvm_entry, 17 TP_PROTO(struct kvm_vcpu *vcpu), 18 TP_ARGS(vcpu), 19 20 TP_STRUCT__entry( 21 __field(unsigned long, pc) 22 ), 23 24 TP_fast_assign( 25 __entry->pc = vcpu->arch.guest_context.sepc; 26 ), 27 28 TP_printk("PC: 0x%016lx", __entry->pc) 29 ); 30 31 TRACE_EVENT(kvm_exit, 32 TP_PROTO(struct kvm_cpu_trap *trap), 33 TP_ARGS(trap), 34 35 TP_STRUCT__entry( 36 __field(unsigned long, sepc) 37 __field(unsigned long, scause) 38 __field(unsigned long, stval) 39 __field(unsigned long, htval) 40 __field(unsigned long, htinst) 41 ), 42 43 TP_fast_assign( 44 __entry->sepc = trap->sepc; 45 __entry->scause = trap->scause; 46 __entry->stval = trap->stval; 47 __entry->htval = trap->htval; 48 __entry->htinst = trap->htinst; 49 ), 50 51 TP_printk("SEPC:0x%lx, SCAUSE:0x%lx, STVAL:0x%lx, HTVAL:0x%lx, HTINST:0x%lx", 52 __entry->sepc, 53 __entry->scause, 54 __entry->stval, 55 __entry->htval, 56 __entry->htinst) 57 ); 58 59 TRACE_EVENT(kvm_mmio_emulate, 60 TP_PROTO(unsigned long vcpu_id, unsigned long sepc, unsigned long insn, 61 unsigned long fault_addr, bool write, int len), 62 TP_ARGS(vcpu_id, sepc, insn, fault_addr, write, len), 63 64 TP_STRUCT__entry( 65 __field(unsigned long, vcpu_id) 66 __field(unsigned long, sepc) 67 __field(unsigned long, insn) 68 __field(unsigned long, fault_addr) 69 __field(bool, write) 70 __field(int, len) 71 ), 72 73 TP_fast_assign( 74 __entry->vcpu_id = vcpu_id; 75 __entry->sepc = sepc; 76 __entry->insn = insn; 77 __entry->fault_addr = fault_addr; 78 __entry->write = write; 79 __entry->len = len; 80 ), 81 82 TP_printk("VCPU: %lu, %s MMIO at 0x%lx, len %d, insn 0x%lx, sepc 0x%lx", 83 __entry->vcpu_id, __entry->write ? "Store" : "Load", 84 __entry->fault_addr, __entry->len, __entry->insn, 85 __entry->sepc) 86 ); 87 88 TRACE_EVENT(kvm_vcpu_exit, 89 TP_PROTO(unsigned long vcpu_id, unsigned long sepc, unsigned long scause, 90 unsigned long stval, unsigned long htval, unsigned long htinst), 91 TP_ARGS(vcpu_id, sepc, scause, stval, htval, htinst), 92 93 TP_STRUCT__entry( 94 __field(unsigned long, vcpu_id) 95 __field(unsigned long, sepc) 96 __field(unsigned long, scause) 97 __field(unsigned long, stval) 98 __field(unsigned long, htval) 99 __field(unsigned long, htinst) 100 ), 101 102 TP_fast_assign( 103 __entry->vcpu_id = vcpu_id; 104 __entry->sepc = sepc; 105 __entry->scause = scause; 106 __entry->stval = stval; 107 __entry->htval = htval; 108 __entry->htinst = htinst; 109 ), 110 111 TP_printk("VCPU: %lu, SEPC: 0x%lx, SCAUSE: 0x%lx, STVAL: 0x%lx, HTVAL: 0x%lx, HTINST: 0x%lx", 112 __entry->vcpu_id, __entry->sepc, __entry->scause, 113 __entry->stval, __entry->htval, __entry->htinst) 114 ); 115 116 TRACE_EVENT(kvm_vcpu_irq, 117 TP_PROTO(unsigned long vcpu_id, unsigned int irq, int level), 118 TP_ARGS(vcpu_id, irq, level), 119 120 TP_STRUCT__entry( 121 __field(unsigned long, vcpu_id) 122 __field(unsigned int, irq) 123 __field(int, level) 124 ), 125 126 TP_fast_assign( 127 __entry->vcpu_id = vcpu_id; 128 __entry->irq = irq; 129 __entry->level = level; 130 ), 131 132 TP_printk("VCPU: %lu, IRQ: %u, level: %d", 133 __entry->vcpu_id, __entry->irq, __entry->level) 134 ); 135 136 #endif /* _TRACE_KVM_H */ 137 138 #undef TRACE_INCLUDE_PATH 139 #define TRACE_INCLUDE_PATH . 140 #undef TRACE_INCLUDE_FILE 141 #define TRACE_INCLUDE_FILE trace 142 143 /* This part must be outside protection */ 144 #include <trace/define_trace.h> 145