@@ -57,13 +57,13 @@ static int llext_manager_update_flags(void __sparse_cache *vma, size_t size, uin
5757 ALIGN_UP (pre_pad_size + size , PAGE_SZ ), flags );
5858}
5959
60- static int llext_manager_align_map (void __sparse_cache * vma , size_t size , uint32_t flags )
60+ static int llext_manager_align_map (const struct sys_mm_drv_region * virtual_region ,
61+ void __sparse_cache * vma , size_t size , uint32_t flags )
6162{
6263 size_t pre_pad_size = (uintptr_t )vma & (PAGE_SZ - 1 );
6364 void * aligned_vma = (__sparse_force uint8_t * )vma - pre_pad_size ;
64-
65- return sys_mm_drv_map_region (aligned_vma , POINTER_TO_UINT (NULL ),
66- ALIGN_UP (pre_pad_size + size , PAGE_SZ ), flags );
65+ return sys_mm_drv_map_region_safe (virtual_region , aligned_vma , POINTER_TO_UINT (NULL ),
66+ ALIGN_UP (pre_pad_size + size , PAGE_SZ ), flags );
6767}
6868
6969static int llext_manager_align_unmap (void __sparse_cache * vma , size_t size )
@@ -93,15 +93,16 @@ static void llext_manager_detached_update_flags(void __sparse_cache *vma,
9393 * sections that belong to the specified 'region' and are contained in the
9494 * memory range, then remap the same area according to the 'flags' parameter.
9595 */
96- static int llext_manager_load_data_from_storage (const struct llext_loader * ldr ,
96+ static int llext_manager_load_data_from_storage (const struct sys_mm_drv_region * virtual_region ,
97+ const struct llext_loader * ldr ,
9798 const struct llext * ext ,
9899 enum llext_mem region ,
99100 void __sparse_cache * vma ,
100101 size_t size , uint32_t flags )
101102{
102103 unsigned int i ;
103104 const void * region_addr ;
104- int ret = llext_manager_align_map (vma , size , SYS_MM_MEM_PERM_RW );
105+ int ret = llext_manager_align_map (virtual_region , vma , size , SYS_MM_MEM_PERM_RW );
105106
106107 if (ret < 0 ) {
107108 tr_err (& lib_manager_tr , "cannot map %u of %p" , size , (__sparse_force void * )vma );
@@ -240,14 +241,25 @@ static int llext_manager_load_module(struct lib_manager_module *mctx)
240241 const struct llext_loader * ldr = & mctx -> ebl -> loader ;
241242 const struct llext * ext = mctx -> llext ;
242243
244+ /* find dedicated virtual memory zone */
245+ const struct sys_mm_drv_region * virtual_memory_regions = sys_mm_drv_query_memory_regions ();
246+ const struct sys_mm_drv_region * virtual_region ;
247+
248+ SYS_MM_DRV_MEMORY_REGION_FOREACH (virtual_memory_regions , virtual_region ) {
249+ if (virtual_region -> attr == VIRTUAL_REGION_LLEXT_LIBRARIES_ATTR )
250+ break ;
251+ }
252+ if (!virtual_region || !virtual_region -> size )
253+ return - EFAULT ;
254+
243255 /* Copy Code */
244- ret = llext_manager_load_data_from_storage (ldr , ext , LLEXT_MEM_TEXT ,
256+ ret = llext_manager_load_data_from_storage (virtual_region , ldr , ext , LLEXT_MEM_TEXT ,
245257 va_base_text , text_size , SYS_MM_MEM_PERM_EXEC );
246258 if (ret < 0 )
247259 return ret ;
248260
249261 /* Copy read-only data */
250- ret = llext_manager_load_data_from_storage (ldr , ext , LLEXT_MEM_RODATA ,
262+ ret = llext_manager_load_data_from_storage (virtual_region , ldr , ext , LLEXT_MEM_RODATA ,
251263 va_base_rodata , rodata_size , 0 );
252264 if (ret < 0 )
253265 goto e_text ;
@@ -258,7 +270,7 @@ static int llext_manager_load_module(struct lib_manager_module *mctx)
258270 * spans over the BSS area as well, so the mapping will cover
259271 * both, but only LLEXT_MEM_DATA sections will be copied.
260272 */
261- ret = llext_manager_load_data_from_storage (ldr , ext , LLEXT_MEM_DATA ,
273+ ret = llext_manager_load_data_from_storage (virtual_region , ldr , ext , LLEXT_MEM_DATA ,
262274 va_base_data , data_size , SYS_MM_MEM_PERM_RW );
263275 if (ret < 0 )
264276 goto e_rodata ;
0 commit comments