Skip to content

Commit 45979da

Browse files
Andrew Boienashif
authored andcommitted
linker: add iterable section macros
For iterable areas defined with Z_STRUCT_SECTION_ITERABLE(), the corresponding output section in the linker script is just boilerplate. Add macros to make these definitions simpler. Unfortunately, we have a fair number of iterable sections not defined with Z_STRUCT_SECTION_ITERABLE(), this patch does not address this. The output sections are all named <struct name>_area, update sanitylib.py with this. sys_sem with no userspace, and k_lifo/k_fifo are special cases where different data types that are all equivalent need to be put in the same iterable area. Add Z_STRUCT_SECTION_ITERABLE_ALTERNATE() for this special case. Signed-off-by: Andrew Boie <[email protected]>
1 parent 973487f commit 45979da

File tree

7 files changed

+84
-154
lines changed

7 files changed

+84
-154
lines changed

include/kernel.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2773,7 +2773,7 @@ struct k_fifo {
27732773
* @param name Name of the FIFO queue.
27742774
*/
27752775
#define K_FIFO_DEFINE(name) \
2776-
Z_STRUCT_SECTION_ITERABLE(k_fifo, name) = \
2776+
Z_STRUCT_SECTION_ITERABLE_ALTERNATE(k_queue, k_fifo, name) = \
27772777
Z_FIFO_INITIALIZER(name)
27782778

27792779
/** @} */
@@ -2879,7 +2879,7 @@ struct k_lifo {
28792879
* @param name Name of the fifo.
28802880
*/
28812881
#define K_LIFO_DEFINE(name) \
2882-
Z_STRUCT_SECTION_ITERABLE(k_lifo, name) = \
2882+
Z_STRUCT_SECTION_ITERABLE_ALTERNATE(k_queue, k_lifo, name) = \
28832883
Z_LIFO_INITIALIZER(name)
28842884

28852885
/** @} */

include/linker/common-ram.ld

Lines changed: 12 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -68,12 +68,7 @@
6868
__log_dynamic_end = .;
6969
} GROUP_DATA_LINK_IN(RAMABLE_REGION, ROMABLE_REGION)
7070

71-
SECTION_DATA_PROLOGUE(_static_thread_area,,SUBALIGN(4))
72-
{
73-
__static_thread_data_list_start = .;
74-
KEEP(*(SORT_BY_NAME(".__static_thread_data.static.*")))
75-
__static_thread_data_list_end = .;
76-
} GROUP_DATA_LINK_IN(RAMABLE_REGION, ROMABLE_REGION)
71+
Z_ITERABLE_SECTION_RAM(_static_thread_data, 4)
7772

7873
#ifdef CONFIG_USERSPACE
7974
/* All kernel objects within are assumed to be either completely
@@ -86,85 +81,17 @@
8681
_static_kernel_objects_begin = .;
8782
#endif /* CONFIG_USERSPACE */
8883

89-
SECTION_DATA_PROLOGUE(_k_timer_area,,SUBALIGN(4))
90-
{
91-
_k_timer_list_start = .;
92-
KEEP(*("._k_timer.static.*"))
93-
_k_timer_list_end = .;
94-
} GROUP_DATA_LINK_IN(RAMABLE_REGION, ROMABLE_REGION)
95-
96-
SECTION_DATA_PROLOGUE(_k_mem_slab_area,,SUBALIGN(4))
97-
{
98-
_k_mem_slab_list_start = .;
99-
KEEP(*("._k_mem_slab.static.*"))
100-
_k_mem_slab_list_end = .;
101-
} GROUP_DATA_LINK_IN(RAMABLE_REGION, ROMABLE_REGION)
102-
103-
SECTION_DATA_PROLOGUE(_k_mem_pool_area,,SUBALIGN(4))
104-
{
105-
_k_mem_pool_list_start = .;
106-
KEEP(*("._k_mem_pool.static.*"))
107-
_k_mem_pool_list_end = .;
108-
} GROUP_DATA_LINK_IN(RAMABLE_REGION, ROMABLE_REGION)
109-
110-
SECTION_DATA_PROLOGUE(_k_heap_area,,SUBALIGN(4))
111-
{
112-
_k_heap_list_start = .;
113-
KEEP(*("._k_heap.static.*"))
114-
_k_heap_list_end = .;
115-
} GROUP_DATA_LINK_IN(RAMABLE_REGION, ROMABLE_REGION)
116-
117-
SECTION_DATA_PROLOGUE(_k_sem_area,,SUBALIGN(4))
118-
{
119-
_k_sem_list_start = .;
120-
KEEP(*("._k_sem.static.*"))
121-
KEEP(*("._sys_sem.static.*"))
122-
_k_sem_list_end = .;
123-
} GROUP_DATA_LINK_IN(RAMABLE_REGION, ROMABLE_REGION)
124-
125-
SECTION_DATA_PROLOGUE(_k_mutex_area,,SUBALIGN(4))
126-
{
127-
_k_mutex_list_start = .;
128-
KEEP(*("._k_mutex.static.*"))
129-
_k_mutex_list_end = .;
130-
} GROUP_DATA_LINK_IN(RAMABLE_REGION, ROMABLE_REGION)
131-
132-
SECTION_DATA_PROLOGUE(_k_queue_area,,SUBALIGN(4))
133-
{
134-
_k_queue_list_start = .;
135-
KEEP(*("._k_queue.static.*"))
136-
KEEP(*("._k_fifo.static.*"))
137-
KEEP(*("._k_lifo.static.*"))
138-
_k_queue_list_end = .;
139-
} GROUP_DATA_LINK_IN(RAMABLE_REGION, ROMABLE_REGION)
140-
141-
SECTION_DATA_PROLOGUE(_k_stack_area,,SUBALIGN(4))
142-
{
143-
_k_stack_list_start = .;
144-
KEEP(*("._k_stack.static.*"))
145-
_k_stack_list_end = .;
146-
} GROUP_DATA_LINK_IN(RAMABLE_REGION, ROMABLE_REGION)
147-
148-
SECTION_DATA_PROLOGUE(_k_msgq_area,,SUBALIGN(4))
149-
{
150-
_k_msgq_list_start = .;
151-
KEEP(*("._k_msgq.static.*"))
152-
_k_msgq_list_end = .;
153-
} GROUP_DATA_LINK_IN(RAMABLE_REGION, ROMABLE_REGION)
154-
155-
SECTION_DATA_PROLOGUE(_k_mbox_area,,SUBALIGN(4))
156-
{
157-
_k_mbox_list_start = .;
158-
KEEP(*("._k_mbox.static.*"))
159-
_k_mbox_list_end = .;
160-
} GROUP_DATA_LINK_IN(RAMABLE_REGION, ROMABLE_REGION)
161-
162-
SECTION_DATA_PROLOGUE(_k_pipe_area,,SUBALIGN(4))
163-
{
164-
_k_pipe_list_start = .;
165-
KEEP(*("._k_pipe.static.*"))
166-
_k_pipe_list_end = .;
167-
} GROUP_DATA_LINK_IN(RAMABLE_REGION, ROMABLE_REGION)
84+
Z_ITERABLE_SECTION_RAM(k_timer, 4)
85+
Z_ITERABLE_SECTION_RAM(k_mem_slab, 4)
86+
Z_ITERABLE_SECTION_RAM(k_mem_pool, 4)
87+
Z_ITERABLE_SECTION_RAM(k_heap, 4)
88+
Z_ITERABLE_SECTION_RAM(k_mutex, 4)
89+
Z_ITERABLE_SECTION_RAM(k_stack, 4)
90+
Z_ITERABLE_SECTION_RAM(k_msgq, 4)
91+
Z_ITERABLE_SECTION_RAM(k_mbox, 4)
92+
Z_ITERABLE_SECTION_RAM(k_pipe, 4)
93+
Z_ITERABLE_SECTION_RAM(k_sem, 4)
94+
Z_ITERABLE_SECTION_RAM(k_queue, 4)
16895

16996
SECTION_DATA_PROLOGUE(_net_buf_pool_area,,SUBALIGN(4))
17097
{

include/linker/common-rom.ld

Lines changed: 8 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -76,12 +76,7 @@
7676
/* Build-time assignment of permissions to kernel objects to
7777
* threads declared with K_THREAD_DEFINE()
7878
*/
79-
SECTION_PROLOGUE(object_access,,)
80-
{
81-
_z_object_assignment_list_start = .;
82-
KEEP(*("._z_object_assignment.*"))
83-
_z_object_assignment_list_end = .;
84-
} GROUP_LINK_IN(ROMABLE_REGION)
79+
Z_ITERABLE_SECTION_ROM(z_object_assignment, 4)
8580
#endif
8681

8782
SECTION_PROLOGUE(app_shmem_regions,,)
@@ -100,12 +95,7 @@
10095
} GROUP_LINK_IN(ROMABLE_REGION)
10196

10297
#if defined(CONFIG_NET_SOCKETS)
103-
SECTION_PROLOGUE(net_socket_register,,)
104-
{
105-
_net_socket_register_list_start = .;
106-
KEEP(*(SORT_BY_NAME("._net_socket_register.*")))
107-
_net_socket_register_list_end = .;
108-
} GROUP_LINK_IN(ROMABLE_REGION)
98+
Z_ITERABLE_SECTION_ROM(net_socket_register, 4)
10999
#endif
110100

111101
#if defined(CONFIG_NET_L2_PPP)
@@ -118,36 +108,16 @@
118108
} GROUP_LINK_IN(ROMABLE_REGION)
119109
#endif
120110

121-
SECTION_DATA_PROLOGUE(_bt_channels_area,,SUBALIGN(4))
122-
{
123-
_bt_l2cap_fixed_chan_list_start = .;
124-
KEEP(*(SORT_BY_NAME("._bt_l2cap_fixed_chan.static.*")))
125-
_bt_l2cap_fixed_chan_list_end = .;
126-
} GROUP_LINK_IN(ROMABLE_REGION)
111+
Z_ITERABLE_SECTION_ROM(bt_l2cap_fixed_chan, 4)
127112

128113
#if defined(CONFIG_BT_BREDR)
129-
SECTION_DATA_PROLOGUE(_bt_br_channels_area,,SUBALIGN(4))
130-
{
131-
_bt_l2cap_br_fixed_chan_list_start = .;
132-
KEEP(*(SORT_BY_NAME("._bt_l2cap_br_fixed_chan.static.*")))
133-
_bt_l2cap_br_fixed_chan_list_end = .;
134-
} GROUP_LINK_IN(ROMABLE_REGION)
114+
Z_ITERABLE_SECTION_ROM(bt_l2cap_br_fixed_chan, 4)
135115
#endif
136116

137-
SECTION_DATA_PROLOGUE(_bt_services_area,,SUBALIGN(4))
138-
{
139-
_bt_gatt_service_static_list_start = .;
140-
KEEP(*(SORT_BY_NAME("._bt_gatt_service_static.static.*")))
141-
_bt_gatt_service_static_list_end = .;
142-
} GROUP_LINK_IN(ROMABLE_REGION)
117+
Z_ITERABLE_SECTION_ROM(bt_gatt_service_static, 4)
143118

144119
#if defined(CONFIG_SETTINGS)
145-
SECTION_DATA_PROLOGUE(_settings_handlers_area,,SUBALIGN(4))
146-
{
147-
_settings_handler_static_list_start = .;
148-
KEEP(*(SORT_BY_NAME("._settings_handler_static.static.*")))
149-
_settings_handler_static_list_end = .;
150-
} GROUP_LINK_IN(ROMABLE_REGION)
120+
Z_ITERABLE_SECTION_ROM(settings_handler_static, 4)
151121
#endif
152122

153123
SECTION_DATA_PROLOGUE(log_const_sections,,)
@@ -164,12 +134,7 @@
164134
__log_backends_end = .;
165135
} GROUP_LINK_IN(ROMABLE_REGION)
166136

167-
SECTION_DATA_PROLOGUE(shell_sections,,)
168-
{
169-
_shell_list_start = .;
170-
KEEP(*(SORT(._shell.static.*)));
171-
_shell_list_end = .;
172-
} GROUP_LINK_IN(ROMABLE_REGION)
137+
Z_ITERABLE_SECTION_ROM(shell, 4)
173138

174139
SECTION_DATA_PROLOGUE(shell_root_cmds_sections,,)
175140
{
@@ -185,9 +150,4 @@
185150
__font_entry_end = .;
186151
} GROUP_LINK_IN(ROMABLE_REGION)
187152

188-
SECTION_DATA_PROLOGUE(tracing_backends_sections,,)
189-
{
190-
_tracing_backend_list_start = .;
191-
KEEP(*("._tracing_backend.*"));
192-
_tracing_backend_list_end = .;
193-
} GROUP_LINK_IN(ROMABLE_REGION)
153+
Z_ITERABLE_SECTION_ROM(tracing_backend, 4)

include/linker/linker-defs.h

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
#define ZEPHYR_INCLUDE_LINKER_LINKER_DEFS_H_
2121

2222
#include <toolchain.h>
23+
#include <toolchain/common.h>
2324
#include <linker/sections.h>
2425
#include <sys/util.h>
2526
#include <offsets.h>
@@ -36,6 +37,35 @@
3637
#endif
3738

3839
#ifdef _LINKER
40+
#define Z_LINK_ITERABLE(struct_type) \
41+
_CONCAT(_##struct_type, _list_start) = .; \
42+
KEEP(*(SORT_BY_NAME(._##struct_type##.static.*))); \
43+
_CONCAT(_##struct_type, _list_end) = .
44+
45+
/* Define an output section which will set up an iterable area
46+
* of equally-sized data structures. For use with Z_STRUCT_SECTION_ITERABLE.
47+
* Input sections will be sorted by name, per ld's SORT_BY_NAME.
48+
*
49+
* This macro should be used for read-only data.
50+
*/
51+
#define Z_ITERABLE_SECTION_ROM(struct_type, subalign) \
52+
SECTION_PROLOGUE(struct_type##_area,,SUBALIGN(subalign)) \
53+
{ \
54+
Z_LINK_ITERABLE(struct_type); \
55+
} GROUP_LINK_IN(ROMABLE_REGION)
56+
57+
/* Define an output section which will set up an iterable area
58+
* of equally-sized data structures. For use with Z_STRUCT_SECTION_ITERABLE.
59+
* Input sections will be sorted by name, per ld's SORT_BY_NAME.
60+
*
61+
* This macro should be used for read-write data that is modified at runtime.
62+
*/
63+
#define Z_ITERABLE_SECTION_RAM(struct_type, subalign) \
64+
SECTION_DATA_PROLOGUE(struct_type##_area,,SUBALIGN(subalign)) \
65+
{ \
66+
Z_LINK_ITERABLE(struct_type); \
67+
} GROUP_DATA_LINK_IN(RAMABLE_REGION, ROMABLE_REGION)
68+
3969
/*
4070
* generate a symbol to mark the start of the objects array for
4171
* the specified object and level, then link all of those objects

include/sys/sem.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ struct sys_sem {
7171
* are identical and can be treated as a k_sem in the boot initialization code
7272
*/
7373
#define SYS_SEM_DEFINE(_name, _initial_count, _count_limit) \
74-
Z_STRUCT_SECTION_ITERABLE(sys_sem, _name) = { \
74+
Z_STRUCT_SECTION_ITERABLE_ALTERNATE(k_sem, sys_sem, _name) = { \
7575
.kernel_sem = Z_SEM_INITIALIZER(_name.kernel_sem, \
7676
_initial_count, _count_limit) \
7777
}; \

include/toolchain/common.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,11 +180,22 @@
180180
* Convenience helper combining __in_section() and Z_DECL_ALIGN().
181181
* The section name is the struct type prepended with an underscore.
182182
* The subsection is "static" and the subsubsection is the variable name.
183+
*
184+
* In the linker script, create output sections for these using
185+
* Z_ITERABLE_SECTION_ROM or Z_ITERABLE_SECTION_RAM.
183186
*/
184187
#define Z_STRUCT_SECTION_ITERABLE(struct_type, name) \
185188
Z_DECL_ALIGN(struct struct_type) name \
186189
__in_section(_##struct_type, static, name) __used
187190

191+
/* Special variant of Z_STRUCT_SECTION_ITERABLE, for placing alternate
192+
* data types within the iterable section of a specific data type. The
193+
* data type sizes and semantics must be equivalent!
194+
*/
195+
#define Z_STRUCT_SECTION_ITERABLE_ALTERNATE(out_type, struct_type, name) \
196+
Z_DECL_ALIGN(struct struct_type) name \
197+
__in_section(_##out_type, static, name) __used
198+
188199
/*
189200
* Itterator for structure instances gathered by Z_STRUCT_SECTION_ITERABLE().
190201
* The linker must provide a _<struct_type>_list_start symbol and a

scripts/sanity_chk/sanitylib.py

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -932,24 +932,24 @@ class SizeCalculator:
932932
"initlevel",
933933
"exceptions",
934934
"initshell",
935-
"_static_thread_area",
936-
"_k_timer_area",
937-
"_k_mem_slab_area",
938-
"_k_mem_pool_area",
935+
"_static_thread_data_area",
936+
"k_timer_area",
937+
"k_mem_slab_area",
938+
"k_mem_pool_area",
939939
"sw_isr_table",
940-
"_k_sem_area",
941-
"_k_mutex_area",
940+
"k_sem_area",
941+
"k_mutex_area",
942942
"app_shmem_regions",
943943
"_k_fifo_area",
944944
"_k_lifo_area",
945-
"_k_stack_area",
946-
"_k_msgq_area",
947-
"_k_mbox_area",
948-
"_k_pipe_area",
945+
"k_stack_area",
946+
"k_msgq_area",
947+
"k_mbox_area",
948+
"k_pipe_area",
949949
"net_if",
950950
"net_if_dev",
951951
"net_l2_data",
952-
"_k_queue_area",
952+
"k_queue_area",
953953
"_net_buf_pool_area",
954954
"app_datas",
955955
"kobject_data",
@@ -980,19 +980,21 @@ class SizeCalculator:
980980
"ctors",
981981
"init_array",
982982
"reset",
983-
"object_access",
983+
"z_object_assignment_area",
984984
"rodata",
985985
"devconfig",
986986
"net_l2",
987987
"vector",
988988
"sw_isr_table",
989-
"_settings_handlers_area",
990-
"_bt_channels_area",
991-
"_bt_br_channels_area",
992-
"_bt_services_area",
989+
"settings_handler_static_area",
990+
"bt_l2cap_fixed_chan",
991+
"bt_l2cap_br_fixec_chan",
992+
"bt_gatt_service_static",
993993
"vectors",
994-
"net_socket_register",
995-
"net_ppp_proto"
994+
"net_socket_register_area",
995+
"net_ppp_proto",
996+
"shell_area",
997+
"tracing_backend_area",
996998
]
997999

9981000
def __init__(self, filename, extra_sections):

0 commit comments

Comments
 (0)