[PATCH] firmware: arm_sdei: publish sdei_entry_point with release semantics
Jaidev Shastri via B4 Relay
devnull+jaidevshastri.vt.edu at kernel.org
Mon Sep 21 18:14:52 PDT 2026
From: Jaidev Shastri <jaidevshastri at vt.edu>
sdei_probe() stores the SDEI entry point to the file-scope
sdei_entry_point with a plain store after the platform reset.
sdei_event_register(), the cross-call helper _local_event_register() and
the re-registration path pass it to the firmware with plain loads.
Keep it in a local and publish it with smp_store_release(). Read it
through a new sdei_get_entry_point() accessor at the three call sites.
Found with MBCheck, a static herd7-based memory consistency checker.
Signed-off-by: Jaidev Shastri <jaidevshastri at vt.edu>
---
drivers/firmware/arm_sdei.c | 19 ++++++++++++++-----
1 file changed, 14 insertions(+), 5 deletions(-)
diff --git a/drivers/firmware/arm_sdei.c b/drivers/firmware/arm_sdei.c
index e8dd2f0f3..a75203469 100644
--- a/drivers/firmware/arm_sdei.c
+++ b/drivers/firmware/arm_sdei.c
@@ -43,6 +43,12 @@ static asmlinkage void (*sdei_firmware_call)(unsigned long function_id,
/* entry point from firmware to arch asm code */
static unsigned long sdei_entry_point;
+static unsigned long sdei_get_entry_point(void)
+{
+ /* Pairs with the smp_store_release() in sdei_probe(). */
+ return smp_load_acquire(&sdei_entry_point);
+}
+
static int sdei_hp_state;
struct sdei_event {
@@ -582,7 +588,7 @@ static void _local_event_register(void *data)
struct sdei_crosscall_args *arg = data;
reg = per_cpu_ptr(arg->event->private_registered, smp_processor_id());
- err = sdei_api_event_register(arg->event->event_num, sdei_entry_point,
+ err = sdei_api_event_register(arg->event->event_num, sdei_get_entry_point(),
reg, 0, 0);
sdei_cross_call_return(arg, err);
@@ -612,7 +618,7 @@ int sdei_event_register(u32 event_num, sdei_event_callback *cb, void *arg)
cpus_read_lock();
if (event->type == SDEI_EVENT_TYPE_SHARED) {
err = sdei_api_event_register(event->event_num,
- sdei_entry_point,
+ sdei_get_entry_point(),
event->registered,
SDEI_EVENT_REGISTER_RM_ANY, 0);
} else {
@@ -650,7 +656,7 @@ static int sdei_reregister_shared(void)
if (event->reregister) {
err = sdei_api_event_register(event->event_num,
- sdei_entry_point, event->registered,
+ sdei_get_entry_point(), event->registered,
SDEI_EVENT_REGISTER_RM_ANY, 0);
if (err) {
pr_err("Failed to re-register event %u\n",
@@ -978,6 +984,7 @@ static int sdei_get_conduit(struct platform_device *pdev)
static int sdei_probe(struct platform_device *pdev)
{
+ unsigned long entry_point;
int err;
u64 ver = 0;
int conduit;
@@ -1007,12 +1014,14 @@ static int sdei_probe(struct platform_device *pdev)
if (err)
return err;
- sdei_entry_point = sdei_arch_get_entry_point(conduit);
- if (!sdei_entry_point) {
+ entry_point = sdei_arch_get_entry_point(conduit);
+ if (!entry_point) {
/* Not supported due to hardware or boot configuration */
sdei_mark_interface_broken();
return 0;
}
+ /* Pairs with the smp_load_acquire() in sdei_get_entry_point(). */
+ smp_store_release(&sdei_entry_point, entry_point);
err = cpu_pm_register_notifier(&sdei_pm_nb);
if (err) {
---
base-commit: 93f51579e7df248780214094418f205253383cc5
change-id: 20260921-mb-arm-sdei-f69f902b810d
Best regards,
--
Jaidev Shastri <jaidevshastri at vt.edu>
More information about the linux-arm-kernel
mailing list