]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
log: fixup log_head after relocating global data
authorThomas Weißschuh <thomas.weissschuh@linutronix.de>
Tue, 13 Feb 2024 17:13:28 +0000 (18:13 +0100)
committerTom Rini <trini@konsulko.com>
Sat, 2 Mar 2024 17:26:56 +0000 (12:26 -0500)
When `gd` is relocated during `spl_relocate_stack_gd()` the
doubly-linked circular list in the `log_head` member is broken.

The last element of the list should point back to the initial
`list_head`, but as the initial `list_head` is moved the pointer becomes
stale. As a result the loop in `log_dispatch` would never finish.

Signed-off-by: Thomas Weißschuh <thomas.weissschuh@linutronix.de>
common/log.c
common/spl/spl.c
include/log.h

index b2de57fcb3b8763204b49611d3c7b1ee4a81045b..42d35f04b689b26d21723d5c7c9bb518366dd9a4 100644 (file)
@@ -428,6 +428,11 @@ int log_device_set_enable(struct log_driver *drv, bool enable)
        return 0;
 }
 
+void log_fixup_for_gd_move(struct global_data *new_gd)
+{
+       new_gd->log_head.prev->next = &new_gd->log_head;
+}
+
 int log_init(void)
 {
        struct log_driver *drv = ll_entry_start(struct log_driver, log_driver);
index b65c439e7aa9b5818a28a30a4c308141fbce946a..e06bc75d36b29921d55f5e6bc6e22dc4ee9e1b70 100644 (file)
@@ -909,6 +909,9 @@ ulong spl_relocate_stack_gd(void)
 #if CONFIG_IS_ENABLED(DM)
        dm_fixup_for_gd_move(new_gd);
 #endif
+#if CONFIG_IS_ENABLED(LOG)
+       log_fixup_for_gd_move(new_gd);
+#endif
 #if !defined(CONFIG_ARM) && !defined(CONFIG_RISCV)
        gd = new_gd;
 #endif
index 6e84f080ef3d1e763b55e08b548585fa34f019fe..fc0d59844728323474120de5f74180932845dbc7 100644 (file)
@@ -688,4 +688,16 @@ static inline int log_get_default_format(void)
               (IS_ENABLED(CONFIG_LOGF_FUNC) ? BIT(LOGF_FUNC) : 0);
 }
 
+struct global_data;
+/**
+ * log_fixup_for_gd_move() - Handle global_data moving to a new place
+ *
+ * @new_gd: Pointer to the new global data
+ *
+ * The log_head list is part of global_data. Due to the way lists work, moving
+ * the list will cause it to become invalid. This function fixes that up so
+ * that the log_head list will work correctly.
+ */
+void log_fixup_for_gd_move(struct global_data *new_gd);
+
 #endif