Skip to content

Commit 98701fc

Browse files
mem: add check if region being mapped fits into LLEXT mem region
Add a _safe check, verify if virtual memory being mapped for LLEXT module fits into the region it belongs Signed-off-by: Marcin Szkudlinski <marcin.szkudlinski@intel.com>
1 parent 0a5d62e commit 98701fc

File tree

1 file changed

+21
-9
lines changed

1 file changed

+21
-9
lines changed

src/library_manager/llext_manager.c

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -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

6969
static 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

Comments
 (0)