Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

LLEXT: build libraries #9702

Merged
merged 14 commits into from
Jan 13, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions app/boards/intel_adsp_ace15_mtpm.conf
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ CONFIG_INTEL_MODULES=y
CONFIG_LIBRARY_MANAGER=y
CONFIG_LIBRARY_AUTH_SUPPORT=y
CONFIG_LIBRARY_BASE_ADDRESS=0xa0688000
CONFIG_LIBRARY_BUILD_LIB=y

# SOF / logging
CONFIG_SOF_LOG_LEVEL_INF=y
Expand Down
6 changes: 6 additions & 0 deletions app/boards/intel_adsp_ace30_ptl.conf
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,9 @@ CONFIG_ZEPHYR_NATIVE_DRIVERS=y
# SOF / loadable modules
CONFIG_INTEL_MODULES=y
CONFIG_LIBRARY_MANAGER=y
CONFIG_LIBRARY_BASE_ADDRESS=0xa0688000
CONFIG_LIBRARY_BUILD_LIB=y
CONFIG_LIBRARY_DEFAULT_MODULAR=n

# SOF / logging
CONFIG_SOF_LOG_LEVEL_INF=y
Expand All @@ -44,6 +47,9 @@ CONFIG_SOF_LOG_LEVEL_INF=y
CONFIG_COUNTER=y
CONFIG_HEAP_MEM_POOL_SIZE=8192
CONFIG_L3_HEAP=y
CONFIG_LLEXT=y
CONFIG_LLEXT_STORAGE_WRITABLE=y
CONFIG_MODULES=y

# Zephyr / device drivers
CONFIG_CLOCK_CONTROL=y
Expand Down
37 changes: 33 additions & 4 deletions scripts/llext_offset_calc.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
import argparse
import pathlib
import os
from elftools.elf.elffile import ELFFile
from elftools.elf.constants import SH_FLAGS

args = None

Expand All @@ -21,6 +23,34 @@ def parse_args():

args = parser.parse_args()

def get_elf_size(elf_name):
start = 0xffffffff
# SOF_MODULE_DRAM_LINK_END
min_start = 0x08000000
end = 0
with open(elf_name, 'rb') as f_elf:
elf = ELFFile(f_elf)

for section in elf.iter_sections():
s_flags = section.header['sh_flags']

if not s_flags & SH_FLAGS.SHF_ALLOC:
continue

# Ignore detached sections, to be used in DRAM, their addresses
# are below min_start
if section.header['sh_addr'] < min_start:
continue

if section.header['sh_addr'] < start:
start = section.header['sh_addr']
if section.header['sh_addr'] + section.header['sh_size'] > end:
end = section.header['sh_addr'] + section.header['sh_size']

size = end - start

return size

def main():
global args

Expand All @@ -34,13 +64,12 @@ def main():
except OSError:
size = 0

# Failure will raise an exception
f_size = open(f_output, "w")

size += get_elf_size(args.input) + 0xfff
# align to a page border
size += os.path.getsize(args.input) + 0xfff
size &= ~0xfff

# Failure will raise an exception
f_size = open(f_output, "w")
f_size.write(f'0x{size:x}\n')

if __name__ == "__main__":
Expand Down
130 changes: 89 additions & 41 deletions scripts/xtensa-build-zephyr.py
Original file line number Diff line number Diff line change
Expand Up @@ -926,19 +926,26 @@ def build_platforms():
symlinks=True, ignore_dangling_symlinks=True, dirs_exist_ok=True)


def install_lib(sof_lib_dir, abs_build_dir, platform_wconfig):
def install_lib(platform, sof_output_dir, abs_build_dir, platform_wconfig):
"""[summary] Sign loadable llext modules, if any, copy them to the
deployment tree and create UUID links for the kernel to find and load
them."""

global signing_key

with os.scandir(str(abs_build_dir)) as iter:
if args.key_type_subdir != "none":
sof_lib_dir = sof_lib_dir / args.key_type_subdir
libs = dict()
lib_uuids = dict()
rimage_cmd = shlex.split(platform_wconfig.get('rimage.path'))[0]
_ws_args = platform_wconfig.get("rimage.extra-args")

sof_lib_dir = sof_output_dir / '..' / 'sof-ipc4-lib' / platform

sof_lib_dir.mkdir(parents=True, exist_ok=True)
if args.key_type_subdir != "none":
sof_lib_dir = sof_lib_dir / args.key_type_subdir

sof_lib_dir.mkdir(parents=True, exist_ok=True)

with os.scandir(str(abs_build_dir)) as iter:
for entry in iter:
if (not entry.is_dir or
not entry.name.endswith('_llext')):
Expand All @@ -955,45 +962,87 @@ def install_lib(sof_lib_dir, abs_build_dir, platform_wconfig):
# eq_iir_llext/eq_iir.llext
llext_base = entry.name[:-6]
llext_file = llext_base + '.llext'

dst = sof_lib_dir / llext_file

rimage_cfg = entry_path / 'rimage_config.toml'
llext_input = entry_path / (llext_base + '.llext')
llext_output = entry_path / (llext_file + '.ri')

# See why the shlex() parsing step is required at
# https://docs.zephyrproject.org/latest/develop/west/sign.html#rimage
# and in Zephyr commit 030b740bd1ec
rimage_cmd = shlex.split(platform_wconfig.get('rimage.path'))[0]
sign_cmd = [rimage_cmd, "-o", str(llext_output),
"-e", "-c", str(rimage_cfg),
"-k", str(signing_key), "-l", "-r"]
_ws_args = platform_wconfig.get("rimage.extra-args")
if _ws_args is not None:
sign_cmd.extend(shlex.split(_ws_args))
sign_cmd.append(str(llext_input))
execute_command(sign_cmd, cwd=west_top)

# An intuitive way to make this multiline would be
# with (open(dst, 'wb') as fdst, open(llext_output, 'rb') as fllext,
# open(llext_output.with_suffix('.llext.xman'), 'rb') as fman):
# but a Python version, used on Windows errored out on this.
# Thus we're left with a choice between a 150-character
# long line and an illogical split like this
with open(dst, 'wb') as fdst, open(llext_output, 'rb') as fllext, open(
llext_output.with_suffix('.ri.xman'), 'rb') as fman:
# Concatenate the manifest and the llext
shutil.copyfileobj(fman, fdst)
shutil.copyfileobj(fllext, fdst)
lib_name = ''

lib_fname = entry_path / 'lib_name.txt'
if os.path.exists(lib_fname):
with open(lib_fname, 'r') as libs_f:
lib_name = libs_f.read()
if lib_name not in libs.keys():
libs[lib_name] = []
libs[lib_name].append(str(entry_path / llext_file))
else:
dst = sof_lib_dir / llext_file

rimage_cfg = entry_path / 'rimage_config.toml'
llext_input = entry_path / (llext_base + '.llext')
llext_output = entry_path / (llext_file + '.ri')

# See why the shlex() parsing step is required at
# https://docs.zephyrproject.org/latest/develop/west/sign.html#rimage
# and in Zephyr commit 030b740bd1ec
sign_cmd = [rimage_cmd, "-o", str(llext_output),
"-e", "-c", str(rimage_cfg),
"-k", str(signing_key), "-l", "-r"]
if _ws_args is not None:
sign_cmd.extend(shlex.split(_ws_args))
sign_cmd.append(str(llext_input))
execute_command(sign_cmd, cwd=west_top)

# An intuitive way to make this multiline would be
# with (open(dst, 'wb') as fdst, open(llext_output, 'rb') as fllext,
# open(llext_output.with_suffix('.llext.xman'), 'rb') as fman):
# but a Python version, used on Windows errored out on this.
# Thus we're left with a choice between a 150-character
# long line and an illogical split like this
with open(dst, 'wb') as fdst, open(llext_output, 'rb') as fllext, open(
llext_output.with_suffix('.ri.xman'), 'rb') as fman:
# Concatenate the manifest and the llext
shutil.copyfileobj(fman, fdst)
shutil.copyfileobj(fllext, fdst)

# Create symbolic links for all UUIDs
with open(uuids, 'r') as uuids_f:
for uuid in uuids_f:
linkname = uuid.strip() + '.bin'
symlink_or_copy(sof_lib_dir, llext_file,
sof_lib_dir, linkname)
if os.path.exists(lib_fname):
if lib_name not in lib_uuids.keys():
lib_uuids[lib_name] = []
lib_uuids[lib_name].append(uuid.strip())
else:
linkname = uuid.strip() + '.bin'
symlink_or_copy(sof_lib_dir, llext_file,
sof_lib_dir, linkname)

lib_install_dir = sof_output_dir / platform
if args.key_type_subdir != "none":
lib_install_dir = lib_install_dir / args.key_type_subdir

for key in libs.keys():
lib_path = abs_build_dir / ''.join(['lib', key, '.ri'])
sign_cmd = [rimage_cmd, "-o", str(lib_path), "-e",
"-c", str(abs_build_dir / 'misc' / 'generated' / 'rimage_config_full.toml'),
"-k", str(signing_key), "-l", "-r"]
if _ws_args is not None:
sign_cmd.extend(shlex.split(_ws_args))
sign_cmd.extend(libs[key])
execute_command(sign_cmd, cwd=west_top)
lib_name = ''.join(['sof-', platform, '-', key, '.ri'])
dst = lib_install_dir / lib_name
with open(dst, 'wb') as fdst, open(lib_path, 'rb') as fllext, open(
lib_path.with_suffix('.ri.xman'), 'rb') as fman:
# Concatenate the manifest and the llext
shutil.copyfileobj(fman, fdst)
shutil.copyfileobj(fllext, fdst)

for p_alias in platform_configs[platform].aliases:
lib_dir = sof_output_dir / p_alias

if args.key_type_subdir != "none":
lib_dir = lib_dir / args.key_type_subdir
lib_dir.mkdir(parents=True, exist_ok=True)
alias_libname = ''.join(['sof-', p_alias, '-', key, '.ri'])
symlink_or_copy(lib_install_dir, lib_name,
lib_dir, alias_libname)

def install_platform(platform, sof_output_dir, platf_build_environ, platform_wconfig):

Expand Down Expand Up @@ -1042,8 +1091,7 @@ def install_platform(platform, sof_output_dir, platf_build_environ, platform_wco
symlink_or_copy(install_key_dir, output_fwname, install_key_dir, f"sof-{p_alias}.ri")

if args.deployable_build and platform_configs[platform].ipc4:
install_lib(sof_output_dir / '..' / 'sof-ipc4-lib' / platform, abs_build_dir,
platform_wconfig)
install_lib(platform, sof_output_dir, abs_build_dir, platform_wconfig)


# sof-info/ directory
Expand Down
1 change: 1 addition & 0 deletions src/audio/aria/llext/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,5 @@ sof_llext_build("aria"
../aria_hifi5.c
../aria_hifi3.c
../aria_generic.c
LIB openmodules
)
1 change: 1 addition & 0 deletions src/audio/asrc/llext/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,5 @@ sof_llext_build("asrc"
../asrc_farrow.c
../asrc_farrow_generic.c
../asrc_ipc4.c
LIB openmodules
)
1 change: 1 addition & 0 deletions src/audio/codec/dts/llext/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ if(CONFIG_DTS_CODEC_STUB)
sof_llext_build("dts"
SOURCES ../dts.c
../dts_stub.c
LIB openmodules
)
target_include_directories(dts_llext_lib PRIVATE
"../../../../../third_party/include"
Expand Down
1 change: 1 addition & 0 deletions src/audio/crossover/llext/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,5 @@ sof_llext_build("crossover"
SOURCES ../crossover.c
../crossover_generic.c
../crossover_ipc4.c
LIB openmodules
)
1 change: 1 addition & 0 deletions src/audio/dcblock/llext/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,5 @@ sof_llext_build("dcblock"
../dcblock_hifi3.c
../dcblock_hifi4.c
../dcblock_ipc4.c
LIB openmodules
)
1 change: 1 addition & 0 deletions src/audio/drc/llext/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,5 @@ sof_llext_build("drc"
../drc_hifi3.c
../drc_hifi4.c
../drc_math_hifi3.c
LIB openmodules
)
9 changes: 5 additions & 4 deletions src/audio/eq_fir/llext/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,9 @@

sof_llext_build("eq_fir"
SOURCES ../eq_fir_hifi3.c
../eq_fir_hifi2ep.c
../eq_fir_generic.c
../eq_fir.c
../eq_fir_ipc4.c
../eq_fir_hifi2ep.c
../eq_fir_generic.c
../eq_fir.c
../eq_fir_ipc4.c
LIB openmodules
)
1 change: 1 addition & 0 deletions src/audio/eq_iir/llext/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,5 @@ sof_llext_build("eq_iir"
SOURCES ../eq_iir.c
../eq_iir_ipc4.c
../eq_iir_generic.c
LIB openmodules
)
1 change: 1 addition & 0 deletions src/audio/google/llext_ctc/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ sof_llext_build("google_ctc_audio_processing"
SOURCES ../google_ctc_audio_processing.c
../google_ctc_audio_processing_ipc4.c
../google_ctc_audio_processing_mock.c
LIB openmodules
)
target_include_directories(google_ctc_audio_processing_llext_lib PRIVATE
"${sof_top_dir}/third_party/include"
Expand Down
1 change: 1 addition & 0 deletions src/audio/google/llext_rtc/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ if(CONFIG_GOOGLE_RTC_AUDIO_PROCESSING_MOCK)
sof_llext_build("google_rtc_audio_processing"
SOURCES ../google_rtc_audio_processing.c
../google_rtc_audio_processing_mock.c
LIB openmodules
)
target_include_directories(google_rtc_audio_processing_llext_lib PRIVATE
"${sof_top_dir}/third_party/include"
Expand Down
1 change: 1 addition & 0 deletions src/audio/igo_nr/llext/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ if(CONFIG_DTS_CODEC_STUB)
sof_llext_build("igo_nr"
SOURCES ../igo_nr.c
../igo_nr_stub.c
LIB openmodules
)
target_include_directories(igo_nr_llext_lib PRIVATE
"../../../../third_party/include"
Expand Down
1 change: 1 addition & 0 deletions src/audio/mfcc/llext/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,5 @@ sof_llext_build("mfcc"
../mfcc_generic.c
../mfcc_hifi3.c
../mfcc_hifi4.c
LIB openmodules
)
1 change: 1 addition & 0 deletions src/audio/mixin_mixout/llext/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,5 @@ sof_llext_build("mixin_mixout"
../mixin_mixout_hifi3.c
../mixin_mixout_hifi5.c
../mixin_mixout_generic.c
LIB openmodules
)
1 change: 1 addition & 0 deletions src/audio/multiband_drc/llext/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,5 @@ sof_llext_build("multiband_drc"
SOURCES ../multiband_drc.c
../multiband_drc_generic.c
../multiband_drc_ipc4.c
LIB openmodules
)
1 change: 1 addition & 0 deletions src/audio/mux/llext/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,5 @@ sof_llext_build("mux"
SOURCES ../mux.c
../mux_generic.c
../mux_ipc4.c
LIB openmodules
)
1 change: 1 addition & 0 deletions src/audio/rtnr/llext/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ if(CONFIG_COMP_RTNR_STUB)
sof_llext_build("rtnr"
SOURCES ../rtnr.c
../rtnr_stub.c
LIB openmodules
)
else()
message(FATAL_ERROR "Add library linking support in src/audio/rtnr/llext/CMakeFiles.txt")
Expand Down
1 change: 1 addition & 0 deletions src/audio/selector/llext/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,5 @@
sof_llext_build("selector"
SOURCES ../selector.c
../selector_generic.c
LIB openmodules
)
2 changes: 2 additions & 0 deletions src/audio/src/llext/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ sof_llext_build("src"
../src_common.c
../src_ipc4.c
../src_lite.c
LIB openmodules
)
else()
sof_llext_build("src"
Expand All @@ -21,5 +22,6 @@ sof_llext_build("src"
../src.c
../src_common.c
../src_ipc4.c
LIB openmodules
)
endif()
1 change: 1 addition & 0 deletions src/audio/tdfb/llext/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,5 @@ sof_llext_build("tdfb"
../tdfb_hifiep.c
../tdfb_hifi3.c
../tdfb_ipc4.c
LIB openmodules
)
1 change: 1 addition & 0 deletions src/audio/volume/llext/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,5 @@ sof_llext_build("volume"
../volume_hifi4_with_peakvol.c
../volume.c
../volume_ipc4.c
LIB openmodules
)
Loading
Loading