LCOV - code coverage report
Current view: top level - zephyr/llext - symbol.h Hit Total Coverage
Test: new.info Lines: 14 14 100.0 %
Date: 2024-12-22 00:14:23

          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(x)                                                \
      94             :         static const struct llext_const_symbol                                  \
      95             :                         Z_GENERIC_SECTION(".exported_sym") __used             \
      96             :                         __llext_sym_ ## x = {                                   \
      97             :                 .name = STRINGIFY(x), .addr = (const void *)&x,                     \
      98             :         }
      99             : #else
     100             : /* No-op when not building an extension */
     101             : #define Z_LL_EXTENSION_SYMBOL(x)
     102             : #endif
     103             : /** @endcond */
     104             : 
     105             : /**
     106             :  * @brief Exports a symbol from an extension to the base image
     107             :  *
     108             :  * This macro can be used in extensions to add a symbol (function or object)
     109             :  * to the extension's exported symbol table, so that it may be referenced by
     110             :  * the base image.
     111             :  *
     112             :  * When not building an extension, this macro is a no-op.
     113             :  *
     114             :  * @param x Extension symbol to export to the base image
     115             :  */
     116           1 : #define LL_EXTENSION_SYMBOL(x) Z_LL_EXTENSION_SYMBOL(x)
     117             : 
     118             : /** @cond ignore */
     119             : #if defined(LL_EXTENSION_BUILD)
     120             : /* Extension build: EXPORT_SYMBOL maps to LL_EXTENSION_SYMBOL */
     121             : #define Z_EXPORT_SYMBOL(x) Z_LL_EXTENSION_SYMBOL(x)
     122             : #elif defined(CONFIG_LLEXT_EXPORT_BUILTINS_BY_SLID)
     123             : /* SLID-enabled LLEXT application: export symbols, names in separate section */
     124             : #define Z_EXPORT_SYMBOL(x)                                                      \
     125             :         static const char Z_GENERIC_SECTION("llext_exports_strtab") __used    \
     126             :                 __llext_sym_name_ ## x[] = STRINGIFY(x);                                \
     127             :         static const STRUCT_SECTION_ITERABLE(llext_const_symbol,                \
     128             :                                              __llext_sym_ ## x) = {             \
     129             :                 .name = __llext_sym_name_ ## x, .addr = (const void *)&x,           \
     130             :         }
     131             : #elif defined(CONFIG_LLEXT)
     132             : /* LLEXT application: export symbols */
     133             : #define Z_EXPORT_SYMBOL(x)                                                      \
     134             :         static const STRUCT_SECTION_ITERABLE(llext_const_symbol,                \
     135             :                                              __llext_sym_ ## x) = {             \
     136             :                 .name = STRINGIFY(x), .addr = (const void *)&x,                     \
     137             :         }
     138             : #else
     139             : /* No extension support in this build */
     140             : #define Z_EXPORT_SYMBOL(x)
     141             : #endif
     142             : /** @endcond */
     143             : 
     144             : /**
     145             :  * @brief Export a constant symbol from the current build
     146             :  *
     147             :  * Takes a symbol (function or object) by symbolic name and adds the name
     148             :  * and address of the symbol to a table of symbols that may be referenced
     149             :  * by extensions or by the base image, depending on the current build type.
     150             :  *
     151             :  * When @c CONFIG_LLEXT is not enabled, this macro is a no-op.
     152             :  *
     153             :  * @param x Symbol to export
     154             :  */
     155           1 : #define EXPORT_SYMBOL(x) Z_EXPORT_SYMBOL(x)
     156             : 
     157             : /**
     158             :  * @}
     159             :  */
     160             : 
     161             : #ifdef __cplusplus
     162             : }
     163             : #endif
     164             : 
     165             : 
     166             : #endif /* ZEPHYR_LLEXT_SYMBOL_H */

Generated by: LCOV version 1.14