arm-trusted-firmware/plat/imx/common/imx_common.c
Sascha Hauer 7eae1db027 feat(imx): add helper to take params from BL2
So far the i.MX BL31 doesn't take any parameters. This means the BL32
image base address and whether or not a BL32 image is used at all has to
be hardcoded in BL31.

This adds a helper function that allows to take params from BL2 safely.
On i.MX BL2 is usually U-Boot SPL which passes random values in arg0,
so make sure arg0 is within the internal SRAM range before accessing it
as a pointer. Also make sure arg0 is sufficiently aligned and the header
type and version is correct.

Change-Id: Idab8013a1d6dabf50a83c75f3e6f831de4a537e9
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
2024-04-26 11:04:56 +02:00

48 lines
1 KiB
C

/*
* Copyright (c) 2024, Pengutronix, Inc. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#include <errno.h>
#include <stdint.h>
#include <common/bl_common.h>
#include <common/desc_image_load.h>
#include <plat_common.h>
/*
* This function checks if @arg0 can safely be accessed as a pointer
* and if it does, it fills in @bl32_info and @bl33_info with data
* found in @arg0.
*
* Returns 0 when @arg0 can be used as entry point info and a negative
* error code otherwise.
*/
int imx_bl31_params_parse(uintptr_t arg0, uintptr_t ocram_base,
uintptr_t ocram_size,
entry_point_info_t *bl32_info,
entry_point_info_t *bl33_info)
{
bl_params_t *v2 = (void *)(uintptr_t)arg0;
if (arg0 & 0x3) {
return -EINVAL;
}
if (arg0 < ocram_base || arg0 >= ocram_base + ocram_size) {
return -EINVAL;
}
if (v2->h.version != PARAM_VERSION_2) {
return -EINVAL;
}
if (v2->h.type != PARAM_BL_PARAMS) {
return -EINVAL;
}
bl31_params_parse_helper(arg0, bl32_info, bl33_info);
return 0;
}