Skip to content

Revert #90014 due to multiple issues with older compilers #93158

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion cmake/linker_script/common/common-rom.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ zephyr_linker_section_obj_level(SECTION init LEVEL APPLICATION)
zephyr_linker_section_obj_level(SECTION init LEVEL SMP)

zephyr_iterable_section(NAME device NUMERIC KVMA RAM_REGION GROUP RODATA_REGION)
zephyr_iterable_section(NAME service NUMERIC KVMA RAM_REGION GROUP RODATA_REGION)

if(CONFIG_GEN_SW_ISR_TABLE AND NOT CONFIG_DYNAMIC_INTERRUPTS)
# ld align has been changed to subalign to provide identical behavior scatter vs. ld.
Expand Down
1 change: 1 addition & 0 deletions include/zephyr/device.h
Original file line number Diff line number Diff line change
Expand Up @@ -1263,6 +1263,7 @@ device_get_dt_nodelabels(const struct device *dev)
static const Z_DECL_ALIGN(struct init_entry) __used __noasan Z_INIT_ENTRY_SECTION( \
level, prio, Z_DEVICE_INIT_SUB_PRIO(node_id)) \
Z_INIT_ENTRY_NAME(DEVICE_NAME_GET(dev_id)) = { \
.init_fn = NULL, \
.dev = (const struct device *)&DEVICE_NAME_GET(dev_id), \
}

Expand Down
22 changes: 9 additions & 13 deletions include/zephyr/init.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,6 @@
#include <zephyr/sys/util.h>
#include <zephyr/toolchain.h>

#include <zephyr/service.h>

#ifdef __cplusplus
extern "C" {
#endif
Expand Down Expand Up @@ -67,14 +65,15 @@ struct device;
*/
struct init_entry {
/**
* An init entry can be about a device or a service, _init_object
* will be used to differentiate depending on relative sections.
* If the init function belongs to a SYS_INIT, this field stored the
* initialization function, otherwise it is set to NULL.
*/
int (*init_fn)(void);
/**
* If the init entry belongs to a device, this fields stores a
* reference to it, otherwise it is set to NULL.
*/
union {
const void *_init_object;
const struct device *dev;
const struct service *srv;
};
const struct device *dev;
};

/** @cond INTERNAL_HIDDEN */
Expand Down Expand Up @@ -165,12 +164,9 @@ struct init_entry {
* @see SYS_INIT()
*/
#define SYS_INIT_NAMED(name, init_fn_, level, prio) \
Z_SERVICE_DEFINE(name, init_fn_, level, prio); \
static const Z_DECL_ALIGN(struct init_entry) \
Z_INIT_ENTRY_SECTION(level, prio, 0) __used __noasan \
Z_INIT_ENTRY_NAME(name) = { \
.srv = (const struct service *)&Z_SERVICE_NAME_GET(name) \
}
Z_INIT_ENTRY_NAME(name) = {.init_fn = (init_fn_), .dev = NULL} \

/** @} */

Expand Down
2 changes: 0 additions & 2 deletions include/zephyr/linker/common-rom/common-rom-kernel-devices.ld
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,6 @@

ITERABLE_SECTION_ROM_NUMERIC(device, Z_LINK_ITERABLE_SUBALIGN)

ITERABLE_SECTION_ROM_NUMERIC(service, Z_LINK_ITERABLE_SUBALIGN)

#if defined(CONFIG_GEN_SW_ISR_TABLE) && defined(CONFIG_SHARED_INTERRUPTS)
/* since z_shared_isr() is not referenced anywhere when
* zephyr_pre0.elf is built, the linker will end up dropping it.
Expand Down
92 changes: 0 additions & 92 deletions include/zephyr/service.h

This file was deleted.

26 changes: 4 additions & 22 deletions kernel/init.c
Original file line number Diff line number Diff line change
Expand Up @@ -136,9 +136,6 @@ enum init_level {
extern const struct init_entry __init_SMP_start[];
#endif /* CONFIG_SMP */

TYPE_SECTION_START_EXTERN(struct service, service);
TYPE_SECTION_END_EXTERN(struct service, service);

/*
* storage space for the interrupt stack
*
Expand Down Expand Up @@ -340,12 +337,6 @@ static int do_device_init(const struct device *dev)
return rc;
}

static inline bool is_entry_about_service(const void *obj)
{
return (obj >= (void *)_service_list_start &&
obj < (void *)_service_list_end);
}

/**
* @brief Execute all the init entry initialization functions at a given level
*
Expand Down Expand Up @@ -374,26 +365,17 @@ static void z_sys_init_run_level(enum init_level level)
const struct init_entry *entry;

for (entry = levels[level]; entry < levels[level+1]; entry++) {
const struct device *dev = entry->dev;
int result = 0;

if (unlikely(entry->_init_object == NULL)) {
continue;
}

sys_trace_sys_init_enter(entry, level);

if (is_entry_about_service(entry->_init_object)) {
const struct service *srv = entry->srv;

result = srv->init();
} else {
const struct device *dev = entry->dev;

if (dev != NULL) {
if ((dev->flags & DEVICE_FLAG_INIT_DEFERRED) == 0U) {
result = do_device_init(dev);
}
} else {
result = entry->init_fn();
}

sys_trace_sys_init_exit(entry, level, result);
}
}
Expand Down
21 changes: 11 additions & 10 deletions scripts/build/check_init_priorities.py
Original file line number Diff line number Diff line change
Expand Up @@ -202,14 +202,15 @@ def _process_initlevels(self):
raise ValueError(f"no symbol at addr {addr:08x}")
obj, size, shidx = self._objects[addr]

arg_name = self._object_name(self._initlevel_pointer(addr, 0, shidx))
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}: {arg_name}")
self.initlevels[level].append(f"{obj}: {arg0_name}({arg1_name})")

ordinal = self._device_ord_from_name(arg_name)
ordinal = self._device_ord_from_name(arg1_name)
if ordinal:
prio = Priority(level, priority)
self.devices[ordinal] = prio
self.devices[ordinal] = (prio, arg0_name)

addr += size
priority += 1
Expand Down Expand Up @@ -255,8 +256,8 @@ def _check_dep(self, dev_ord, dep_ord):
self.log.info(f"Ignoring priority: {dev_node._binding.compatible}")
return

dev_prio = self._obj.devices.get(dev_ord, None)
dep_prio = self._obj.devices.get(dep_ord, None)
dev_prio, dev_init = self._obj.devices.get(dev_ord, (None, None))
dep_prio, dep_init = self._obj.devices.get(dep_ord, (None, None))

if not dev_prio or not dep_prio:
return
Expand All @@ -271,12 +272,12 @@ def _check_dep(self, dev_ord, dep_ord):
"the devicetree dependencies.")
self.errors += 1
self.log.error(
f"{dev_node.path} is initialized before its dependency "
f"{dep_node.path} ({dev_prio} < {dep_prio})")
f"{dev_node.path} <{dev_init}> is initialized before its dependency "
f"{dep_node.path} <{dep_init}> ({dev_prio} < {dep_prio})")
else:
self.log.info(
f"{dev_node.path} {dev_prio} > "
f"{dep_node.path} {dep_prio}")
f"{dev_node.path} <{dev_init}> {dev_prio} > "
f"{dep_node.path} <{dep_init}> {dep_prio}")

def check_edt(self):
"""Scan through all known devices and validate the init priorities."""
Expand Down
21 changes: 12 additions & 9 deletions scripts/build/check_init_priorities_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -215,8 +215,12 @@ def test_process_initlevels(self, mock_zilinit, mock_ip, mock_on):

def mock_obj_name(*args):
if args[0] == (0, 0, 0):
return "i0"
elif args[0] == (0, 1, 0):
return "__device_dts_ord_11"
elif args[0] == (4, 0, 0):
return "i1"
elif args[0] == (4, 1, 0):
return "__device_dts_ord_22"
return f"name_{args[0][0]}_{args[0][1]}"
mock_on.side_effect = mock_obj_name
Expand All @@ -226,15 +230,14 @@ def mock_obj_name(*args):
self.assertDictEqual(obj.initlevels, {
"EARLY": [],
"PRE_KERNEL_1": [],
"PRE_KERNEL_2": ["a: __device_dts_ord_11", "b: __device_dts_ord_22"],
"POST_KERNEL": ["c: name_8_0"],
"PRE_KERNEL_2": ["a: i0(__device_dts_ord_11)", "b: i1(__device_dts_ord_22)"],
"POST_KERNEL": ["c: name_8_0(name_8_1)"],
"APPLICATION": [],
"SMP": [],
})

self.assertDictEqual(obj.devices, {
11: check_init_priorities.Priority("PRE_KERNEL_2", 0),
22: check_init_priorities.Priority("PRE_KERNEL_2", 1),
11: (check_init_priorities.Priority("PRE_KERNEL_2", 0), "i0"),
22: (check_init_priorities.Priority("PRE_KERNEL_2", 1), "i1"),
})

class testValidator(unittest.TestCase):
Expand Down Expand Up @@ -300,14 +303,14 @@ def test_check(self, mock_vinit):
validator._ord2node[2]._binding = None
validator._ord2node[2].path = "/2"

validator._obj.devices = {1: 10, 2: 20}
validator._obj.devices = {1: (10, "i1"), 2: (20, "i2")}

validator._check_dep(2, 1)
validator._check_dep(1, 2)

validator.log.info.assert_called_once_with("/2 20 > /1 10")
validator.log.info.assert_called_once_with("/2 <i2> 20 > /1 <i1> 10")
validator.log.error.assert_has_calls([
mock.call("/1 is initialized before its dependency /2 (10 < 20)")
mock.call("/1 <i1> is initialized before its dependency /2 <i2> (10 < 20)")
])
self.assertEqual(validator.errors, 1)

Expand All @@ -324,7 +327,7 @@ def test_check_same_prio_assert(self, mock_vinit):
validator._ord2node[2]._binding = None
validator._ord2node[2].path = "/2"

validator._obj.devices = {1: 10, 2: 10,}
validator._obj.devices = {1: (10, "i1"), 2: (10, "i2")}

with self.assertRaises(ValueError):
validator._check_dep(1, 2)
Expand Down
2 changes: 1 addition & 1 deletion subsys/net/lib/sockets/sockets_service.c
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ static K_CONDVAR_DEFINE(wait_start);
STRUCT_SECTION_START_EXTERN(net_socket_service_desc);
STRUCT_SECTION_END_EXTERN(net_socket_service_desc);

static struct service_context {
static struct service {
struct zsock_pollfd events[CONFIG_ZVFS_POLL_MAX];
int count;
} ctx;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,10 @@

REFERENCE_OUTPUT = [
"ERROR: Device initialization priority validation failed, the sequence of initialization calls does not match the devicetree dependencies.",
"ERROR: /i2c@11112222/test-i2c-dev@10 is initialized before its dependency /gpio@ffff (PRE_KERNEL_1+0 < PRE_KERNEL_1+1)",
"ERROR: /i2c@11112222/test-i2c-dev@10 is initialized before its dependency /i2c@11112222 (PRE_KERNEL_1+0 < PRE_KERNEL_1+2)",
"INFO: /i2c@11112222/test-i2c-dev@11 PRE_KERNEL_1+3 > /gpio@ffff PRE_KERNEL_1+1",
"INFO: /i2c@11112222/test-i2c-dev@11 PRE_KERNEL_1+3 > /i2c@11112222 PRE_KERNEL_1+2",
"ERROR: /i2c@11112222/test-i2c-dev@10 <NULL> is initialized before its dependency /gpio@ffff <NULL> (PRE_KERNEL_1+0 < PRE_KERNEL_1+1)",
"ERROR: /i2c@11112222/test-i2c-dev@10 <NULL> is initialized before its dependency /i2c@11112222 <NULL> (PRE_KERNEL_1+0 < PRE_KERNEL_1+2)",
"INFO: /i2c@11112222/test-i2c-dev@11 <NULL> PRE_KERNEL_1+3 > /gpio@ffff <NULL> PRE_KERNEL_1+1",
"INFO: /i2c@11112222/test-i2c-dev@11 <NULL> PRE_KERNEL_1+3 > /i2c@11112222 <NULL> PRE_KERNEL_1+2",
]

if len(sys.argv) != 2:
Expand Down
Loading