Skip to content

Commit 0d21245

Browse files
seokhun-eom24ewoodev
authored andcommitted
os/kernel/binary_manager: Add validation for in-use BP kernel addresses
Add new function `binary_manager_is_bp_kernel_address_valid` to validate in-use BP's kernel addresses against registered partition addresses. If in-use BP's kernel address is wrong, binary_manager should recover BP from partition information. Signed-off-by: seokhun-eom <seokhun.eom@samsung.com>
1 parent d5d79bf commit 0d21245

1 file changed

Lines changed: 40 additions & 0 deletions

File tree

os/kernel/binary_manager/binary_manager_bootparam.c

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -364,6 +364,41 @@ int binary_manager_write_bootparam(binmgr_bpdata_t *bp_data)
364364
return binary_manager_write_bootparam_to_slot(bp_data, g_bp_info.inuse_idx ^ 1);
365365
}
366366

367+
/****************************************************************************
368+
* Name: binary_manager_is_bp_kernel_address_valid
369+
*
370+
* Description:
371+
* This function checks whether in-use BP kernel addresses are valid
372+
* against registered partition addresses.
373+
*
374+
****************************************************************************/
375+
static bool binary_manager_is_bp_kernel_address_valid(binmgr_bpdata_t *bp_data)
376+
{
377+
uint32_t part_idx;
378+
binmgr_kinfo_t *kdata;
379+
380+
if (!bp_data) {
381+
bmdbg("BP data is NULL\n");
382+
return false;
383+
}
384+
385+
kdata = binary_manager_get_kdata();
386+
if (!kdata || kdata->part_count == 0 || kdata->part_count > BOOTPARAM_COUNT || !kdata->part_info) {
387+
bmdbg("Invalid kernel partition data\n");
388+
return false;
389+
}
390+
391+
for (part_idx = 0; part_idx < kdata->part_count; part_idx++) {
392+
if (bp_data->head.address[part_idx] != kdata->part_info[part_idx].address) {
393+
bmdbg("Invalid in-use BP kernel address: part[%u] BP 0x%x, partition 0x%x\n",
394+
part_idx, bp_data->head.address[part_idx], kdata->part_info[part_idx].address);
395+
return false;
396+
}
397+
}
398+
399+
return true;
400+
}
401+
367402
/****************************************************************************
368403
* Name: binary_manager_is_set_mismatch
369404
*
@@ -641,6 +676,11 @@ int binary_manager_check_bootparam_set(void)
641676
return BINMGR_OPERATION_FAIL;
642677
}
643678

679+
if (!binary_manager_is_bp_kernel_address_valid(bp_data)) {
680+
bmdbg("Invalid in-use BP kernel address detected. Run BP recovery from partition information\n");
681+
return BINMGR_OPERATION_FAIL;
682+
}
683+
644684
bmdbg("BP set is already aligned and active set %s is valid\n", GET_PARTNAME(bp_data->head.active_idx));
645685
return BINMGR_OK;
646686
}

0 commit comments

Comments
 (0)