blob: dfa19d13492eccf4867bd4972a856352da8994d4 [file] [log] [blame]
/* SPDX-License-Identifier: Apache-2.0 */
#include <zephyr/linker/iterable_sections.h>
SECTION_PROLOGUE(initlevel,,)
{
/*
* link in initialization objects for all objects that are
* automatically initialized by the kernel; the objects are
* sorted in the order they will be initialized (i.e. ordered
* by level, sorted by priority within a level)
*/
__init_start = .;
CREATE_OBJ_LEVEL(init, EARLY)
CREATE_OBJ_LEVEL(init, PRE_KERNEL_1)
CREATE_OBJ_LEVEL(init, PRE_KERNEL_2)
CREATE_OBJ_LEVEL(init, POST_KERNEL)
CREATE_OBJ_LEVEL(init, APPLICATION)
CREATE_OBJ_LEVEL(init, SMP)
__init_end = .;
} GROUP_ROM_LINK_IN(RAMABLE_REGION, ROMABLE_REGION)
ITERABLE_SECTION_ROM_NUMERIC(device, 4)
#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.
* Later on, during the second linking stage (when zephyr.elf is
* built), the symbol will be added to the text section since it's
* now being referenced (thanks to isr_tables.c). This is very
* problematic because adding the z_shared_isr symbol between
* the linking stages will end up shifting the addresses of the
* functions, which, in turn, will end up messing the ISR table
* (as the entries from _sw_isr_table will end up pointing to
* old addresses of the registered ISRs). To prevent this from
* happening, instruct the linker to avoid dropping z_shared_isr
* if it's not being referenced anywhere.
*/
SECTION_PROLOGUE(.text.z_shared_isr,,)
{
KEEP(*(.text.z_shared_isr))
} GROUP_ROM_LINK_IN(RAMABLE_REGION, ROMABLE_REGION)
#endif
#if defined(CONFIG_GEN_SW_ISR_TABLE) && !defined(CONFIG_DYNAMIC_INTERRUPTS)
SECTION_PROLOGUE(sw_isr_table,,)
{
/*
* Some arch requires an entry to be aligned to arch
* specific boundary for using double word load
* instruction. See include/sw_isr_table.h.
*/
. = ALIGN(CONFIG_ARCH_SW_ISR_TABLE_ALIGN);
*(_SW_ISR_TABLE_SECTION_SYMS)
} GROUP_ROM_LINK_IN(RAMABLE_REGION, ROMABLE_REGION)
#if defined(CONFIG_SHARED_INTERRUPTS)
SECTION_PROLOGUE(shared_sw_isr_table,,)
{
/* TODO: does this section require alignment? */
KEEP(*(_SHARED_SW_ISR_TABLE_SECTION_SYMS))
} GROUP_ROM_LINK_IN(RAMABLE_REGION, ROMABLE_REGION)
#endif
#endif
/* verify we don't have rogue .z_init_<something> initlevel sections */
SECTION_PROLOGUE(initlevel_error,,)
{
KEEP(*(SORT(.z_init_[_A-Z0-9]*)))
}
ASSERT(SIZEOF(initlevel_error) == 0, "Undefined initialization levels used.")
#ifdef CONFIG_USERSPACE
/* Build-time assignment of permissions to kernel objects to
* threads declared with K_THREAD_DEFINE()
*/
ITERABLE_SECTION_ROM(k_object_assignment, 4)
#endif
SECTION_DATA_PROLOGUE(app_shmem_regions,,)
{
__app_shmem_regions_start = .;
KEEP(*(SORT(.app_regions.*)));
__app_shmem_regions_end = .;
} GROUP_ROM_LINK_IN(RAMABLE_REGION, ROMABLE_REGION)
ITERABLE_SECTION_ROM(k_p4wq_initparam, 4)
ITERABLE_SECTION_ROM(_static_thread_data, 4)
#if defined(CONFIG_PCIE)
ITERABLE_SECTION_ROM(irq_alloc, 4)
#endif /* CONFIG_PCIE */
#if !defined(CONFIG_DEVICE_DEPS_DYNAMIC)
SECTION_DATA_PROLOGUE(device_deps,,)
{
#include <zephyr/linker/device-deps.ld>
} GROUP_ROM_LINK_IN(RAMABLE_REGION, ROMABLE_REGION)
#endif /* !CONFIG_DEVICE_DEPS_DYNAMIC */