[U-Boot] [PATCH] syscon: reset node list syscon_list after relocation
Patrick Delaunay
patrick.delaunay at st.com
Fri Oct 12 15:26:25 UTC 2018
Reset the list head after the reallocation because the list syscon_list
use allocated pointer and they are no more valid.
This patch avoid issue (crash) when syscon_node_to_regmap() is called
before and after reallocation.
Signed-off-by: Patrick Delaunay <patrick.delaunay at st.com>
---
Hi
This patch correct a crash see on v2018.11-rc1 with my board stm32mp1
for the command "reset".
The crash is a side effect of 2 patches
1f6ca3f42f6edf143473159297f4c515b1cf36f6
sysreset: syscon: update regmap access to syscon
23471aed5c33e104d6fa64575932577618543bec
board_f: Add reset status printing
With the first patch the syscon_node_to_regmap() is called
each time that the class sysreset_syscon is probed.
=> in v2018.09 probe is done only when reset is requested
NB: for stm32mp1, the node rcc_reboot in tagged pre-relocated to
support reset in pre-reloc phases (allow panic).
With the second patch, U-Boot probes all the sysreset uclass in preloc
phase to allow to print the reset status, and the list is initialized
in board_f / pre-reloc:
-> print_resetinfo
--> uclass_first_device_err(UCLASS_SYSRESET, &dev);
---> syscon_reboot_probe()
----> syscon_node_to_regmap(node)
-----> of_syscon_register()
-------> list_add_tail(&syscon->list, &syscon_list);
During relocation, the content of syscon_list (static) is updated
but the list use pointers allocated by malloc in pre-reloc phasis
And when I execute the reset command
-> do_reset()
--> reset_cpu()
---> sysreset_walk_halt(SYSRESET_COLD);
----> loop on device UCLASS_SYSRESET
-----> syscon_reboot_probe()
------> syscon_node_to_regmap(node)
-------> list_for_each_entry(entry, &syscon_list, list)
I have a crash here because the pointer syscon_list.next is invalid.
I solve the issue by resetting the list after reloc and it is working
but I don't know if a more elegant solution exist
(keep the list in .bss section to be set to 0).
Regards
Patrick
drivers/core/syscon-uclass.c | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/drivers/core/syscon-uclass.c b/drivers/core/syscon-uclass.c
index 303e166..aacb43a 100644
--- a/drivers/core/syscon-uclass.c
+++ b/drivers/core/syscon-uclass.c
@@ -156,8 +156,15 @@ static struct syscon *of_syscon_register(ofnode node)
struct regmap *syscon_node_to_regmap(ofnode node)
{
+ static int reloc_done;
struct syscon *entry, *syscon = NULL;
+ /* content of list is not relocated (malloc): reinit when needed */
+ if (!reloc_done && (gd->flags & GD_FLG_RELOC)) {
+ INIT_LIST_HEAD(&syscon_list);
+ reloc_done++;
+ }
+
list_for_each_entry(entry, &syscon_list, list)
if (ofnode_equal(entry->node, node)) {
syscon = entry;
--
2.7.4
More information about the U-Boot
mailing list