From 3671884dfe0a6d27abed728979afdc0934bd8d51 Mon Sep 17 00:00:00 2001 From: Guennadi Liakhovetski Date: Thu, 16 Jul 2026 14:14:10 +0200 Subject: [PATCH 1/2] schedule: fix regression with DRAM execution debugging Fix a NULL dereference when a __cold function is called before schedulers are initilised on that core and CONFIG_COLD_STORE_EXECUTE_DEBUG=y and assertions are enabled. Signed-off-by: Guennadi Liakhovetski --- src/include/sof/schedule/schedule.h | 3 +++ src/schedule/zephyr_domain.c | 3 ++- src/schedule/zephyr_ll.c | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/include/sof/schedule/schedule.h b/src/include/sof/schedule/schedule.h index 03ce567dc9ea..a68169736ef2 100644 --- a/src/include/sof/schedule/schedule.h +++ b/src/include/sof/schedule/schedule.h @@ -197,6 +197,9 @@ static inline void *scheduler_get_data(uint16_t type) struct schedule_data *sch; struct list_item *slist; + if (!schedulers) + return NULL; + list_for_item(slist, &schedulers->list) { sch = container_of(slist, struct schedule_data, list); if (type == sch->type) diff --git a/src/schedule/zephyr_domain.c b/src/schedule/zephyr_domain.c index c878e1972c49..681b0c872f58 100644 --- a/src/schedule/zephyr_domain.c +++ b/src/schedule/zephyr_domain.c @@ -609,7 +609,8 @@ struct ll_schedule_domain *zephyr_domain_init(int clk) /* Check if currently running in the LL scheduler thread context */ bool ll_sch_is_current(void) { - struct zephyr_domain *zephyr_domain = ll_sch_domain_get_pdata(zephyr_ll_domain()); + struct ll_schedule_domain *ll_dom = zephyr_ll_domain(); + struct zephyr_domain *zephyr_domain = ll_dom ? ll_sch_domain_get_pdata(ll_dom) : NULL; if (!zephyr_domain) return false; diff --git a/src/schedule/zephyr_ll.c b/src/schedule/zephyr_ll.c index 33d2d76014bd..2c0bfc1ce0ff 100644 --- a/src/schedule/zephyr_ll.c +++ b/src/schedule/zephyr_ll.c @@ -769,5 +769,5 @@ struct ll_schedule_domain *zephyr_ll_domain(void) { struct zephyr_ll *ll_sch = scheduler_get_data(SOF_SCHEDULE_LL_TIMER); - return ll_sch->ll_domain; + return ll_sch ? ll_sch->ll_domain : NULL; } From 4d03f81fce6c9e9082b4ddba9b13f5835a1e5186 Mon Sep 17 00:00:00 2001 From: Guennadi Liakhovetski Date: Thu, 16 Jul 2026 14:19:59 +0200 Subject: [PATCH 2/2] schedule: make 2 initialisation functions __cold scheduler_register() and scheduler_init() are never called on hot paths, make them cold. Signed-off-by: Guennadi Liakhovetski --- src/schedule/schedule.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/schedule/schedule.c b/src/schedule/schedule.c index 6dc141834842..519b8f144ba6 100644 --- a/src/schedule/schedule.c +++ b/src/schedule/schedule.c @@ -81,11 +81,13 @@ int schedule_task_init(struct task *task, return 0; } -static void scheduler_register(struct schedule_data *scheduler) +__cold static void scheduler_register(struct schedule_data *scheduler) { struct schedulers **sch = arch_schedulers_get(); struct k_heap *heap = NULL; + assert_can_be_cold(); + if (IS_ENABLED(CONFIG_SOF_USERSPACE_LL) && scheduler_is_user(scheduler->type)) { sch = arch_user_schedulers_get(); heap = sof_sys_user_heap_get(); @@ -105,11 +107,13 @@ static void scheduler_register(struct schedule_data *scheduler) list_item_append(&scheduler->list, &(*sch)->list); } -void scheduler_init(int type, const struct scheduler_ops *ops, void *data) +__cold void scheduler_init(int type, const struct scheduler_ops *ops, void *data) { struct schedule_data *sch; struct k_heap *heap = NULL; + assert_can_be_cold(); + if (IS_ENABLED(CONFIG_SOF_USERSPACE_LL) && scheduler_is_user(type)) heap = sof_sys_user_heap_get();