ANDROID: KVM: arm64: Allow enabling pKVM modules hyp event at boot
Allow to select pKVM modules declared hyp events in the kernel
commandline "hyp_event".
Bug: 357781595
Bug: 268495982
Signed-off-by: Vincent Donnefort <vdonnefort@google.com>
diff --git a/arch/arm64/kvm/hyp_events.c b/arch/arm64/kvm/hyp_events.c
index 74dc8e8..090eb40 100644
--- a/arch/arm64/kvm/hyp_events.c
+++ b/arch/arm64/kvm/hyp_events.c
@@ -353,7 +353,7 @@ static __init int setup_hyp_event_early(char *str)
}
__setup("hyp_event=", setup_hyp_event_early);
-bool hyp_trace_init_event_early(void)
+bool hyp_event_early_probe(void)
{
char *token, *buf = early_events;
bool enabled = false;
@@ -376,8 +376,6 @@ bool hyp_trace_init_event_early(void)
token, ret);
else
enabled = true;
- } else {
- pr_warn("Couldn't find hyp event %s\n", token);
}
}
diff --git a/arch/arm64/kvm/hyp_trace.c b/arch/arm64/kvm/hyp_trace.c
index cca2e4c..9741c55a 100644
--- a/arch/arm64/kvm/hyp_trace.c
+++ b/arch/arm64/kvm/hyp_trace.c
@@ -990,12 +990,21 @@ static void hyp_trace_buffer_printk(struct hyp_trace_buffer *hyp_buffer)
}
}
+void hyp_trace_enable_event_early(void)
+{
+ if (hyp_event_early_probe()) {
+ int err = hyp_trace_start();
+
+ if (err)
+ pr_warn("Failed to start early events tracing: %d\n", err);
+ }
+}
+
int hyp_trace_init_tracefs(void)
{
struct dentry *root, *per_cpu_root;
char per_cpu_name[16];
long cpu;
- int err;
if (!is_protected_kvm_enabled())
return 0;
@@ -1049,17 +1058,14 @@ int hyp_trace_init_tracefs(void)
}
hyp_trace_init_event_tracefs(root);
+
+ hyp_trace_enable_event_early();
+
hyp_trace_init_testing_tracefs(root);
if (hyp_trace_buffer.printk_on &&
hyp_trace_buffer_printk_init(&hyp_trace_buffer))
pr_warn("Failed to init ht_printk");
- if (hyp_trace_init_event_early()) {
- err = hyp_trace_start();
- if (err)
- pr_warn("Failed to start early events tracing: %d\n", err);
- }
-
return 0;
}
diff --git a/arch/arm64/kvm/hyp_trace.h b/arch/arm64/kvm/hyp_trace.h
index f10388bc..f2bdff4 100644
--- a/arch/arm64/kvm/hyp_trace.h
+++ b/arch/arm64/kvm/hyp_trace.h
@@ -11,10 +11,11 @@ int hyp_trace_init_tracefs(void);
int hyp_trace_init_events(void);
struct hyp_event *hyp_trace_find_event(int id);
void hyp_trace_init_event_tracefs(struct dentry *parent);
-bool hyp_trace_init_event_early(void);
int hyp_trace_init_mod_events(struct hyp_event *event,
struct hyp_event_id *event_id, int nr_events,
struct hyp_printk_fmt *fmt, int nr_fmts);
+bool hyp_event_early_probe(void);
+void hyp_trace_enable_event_early(void);
#else
static inline int hyp_trace_init_tracefs(void) { return 0; }
static inline int hyp_trace_init_events(void) { return 0; }
@@ -25,5 +26,6 @@ hyp_trace_init_mod_events(struct hyp_event *event,
{
return 0;
}
+static inline void hyp_trace_enable_event_early(void) { }
#endif
#endif
diff --git a/arch/arm64/kvm/pkvm.c b/arch/arm64/kvm/pkvm.c
index 384994b..378960b 100644
--- a/arch/arm64/kvm/pkvm.c
+++ b/arch/arm64/kvm/pkvm.c
@@ -873,6 +873,8 @@ int __pkvm_load_el2_module(struct module *this, unsigned long *token)
return ret;
}
+ hyp_trace_enable_event_early();
+
return 0;
}
EXPORT_SYMBOL(__pkvm_load_el2_module);