mirror of
https://github.com/torvalds/linux.git
synced 2026-06-04 20:46:48 +02:00
KVM: arm64: Add selftest event support to nVHE/pKVM hyp
Add a selftest event that can be triggered from a `write_event` tracefs file. This intends to be used by trace remote selftests. Signed-off-by: Vincent Donnefort <vdonnefort@google.com> Link: https://patch.msgid.link/20260309162516.2623589-30-vdonnefort@google.com Signed-off-by: Marc Zyngier <maz@kernel.org>
This commit is contained in:
parent
696dfec22b
commit
5bbbed42f7
|
|
@ -96,6 +96,7 @@ enum __kvm_host_smccc_func {
|
|||
__KVM_HOST_SMCCC_FUNC___tracing_update_clock,
|
||||
__KVM_HOST_SMCCC_FUNC___tracing_reset,
|
||||
__KVM_HOST_SMCCC_FUNC___tracing_enable_event,
|
||||
__KVM_HOST_SMCCC_FUNC___tracing_write_event,
|
||||
};
|
||||
|
||||
#define DECLARE_KVM_VHE_SYM(sym) extern char sym[]
|
||||
|
|
|
|||
|
|
@ -46,4 +46,15 @@ HYP_EVENT(hyp_exit,
|
|||
),
|
||||
HE_PRINTK("reason=%s vcpu=%d", __hyp_enter_exit_reason_str(__entry->reason), __entry->vcpu)
|
||||
);
|
||||
|
||||
HYP_EVENT(selftest,
|
||||
HE_PROTO(u64 id),
|
||||
HE_STRUCT(
|
||||
he_field(u64, id)
|
||||
),
|
||||
HE_ASSIGN(
|
||||
__entry->id = id;
|
||||
),
|
||||
RE_PRINTK("id=%llu", __entry->id)
|
||||
);
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -643,6 +643,13 @@ static void handle___tracing_enable_event(struct kvm_cpu_context *host_ctxt)
|
|||
cpu_reg(host_ctxt, 1) = __tracing_enable_event(id, enable);
|
||||
}
|
||||
|
||||
static void handle___tracing_write_event(struct kvm_cpu_context *host_ctxt)
|
||||
{
|
||||
DECLARE_REG(u64, id, host_ctxt, 1);
|
||||
|
||||
trace_selftest(id);
|
||||
}
|
||||
|
||||
typedef void (*hcall_t)(struct kvm_cpu_context *);
|
||||
|
||||
#define HANDLE_FUNC(x) [__KVM_HOST_SMCCC_FUNC_##x] = (hcall_t)handle_##x
|
||||
|
|
@ -691,6 +698,7 @@ static const hcall_t host_hcall[] = {
|
|||
HANDLE_FUNC(__tracing_update_clock),
|
||||
HANDLE_FUNC(__tracing_reset),
|
||||
HANDLE_FUNC(__tracing_enable_event),
|
||||
HANDLE_FUNC(__tracing_write_event),
|
||||
};
|
||||
|
||||
static void handle_host_hcall(struct kvm_cpu_context *host_ctxt)
|
||||
|
|
|
|||
|
|
@ -348,8 +348,30 @@ static int hyp_trace_clock_show(struct seq_file *m, void *v)
|
|||
}
|
||||
DEFINE_SHOW_ATTRIBUTE(hyp_trace_clock);
|
||||
|
||||
static ssize_t hyp_trace_write_event_write(struct file *f, const char __user *ubuf,
|
||||
size_t cnt, loff_t *pos)
|
||||
{
|
||||
unsigned long val;
|
||||
int ret;
|
||||
|
||||
ret = kstrtoul_from_user(ubuf, cnt, 10, &val);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
kvm_call_hyp_nvhe(__tracing_write_event, val);
|
||||
|
||||
return cnt;
|
||||
}
|
||||
|
||||
static const struct file_operations hyp_trace_write_event_fops = {
|
||||
.write = hyp_trace_write_event_write,
|
||||
};
|
||||
|
||||
static int hyp_trace_init_tracefs(struct dentry *d, void *priv)
|
||||
{
|
||||
if (!tracefs_create_file("write_event", 0200, d, NULL, &hyp_trace_write_event_fops))
|
||||
return -ENOMEM;
|
||||
|
||||
return tracefs_create_file("trace_clock", 0440, d, NULL, &hyp_trace_clock_fops) ?
|
||||
0 : -ENOMEM;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user