zephyr/cmake/linker_script/common/kobject-data.cmake
Björn Bergman 128698fd36 cmake: userspace: A stab at USERSPACE + CMAKE_LINKER_GENERATOR
All in all this makes cmake linker generator able to work for at least
most of the kernel tests and samples, on cortex m4.

Make the cmake linker generator have a file-structure more similar to
the ld-skeletons.

Add or edit groups, sections and logic to make the generator reflect
what the ld-skeletons do, esp. for kobjects and APP_SMEM, nonint and
some other details are also effected.

Use the new zephyr_linker_include_generated() and
zephyr_linker_include_var() functions to to handle
${DEVICE_API_LINKER_SECTIONS_CMAKE}, the kobject-prebuilt-*.h files and
APP_SMEM partition. Essentially the output from gen_app_partitions.py,
gen_kobject_placeholders.py.

Add ALIGN_WITH_INPUT on sections being put into DATA_REGION. This makes
the init layout work for ld.

This leverages the updates in gen_app_partitions.py to generate its
output as cmake linker generator sections too, and puts them into a
group defined in linker.cmake

Setup generator variables for alignment of APP_SMEM. Note that this does
not yet handle MPU_ALIGN which depends on the size of the section...

Fix broken k_object_assignment iterable section

Signed-off-by: Björn Bergman <bjorn.bergman@iar.com>
2025-03-27 17:17:03 +01:00

60 lines
2.0 KiB
CMake

# SPDX-License-Identifier: Apache-2.0
# The contents of this file is based on include/zephyr/linker/kobject-data.ld
# Please keep in sync
if(CONFIG_USERSPACE)
zephyr_linker_section(NAME kobject_data GROUP ${K_OBJECTS_GROUP} ALIGN_WITH_INPUT NOINPUT)
zephyr_linker_section_configure(
SECTION kobject_data
SYMBOLS z_kobject_data_begin
)
if(CONFIG_DYNAMIC_OBJECTS)
# generated by gperf, this avoids errors for the first build.
# Also, we dont have KOBJECT_DATA_SZ for the first build
zephyr_linker_section_configure(
SECTION kobject_data
SYMBOLS _thread_idx_map
MIN_SIZE ${CONFIG_MAX_THREAD_BYTES}
PASS NOT LINKER_ZEPHYR_PREBUILT LINKER_ZEPHYR_FINAL
)
zephyr_linker_section_configure(
SECTION kobject_data
SYMBOLS _kobject_data_area_start _kobject_data_area_end
PASS NOT LINKER_ZEPHYR_PREBUILT LINKER_ZEPHYR_FINAL
)
endif()
# During LINKER_KOBJECT_PREBUILT and LINKER_ZEPHYR_PREBUILT,
# space needs to be reserved for the rodata that will be
# produced by gperf during the final stages of linking.
# The alignment and size are produced by
# scripts/build/gen_kobject_placeholders.py. These are here
# so the addresses to kobjects would remain the same
# during the final stages of linking (LINKER_ZEPHYR_FINAL).
if(CONFIG_DYNAMIC_OBJECTS)
# in LINKER_ZEPHYR_PREBUILT there is no object file defining _thread_idx_map
# so we must have a synthetic one. Note that the size is not set here,
# since the space is provided in the section below:
zephyr_linker_section_configure(
SECTION kobject_data
SYMBOLS _thread_idx_map
PASS LINKER_ZEPHYR_PREBUILT
)
endif()
zephyr_linker_section_configure(
SECTION kobject_data
INPUT
".kobject_data.data*"
".kobject_data.sdata*"
PASS LINKER_ZEPHYR_PREBUILT LINKER_ZEPHYR_FINAL
ALIGN @KOBJECT_DATA_ALIGN,undef:4@
MIN_SIZE @KOBJECT_DATA_SZ@
MAX_SIZE @KOBJECT_DATA_SZ@
SYMBOLS _kobject_data_area_start _kobject_data_area_end
)
endif()