diff --git a/drivers/misc/pkvm-smc/pkvm-smc.c b/drivers/misc/pkvm-smc/pkvm-smc.c index ad1081bbbd86..2101462be303 100644 --- a/drivers/misc/pkvm-smc/pkvm-smc.c +++ b/drivers/misc/pkvm-smc/pkvm-smc.c @@ -9,6 +9,9 @@ #include #include +#define HYP_EVENT_FILE ../../../../drivers/misc/pkvm-smc/pkvm/events.h +#include + static unsigned long pkvm_module_token; int kvm_nvhe_sym(pkvm_smc_filter_hyp_init)(const struct pkvm_module_ops *ops); diff --git a/drivers/misc/pkvm-smc/pkvm/events.h b/drivers/misc/pkvm-smc/pkvm/events.h new file mode 100644 index 000000000000..9db1f021dcd0 --- /dev/null +++ b/drivers/misc/pkvm-smc/pkvm/events.h @@ -0,0 +1,19 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#if !defined(__PKVM_SMC_FILTER_HYPEVENTS_H_) || defined(HYP_EVENT_MULTI_READ) +#define __PKVM_SMC_FILTER_HYPEVENTS_H_ + +#ifdef __KVM_NVHE_HYPERVISOR__ +#include +#endif + +HYP_EVENT(filtered_smc, + HE_PROTO(u64 smc_id), + HE_STRUCT( + he_field(u64, smc_id) + ), + HE_ASSIGN( + __entry->smc_id = smc_id; + ), + HE_PRINTK("smc_id = 0x%08llx", __entry->smc_id) +); +#endif diff --git a/drivers/misc/pkvm-smc/pkvm/pkvm-smc.c b/drivers/misc/pkvm-smc/pkvm/pkvm-smc.c index d9a677ab18e9..96850e783385 100644 --- a/drivers/misc/pkvm-smc/pkvm/pkvm-smc.c +++ b/drivers/misc/pkvm-smc/pkvm/pkvm-smc.c @@ -9,6 +9,27 @@ #include #include +#include "events.h" +#define HYP_EVENT_FILE ../../../../drivers/misc/pkvm-smc/pkvm/events.h +#include + +const struct pkvm_module_ops *pkvm_ops; + +#ifdef CONFIG_TRACING +extern char __hyp_event_ids_start[]; +extern char __hyp_event_ids_end[]; + +void *tracing_reserve_entry(unsigned long length) +{ + return pkvm_ops->tracing_reserve_entry(length); +} + +void tracing_commit_entry(void) +{ + pkvm_ops->tracing_commit_entry(); +} +#endif + struct pkvm_smc_filter { u64 smc_id; bool (*cb)(struct user_pt_regs *regs); /* Forward unconditionally if NULL. */ @@ -16,6 +37,7 @@ struct pkvm_smc_filter { static bool deny_smc(struct user_pt_regs *regs) { + trace_filtered_smc(regs->regs[0]); regs->regs[0] = SMCCC_RET_NOT_SUPPORTED; return true; } @@ -107,5 +129,10 @@ bool filter_smc(struct user_pt_regs *regs) int pkvm_smc_filter_hyp_init(const struct pkvm_module_ops *ops) { +#ifdef CONFIG_TRACING + ops->register_hyp_event_ids((unsigned long)__hyp_event_ids_start, + (unsigned long)__hyp_event_ids_end); +#endif + pkvm_ops = ops; return ops->register_host_smc_handler(filter_smc); }