LCOV - code coverage report
Current view: top level - zephyr/app_memory - app_memdomain.h Hit Total Coverage
Test: new.info Lines: 5 6 83.3 %
Date: 2024-12-22 00:14:23

          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 1.14