Skip to content

Commit 599d79d

Browse files
author
Marc Zyngier
committed
arm64: KVM: Add trapped system register access tracepoint
We're pretty blind when it comes to system register tracing, and rely on the ESR value displayed by kvm_handle_sys, which isn't much. Instead, let's add an actual name to the sysreg entries, so that we can finally print it as we're about to perform the access itself. The new tracepoint is conveniently called kvm_sys_access. Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
1 parent da6f166 commit 599d79d

File tree

3 files changed

+41
-0
lines changed

3 files changed

+41
-0
lines changed

arch/arm64/kvm/sys_regs.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1850,6 +1850,8 @@ static void perform_access(struct kvm_vcpu *vcpu,
18501850
struct sys_reg_params *params,
18511851
const struct sys_reg_desc *r)
18521852
{
1853+
trace_kvm_sys_access(*vcpu_pc(vcpu), params, r);
1854+
18531855
/*
18541856
* Not having an accessor means that we have configured a trap
18551857
* that we don't know how to handle. This certainly qualifies

arch/arm64/kvm/sys_regs.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,9 @@ struct sys_reg_params {
3535
};
3636

3737
struct sys_reg_desc {
38+
/* Sysreg string for debug */
39+
const char *name;
40+
3841
/* MRS/MSR instruction which accesses it. */
3942
u8 Op0;
4043
u8 Op1;
@@ -130,6 +133,7 @@ const struct sys_reg_desc *find_reg_by_id(u64 id,
130133
#define Op2(_x) .Op2 = _x
131134

132135
#define SYS_DESC(reg) \
136+
.name = #reg, \
133137
Op0(sys_reg_Op0(reg)), Op1(sys_reg_Op1(reg)), \
134138
CRn(sys_reg_CRn(reg)), CRm(sys_reg_CRm(reg)), \
135139
Op2(sys_reg_Op2(reg))

arch/arm64/kvm/trace.h

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#define _TRACE_ARM64_KVM_H
44

55
#include <linux/tracepoint.h>
6+
#include "sys_regs.h"
67

78
#undef TRACE_SYSTEM
89
#define TRACE_SYSTEM kvm
@@ -152,6 +153,40 @@ TRACE_EVENT(kvm_handle_sys_reg,
152153
TP_printk("HSR 0x%08lx", __entry->hsr)
153154
);
154155

156+
TRACE_EVENT(kvm_sys_access,
157+
TP_PROTO(unsigned long vcpu_pc, struct sys_reg_params *params, const struct sys_reg_desc *reg),
158+
TP_ARGS(vcpu_pc, params, reg),
159+
160+
TP_STRUCT__entry(
161+
__field(unsigned long, vcpu_pc)
162+
__field(bool, is_write)
163+
__field(const char *, name)
164+
__field(u8, Op0)
165+
__field(u8, Op1)
166+
__field(u8, CRn)
167+
__field(u8, CRm)
168+
__field(u8, Op2)
169+
),
170+
171+
TP_fast_assign(
172+
__entry->vcpu_pc = vcpu_pc;
173+
__entry->is_write = params->is_write;
174+
__entry->name = reg->name;
175+
__entry->Op0 = reg->Op0;
176+
__entry->Op0 = reg->Op0;
177+
__entry->Op1 = reg->Op1;
178+
__entry->CRn = reg->CRn;
179+
__entry->CRm = reg->CRm;
180+
__entry->Op2 = reg->Op2;
181+
),
182+
183+
TP_printk("PC: %lx %s (%d,%d,%d,%d,%d) %s",
184+
__entry->vcpu_pc, __entry->name ?: "UNKN",
185+
__entry->Op0, __entry->Op1, __entry->CRn,
186+
__entry->CRm, __entry->Op2,
187+
__entry->is_write ? "write" : "read")
188+
);
189+
155190
TRACE_EVENT(kvm_set_guest_debug,
156191
TP_PROTO(struct kvm_vcpu *vcpu, __u32 guest_debug),
157192
TP_ARGS(vcpu, guest_debug),

0 commit comments

Comments
 (0)