LCOV - code coverage report
Current view: top level - zephyr/linker - linker-defs.h Hit Total Coverage
Test: new.info Lines: 0 2 0.0 %
Date: 2024-12-22 00:14:23

          Line data    Source code
       1           0 : /*
       2             :  * Copyright (c) 2013-2014, Wind River Systems, Inc.
       3             :  *
       4             :  * SPDX-License-Identifier: Apache-2.0
       5             :  */
       6             : 
       7             : /*
       8             :  * DESCRIPTION
       9             :  * Platform independent, commonly used macros and defines related to linker
      10             :  * script.
      11             :  *
      12             :  * This file may be included by:
      13             :  * - Linker script files: for linker section declarations
      14             :  * - C files: for external declaration of address or size of linker section
      15             :  * - Assembly files: for external declaration of address or size of linker
      16             :  *   section
      17             :  */
      18             : 
      19             : #ifndef ZEPHYR_INCLUDE_LINKER_LINKER_DEFS_H_
      20             : #define ZEPHYR_INCLUDE_LINKER_LINKER_DEFS_H_
      21             : 
      22             : #include <zephyr/toolchain.h>
      23             : #include <zephyr/toolchain/common.h>
      24             : #include <zephyr/linker/sections.h>
      25             : #include <zephyr/sys/util.h>
      26             : #include <zephyr/offsets.h>
      27             : 
      28             : /* We need to dummy out DT_NODE_HAS_STATUS when building the unittests.
      29             :  * Including devicetree.h would require generating dummy header files
      30             :  * to match what gen_defines creates, so it's easier to just dummy out
      31             :  * DT_NODE_HAS_STATUS. These are undefined at the end of the file.
      32             :  */
      33             : #ifdef ZTEST_UNITTEST
      34             : #define DT_NODE_HAS_STATUS(node, status) 0
      35             : #define DT_NODE_HAS_STATUS_OKAY(node) 0
      36             : #else
      37             : #include <zephyr/devicetree.h>
      38             : #endif
      39             : 
      40             : #ifdef _LINKER
      41             : /*
      42             :  * generate a symbol to mark the start of the objects array for
      43             :  * the specified object and level, then link all of those objects
      44             :  * (sorted by priority). Ensure the objects aren't discarded if there is
      45             :  * no direct reference to them
      46             :  */
      47           0 : #define CREATE_OBJ_LEVEL(object, level)                         \
      48             :                 __##object##_##level##_start = .;               \
      49             :                 KEEP(*(SORT(.z_##object##_##level?_*)));        \
      50             :                 KEEP(*(SORT(.z_##object##_##level??_*)));
      51             : 
      52             : /*
      53             :  * link in shell initialization objects for all modules that use shell and
      54             :  * their shell commands are automatically initialized by the kernel.
      55             :  */
      56             : 
      57             : #elif defined(_ASMLANGUAGE)
      58             : 
      59             : /* Assembly FILES: declaration defined by the linker script */
      60             : GDATA(__bss_start)
      61             : GDATA(__bss_num_words)
      62             : #ifdef CONFIG_XIP
      63             : GDATA(__data_region_load_start)
      64             : GDATA(__data_region_start)
      65             : GDATA(__data_region_num_words)
      66             : #endif
      67             : 
      68             : #else /* ! _ASMLANGUAGE */
      69             : 
      70             : #include <zephyr/types.h>
      71             : /*
      72             :  * Memory owned by the kernel, to be used as shared memory between
      73             :  * application threads.
      74             :  *
      75             :  * The following are extern symbols from the linker. This enables
      76             :  * the dynamic k_mem_domain and k_mem_partition creation and alignment
      77             :  * to the section produced in the linker.
      78             : 
      79             :  * The policy for this memory will be to initially configure all of it as
      80             :  * kernel / supervisor thread accessible.
      81             :  */
      82             : extern char _app_smem_start[];
      83             : extern char _app_smem_end[];
      84             : extern char _app_smem_size[];
      85             : extern char _app_smem_rom_start[];
      86             : extern char _app_smem_num_words[];
      87             : 
      88             : #ifdef CONFIG_LINKER_USE_PINNED_SECTION
      89             : extern char _app_smem_pinned_start[];
      90             : extern char _app_smem_pinned_end[];
      91             : extern char _app_smem_pinned_size[];
      92             : extern char _app_smem_pinned_num_words[];
      93             : #endif
      94             : 
      95             : /* Memory owned by the kernel. Start and end will be aligned for memory
      96             :  * management/protection hardware for the target architecture.
      97             :  *
      98             :  * Consists of all kernel-side globals, all kernel objects, all thread stacks,
      99             :  * and all currently unused RAM.
     100             :  *
     101             :  * Except for the stack of the currently executing thread, none of this memory
     102             :  * is normally accessible to user threads unless specifically granted at
     103             :  * runtime.
     104             :  */
     105             : extern char __kernel_ram_start[];
     106             : extern char __kernel_ram_end[];
     107             : extern char __kernel_ram_size[];
     108             : 
     109             : /* Used by z_bss_zero or arch-specific implementation */
     110             : extern char __bss_start[];
     111             : extern char __bss_end[];
     112             : 
     113             : /* Used by z_data_copy() or arch-specific implementation */
     114             : #ifdef CONFIG_XIP
     115             : extern char __data_region_load_start[];
     116             : extern char __data_region_start[];
     117             : extern char __data_region_end[];
     118             : #endif /* CONFIG_XIP */
     119             : 
     120             : #ifdef CONFIG_MMU
     121             : /* Virtual addresses of page-aligned kernel image mapped into RAM at boot */
     122             : extern char z_mapped_start[];
     123             : extern char z_mapped_end[];
     124             : #endif /* CONFIG_MMU */
     125             : 
     126             : /* Includes text and rodata */
     127             : extern char __rom_region_start[];
     128             : extern char __rom_region_end[];
     129             : extern char __rom_region_size[];
     130             : 
     131             : /* Includes all ROMable data, i.e. the size of the output image file. */
     132             : extern char _flash_used[];
     133             : 
     134             : /* datas, bss, noinit */
     135             : extern char _image_ram_start[];
     136             : extern char _image_ram_end[];
     137             : extern char _image_ram_size[];
     138             : 
     139             : extern char __text_region_start[];
     140             : extern char __text_region_end[];
     141             : extern char __text_region_size[];
     142             : 
     143             : extern char __rodata_region_start[];
     144             : extern char __rodata_region_end[];
     145             : extern char __rodata_region_size[];
     146             : 
     147             : extern char _vector_start[];
     148             : extern char _vector_end[];
     149             : 
     150             : #ifdef CONFIG_SW_VECTOR_RELAY
     151             : extern char __vector_relay_table[];
     152             : #endif
     153             : 
     154             : #ifdef CONFIG_COVERAGE_GCOV
     155             : extern char __gcov_bss_start[];
     156             : extern char __gcov_bss_end[];
     157             : extern char __gcov_bss_size[];
     158             : #endif  /* CONFIG_COVERAGE_GCOV */
     159             : 
     160             : /* end address of image, used by newlib for the heap */
     161             : extern char _end[];
     162             : 
     163             : #if (DT_NODE_HAS_STATUS_OKAY(DT_CHOSEN(zephyr_ccm)))
     164             : extern char __ccm_data_rom_start[];
     165             : extern char __ccm_start[];
     166             : extern char __ccm_data_start[];
     167             : extern char __ccm_data_end[];
     168             : extern char __ccm_bss_start[];
     169             : extern char __ccm_bss_end[];
     170             : extern char __ccm_noinit_start[];
     171             : extern char __ccm_noinit_end[];
     172             : extern char __ccm_end[];
     173             : #endif
     174             : 
     175             : #if (DT_NODE_HAS_STATUS_OKAY(DT_CHOSEN(zephyr_itcm)))
     176             : extern char __itcm_start[];
     177             : extern char __itcm_end[];
     178             : extern char __itcm_size[];
     179             : extern char __itcm_load_start[];
     180             : #endif
     181             : 
     182             : #if (DT_NODE_HAS_STATUS_OKAY(DT_CHOSEN(zephyr_dtcm)))
     183             : extern char __dtcm_data_start[];
     184             : extern char __dtcm_data_end[];
     185             : extern char __dtcm_bss_start[];
     186             : extern char __dtcm_bss_end[];
     187             : extern char __dtcm_noinit_start[];
     188             : extern char __dtcm_noinit_end[];
     189             : extern char __dtcm_data_load_start[];
     190             : extern char __dtcm_start[];
     191             : extern char __dtcm_end[];
     192             : #endif
     193             : 
     194             : #if (DT_NODE_HAS_STATUS_OKAY(DT_CHOSEN(zephyr_ocm)))
     195             : extern char __ocm_data_start[];
     196             : extern char __ocm_data_end[];
     197             : extern char __ocm_bss_start[];
     198             : extern char __ocm_bss_end[];
     199             : extern char __ocm_start[];
     200             : extern char __ocm_end[];
     201             : extern char __ocm_size[];
     202             : #endif
     203             : 
     204             : /* Used by the Security Attribution Unit to configure the
     205             :  * Non-Secure Callable region.
     206             :  */
     207             : #ifdef CONFIG_ARM_FIRMWARE_HAS_SECURE_ENTRY_FUNCS
     208             : extern char __sg_start[];
     209             : extern char __sg_end[];
     210             : extern char __sg_size[];
     211             : #endif /* CONFIG_ARM_FIRMWARE_HAS_SECURE_ENTRY_FUNCS */
     212             : 
     213             : /*
     214             :  * Non-cached kernel memory region, currently only available on ARM Cortex-M7
     215             :  * with a MPU. Start and end will be aligned for memory management/protection
     216             :  * hardware for the target architecture.
     217             :  *
     218             :  * All the functions with '__nocache' keyword will be placed into this
     219             :  * section.
     220             :  */
     221             : #ifdef CONFIG_NOCACHE_MEMORY
     222             : extern char _nocache_ram_start[];
     223             : extern char _nocache_ram_end[];
     224             : extern char _nocache_ram_size[];
     225             : #endif /* CONFIG_NOCACHE_MEMORY */
     226             : 
     227             : /* Memory owned by the kernel. Start and end will be aligned for memory
     228             :  * management/protection hardware for the target architecture.
     229             :  *
     230             :  * All the functions with '__ramfunc' keyword will be placed into this
     231             :  * section, stored in RAM instead of FLASH.
     232             :  */
     233             : #ifdef CONFIG_ARCH_HAS_RAMFUNC_SUPPORT
     234             : extern char __ramfunc_region_start[];
     235             : extern char __ramfunc_start[];
     236             : extern char __ramfunc_end[];
     237             : extern char __ramfunc_size[];
     238             : extern char __ramfunc_load_start[];
     239             : #endif /* CONFIG_ARCH_HAS_RAMFUNC_SUPPORT */
     240             : 
     241             : /* Memory owned by the kernel. Memory region for thread privilege stack buffers,
     242             :  * currently only applicable on ARM Cortex-M architecture when building with
     243             :  * support for User Mode.
     244             :  *
     245             :  * All thread privilege stack buffers will be placed into this section.
     246             :  */
     247             : #ifdef CONFIG_USERSPACE
     248             : extern char z_priv_stacks_ram_start[];
     249             : extern char z_priv_stacks_ram_end[];
     250             : extern char z_user_stacks_start[];
     251             : extern char z_user_stacks_end[];
     252             : extern char z_kobject_data_begin[];
     253             : #endif /* CONFIG_USERSPACE */
     254             : 
     255             : #ifdef CONFIG_THREAD_LOCAL_STORAGE
     256             : extern char __tdata_start[];
     257             : extern char __tdata_end[];
     258             : extern char __tdata_size[];
     259             : extern char __tdata_align[];
     260             : extern char __tbss_start[];
     261             : extern char __tbss_end[];
     262             : extern char __tbss_size[];
     263             : extern char __tbss_align[];
     264             : extern char __tls_start[];
     265             : extern char __tls_end[];
     266             : extern char __tls_size[];
     267             : #endif /* CONFIG_THREAD_LOCAL_STORAGE */
     268             : 
     269             : #ifdef CONFIG_LINKER_USE_BOOT_SECTION
     270             : /* lnkr_boot_start[] and lnkr_boot_end[]
     271             :  * must encapsulate all the boot sections.
     272             :  */
     273             : extern char lnkr_boot_start[];
     274             : extern char lnkr_boot_end[];
     275             : 
     276             : extern char lnkr_boot_text_start[];
     277             : extern char lnkr_boot_text_end[];
     278             : extern char lnkr_boot_text_size[];
     279             : extern char lnkr_boot_data_start[];
     280             : extern char lnkr_boot_data_end[];
     281             : extern char lnkr_boot_data_size[];
     282             : extern char lnkr_boot_rodata_start[];
     283             : extern char lnkr_boot_rodata_end[];
     284             : extern char lnkr_boot_rodata_size[];
     285             : extern char lnkr_boot_bss_start[];
     286             : extern char lnkr_boot_bss_end[];
     287             : extern char lnkr_boot_bss_size[];
     288             : extern char lnkr_boot_noinit_start[];
     289             : extern char lnkr_boot_noinit_end[];
     290             : extern char lnkr_boot_noinit_size[];
     291             : #endif /* CONFIG_LINKER_USE_BOOT_SECTION */
     292             : 
     293             : #ifdef CONFIG_LINKER_USE_PINNED_SECTION
     294             : /* lnkr_pinned_start[] and lnkr_pinned_end[] must encapsulate
     295             :  * all the pinned sections as these are used by
     296             :  * the MMU code to mark the physical page frames with
     297             :  * K_MEM_PAGE_FRAME_PINNED.
     298             :  */
     299             : extern char lnkr_pinned_start[];
     300             : extern char lnkr_pinned_end[];
     301             : 
     302             : extern char lnkr_pinned_text_start[];
     303             : extern char lnkr_pinned_text_end[];
     304             : extern char lnkr_pinned_text_size[];
     305             : extern char lnkr_pinned_data_start[];
     306             : extern char lnkr_pinned_data_end[];
     307             : extern char lnkr_pinned_data_size[];
     308             : extern char lnkr_pinned_rodata_start[];
     309             : extern char lnkr_pinned_rodata_end[];
     310             : extern char lnkr_pinned_rodata_size[];
     311             : extern char lnkr_pinned_bss_start[];
     312             : extern char lnkr_pinned_bss_end[];
     313             : extern char lnkr_pinned_bss_size[];
     314             : extern char lnkr_pinned_noinit_start[];
     315             : extern char lnkr_pinned_noinit_end[];
     316             : extern char lnkr_pinned_noinit_size[];
     317             : 
     318             : __pinned_func
     319             : static inline bool lnkr_is_pinned(uint8_t *addr)
     320             : {
     321             :         if ((addr >= (uint8_t *)lnkr_pinned_start) &&
     322             :             (addr < (uint8_t *)lnkr_pinned_end)) {
     323             :                 return true;
     324             :         } else {
     325             :                 return false;
     326             :         }
     327             : }
     328             : 
     329             : __pinned_func
     330             : static inline bool lnkr_is_region_pinned(uint8_t *addr, size_t sz)
     331             : {
     332             :         if ((addr >= (uint8_t *)lnkr_pinned_start) &&
     333             :             ((addr + sz) < (uint8_t *)lnkr_pinned_end)) {
     334             :                 return true;
     335             :         } else {
     336             :                 return false;
     337             :         }
     338             : }
     339             : 
     340             : #endif /* CONFIG_LINKER_USE_PINNED_SECTION */
     341             : 
     342             : #ifdef CONFIG_LINKER_USE_ONDEMAND_SECTION
     343             : /* lnkr_ondemand_start[] and lnkr_ondemand_end[] must encapsulate
     344             :  * all the on-demand sections as these are used by
     345             :  * the MMU code to mark the virtual pages with the appropriate backing store
     346             :  * location token to have them be paged in on demand.
     347             :  */
     348             : extern char lnkr_ondemand_start[];
     349             : extern char lnkr_ondemand_end[];
     350             : extern char lnkr_ondemand_load_start[];
     351             : 
     352             : extern char lnkr_ondemand_text_start[];
     353             : extern char lnkr_ondemand_text_end[];
     354             : extern char lnkr_ondemand_text_size[];
     355             : extern char lnkr_ondemand_rodata_start[];
     356             : extern char lnkr_ondemand_rodata_end[];
     357             : extern char lnkr_ondemand_rodata_size[];
     358             : 
     359             : #endif /* CONFIG_LINKER_USE_ONDEMAND_SECTION */
     360             : #endif /* ! _ASMLANGUAGE */
     361             : 
     362             : #ifdef ZTEST_UNITTEST
     363             : #undef DT_NODE_HAS_STATUS
     364             : #undef DT_NODE_HAS_STATUS_OKAY
     365             : #endif
     366             : 
     367             : #endif /* ZEPHYR_INCLUDE_LINKER_LINKER_DEFS_H_ */

Generated by: LCOV version 1.14