Boot Linux faster!

Check our new training course

Boot Linux faster!

Check our new training course
and Creative Commons CC-BY-SA
lecture and lab materials

Bootlin logo

Elixir Cross Referencer

/* SPDX-License-Identifier: Apache-2.0 */

#if defined(CONFIG_GEN_SW_ISR_TABLE) && defined(CONFIG_DYNAMIC_INTERRUPTS)
	SECTION_DATA_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_DATA_LINK_IN(RAMABLE_REGION, ROMABLE_REGION)
#endif

/*
 * Space for storing per device init status and busy bitmap in case PM is
 * enabled. Since we do not know beforehand the number of devices,
 * we go through the below mechanism to allocate the required space.
 * Both are made of 1 bit per-device instance, so we compute the size of
 * of an entire bitfield, aligned on 32bits.
 */
#define DEVICE_COUNT \
	((__device_end - __device_start) / _DEVICE_STRUCT_SIZEOF)
#define DEVICE_BITFIELD_SIZE	(((DEVICE_COUNT + 31) / 32) * 4)

#define DEVICE_INIT_STATUS_BITFIELD() 		\
		FILL(0x00);			\
		__device_init_status_start = .; \
		. = . + DEVICE_BITFIELD_SIZE;	\
		__device_init_status_end = .;

#ifdef CONFIG_PM_DEVICE
#define DEVICE_BUSY_BITFIELD()			\
		FILL(0x00);			\
		__device_busy_start = .;	\
		. = . + DEVICE_BITFIELD_SIZE;	\
		__device_busy_end = .;
#else
#define DEVICE_BUSY_BITFIELD()
#endif

	SECTION_DATA_PROLOGUE(devices,,)
	{
		/* link in devices objects, which are tied to the init ones;
		 * the objects are thus sorted the same way as their init
		 * object parent see include/device.h
		 */
		__device_start = .;
		CREATE_OBJ_LEVEL(device, PRE_KERNEL_1)
		CREATE_OBJ_LEVEL(device, PRE_KERNEL_2)
		CREATE_OBJ_LEVEL(device, POST_KERNEL)
		CREATE_OBJ_LEVEL(device, APPLICATION)
		CREATE_OBJ_LEVEL(device, SMP)
		__device_end = .;
		DEVICE_INIT_STATUS_BITFIELD()
		DEVICE_BUSY_BITFIELD()
	} GROUP_DATA_LINK_IN(RAMABLE_REGION, ROMABLE_REGION)

	SECTION_DATA_PROLOGUE(initshell,,)
	{
		/* link in shell initialization objects for all modules that
		 * use shell and their shell commands are automatically
		 * initialized by the kernel.
		 */
		__shell_module_start = .;
		KEEP(*(".shell_module_*"));
		__shell_module_end = .;
		__shell_cmd_start = .;
		KEEP(*(".shell_cmd_*"));
		__shell_cmd_end = .;
	} GROUP_DATA_LINK_IN(RAMABLE_REGION, ROMABLE_REGION)

	SECTION_DATA_PROLOGUE(log_dynamic_sections,,)
	{
		__log_dynamic_start = .;
		KEEP(*(SORT(.log_dynamic_*)));
		__log_dynamic_end = .;
	} GROUP_DATA_LINK_IN(RAMABLE_REGION, ROMABLE_REGION)

	Z_ITERABLE_SECTION_RAM(_static_thread_data, 4)

#ifdef CONFIG_USERSPACE
	/* All kernel objects within are assumed to be either completely
	 * initialized at build time, or initialized automatically at runtime
	 * via iteration before the POST_KERNEL phase.
	 *
	 * These two symbols only used by gen_kobject_list.py
	 */

	_static_kernel_objects_begin = .;
#endif /* CONFIG_USERSPACE */

	Z_ITERABLE_SECTION_RAM_GC_ALLOWED(k_timer, 4)
	Z_ITERABLE_SECTION_RAM_GC_ALLOWED(k_mem_slab, 4)
	Z_ITERABLE_SECTION_RAM_GC_ALLOWED(k_mem_pool, 4)
	Z_ITERABLE_SECTION_RAM_GC_ALLOWED(k_heap, 4)
	Z_ITERABLE_SECTION_RAM_GC_ALLOWED(k_mutex, 4)
	Z_ITERABLE_SECTION_RAM_GC_ALLOWED(k_stack, 4)
	Z_ITERABLE_SECTION_RAM_GC_ALLOWED(k_msgq, 4)
	Z_ITERABLE_SECTION_RAM_GC_ALLOWED(k_mbox, 4)
	Z_ITERABLE_SECTION_RAM_GC_ALLOWED(k_pipe, 4)
	Z_ITERABLE_SECTION_RAM_GC_ALLOWED(k_sem, 4)
	Z_ITERABLE_SECTION_RAM_GC_ALLOWED(k_queue, 4)
	Z_ITERABLE_SECTION_RAM_GC_ALLOWED(k_condvar, 4)

	SECTION_DATA_PROLOGUE(_net_buf_pool_area,,SUBALIGN(4))
	{
		_net_buf_pool_list = .;
		KEEP(*(SORT_BY_NAME("._net_buf_pool.static.*")))
	} GROUP_DATA_LINK_IN(RAMABLE_REGION, ROMABLE_REGION)

#if defined(CONFIG_NETWORKING)
	Z_ITERABLE_SECTION_RAM(net_if, 4)
	Z_ITERABLE_SECTION_RAM(net_if_dev, 4)
	Z_ITERABLE_SECTION_RAM(net_l2, 4)
#endif /* NETWORKING */

#if defined(CONFIG_UART_MUX)
	SECTION_DATA_PROLOGUE(uart_mux,,SUBALIGN(4))
	{
		__uart_mux_start = .;
		*(".uart_mux.*")
		KEEP(*(SORT_BY_NAME(".uart_mux.*")))
		__uart_mux_end = .;
	} GROUP_DATA_LINK_IN(RAMABLE_REGION, ROMABLE_REGION)
#endif

#if defined(CONFIG_USB_DEVICE_STACK)
	SECTION_DATA_PROLOGUE(usb_descriptor,,SUBALIGN(1))
	{
		__usb_descriptor_start = .;
		*(".usb.descriptor")
		KEEP(*(SORT_BY_NAME(".usb.descriptor*")))
		__usb_descriptor_end = .;
	} GROUP_DATA_LINK_IN(RAMABLE_REGION, ROMABLE_REGION)

	SECTION_DATA_PROLOGUE(usb_data,,SUBALIGN(1))
	{
		__usb_data_start = .;
		*(".usb.data")
		KEEP(*(SORT_BY_NAME(".usb.data*")))
		__usb_data_end = .;
	} GROUP_DATA_LINK_IN(RAMABLE_REGION, ROMABLE_REGION)
#endif /* CONFIG_USB_DEVICE_STACK */

#if defined(CONFIG_USB_DEVICE_BOS)
	SECTION_DATA_PROLOGUE(usb_bos_desc,,SUBALIGN(1))
	{
		__usb_bos_desc_start = .;
		*(".usb.bos_desc")
		KEEP(*(SORT_BY_NAME(".usb.bos_desc*")))
		__usb_bos_desc_end = .;
	} GROUP_DATA_LINK_IN(RAMABLE_REGION, ROMABLE_REGION)
#endif /* CONFIG_USB_DEVICE_BOS */

#ifdef CONFIG_USERSPACE
	_static_kernel_objects_end = .;
#endif