@@ -740,7 +740,6 @@ int llext_manager_add_domain(const uint32_t component_id, struct k_mem_domain *d
740740 const uint32_t entry_index = LIB_MANAGER_GET_MODULE_INDEX (module_id );
741741 const unsigned int mod_idx = llext_manager_mod_find (ctx , entry_index );
742742 struct lib_manager_module * mctx = ctx -> mod + mod_idx ;
743- int ret ;
744743
745744 /* Executable code (.text) */
746745 uintptr_t va_base_text = mctx -> segment [LIB_MANAGER_TEXT ].addr ;
@@ -754,8 +753,9 @@ int llext_manager_add_domain(const uint32_t component_id, struct k_mem_domain *d
754753 uintptr_t va_base_data = mctx -> segment [LIB_MANAGER_DATA ].addr ;
755754 size_t data_size = mctx -> segment [LIB_MANAGER_DATA ].size ;
756755
757- ret = llext_manager_add_partition (domain , va_base_text , text_size ,
758- K_MEM_PARTITION_P_RX_U_RX );
756+ int ret = llext_manager_add_partition (domain , va_base_text , text_size ,
757+ K_MEM_PARTITION_P_RX_U_RX );
758+
759759 if (ret < 0 )
760760 return ret ;
761761
@@ -775,6 +775,64 @@ int llext_manager_add_domain(const uint32_t component_id, struct k_mem_domain *d
775775
776776 return 0 ;
777777}
778+
779+ static int llext_manager_rm_partition (struct k_mem_domain * domain ,
780+ uintptr_t addr , size_t size ,
781+ k_mem_partition_attr_t attr )
782+ {
783+ size_t pre_pad_size = addr & (PAGE_SZ - 1 );
784+ struct k_mem_partition part = {
785+ .start = addr - pre_pad_size ,
786+ .size = ALIGN_UP (pre_pad_size + size , PAGE_SZ ),
787+ .attr = attr ,
788+ };
789+
790+ tr_dbg (& lib_manager_tr , "remove %#zx @ %lx partition" , part .size , part .start );
791+ return k_mem_domain_remove_partition (domain , & part );
792+ }
793+
794+ int llext_manager_rm_domain (const uint32_t component_id , struct k_mem_domain * domain )
795+ {
796+ const uint32_t module_id = IPC4_MOD_ID (component_id );
797+ struct lib_manager_mod_ctx * ctx = lib_manager_get_mod_ctx (module_id );
798+ const uint32_t entry_index = LIB_MANAGER_GET_MODULE_INDEX (module_id );
799+ const unsigned int mod_idx = llext_manager_mod_find (ctx , entry_index );
800+ struct lib_manager_module * mctx = ctx -> mod + mod_idx ;
801+
802+ /* Executable code (.text) */
803+ uintptr_t va_base_text = mctx -> segment [LIB_MANAGER_TEXT ].addr ;
804+ size_t text_size = mctx -> segment [LIB_MANAGER_TEXT ].size ;
805+
806+ /* Read-only data (.rodata and others) */
807+ uintptr_t va_base_rodata = mctx -> segment [LIB_MANAGER_RODATA ].addr ;
808+ size_t rodata_size = mctx -> segment [LIB_MANAGER_RODATA ].size ;
809+
810+ /* Writable data (.data, .bss and others) */
811+ uintptr_t va_base_data = mctx -> segment [LIB_MANAGER_DATA ].addr ;
812+ size_t data_size = mctx -> segment [LIB_MANAGER_DATA ].size ;
813+
814+ int ret = llext_manager_rm_partition (domain , va_base_text , text_size ,
815+ K_MEM_PARTITION_P_RX_U_RX );
816+
817+ if (ret < 0 )
818+ return ret ;
819+
820+ if (rodata_size ) {
821+ ret = llext_manager_rm_partition (domain , va_base_rodata , rodata_size ,
822+ K_MEM_PARTITION_P_RO_U_RO );
823+ if (ret < 0 )
824+ return ret ;
825+ }
826+
827+ if (data_size ) {
828+ ret = llext_manager_rm_partition (domain , va_base_data , data_size ,
829+ K_MEM_PARTITION_P_RW_U_RW );
830+ if (ret < 0 )
831+ return ret ;
832+ }
833+
834+ return 0 ;
835+ }
778836#endif
779837
780838int llext_manager_free_module (const uint32_t component_id )
0 commit comments