imx: add status reporting for HAB status
Add functions to report the HAB (High Assurance Boot) status of e.g. i.MX6 CPUs. This is taken from git://git.freescale.com/imx/uboot-imx.git branch imx_v2009.08_3.0.35_4.0.0 cpu/arm_cortexa8/mx6/generic.c include/asm-arm/arch-mx6/mx6_secure.h Signed-off-by: Stefano Babic <sbabic@denx.de>
This commit is contained in:
parent
0187c985aa
commit
b83c709e8d
@ -11,10 +11,11 @@ include $(TOPDIR)/config.mk
|
||||
|
||||
LIB = $(obj)lib$(SOC).o
|
||||
|
||||
COBJS = soc.o clock.o
|
||||
COBJS-y = soc.o clock.o
|
||||
COBJS-$(CONFIG_SECURE_BOOT) += hab.o
|
||||
|
||||
SRCS := $(SOBJS:.o=.S) $(COBJS:.o=.c)
|
||||
OBJS := $(addprefix $(obj),$(SOBJS) $(COBJS))
|
||||
SRCS := $(SOBJS:.o=.S) $(COBJS-y:.o=.c)
|
||||
OBJS := $(addprefix $(obj),$(SOBJS) $(COBJS-y))
|
||||
|
||||
all: $(obj).depend $(LIB)
|
||||
|
||||
|
104
arch/arm/cpu/armv7/mx6/hab.c
Normal file
104
arch/arm/cpu/armv7/mx6/hab.c
Normal file
@ -0,0 +1,104 @@
|
||||
/*
|
||||
* Copyright (C) 2010-2013 Freescale Semiconductor, Inc.
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/arch/hab.h>
|
||||
|
||||
/* -------- start of HAB API updates ------------*/
|
||||
#define hab_rvt_report_event ((hab_rvt_report_event_t *)HAB_RVT_REPORT_EVENT)
|
||||
#define hab_rvt_report_status ((hab_rvt_report_status_t *)HAB_RVT_REPORT_STATUS)
|
||||
#define hab_rvt_authenticate_image \
|
||||
((hab_rvt_authenticate_image_t *)HAB_RVT_AUTHENTICATE_IMAGE)
|
||||
#define hab_rvt_entry ((hab_rvt_entry_t *)HAB_RVT_ENTRY)
|
||||
#define hab_rvt_exit ((hab_rvt_exit_t *)HAB_RVT_EXIT)
|
||||
#define hab_rvt_clock_init HAB_RVT_CLOCK_INIT
|
||||
|
||||
bool is_hab_enabled(void)
|
||||
{
|
||||
struct ocotp_regs *ocotp = (struct ocotp_regs *)OCOTP_BASE_ADDR;
|
||||
struct fuse_bank *bank = &ocotp->bank[0];
|
||||
struct fuse_bank0_regs *fuse =
|
||||
(struct fuse_bank0_regs *)bank->fuse_regs;
|
||||
uint32_t reg = readl(&fuse->cfg5);
|
||||
|
||||
return (reg & 0x2) == 0x2;
|
||||
}
|
||||
|
||||
void display_event(uint8_t *event_data, size_t bytes)
|
||||
{
|
||||
uint32_t i;
|
||||
|
||||
if (!(event_data && bytes > 0))
|
||||
return;
|
||||
|
||||
for (i = 0; i < bytes; i++) {
|
||||
if (i == 0)
|
||||
printf("\t0x%02x", event_data[i]);
|
||||
else if ((i % 8) == 0)
|
||||
printf("\n\t0x%02x", event_data[i]);
|
||||
else
|
||||
printf(" 0x%02x", event_data[i]);
|
||||
}
|
||||
}
|
||||
|
||||
int get_hab_status(void)
|
||||
{
|
||||
uint32_t index = 0; /* Loop index */
|
||||
uint8_t event_data[128]; /* Event data buffer */
|
||||
size_t bytes = sizeof(event_data); /* Event size in bytes */
|
||||
enum hab_config config = 0;
|
||||
enum hab_state state = 0;
|
||||
|
||||
if (is_hab_enabled())
|
||||
puts("\nSecure boot enabled\n");
|
||||
else
|
||||
puts("\nSecure boot disabled\n");
|
||||
|
||||
/* Check HAB status */
|
||||
if (hab_rvt_report_status(&config, &state) != HAB_SUCCESS) {
|
||||
printf("\nHAB Configuration: 0x%02x, HAB State: 0x%02x\n",
|
||||
config, state);
|
||||
|
||||
/* Display HAB Error events */
|
||||
while (hab_rvt_report_event(HAB_FAILURE, index, event_data,
|
||||
&bytes) == HAB_SUCCESS) {
|
||||
puts("\n");
|
||||
printf("--------- HAB Event %d -----------------\n",
|
||||
index + 1);
|
||||
puts("event data:\n");
|
||||
display_event(event_data, bytes);
|
||||
puts("\n");
|
||||
bytes = sizeof(event_data);
|
||||
index++;
|
||||
}
|
||||
}
|
||||
/* Display message if no HAB events are found */
|
||||
else {
|
||||
printf("\nHAB Configuration: 0x%02x, HAB State: 0x%02x\n",
|
||||
config, state);
|
||||
puts("No HAB Events Found!\n\n");
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int do_hab_status(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
||||
{
|
||||
if ((argc != 1)) {
|
||||
cmd_usage(cmdtp);
|
||||
return 1;
|
||||
}
|
||||
|
||||
get_hab_status();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
U_BOOT_CMD(
|
||||
hab_status, CONFIG_SYS_MAXARGS, 1, do_hab_status,
|
||||
"display HAB status",
|
||||
""
|
||||
);
|
67
arch/arm/include/asm/arch-mx6/hab.h
Normal file
67
arch/arm/include/asm/arch-mx6/hab.h
Normal file
@ -0,0 +1,67 @@
|
||||
/*
|
||||
* Copyright (C) 2012 Freescale Semiconductor, Inc. All Rights Reserved.
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __SECURE_MX6Q_H__
|
||||
#define __SECURE_MX6Q_H__
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
/* -------- start of HAB API updates ------------*/
|
||||
/* The following are taken from HAB4 SIS */
|
||||
|
||||
/* Status definitions */
|
||||
enum hab_status {
|
||||
HAB_STS_ANY = 0x00,
|
||||
HAB_FAILURE = 0x33,
|
||||
HAB_WARNING = 0x69,
|
||||
HAB_SUCCESS = 0xf0
|
||||
};
|
||||
|
||||
/* Security Configuration definitions */
|
||||
enum hab_config {
|
||||
HAB_CFG_RETURN = 0x33, /**< Field Return IC */
|
||||
HAB_CFG_OPEN = 0xf0, /**< Non-secure IC */
|
||||
HAB_CFG_CLOSED = 0xcc /**< Secure IC */
|
||||
};
|
||||
|
||||
/* State definitions */
|
||||
enum hab_state {
|
||||
HAB_STATE_INITIAL = 0x33, /**< Initialising state (transitory) */
|
||||
HAB_STATE_CHECK = 0x55, /**< Check state (non-secure) */
|
||||
HAB_STATE_NONSECURE = 0x66, /**< Non-secure state */
|
||||
HAB_STATE_TRUSTED = 0x99, /**< Trusted state */
|
||||
HAB_STATE_SECURE = 0xaa, /**< Secure state */
|
||||
HAB_STATE_FAIL_SOFT = 0xcc, /**< Soft fail state */
|
||||
HAB_STATE_FAIL_HARD = 0xff, /**< Hard fail state (terminal) */
|
||||
HAB_STATE_NONE = 0xf0, /**< No security state machine */
|
||||
HAB_STATE_MAX
|
||||
};
|
||||
|
||||
/*Function prototype description*/
|
||||
typedef enum hab_status hab_rvt_report_event_t(enum hab_status, uint32_t,
|
||||
uint8_t* , size_t*);
|
||||
typedef enum hab_status hab_rvt_report_status_t(enum hab_config *,
|
||||
enum hab_state *);
|
||||
typedef enum hab_status hab_loader_callback_f_t(void**, size_t*, const void*);
|
||||
typedef enum hab_status hab_rvt_entry_t(void);
|
||||
typedef enum hab_status hab_rvt_exit_t(void);
|
||||
typedef void *hab_rvt_authenticate_image_t(uint8_t, ptrdiff_t,
|
||||
void **, size_t *, hab_loader_callback_f_t);
|
||||
typedef void hapi_clock_init_t(void);
|
||||
|
||||
#define HAB_RVT_REPORT_EVENT (*(uint32_t *)0x000000B4)
|
||||
#define HAB_RVT_REPORT_STATUS (*(uint32_t *)0x000000B8)
|
||||
#define HAB_RVT_AUTHENTICATE_IMAGE (*(uint32_t *)0x000000A4)
|
||||
#define HAB_RVT_ENTRY (*(uint32_t *)0x00000098)
|
||||
#define HAB_RVT_EXIT (*(uint32_t *)0x0000009C)
|
||||
#define HAB_RVT_CLOCK_INIT ((hapi_clock_init_t *)0x0000024D)
|
||||
|
||||
#define HAB_CID_ROM 0 /**< ROM Caller ID */
|
||||
#define HAB_CID_UBOOT 1 /**< UBOOT Caller ID*/
|
||||
/* ----------- end of HAB API updates ------------*/
|
||||
|
||||
#endif
|
@ -456,7 +456,13 @@ struct fuse_bank0_regs {
|
||||
u32 uid_low;
|
||||
u32 rsvd1[3];
|
||||
u32 uid_high;
|
||||
u32 rsvd2[0x17];
|
||||
u32 rsvd2[3];
|
||||
u32 rsvd3[4];
|
||||
u32 rsvd4[4];
|
||||
u32 rsvd5[4];
|
||||
u32 cfg5;
|
||||
u32 rsvd6[3];
|
||||
u32 rsvd7[4];
|
||||
};
|
||||
|
||||
struct fuse_bank4_regs {
|
||||
|
Loading…
Reference in New Issue
Block a user