LCOV - code coverage report
Current view: top level - zephyr/app_memory - app_memdomain.h Coverage Total Hit
Test: new.info Lines: 83.3 % 6 5
Test Date: 2025-09-05 16:43:28

            Line data    Source code
       1            0 : /*
       2              :  * Copyright (c) 2019 Intel Corporation
       3              :  *
       4              :  * SPDX-License-Identifier: Apache-2.0
       5              :  */
       6              : #ifndef ZEPHYR_INCLUDE_APP_MEMORY_APP_MEMDOMAIN_H_
       7              : #define ZEPHYR_INCLUDE_APP_MEMORY_APP_MEMDOMAIN_H_
       8              : 
       9              : #include <zephyr/linker/linker-defs.h>
      10              : #include <zephyr/sys/dlist.h>
      11              : #include <zephyr/kernel.h>
      12              : 
      13              : /**
      14              :  * @brief Application memory domain APIs
      15              :  * @defgroup mem_domain_apis_app Application memory domain APIs
      16              :  * @ingroup mem_domain_apis
      17              :  * @{
      18              :  */
      19              : 
      20              : #ifdef CONFIG_USERSPACE
      21              : 
      22              : /**
      23              :  * @brief Name of the data section for a particular partition
      24              :  *
      25              :  * Useful for defining memory pools, or any other macro that takes a
      26              :  * section name as a parameter.
      27              :  *
      28              :  * @param id Partition name
      29              :  */
      30            1 : #define K_APP_DMEM_SECTION(id) data_smem_##id##_data
      31              : 
      32              : /**
      33              :  * @brief Name of the bss section for a particular partition
      34              :  *
      35              :  * Useful for defining memory pools, or any other macro that takes a
      36              :  * section name as a parameter.
      37              :  *
      38              :  * @param id Partition name
      39              :  */
      40            1 : #define K_APP_BMEM_SECTION(id) data_smem_##id##_bss
      41              : 
      42              : /**
      43              :  * @brief Place data in a partition's data section
      44              :  *
      45              :  * Globals tagged with this will end up in the data section for the
      46              :  * specified memory partition. This data should be initialized to some
      47              :  * desired value.
      48              :  *
      49              :  * @param id Name of the memory partition to associate this data
      50              :  */
      51            1 : #define K_APP_DMEM(id) Z_GENERIC_SECTION(K_APP_DMEM_SECTION(id))
      52              : 
      53              : /**
      54              :  * @brief Place data in a partition's bss section
      55              :  *
      56              :  * Globals tagged with this will end up in the bss section for the
      57              :  * specified memory partition. This data will be zeroed at boot.
      58              :  *
      59              :  * @param id Name of the memory partition to associate this data
      60              :  */
      61            1 : #define K_APP_BMEM(id) Z_GENERIC_SECTION(K_APP_BMEM_SECTION(id))
      62              : 
      63              : struct z_app_region {
      64              :         void *bss_start;
      65              :         size_t bss_size;
      66              : };
      67              : 
      68              : #define Z_APP_START(id) z_data_smem_##id##_part_start
      69              : #define Z_APP_SIZE(id) z_data_smem_##id##_part_size
      70              : #define Z_APP_BSS_START(id) z_data_smem_##id##_bss_start
      71              : #define Z_APP_BSS_SIZE(id) z_data_smem_##id##_bss_size
      72              : 
      73              : /* If a partition is declared with K_APPMEM_PARTITION, but never has any
      74              :  * data assigned to its contents, then no symbols with its prefix will end
      75              :  * up in the symbol table. This prevents gen_app_partitions.py from detecting
      76              :  * that the partition exists, and the linker symbols which specify partition
      77              :  * bounds will not be generated, resulting in build errors.
      78              :  *
      79              :  * What this inline assembly code does is define a symbol with no data.
      80              :  * This should work for all arches that produce ELF binaries, see
      81              :  * https://sourceware.org/binutils/docs/as/Section.html
      82              :  *
      83              :  * We don't know what active flags/type of the pushed section were, so we are
      84              :  * specific: "aw" indicates section is allocatable and writable,
      85              :  * and "@progbits" indicates the section has data.
      86              :  */
      87              : #if defined(CONFIG_ARM) || defined(CONFIG_ARM64)
      88              : /* ARM has a quirk in that '@' denotes a comment, so we have to send
      89              :  * %progbits to the assembler instead.
      90              :  */
      91              : #define Z_PROGBITS_SYM  "%"
      92              : #else
      93              : #define Z_PROGBITS_SYM "@"
      94              : #endif
      95              : 
      96              : #if defined(CONFIG_ARC) && defined(__CCAC__)
      97              : /* ARC MWDT assembler has slightly different pushsection/popsection directives
      98              :  * names.
      99              :  */
     100              : #define Z_PUSHSECTION_DIRECTIV          ".pushsect"
     101              : #define Z_POPSECTION_DIRECTIVE          ".popsect"
     102              : #else
     103              : #define Z_PUSHSECTION_DIRECTIV          ".pushsection"
     104              : #define Z_POPSECTION_DIRECTIVE          ".popsection"
     105              : #endif
     106              : 
     107              : #define Z_APPMEM_PLACEHOLDER(name) \
     108              :         __asm__ ( \
     109              :                 Z_PUSHSECTION_DIRECTIV " " STRINGIFY(K_APP_DMEM_SECTION(name)) \
     110              :                         ",\"aw\"," Z_PROGBITS_SYM "progbits\n\t" \
     111              :                 ".global " STRINGIFY(name) "_placeholder\n\t" \
     112              :                 STRINGIFY(name) "_placeholder:\n\t" \
     113              :                 Z_POPSECTION_DIRECTIVE "\n\t")
     114              : 
     115              : /**
     116              :  * @brief Define an application memory partition with linker support
     117              :  *
     118              :  * Defines a k_mem_paritition with the provided name.
     119              :  * This name may be used with the K_APP_DMEM and K_APP_BMEM macros to
     120              :  * place globals automatically in this partition.
     121              :  *
     122              :  * NOTE: placeholder char variable is defined here to prevent build errors
     123              :  * if a partition is defined but nothing ever placed in it.
     124              :  *
     125              :  * @param name Name of the k_mem_partition to declare
     126              :  */
     127            1 : #define K_APPMEM_PARTITION_DEFINE(name) \
     128              :         extern char Z_APP_START(name)[]; \
     129              :         extern char Z_APP_SIZE(name)[]; \
     130              :         struct k_mem_partition name = { \
     131              :                 .start = (uintptr_t) &Z_APP_START(name)[0], \
     132              :                 .size = (size_t) &Z_APP_SIZE(name)[0], \
     133              :                 .attr = K_MEM_PARTITION_P_RW_U_RW \
     134              :         }; \
     135              :         extern char Z_APP_BSS_START(name)[]; \
     136              :         extern char Z_APP_BSS_SIZE(name)[]; \
     137              :         Z_GENERIC_SECTION(.app_regions.name) \
     138              :         const struct z_app_region name##_region = { \
     139              :                 .bss_start = &Z_APP_BSS_START(name)[0], \
     140              :                 .bss_size = (size_t) &Z_APP_BSS_SIZE(name)[0] \
     141              :         }; \
     142              :         Z_APPMEM_PLACEHOLDER(name)
     143              : #else
     144              : 
     145              : #define K_APP_BMEM(ptn)
     146              : #define K_APP_DMEM(ptn)
     147              : #define K_APP_DMEM_SECTION(ptn) .data
     148              : #define K_APP_BMEM_SECTION(ptn) .bss
     149              : #define K_APPMEM_PARTITION_DEFINE(name)
     150              : 
     151              : #endif /* CONFIG_USERSPACE */
     152              : 
     153              : /**
     154              :  * @}
     155              :  */
     156              : 
     157              : #endif /* ZEPHYR_INCLUDE_APP_MEMORY_APP_MEMDOMAIN_H_ */
        

Generated by: LCOV version 2.0-1