mirror of
https://github.com/torvalds/linux.git
synced 2026-04-18 06:44:00 -04:00
KVM: arm64: Add event support to the nVHE/pKVM hyp and trace remote
Allow the creation of hypervisor and trace remote events with a single macro HYP_EVENT(). That macro expands in the kernel side to add all the required declarations (based on REMOTE_EVENT()) as well as in the hypervisor side to create the trace_<event>() function. Signed-off-by: Vincent Donnefort <vdonnefort@google.com> Link: https://patch.msgid.link/20260309162516.2623589-28-vdonnefort@google.com Signed-off-by: Marc Zyngier <maz@kernel.org>
This commit is contained in:
committed by
Marc Zyngier
parent
2194d317e0
commit
0a90fbc8a1
@@ -318,6 +318,25 @@ static int hyp_trace_reset(unsigned int cpu, void *priv)
|
||||
|
||||
static int hyp_trace_enable_event(unsigned short id, bool enable, void *priv)
|
||||
{
|
||||
struct hyp_event_id *event_id = lm_alias(&__hyp_event_ids_start[id]);
|
||||
struct page *page;
|
||||
atomic_t *enabled;
|
||||
void *map;
|
||||
|
||||
if (is_protected_kvm_enabled())
|
||||
return kvm_call_hyp_nvhe(__tracing_enable_event, id, enable);
|
||||
|
||||
enabled = &event_id->enabled;
|
||||
page = virt_to_page(enabled);
|
||||
map = vmap(&page, 1, VM_MAP, PAGE_KERNEL);
|
||||
if (!map)
|
||||
return -ENOMEM;
|
||||
|
||||
enabled = map + offset_in_page(enabled);
|
||||
atomic_set(enabled, enable);
|
||||
|
||||
vunmap(map);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -345,6 +364,19 @@ static struct trace_remote_callbacks trace_remote_callbacks = {
|
||||
.enable_event = hyp_trace_enable_event,
|
||||
};
|
||||
|
||||
#include <asm/kvm_define_hypevents.h>
|
||||
|
||||
static void __init hyp_trace_init_events(void)
|
||||
{
|
||||
struct hyp_event_id *hyp_event_id = __hyp_event_ids_start;
|
||||
struct remote_event *event = __hyp_events_start;
|
||||
int id = 0;
|
||||
|
||||
/* Events on both sides hypervisor are sorted */
|
||||
for (; event < __hyp_events_end; event++, hyp_event_id++, id++)
|
||||
event->id = hyp_event_id->id = id;
|
||||
}
|
||||
|
||||
int __init kvm_hyp_trace_init(void)
|
||||
{
|
||||
int cpu;
|
||||
@@ -364,5 +396,8 @@ int __init kvm_hyp_trace_init(void)
|
||||
}
|
||||
#endif
|
||||
|
||||
return trace_remote_register("hypervisor", &trace_remote_callbacks, &trace_buffer, NULL, 0);
|
||||
hyp_trace_init_events();
|
||||
|
||||
return trace_remote_register("hypervisor", &trace_remote_callbacks, &trace_buffer,
|
||||
__hyp_events_start, __hyp_events_end - __hyp_events_start);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user