LCOV - code coverage report
Current view: top level - zephyr/llext - symbol.h Coverage Total Hit
Test: new.info Lines: 100.0 % 16 16
Test Date: 2025-09-05 20:47:19

            Line data    Source code
       1            1 : /*
       2              :  * Copyright (c) 2023 Intel Corporation
       3              :  *
       4              :  * SPDX-License-Identifier: Apache-2.0
       5              :  */
       6              : 
       7              : #ifndef ZEPHYR_LLEXT_SYMBOL_H
       8              : #define ZEPHYR_LLEXT_SYMBOL_H
       9              : 
      10              : #include <zephyr/sys/iterable_sections.h>
      11              : #include <zephyr/toolchain.h>
      12              : #include <stddef.h>
      13              : #include <stdint.h>
      14              : 
      15              : #ifdef __cplusplus
      16              : extern "C" {
      17              : #endif
      18              : 
      19              : /**
      20              :  * @file
      21              :  * @brief Linkable loadable extension symbol definitions
      22              :  *
      23              :  * This file provides a set of macros and structures for defining and exporting
      24              :  * symbols from the base image to extensions and vice versa, so that proper
      25              :  * linking can be done between the two entities.
      26              :  *
      27              :  * @defgroup llext_symbols Exported symbol definitions
      28              :  * @ingroup llext_apis
      29              :  * @{
      30              :  */
      31              : 
      32              : /**
      33              :  * @brief Constant symbols are unchangeable named memory addresses
      34              :  *
      35              :  * Symbols may be named function or global objects that have been exported
      36              :  * for linking. These constant symbols are useful in the base image
      37              :  * as they may be placed in ROM.
      38              :  *
      39              :  * @note When updating this structure, make sure to also update the
      40              :  * 'scripts/build/llext_prepare_exptab.py' build script.
      41              :  */
      42            1 : struct llext_const_symbol {
      43              :         /** At build time, we always write to 'name'.
      44              :          *  At runtime, which field is used depends
      45              :          *  on CONFIG_LLEXT_EXPORT_BUILTINS_BY_SLID.
      46              :          */
      47              :         union {
      48              :                 /** Name of symbol */
      49            1 :                 const char *const name;
      50              : 
      51              :                 /** Symbol Link Identifier */
      52            1 :                 const uintptr_t slid;
      53            1 :         };
      54              : 
      55              :         /** Address of symbol */
      56            1 :         const void *const addr;
      57              : };
      58              : BUILD_ASSERT(sizeof(struct llext_const_symbol) == 2 * sizeof(uintptr_t));
      59              : 
      60              : /**
      61              :  * @brief Symbols are named memory addresses
      62              :  *
      63              :  * Symbols may be named function or global objects that have been exported
      64              :  * for linking. These are mutable and should come from extensions where
      65              :  * the location may need updating depending on where memory is placed.
      66              :  */
      67            1 : struct llext_symbol {
      68              :         /** Name of symbol */
      69            1 :         const char *name;
      70              : 
      71              :         /** Address of symbol */
      72            1 :         void *addr;
      73              : };
      74              : 
      75              : 
      76              : /**
      77              :  * @brief A symbol table
      78              :  *
      79              :  * An array of symbols
      80              :  */
      81            1 : struct llext_symtable {
      82              :         /** Number of symbols in the table */
      83            1 :         size_t sym_cnt;
      84              : 
      85              :         /** Array of symbols */
      86            1 :         struct llext_symbol *syms;
      87              : };
      88              : 
      89              : 
      90              : /** @cond ignore */
      91              : #ifdef LL_EXTENSION_BUILD
      92              : /* Extension build: add exported symbols to llext table */
      93              : #define Z_LL_EXTENSION_SYMBOL_NAMED(sym_ident, sym_name)                        \
      94              :         static const struct llext_const_symbol                                  \
      95              :                         Z_GENERIC_SECTION(.exported_sym) __used                 \
      96              :                         __llext_sym_ ## sym_name = {                            \
      97              :                 .name = STRINGIFY(sym_name), .addr = (const void *)&sym_ident,      \
      98              :         }
      99              : #else
     100              : /* No-op when not building an extension */
     101              : #define Z_LL_EXTENSION_SYMBOL_NAMED(sym_ident, sym_name)
     102              : #endif
     103              : /** @endcond */
     104              : 
     105              : /**
     106              :  * @brief Exports a symbol from an extension to the base image with a custom name
     107              :  *
     108              :  * Version of @ref LL_EXTENSION_SYMBOL that allows the user to specify a custom
     109              :  * name for the exported symbol.
     110              :  *
     111              :  * @param sym_ident Extension symbol to export to the base image
     112              :  * @param sym_name Name associated with the symbol
     113              :  */
     114            1 : #define LL_EXTENSION_SYMBOL_NAMED(sym_ident, sym_name)                          \
     115              :         Z_LL_EXTENSION_SYMBOL_NAMED(sym_ident, sym_name)
     116              : 
     117              : /**
     118              :  * @brief Exports a symbol from an extension to the base image
     119              :  *
     120              :  * This macro can be used in extensions to add a symbol (function or object)
     121              :  * to the extension's exported symbol table, so that it may be referenced by
     122              :  * the base image.
     123              :  *
     124              :  * When not building an extension, this macro is a no-op.
     125              :  *
     126              :  * @param x Extension symbol to export to the base image
     127              :  */
     128            1 : #define LL_EXTENSION_SYMBOL(x) Z_LL_EXTENSION_SYMBOL_NAMED(x, x)
     129              : 
     130              : /** @cond ignore */
     131              : #if defined(LL_EXTENSION_BUILD)
     132              : /* Extension build: EXPORT_SYMBOL maps to LL_EXTENSION_SYMBOL */
     133              : #define Z_EXPORT_SYMBOL_NAMED(sym_ident, sym_name)                              \
     134              :         Z_LL_EXTENSION_SYMBOL_NAMED(sym_ident, sym_name)
     135              : #elif defined(CONFIG_LLEXT_EXPORT_BUILTINS_BY_SLID)
     136              : /* SLID-enabled LLEXT application: export symbols, names in separate section */
     137              : #define Z_EXPORT_SYMBOL_NAMED(sym_ident, sym_name)                              \
     138              :         static const char Z_GENERIC_SECTION(llext_exports_strtab) __used        \
     139              :                 __llext_sym_name_ ## sym_name[] = STRINGIFY(sym_name);          \
     140              :         static const STRUCT_SECTION_ITERABLE(llext_const_symbol,                \
     141              :                                              __llext_sym_ ## sym_name) = {      \
     142              :                 .name = __llext_sym_name_ ## sym_name,                          \
     143              :                 .addr = (const void *)&sym_ident,                           \
     144              :         }
     145              : #elif defined(CONFIG_LLEXT)
     146              : /* LLEXT application: export symbols */
     147              : #define Z_EXPORT_SYMBOL_NAMED(sym_ident, sym_name)                              \
     148              :         static const STRUCT_SECTION_ITERABLE(llext_const_symbol,                \
     149              :                                              __llext_sym_ ## sym_name) = {      \
     150              :                 .name = STRINGIFY(sym_name), .addr = (const void *)&sym_ident,      \
     151              :         }
     152              : #else
     153              : /* No extension support in this build */
     154              : #define Z_EXPORT_SYMBOL_NAMED(sym_ident, sym_name)
     155              : #endif
     156              : /** @endcond */
     157              : 
     158              : /**
     159              :  * @brief Export a constant symbol from the current build with a custom name
     160              :  *
     161              :  * Version of @ref EXPORT_SYMBOL that allows the user to specify a custom name
     162              :  * for the exported symbol.
     163              :  *
     164              :  * When @c CONFIG_LLEXT is not enabled, this macro is a no-op.
     165              :  *
     166              :  * @param sym_ident Symbol to export
     167              :  * @param sym_name Name associated with the symbol
     168              :  */
     169            1 : #define EXPORT_SYMBOL_NAMED(sym_ident, sym_name)                                \
     170              :         Z_EXPORT_SYMBOL_NAMED(sym_ident, sym_name)
     171              : 
     172              : /**
     173              :  * @brief Export a constant symbol from the current build
     174              :  *
     175              :  * Takes a symbol (function or object) by symbolic name and adds the name
     176              :  * and address of the symbol to a table of symbols that may be referenced
     177              :  * by extensions or by the base image, depending on the current build type.
     178              :  *
     179              :  * When @c CONFIG_LLEXT is not enabled, this macro is a no-op.
     180              :  *
     181              :  * @param x Symbol to export
     182              :  */
     183            1 : #define EXPORT_SYMBOL(x) EXPORT_SYMBOL_NAMED(x, x)
     184              : 
     185              : /**
     186              :  * @}
     187              :  */
     188              : 
     189              : #ifdef __cplusplus
     190              : }
     191              : #endif
     192              : 
     193              : 
     194              : #endif /* ZEPHYR_LLEXT_SYMBOL_H */
        

Generated by: LCOV version 2.0-1