2424#include < sof/audio/module_adapter/library/native_system_service.h>
2525#include < sof/audio/module_adapter/library/native_system_agent.h>
2626
27+ /* sof/lib_manager.h pulls C-only component headers into this C++ unit. */
2728struct sof_man_module ;
2829extern " C" const struct sof_man_module *
2930lib_manager_get_module_manifest (const uint32_t module_id);
3031extern " C" void
3132lib_manager_get_instance_bss_address (uint32_t instance_id,
3233 const struct sof_man_module *mod,
33- void **va_addr, size_t *size);
34+ void __sparse_cache **va_addr, size_t *size);
3435
3536using namespace intel_adsp ;
3637using namespace intel_adsp ::system;
@@ -46,6 +47,21 @@ namespace intel_adsp
4647namespace system
4748{
4849
50+ static void *system_agent_get_instance_bss (uint32_t module_id,
51+ uint32_t instance_id,
52+ size_t *size)
53+ {
54+ const struct sof_man_module *mod = lib_manager_get_module_manifest (module_id);
55+ void __sparse_cache *base = NULL ;
56+
57+ *size = 0 ;
58+ if (!mod)
59+ return NULL ;
60+
61+ lib_manager_get_instance_bss_address (instance_id, mod, &base, size);
62+ return reinterpret_cast <void *>(base);
63+ }
64+
4965/* Structure storing handles to system service operations */
5066const APP_TASK_DATA AdspSystemService SystemAgent::system_service_ = {
5167 native_system_service_log_message,
@@ -98,15 +114,9 @@ void SystemAgent::CheckInDetector(DetectorModuleInterface& processing_module,
98114
99115void *SystemAgent::GetBssBase (void )
100116{
101- const struct sof_man_module *mod = lib_manager_get_module_manifest (module_id_);
102- void *base = NULL ;
103117 size_t size = 0 ;
104118
105- if (!mod)
106- return NULL ;
107-
108- lib_manager_get_instance_bss_address (instance_id_, mod, &base, &size);
109- return base;
119+ return system_agent_get_instance_bss (module_id_, instance_id_, &size);
110120}
111121
112122int SystemAgent::CheckIn (ProcessingModuleFactoryInterface& module_factory,
@@ -117,6 +127,19 @@ int SystemAgent::CheckIn(ProcessingModuleFactoryInterface& module_factory,
117127 void *obfuscated_parent_ppl,
118128 void **obfuscated_modinst_p)
119129{
130+ if (!module_placeholder) {
131+ size_t bss_size;
132+ void *bss_base = system_agent_get_instance_bss (module_id_, instance_id_,
133+ &bss_size);
134+
135+ if (!bss_base || processing_module_size > bss_size)
136+ return -ENOMEM ;
137+
138+ module_placeholder = reinterpret_cast <ModulePlaceholder *>(bss_base);
139+ }
140+
141+ module_size_ = processing_module_size;
142+
120143 IoPinsInfo pins_info;
121144 const dsp_fw::DwordArray& cfg_ipc_msg =
122145 *reinterpret_cast <const dsp_fw::DwordArray*>(obfuscated_mod_cfg);
@@ -140,7 +163,14 @@ int SystemAgent::CheckIn(ProcessingModuleFactoryInterface& module_factory,
140163 settings.DeduceBaseModuleCfgExt (prerequisites.input_pins_count ,
141164 prerequisites.output_pins_count );
142165
143- module_factory.Create (*this , module_placeholder, ModuleInitialSettings (settings), pins_info);
166+ int ret = module_factory.Create (*this , module_placeholder,
167+ ModuleInitialSettings (settings), pins_info);
168+ if (ret)
169+ return ret;
170+
171+ if (!module_handle_)
172+ return -EINVAL ;
173+
144174 IadkModuleAdapter& module_adapter = *reinterpret_cast <IadkModuleAdapter*>(module_handle_);
145175 *obfuscated_modinst_p = &module_adapter;
146176 reinterpret_cast <intel_adsp::ProcessingModuleInterface*>(module_placeholder)->Init ();
0 commit comments