Skip to content

Commit

Permalink
deployable build: install LLEXT modules into the tree
Browse files Browse the repository at this point in the history
Install loadable LLEXT modules into the deployment tree and
create symbolic links for them.

Signed-off-by: Guennadi Liakhovetski <[email protected]>
  • Loading branch information
lyakh committed May 2, 2024
1 parent ff87687 commit a8767bd
Showing 1 changed file with 84 additions and 2 deletions.
86 changes: 84 additions & 2 deletions scripts/xtensa-build-zephyr.py
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,8 @@

sof_fw_version = None

signing_key = None

if py_platform.system() == "Windows":
xtensa_tools_version_postfix = "-win32"
elif py_platform.system() == "Linux":
Expand Down Expand Up @@ -597,13 +599,17 @@ def clean_staging(platform):
# detailed comments in west.yml
RIMAGE_SOURCE_DIR = west_top / "sof" / "tools" / "rimage"

platform_wconfig = None


def rimage_west_configuration(platform_dict, dest_dir):
"""Configure rimage in a new file `dest_dir/westconfig.ini`, starting
from the workspace .west/config.
Returns the pathlib.Path to the new file.
"""

global platform_wconfig

saved_local_var = os.environ.get('WEST_CONFIG_LOCAL')
workspace_west_config_path = os.environ.get('WEST_CONFIG_LOCAL',
str(west_top / ".west" / "config"))
Expand Down Expand Up @@ -671,12 +677,12 @@ def rimage_options(platform_dict):
example: [ (-f, 2.5.0), (-b, 1), (-k, key.pem),... ]
"""
global signing_key
opts = []

if args.verbose > 0:
opts.append(("-v",) * args.verbose)

signing_key = None
if args.key:
key_path = pathlib.Path(args.key)
assert key_path.exists(), f"{key_path} not found"
Expand Down Expand Up @@ -902,6 +908,80 @@ def build_platforms():
symlinks=True, ignore_dangling_symlinks=True, dirs_exist_ok=True)


def install_lib(sof_lib_dir, abs_build_dir):
"""[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
global platform_wconfig

with os.scandir(str(abs_build_dir)) as iter:
rimage_executable = platform_wconfig.get("rimage.path")
if rimage_executable is None:
rimage_executable = platform_wconfig.get("rimage.path", None,
west_config.ConfigFile.LOCAL)

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)

for entry in iter:
if (not entry.is_dir or
not entry.name.endswith('_llext')):
continue

entry_path = pathlib.Path(entry.path)

uuids = entry_path / 'llext.uuid'
if not os.path.exists(uuids):
print(f"Directory {entry.name} has no llext.uuid file. Skipping.")
continue

# replace '_llext' with '.llext', e.g.
# 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 + '.so')
llext_output = entry_path / llext_file

sign_cmd = [str(rimage_executable), "-o", str(llext_output),
"-e", "-c", str(rimage_cfg),
"-k", str(signing_key), "-l", "-r",
str(llext_input)]
execute_command(sign_cmd, cwd=west_top)

# Explicitly rely on default exception handling
fdst = open(dst, 'wb')
fllext = open(llext_output, 'rb')
fman = open(llext_output.with_suffix('.llext.xman'), 'rb')

# Concatenate the manifest and the llext
shutil.copyfileobj(fman, fdst)
shutil.copyfileobj(fllext, fdst)

fdst.close()
fman.close()
fllext.close()

# Create symbolic links for all UUIDs
with open(uuids, 'r') as f_llext:
lines = f_llext.readlines()
for line in lines:
linkname = line.strip() + '.bin'
link = sof_lib_dir / linkname
if (os.path.exists(link)):
link.unlink()
symlink_or_copy(sof_lib_dir, llext_file,
sof_lib_dir, linkname)
f_llext.close()


def install_platform(platform, sof_output_dir, platf_build_environ):

# Keep in sync with caller
Expand Down Expand Up @@ -948,6 +1028,9 @@ def install_platform(platform, sof_output_dir, platf_build_environ):
for p_alias in platform_configs[platform].aliases:
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)


# sof-info/ directory

Expand Down Expand Up @@ -1033,7 +1116,6 @@ class InstFile:
gzip_res.result() # throws exception if gzip unexpectedly failed
gzip_threads.shutdown()


# Zephyr's CONFIG_KERNEL_BIN_NAME default value
BIN_NAME = 'zephyr'

Expand Down

0 comments on commit a8767bd

Please sign in to comment.