From 3bbe5ec09a273955375d9d41f0416bffa010e995 Mon Sep 17 00:00:00 2001 From: Adrian Warecki Date: Wed, 28 Feb 2024 17:07:19 +0100 Subject: [PATCH] lib_manager: lib_manager_get_library_manifest --- src/audio/module_adapter/module/modules.c | 11 ++++----- src/include/sof/lib_manager.h | 30 ++++++++++++++++------- src/ipc/ipc4/helper.c | 30 ++++++++++++++++------- src/library_manager/lib_manager.c | 23 +++-------------- src/library_manager/llext_manager.c | 13 +++------- 5 files changed, 53 insertions(+), 54 deletions(-) diff --git a/src/audio/module_adapter/module/modules.c b/src/audio/module_adapter/module/modules.c index 4c2a1808c95b..893a428cee73 100644 --- a/src/audio/module_adapter/module/modules.c +++ b/src/audio/module_adapter/module/modules.c @@ -87,17 +87,16 @@ static int modules_init(struct processing_module *mod) uint32_t log_handle = (uint32_t) mod->dev->drv->tctx; /* Connect loadable module interfaces with module adapter entity. */ /* Check if native Zephyr lib is loaded */ - struct sof_man_fw_desc *desc; - desc = lib_manager_get_library_module_desc(module_id); - if (!desc) { + const struct sof_man_module *const module_entry = + lib_manager_get_library_manifest(module_id); + + if (!module_entry) { comp_err(dev, "modules_init(): Failed to load manifest"); return -ENOMEM; } - struct sof_man_module *module_entry = - (struct sof_man_module *)((char *)desc + SOF_MAN_MODULE_OFFSET(0)); - struct sof_module_api_build_info *mod_buildinfo = + const struct sof_module_api_build_info *const mod_buildinfo = (struct sof_module_api_build_info *) (module_entry->segment[SOF_MAN_SEGMENT_TEXT].v_base_addr); diff --git a/src/include/sof/lib_manager.h b/src/include/sof/lib_manager.h index f149b7ea2df1..ed781f9bd835 100644 --- a/src/include/sof/lib_manager.h +++ b/src/include/sof/lib_manager.h @@ -117,6 +117,27 @@ static inline struct lib_manager_mod_ctx *lib_manager_get_mod_ctx(int module_id) return _ext_lib->desc[lib_id]; } + +/* + * \brief Get library manifest for given module id + * + * param[in] module_id - used to get library manifest + * + * Gets library manifest descriptor using module_id to locate it + */ +static inline const struct sof_man_module *lib_manager_get_library_manifest(const uint32_t module_id) +{ + const uint32_t entry_index = LIB_MANAGER_GET_MODULE_INDEX(module_id); + + const struct lib_manager_mod_ctx *const ctx = lib_manager_get_mod_ctx(module_id); + + if (!ctx || ctx->desc) + return NULL; + + return (const struct sof_man_module *)((const char *)ctx->desc + + SOF_MAN_ELF_TEXT_OFFSET + + SOF_MAN_MODULE_OFFSET(entry_index)); +} #endif /* @@ -134,15 +155,6 @@ void lib_manager_init(void); */ int lib_manager_register_module(const struct sof_man_module *const mod); -/* - * \brief Get library module manifest descriptor - * - * param[in] module_id - used to get text manifest offset - * - * Gets firmware manifest descriptor using module_id to locate it - */ -struct sof_man_fw_desc *lib_manager_get_library_module_desc(int module_id); - /* * \brief Allocate module * diff --git a/src/ipc/ipc4/helper.c b/src/ipc/ipc4/helper.c index 4707ef946edb..c5ee6f7ea37a 100644 --- a/src/ipc/ipc4/helper.c +++ b/src/ipc/ipc4/helper.c @@ -944,20 +944,20 @@ static const struct comp_driver *ipc4_library_get_drv(int module_id) const struct comp_driver *ipc4_get_comp_drv(int module_id) { - struct sof_man_fw_desc *desc = NULL; + const struct sof_man_fw_desc *desc = NULL; const struct comp_driver *drv; - struct sof_man_module *mod; - int entry_index; + const struct sof_man_module *mod; + uint32_t entry_index; #if CONFIG_LIBRARY return ipc4_library_get_drv(module_id); #endif #ifdef RIMAGE_MANIFEST - desc = (struct sof_man_fw_desc *)IMR_BOOT_LDR_MANIFEST_BASE; + desc = (const struct sof_man_fw_desc *)IMR_BOOT_LDR_MANIFEST_BASE; #else - /* Non-rimage platforms have no component facility yet. This - * needs to move to the platform layer. + /* Non-rimage platforms have no component facility yet. + * This needs to move to the platform layer. */ return NULL; #endif @@ -970,13 +970,26 @@ const struct comp_driver *ipc4_get_comp_drv(int module_id) entry_index = 1; else entry_index = module_id; + + if (entry_index >= desc->header.num_module_entries) { + tr_err(&comp_tr, "Error: entry index %d out of bounds.", entry_index); + return NULL; + } + + mod = (const struct sof_man_module *)((const char *)desc + + SOF_MAN_MODULE_OFFSET(entry_index)); } else { /* Library index greater than 0 possible only when LIBRARY_MANAGER * support enabled. */ #if CONFIG_LIBRARY_MANAGER - desc = lib_manager_get_library_module_desc(module_id); - entry_index = LIB_MANAGER_GET_MODULE_INDEX(module_id); + mod = lib_manager_get_library_manifest(module_id); + + if (!mod) { + tr_err(&comp_tr, "Error: Couldn't find loadable module with id %d.", + module_id); + return NULL; + } #else tr_err(&comp_tr, "Error: lib index:%d, while loadable libraries are not supported!!!", lib_idx); @@ -984,7 +997,6 @@ const struct comp_driver *ipc4_get_comp_drv(int module_id) #endif } /* Check already registered components */ - mod = (struct sof_man_module *)((char *)desc + SOF_MAN_MODULE_OFFSET(entry_index)); drv = ipc4_get_drv(mod->uuid); #if CONFIG_LIBRARY_MANAGER diff --git a/src/library_manager/lib_manager.c b/src/library_manager/lib_manager.c index 427f805a823e..2a5209471dad 100644 --- a/src/library_manager/lib_manager.c +++ b/src/library_manager/lib_manager.c @@ -346,25 +346,21 @@ uint32_t lib_manager_allocate_module(const struct comp_driver *drv, struct comp_ipc_config *ipc_config, const void *ipc_specific_config) { - struct sof_man_fw_desc *desc; const struct sof_man_module *mod; const struct ipc4_base_module_cfg *base_cfg = ipc_specific_config; int ret; uint32_t module_id = IPC4_MOD_ID(ipc_config->id); - uint32_t entry_index = LIB_MANAGER_GET_MODULE_INDEX(module_id); tr_dbg(&lib_manager_tr, "lib_manager_allocate_module(): mod_id: %#x", ipc_config->id); - desc = lib_manager_get_library_module_desc(module_id); - if (!desc) { + mod = lib_manager_get_library_manifest(module_id); + if (!mod) { tr_err(&lib_manager_tr, "lib_manager_allocate_module(): failed to get module descriptor"); return 0; } - mod = (struct sof_man_module *)((char *)desc + SOF_MAN_MODULE_OFFSET(entry_index)); - if (module_is_llext(mod)) return llext_manager_allocate_module(drv, ipc_config, ipc_specific_config); @@ -398,16 +394,13 @@ uint32_t lib_manager_allocate_module(const struct comp_driver *drv, int lib_manager_free_module(const struct comp_driver *drv, struct comp_ipc_config *ipc_config) { - struct sof_man_fw_desc *desc; const struct sof_man_module *mod; uint32_t module_id = IPC4_MOD_ID(ipc_config->id); - uint32_t entry_index = LIB_MANAGER_GET_MODULE_INDEX(module_id); int ret; tr_dbg(&lib_manager_tr, "lib_manager_free_module(): mod_id: %#x", ipc_config->id); - desc = lib_manager_get_library_module_desc(module_id); - mod = (struct sof_man_module *)((char *)desc + SOF_MAN_MODULE_OFFSET(entry_index)); + mod = lib_manager_get_library_manifest(module_id); if (module_is_llext(mod)) return llext_manager_free_module(drv, ipc_config); @@ -462,16 +455,6 @@ void lib_manager_init(void) sof->ext_library = &loader_ext_lib; } -struct sof_man_fw_desc *lib_manager_get_library_module_desc(int module_id) -{ - struct lib_manager_mod_ctx *ctx = lib_manager_get_mod_ctx(module_id); - uint8_t *buffptr = (uint8_t *)(ctx ? ctx->desc : NULL); - - if (!buffptr) - return NULL; - return (struct sof_man_fw_desc *)(buffptr + SOF_MAN_ELF_TEXT_OFFSET); -} - static void lib_manager_update_sof_ctx(struct sof_man_fw_desc *desc, uint32_t lib_id) { struct ext_library *_ext_lib = ext_lib_get(); diff --git a/src/library_manager/llext_manager.c b/src/library_manager/llext_manager.c index cdddfb25d63a..bd811bbe3471 100644 --- a/src/library_manager/llext_manager.c +++ b/src/library_manager/llext_manager.c @@ -172,26 +172,22 @@ uint32_t llext_manager_allocate_module(const struct comp_driver *drv, struct comp_ipc_config *ipc_config, const void *ipc_specific_config) { - struct sof_man_fw_desc *desc; const struct sof_man_module *mod; const struct ipc4_base_module_cfg *base_cfg = ipc_specific_config; int ret; uint32_t module_id = IPC4_MOD_ID(ipc_config->id); - uint32_t entry_index = LIB_MANAGER_GET_MODULE_INDEX(module_id); struct lib_manager_mod_ctx *ctx = lib_manager_get_mod_ctx(module_id); tr_dbg(&lib_manager_tr, "llext_manager_allocate_module(): mod_id: %#x", ipc_config->id); - desc = lib_manager_get_library_module_desc(module_id); - if (!ctx || !desc) { + mod = lib_manager_get_library_manifest(module_id); + if (!ctx || !mod) { tr_err(&lib_manager_tr, "llext_manager_allocate_module(): failed to get module descriptor"); return 0; } - mod = (struct sof_man_module *)((char *)desc + SOF_MAN_MODULE_OFFSET(entry_index)); - for (unsigned int i = 0; i < ARRAY_SIZE(ctx->segment_size); i++) ctx->segment_size[i] = mod->segment[i].flags.r.length * PAGE_SZ; @@ -211,16 +207,13 @@ uint32_t llext_manager_allocate_module(const struct comp_driver *drv, int llext_manager_free_module(const struct comp_driver *drv, struct comp_ipc_config *ipc_config) { - struct sof_man_fw_desc *desc; const struct sof_man_module *mod; uint32_t module_id = IPC4_MOD_ID(ipc_config->id); - uint32_t entry_index = LIB_MANAGER_GET_MODULE_INDEX(module_id); int ret; tr_dbg(&lib_manager_tr, "llext_manager_free_module(): mod_id: %#x", ipc_config->id); - desc = lib_manager_get_library_module_desc(module_id); - mod = (struct sof_man_module *)((char *)desc + SOF_MAN_MODULE_OFFSET(entry_index)); + mod = lib_manager_get_library_manifest(module_id); ret = llext_manager_unload_module(module_id, mod); if (ret < 0)