From b1fccaad6e7e5eff6f28f493c7f9125d5e089226 Mon Sep 17 00:00:00 2001 From: Fabio Baltieri Date: Wed, 23 Jul 2025 18:14:47 +0100 Subject: [PATCH] scripts: check_init_priorities: fix device function name display Device init pointers have been moved off struct init_entry and into struct device in 766bfe7b2e2, but check_init_priorities.py have not been modified to check the new pointer so it's been showing NULL for all devices since. Fix it by searching down the right pointer for device init entries. Signed-off-by: Fabio Baltieri --- scripts/build/check_init_priorities.py | 14 ++++++++++++-- scripts/build/check_init_priorities_test.py | 8 ++++++-- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/scripts/build/check_init_priorities.py b/scripts/build/check_init_priorities.py index dc028aa31de..a500e673318 100755 --- a/scripts/build/check_init_priorities.py +++ b/scripts/build/check_init_priorities.py @@ -49,6 +49,9 @@ _IGNORE_COMPATIBLES = frozenset([ "zephyr,cdc-acm-uart", ]) +# The offset of the init pointer in "struct device", in number of pointers. +DEVICE_INIT_OFFSET = 5 + class Priority: """Parses and holds a device initialization priority. @@ -108,6 +111,7 @@ class ZephyrInitLevels: def _load_objects(self): """Initialize the object table.""" self._objects = {} + self._object_addr = {} for section in self._elf.iter_sections(): if not isinstance(section, SymbolTableSection): @@ -119,6 +123,7 @@ class ZephyrInitLevels: sym.entry.st_info.type in ["STT_OBJECT", "STT_FUNC"]): self._objects[sym.entry.st_value] = ( sym.name, sym.entry.st_size, sym.entry.st_shndx) + self._object_addr[sym.name] = sym.entry.st_value def _load_level_addr(self): """Find the address associated with known init levels.""" @@ -205,13 +210,18 @@ class ZephyrInitLevels: arg0_name = self._object_name(self._initlevel_pointer(addr, 0, shidx)) arg1_name = self._object_name(self._initlevel_pointer(addr, 1, shidx)) - self.initlevels[level].append(f"{obj}: {arg0_name}({arg1_name})") - ordinal = self._device_ord_from_name(arg1_name) if ordinal: + dev_addr = self._object_addr[arg1_name] + _, _, shidx = self._objects[dev_addr] + arg0_name = self._object_name(self._initlevel_pointer( + dev_addr, DEVICE_INIT_OFFSET, shidx)) + prio = Priority(level, priority) self.devices[ordinal] = (prio, arg0_name) + self.initlevels[level].append(f"{obj}: {arg0_name}({arg1_name})") + addr += size priority += 1 diff --git a/scripts/build/check_init_priorities_test.py b/scripts/build/check_init_priorities_test.py index 7ada2349839..394e536a55c 100755 --- a/scripts/build/check_init_priorities_test.py +++ b/scripts/build/check_init_priorities_test.py @@ -210,15 +210,19 @@ class testZephyrInitLevels(unittest.TestCase): 0x04: ("b", 4, 0), 0x08: ("c", 4, 0), } + obj._object_addr = { + "__device_dts_ord_11": 0x00, + "__device_dts_ord_22": 0x04, + } mock_ip.side_effect = lambda *args: args def mock_obj_name(*args): - if args[0] == (0, 0, 0): + if args[0] == (0, 5, 0): return "i0" elif args[0] == (0, 1, 0): return "__device_dts_ord_11" - elif args[0] == (4, 0, 0): + elif args[0] == (4, 5, 0): return "i1" elif args[0] == (4, 1, 0): return "__device_dts_ord_22"