[PATCH 1/2] habv4: correct habv4 rom vector table
Ahmad Fatoum
a.fatoum at pengutronix.de
Thu Jan 11 07:57:18 PST 2024
Hello Stefan,
On 11.01.24 16:42, Stefan Kerkmann wrote:
> All function signatures have been taken from the NXP manual "High
> Assurance Boot Version 4 Application Programming Interface Reference
> Manual" revision 1.4 under section "4.5 ROM vector table". A copy can be
> obtained from the imx code signing tool (imx-cst).
>
> Signed-off-by: Stefan Kerkmann <s.kerkmann at pengutronix.de>
> ---
> drivers/hab/habv4.c | 50 ++++++++++++++++++++++++++++++--------------------
> 1 file changed, 30 insertions(+), 20 deletions(-)
>
> diff --git a/drivers/hab/habv4.c b/drivers/hab/habv4.c
> index ed6d4db77c..dfa0207435 100644
> --- a/drivers/hab/habv4.c
> +++ b/drivers/hab/habv4.c
> @@ -144,31 +144,41 @@ struct hab_header {
> uint8_t par;
> } __packed;
>
> -typedef enum hab_status hab_loader_callback_fn(void **start, uint32_t *bytes, const void *boot_data);
> +typedef enum hab_status hab_loader_callback_fn(void **start, size_t *bytes, const void *boot_data);
> +typedef void (*hab_image_entry_fn)(void);
While it only matter for forward declaration, perhaps, change this
to be a non-pointer like hab_loader_callback_fn above?
>
> +/* This table is constructed from the NXP manual "High Assurance Boot Version 4
> + * Application Programming Interface Reference Manual", section 4.5 ROM vector
> + * table. Revision 1.4 */
> struct habv4_rvt {
> struct hab_header header;
> enum hab_status (*entry)(void);
> enum hab_status (*exit)(void);
> - enum hab_status (*check_target)(enum hab_target target, const void *start, uint32_t bytes);
> - void *(*authenticate_image)(uint8_t cid, uint32_t ivt_offset, void **start, uint32_t *bytes, hab_loader_callback_fn *loader);
> - enum hab_status (*run_dcd)(const void *dcd);
> - enum hab_status (*run_csf)(const void *csf, uint8_t cid);
> + enum hab_status (*check_target)(enum hab_target target, const void *start, size_t bytes);
> + void *(*authenticate_image)(uint8_t cid, ptrdiff_t ivt_offset, void **start, size_t *bytes, hab_loader_callback_fn *loader);
Here you explicitly use a pointer to a function.
> + enum hab_status (*run_dcd)(const uint8_t *dcd);
> + enum hab_status (*run_csf)(const uint8_t *csf, uint8_t cid, uint32_t srkmask);
> enum hab_status (*assert)(enum hab_assertion assertion, const void *data, uint32_t count);
> - enum hab_status (*report_event)(enum hab_status status, uint32_t index, void *event, uint32_t *bytes);
> + enum hab_status (*report_event)(enum hab_status status, uint32_t index, uint8_t *event, size_t *bytes);
> enum hab_status (*report_status)(enum hab_config *config, enum habv4_state *state);
> void (*failsafe)(void);
> + hab_image_entry_fn(* authenticate_image_no_dcd)(uint8_t cid, ptrdiff_t ivt_offset, void **start, size_t *bytes, hab_loader_callback_fn loader);
And here you rely on a function pointer being automatically derived.
While that's ok from a correctness point of view, for symmetry, it
would be better to stick to one type.
> + uint32_t(* get_version)(void);
Nitpick: space after uint32_t and not before get_version.
> + enum hab_status (*authenticate_container)(uint8_t cid, ptrdiff_t ivt_offset, void **start, size_t *bytes, hab_loader_callback_fn loader, uint32_t srkmask, int skip_dcd);
> } __packed;
>
> -#define FSL_SIP_HAB 0xC2000007
This is removed without replacement?
> -#define FSL_SIP_HAB_AUTHENTICATE 0x00
> -#define FSL_SIP_HAB_ENTRY 0x01
> -#define FSL_SIP_HAB_EXIT 0x02
> -#define FSL_SIP_HAB_REPORT_EVENT 0x03
> -#define FSL_SIP_HAB_REPORT_STATUS 0x04
> -#define FSL_SIP_HAB_FAILSAFE 0x05
> -#define FSL_SIP_HAB_CHECK_TARGET 0x06
> -#define FSL_SIP_HAB_GET_VERSION 0x07
> +#define FSL_SIP_HAB 0xC2000007
> +
> +enum hab_sip_cmd {
> + FSL_SIP_HAB_AUTHENTICATE = 0x00,
> + FSL_SIP_HAB_ENTRY = 0x01,
> + FSL_SIP_HAB_EXIT = 0x02,
> + FSL_SIP_HAB_REPORT_EVENT = 0x03,
> + FSL_SIP_HAB_REPORT_STATUS = 0x04,
> + FSL_SIP_HAB_FAILSAFE = 0x05,
> + FSL_SIP_HAB_CHECK_TARGET = 0x06,
> + FSL_SIP_HAB_GET_VERSION = 0x07,
> +};
>
> static enum hab_status hab_sip_report_status(enum hab_config *config,
> enum habv4_state *state)
> @@ -211,8 +221,8 @@ static uint32_t hab_sip_get_version(void)
> #define IMX8MP_ROM_OCRAM_ADDRESS 0x90D040
>
> static enum hab_status imx8m_read_sram_events(enum hab_status status,
> - uint32_t index, void *event,
> - uint32_t *bytes)
> + uint32_t index, uint8_t *event,
> + size_t *bytes)
> {
> struct hab_event_record *events[10];
> int num_events = 0;
> @@ -478,7 +488,7 @@ static void habv4_display_event_record(struct hab_event_record *record)
> pr_err("Engine: %s (0x%02x)\n", habv4_get_engine_str(record->engine), record->engine);
> }
>
> -static void habv4_display_event(uint8_t *data, uint32_t len)
> +static void habv4_display_event(uint8_t *data, size_t len)
> {
> unsigned int i;
>
> @@ -525,7 +535,7 @@ static bool is_known_rng_fail_event(const uint8_t *data, size_t len)
> return false;
> }
>
> -static uint8_t *hab_get_event(const struct habv4_rvt *rvt, int index, int *len)
> +static uint8_t *hab_get_event(const struct habv4_rvt *rvt, int index, size_t *len)
> {
> enum hab_status err;
> uint8_t *buf;
> @@ -558,7 +568,7 @@ int habv4_get_state(void)
> static int habv4_get_status(const struct habv4_rvt *rvt)
> {
> uint8_t *data;
> - uint32_t len;
> + size_t len;
> int i;
> enum hab_status status;
> enum hab_config config = 0x0;
>
--
Pengutronix e.K. | |
Steuerwalder Str. 21 | http://www.pengutronix.de/ |
31137 Hildesheim, Germany | Phone: +49-5121-206917-0 |
Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
More information about the barebox
mailing list