Skip to content

Commit 8f11faa

Browse files
committed
scripts: Adapt where to get init function pointer in check_init scripts
As the pointer has been removed from struct init_entry, it should be looked up in the pointed object instead, as it has been done already for device objects. Signed-off-by: Tomasz Bursztyka <[email protected]>
1 parent 20b2d44 commit 8f11faa

File tree

2 files changed

+28
-18
lines changed

2 files changed

+28
-18
lines changed

scripts/build/check_init_priorities.py

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,8 @@
5151

5252
# The offset of the init pointer in "struct device", in number of pointers.
5353
DEVICE_INIT_OFFSET = 5
54+
# The offset of the init pointer in "struct service", in number of pointers.
55+
SERVICE_INIT_OFFSET = 0
5456

5557
class Priority:
5658
"""Parses and holds a device initialization priority.
@@ -207,20 +209,23 @@ def _process_initlevels(self):
207209
raise ValueError(f"no symbol at addr {addr:08x}")
208210
obj, size, shidx = self._objects[addr]
209211

210-
arg0_name = self._object_name(self._initlevel_pointer(addr, 0, shidx))
211-
arg1_name = self._object_name(self._initlevel_pointer(addr, 1, shidx))
212+
obj_name = self._object_name(self._initlevel_pointer(addr, 0, shidx))
213+
if obj_name != "unknown":
214+
obj_addr = self._object_addr[obj_name]
215+
_, _, shidx = self._objects[obj_addr]
212216

213-
ordinal = self._device_ord_from_name(arg1_name)
214-
if ordinal:
215-
dev_addr = self._object_addr[arg1_name]
216-
_, _, shidx = self._objects[dev_addr]
217-
arg0_name = self._object_name(self._initlevel_pointer(
218-
dev_addr, DEVICE_INIT_OFFSET, shidx))
217+
ordinal = self._device_ord_from_name(obj_name)
218+
if ordinal:
219+
init_fn_name = self._object_name(self._initlevel_pointer(
220+
obj_addr, DEVICE_INIT_OFFSET, shidx))
219221

220-
prio = Priority(level, priority)
221-
self.devices[ordinal] = (prio, arg0_name)
222+
prio = Priority(level, priority)
223+
self.devices[ordinal] = (prio, init_fn_name)
224+
else:
225+
init_fn_name = self._object_name(self._initlevel_pointer(
226+
obj_addr, SERVICE_INIT_OFFSET, shidx))
222227

223-
self.initlevels[level].append(f"{obj}: {arg0_name}({arg1_name})")
228+
self.initlevels[level].append(f"{obj}: {init_fn_name}({obj_name})")
224229

225230
addr += size
226231
priority += 1

scripts/build/check_init_priorities_test.py

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -209,24 +209,29 @@ def test_process_initlevels(self, mock_zilinit, mock_ip, mock_on):
209209
0x00: ("a", 4, 0),
210210
0x04: ("b", 4, 0),
211211
0x08: ("c", 4, 0),
212+
0x0a: ("d", 4, 0),
212213
}
213214
obj._object_addr = {
214215
"__device_dts_ord_11": 0x00,
215216
"__device_dts_ord_22": 0x04,
217+
"__service_foo" : 0x0a,
216218
}
217219

218220
mock_ip.side_effect = lambda *args: args
219221

220222
def mock_obj_name(*args):
221-
if args[0] == (0, 5, 0):
222-
return "i0"
223-
elif args[0] == (0, 1, 0):
223+
if args[0] == (0, 0, 0):
224224
return "__device_dts_ord_11"
225+
elif args[0] == (4, 0, 0):
226+
return "__device_dts_ord_22"
227+
elif args[0] == (8, 0, 0):
228+
return "__service_foo"
229+
elif args[0] == (10, 0, 0):
230+
return "foo_init_fn"
231+
elif args[0] == (0, 5, 0):
232+
return "i0"
225233
elif args[0] == (4, 5, 0):
226234
return "i1"
227-
elif args[0] == (4, 1, 0):
228-
return "__device_dts_ord_22"
229-
return f"name_{args[0][0]}_{args[0][1]}"
230235
mock_on.side_effect = mock_obj_name
231236

232237
obj._process_initlevels()
@@ -235,7 +240,7 @@ def mock_obj_name(*args):
235240
"EARLY": [],
236241
"PRE_KERNEL_1": [],
237242
"PRE_KERNEL_2": ["a: i0(__device_dts_ord_11)", "b: i1(__device_dts_ord_22)"],
238-
"POST_KERNEL": ["c: name_8_0(name_8_1)"],
243+
"POST_KERNEL": ["c: foo_init_fn(__service_foo)"],
239244
"APPLICATION": [],
240245
"SMP": [],
241246
})

0 commit comments

Comments
 (0)