# Copyright (c) 2023 Intel Corporation
# SPDX-License-Identifier: Apache-2.0

menuconfig LLEXT
	bool "Linkable loadable extensions"
	select CACHE_MANAGEMENT if DCACHE
	select KERNEL_WHOLE_ARCHIVE
	help
	  Enable the linkable loadable extension subsystem

if LLEXT

choice LLEXT_BINARY_TYPE
	prompt "Binary object type for llext"
	default LLEXT_TYPE_ELF_OBJECT if ARM || ARM64
	default LLEXT_TYPE_ELF_SHAREDLIB if XTENSA
	default LLEXT_TYPE_ELF_RELOCATABLE if RISCV
	help
	  Object type for llext

config LLEXT_TYPE_ELF_OBJECT
	bool "Single object ELF file"
	depends on !RISCV
	help
	  Build and expect object files as binary object type for the
	  llext subsystem. A single compiler invocation is used to
	  generate the object file. Currently not supported on RISC-V.

config LLEXT_TYPE_ELF_RELOCATABLE
	bool "Relocatable ELF file"
	help
	  Build and expect relocatable (partially linked) files as the
	  binary object type for the llext subsystem. These object files
	  are generated by the linker by combining multiple object files
	  into a single one.

config LLEXT_TYPE_ELF_SHAREDLIB
	bool "Shared library ELF file"
	help
	  Build and expect shared libraries as binary object type for
	  the llext subsystem. The usual linking process is used to
	  generate the shared library from multiple object files.

endchoice

config LLEXT_HEAP_SIZE
	int "llext heap memory size in kilobytes"
	default 8
	help
	  Heap size in kilobytes available to llext for dynamic allocation

config LLEXT_BUILD_PIC
	bool "Use -fPIC when building LLEXT"
	depends on XTENSA
	default y if LLEXT_TYPE_ELF_SHAREDLIB
	help
	  By default LLEXT compilation is performed with -fno-pic -fno-pie compiler
	  flags. Some platforms can benefit from using -fPIC instead, in which case
	  most internal linking is performed by the linker at build time. Select "y"
	  to make use of that advantage.

config LLEXT_SHELL
	bool "llext shell commands"
	depends on SHELL
	help
	  Manage llext with shell commands for loading, unloading, and introspection

config LLEXT_SHELL_MAX_SIZE
	int "Maximum size of llext in bytes"
	depends on LLEXT_SHELL
	default 8192
	help
	  When loading llext with shell it is stored in a temporary buffer of this size

config LLEXT_STORAGE_WRITABLE
	bool "llext storage is writable"
	default y if XTENSA
	help
	  Select if LLEXT storage is writable, i.e. if extensions are stored in
	  RAM and can be modified in place

config LLEXT_EXPORT_DEVICES
	bool "Export all DT devices to llexts"
	help
	  When enabled, all Zephyr devices defined in the device tree are
	  made available to llexts via the standard DT_ / DEVICE_* macros.

config LLEXT_EXPORT_BUILTINS_BY_SLID
	bool "Export built-in symbols to llexts via SLIDs"
	help
	  When enabled, symbols exported from the Zephyr kernel
	  or application (via EXPORT_SYMBOL) are linked to LLEXTs
	  via Symbol Link Identifiers (SLIDs) instead of name.

	  Enabling this option provides a huge size reduction,
	  makes the linking process faster and provides more
	  confidentiality, as exported symbol names are dropped
	  from the binary. However, it can make LLEXT debugging
	  harder and prevents usage of 'llext_find_sym' to look
	  up symbols from the built-in table by name. It also
	  requires the LLEXTs to be post-processed after build.

module = LLEXT
module-str = llext
source "subsys/logging/Kconfig.template.log_config"

endif

menu "Linkable loadable Extension Development Kit (EDK)"

config LLEXT_EDK_NAME
	string "Name for llext EDK (Extension Development Kit)"
	default "llext-edk"
	help
	  Name will be used when generating the EDK file, as <name>.tar.xz.
	  It will also be used, normalized, as the prefix for the variable
	  stating EDK location, used on generated Makefile.cflags. For
	  instance, the default name, "llext-edk", becomes LLEXT_EDK_INSTALL_DIR.

config LLEXT_EDK_USERSPACE_ONLY
	bool "Only generate the Userpace codepath on syscall stubs for the EDK"
	help
	  Syscall stubs can contain code that verifies if running code is at user
	  or kernel space and route the call accordingly. If the EDK is expected
	  to be used by userspace only extensions, this option will make EDK stubs
	  not contain the routing code, and only generate the userspace one.

endmenu
