From: Ulises Cardenas <B45798@freescale.com>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH] iMX: adding parsing to hab_status command
Date: Thu, 2 Jul 2015 21:36:15 -0500 [thread overview]
Message-ID: <5595F51F.5080808@freescale.com> (raw)
In-Reply-To: <CAOf5uw=doOyPp-+yxihdreU60qVs3i7J16HTTRzzNUkv=GdCJA@mail.gmail.com>
Hi Michael,
On 07/02/2015 03:56 PM, Michael Trimarchi wrote:
>
> Hi
>
> On Jul 2, 2015 10:47 PM, <Ulises.
>
> @freescale.com <http://freescale.com>> wrote:
> >
> > From: Ulises Cardenas <Ulises.Cardenas@freescale.com
> <mailto:Ulises.Cardenas@freescale.com>>
> >
> > hab_status command returns a memory dump of the hab event log. But the
> > raw data is not human-readable. Parsing such data into readable event
> > will help to minimize debbuging time.
> >
> > Signed-off-by: Ulises Cardenas <Ulises.Cardenas@freescale.com
> <mailto:Ulises.Cardenas@freescale.com>>
> > ---
> >
>
> Please remove all those if else and then make sense to review
>
> Michael
>
This was a port of a external parser. And we wanted to keep a similiar
structure.
However, I understand your point. I think the problem that the original
programmer had
was the trasversal of enums with a non-increasing order. I submitted
another version of
it addressing the issue.
Thanks,
Ulises
>
> > arch/arm/cpu/armv7/mx6/hab.c | 228
> +++++++++++++++++++++++++++++++++++-
> > arch/arm/include/asm/arch-mx6/hab.h | 85 ++++++++++++--
> > 2 files changed, 300 insertions(+), 13 deletions(-)
> >
> > diff --git a/arch/arm/cpu/armv7/mx6/hab.c b/arch/arm/cpu/armv7/mx6/hab.c
> > index 8dee595..c715545 100644
> > --- a/arch/arm/cpu/armv7/mx6/hab.c
> > +++ b/arch/arm/cpu/armv7/mx6/hab.c
> > @@ -1,5 +1,5 @@
> > /*
> > - * Copyright (C) 2010-2014 Freescale Semiconductor, Inc.
> > + * Copyright (C) 2010-2015 Freescale Semiconductor, Inc.
> > *
> > * SPDX-License-Identifier: GPL-2.0+
> > */
> > @@ -111,6 +111,220 @@
> > * +------------+ + CSF_PAD_SIZE
> > */
> >
> > +#define MAX_RECORD_BYTES (8*1024) /* 4 kbytes */
> > +
> > +struct record {
> > + uint8_t tag; /* Tag */
> > + uint8_t len[2]; /* Length */
> > + uint8_t par; /* Version */
> > + uint8_t contents[MAX_RECORD_BYTES];/* Record Data */
> > + bool any_rec_flag;
> > +};
> > +
> > +char *rsn_str[] = {"RSN = HAB_RSN_ANY (0x00)\n",
> > + "RSN = HAB_ENG_FAIL (0x30)\n",
> > + "RSN = HAB_INV_ADDRESS (0x22)\n",
> > + "RSN = HAB_INV_ASSERTION (0x0C)\n",
> > + "RSN = HAB_INV_CALL (0x28)\n",
> > + "RSN = HAB_INV_CERTIFICATE (0x21)\n",
> > + "RSN = HAB_INV_COMMAND (0x06)\n",
> > + "RSN = HAB_INV_CSF (0x11)\n",
> > + "RSN = HAB_INV_DCD (0x27)\n",
> > + "RSN = HAB_INV_INDEX (0x0F)\n",
> > + "RSN = HAB_INV_IVT (0x05)\n",
> > + "RSN = HAB_INV_KEY (0x1D)\n",
> > + "RSN = HAB_INV_RETURN (0x1E)\n",
> > + "RSN = HAB_INV_SIGNATURE (0x18)\n",
> > + "RSN = HAB_INV_SIZE (0x17)\n",
> > + "RSN = HAB_MEM_FAIL (0x2E)\n",
> > + "RSN = HAB_OVR_COUNT (0x2B)\n",
> > + "RSN = HAB_OVR_STORAGE (0x2D)\n",
> > + "RSN = HAB_UNS_ALGORITHM (0x12)\n",
> > + "RSN = HAB_UNS_COMMAND (0x03)\n",
> > + "RSN = HAB_UNS_ENGINE (0x0A)\n",
> > + "RSN = HAB_UNS_ITEM (0x24)\n",
> > + "RSN = HAB_UNS_KEY (0x1B)\n",
> > + "RSN = HAB_UNS_PROTOCOL (0x14)\n",
> > + "RSN = HAB_UNS_STATE (0x09)\n",
> > + "RSN = INVALID\n"};
> > +
> > +char *sts_str[] = {"STS = HAB_SUCCESS (0xF0)\n",
> > + "STS = HAB_FAILURE (0x33)\n",
> > + "STS = HAB_WARNING (0x69)\n",
> > + "STS = INVALID\n"};
> > +
> > +char *eng_str[] = {"ENG = HAB_ENG_ANY (0x00)\n",
> > + "ENG = HAB_ENG_SCC (0x03)\n",
> > + "ENG = HAB_ENG_RTIC (0x05)\n",
> > + "ENG = HAB_ENG_SAHARA (0x06)\n",
> > + "ENG = HAB_ENG_CSU (0x0A)\n",
> > + "ENG = HAB_ENG_SRTC (0x0C)\n",
> > + "ENG = HAB_ENG_DCP (0x1B)\n",
> > + "ENG = HAB_ENG_CAAM (0x1D)\n",
> > + "ENG = HAB_ENG_SNVS (0x1E)\n",
> > + "ENG = HAB_ENG_OCOTP (0x21)\n",
> > + "ENG = HAB_ENG_DTCP (0x22)\n",
> > + "ENG = HAB_ENG_ROM (0x36)\n",
> > + "ENG = HAB_ENG_HDCP (0x24)\n",
> > + "ENG = HAB_ENG_RTL (0x77)\n",
> > + "ENG = HAB_ENG_SW (0xFF)\n",
> > + "ENG = INVALID\n"};
> > +
> > +char *ctx_str[] = {"CTX = HAB_CTX_ANY(0x00)\n",
> > + "CTX = HAB_CTX_FAB (0xFF)\n",
> > + "CTX = HAB_CTX_ENTRY (0xE1)\n",
> > + "CTX = HAB_CTX_TARGET (0x33)\n",
> > + "CTX = HAB_CTX_AUTHENTICATE
> (0x0A)\n",
> > + "CTX = HAB_CTX_DCD (0xDD)\n",
> > + "CTX = HAB_CTX_CSF (0xCF)\n",
> > + "CTX = HAB_CTX_COMMAND (0xC0)\n",
> > + "CTX = HAB_CTX_AUT_DAT (0xDB)\n",
> > + "CTX = HAB_CTX_ASSERT (0xA0)\n",
> > + "CTX = HAB_CTX_EXIT (0xEE)\n",
> > + "CTX = INVALID\n"};
> > +
> > +static inline uint8_t get_rsn_idx(uint8_t rsn)
> > +{
> > + uint8_t result;
> > + if (rsn == HAB_RSN_ANY)
> > + result = 0;
> > + else if (rsn == HAB_ENG_FAIL)
> > + result = 1;
> > + else if (rsn == HAB_INV_ADDRESS)
> > + result = 2;
> > + else if (rsn == HAB_INV_ASSERTION)
> > + result = 3;
> > + else if (rsn == HAB_INV_CALL)
> > + result = 4;
> > + else if (rsn == HAB_INV_CERTIFICATE)
> > + result = 5;
> > + else if (rsn == HAB_INV_COMMAND)
> > + result = 6;
> > + else if (rsn == HAB_INV_CSF)
> > + result = 7;
> > + else if (rsn == HAB_INV_DCD)
> > + result = 8;
> > + else if (rsn == HAB_INV_INDEX)
> > + result = 9;
> > + else if (rsn == HAB_INV_IVT)
> > + result = 10;
> > + else if (rsn == HAB_INV_KEY)
> > + result = 11;
> > + else if (rsn == HAB_INV_RETURN)
> > + result = 12;
> > + else if (rsn == HAB_INV_SIGNATURE)
> > + result = 13;
> > + else if (rsn == HAB_INV_SIZE)
> > + result = 14;
> > + else if (rsn == HAB_MEM_FAIL)
> > + result = 15;
> > + else if (rsn == HAB_OVR_COUNT)
> > + result = 16;
> > + else if (rsn == HAB_OVR_STORAGE)
> > + result = 17;
> > + else if (rsn == HAB_UNS_ALGORITHM)
> > + result = 18;
> > + else if (rsn == HAB_UNS_COMMAND)
> > + result = 19;
> > + else if (rsn == HAB_UNS_ENGINE)
> > + result = 20;
> > + else if (rsn == HAB_UNS_ITEM)
> > + result = 21;
> > + else if (rsn == HAB_UNS_KEY)
> > + result = 22;
> > + else if (rsn == HAB_UNS_PROTOCOL)
> > + result = 23;
> > + else if (rsn == HAB_UNS_STATE)
> > + result = 24;
> > + else
> > + result = 25;
> > +
> > + return result;
> > +}
> > +
> > +static inline uint8_t get_sts_idx(uint8_t sts)
> > +{
> > + uint8_t result;
> > + if (sts == HAB_SUCCESS)
> > + result = 0;
> > + else if (sts == HAB_FAILURE)
> > + result = 1;
> > + else if (sts == HAB_WARNING)
> > + result = 2;
> > + else
> > + result = 3;
> > +
> > + return result;
> > +}
> > +
> > +static inline uint8_t get_eng_idx(uint8_t eng)
> > +{
> > + uint8_t result;
> > + if (eng == HAB_ENG_ANY)
> > + result = 0;
> > + else if (eng == HAB_ENG_SCC)
> > + result = 1;
> > + else if (eng == HAB_ENG_RTIC)
> > + result = 2;
> > + else if (eng == HAB_ENG_SAHARA)
> > + result = 3;
> > + else if (eng == HAB_ENG_CSU)
> > + result = 4;
> > + else if (eng == HAB_ENG_SRTC)
> > + result = 5;
> > + else if (eng == HAB_ENG_DCP)
> > + result = 6;
> > + else if (eng == HAB_ENG_CAAM)
> > + result = 7;
> > + else if (eng == HAB_ENG_SNVS)
> > + result = 8;
> > + else if (eng == HAB_ENG_OCOTP)
> > + result = 9;
> > + else if (eng == HAB_ENG_DTCP)
> > + result = 10;
> > + else if (eng == HAB_ENG_ROM)
> > + result = 11;
> > + else if (eng == HAB_ENG_HDCP)
> > + result = 12;
> > + else if (eng == HAB_ENG_RTL)
> > + result = 13;
> > + else if (eng == HAB_ENG_SW)
> > + result = 14;
> > + else
> > + result = 9;
> > + return result;
> > +}
> > +
> > +static inline uint8_t get_ctx_idx(uint8_t ctx)
> > +{
> > + uint8_t result;
> > + if (ctx == HAB_CTX_ANY)
> > + result = 0;
> > + else if (ctx == HAB_CTX_FAB)
> > + result = 1;
> > + else if (ctx == HAB_CTX_ENTRY)
> > + result = 2;
> > + else if (ctx == HAB_CTX_TARGET)
> > + result = 3;
> > + else if (ctx == HAB_CTX_AUTHENTICATE)
> > + result = 4;
> > + else if (ctx == HAB_CTX_DCD)
> > + result = 5;
> > + else if (ctx == HAB_CTX_CSF)
> > + result = 6;
> > + else if (ctx == HAB_CTX_COMMAND)
> > + result = 7;
> > + else if (ctx == HAB_CTX_AUT_DAT)
> > + result = 8;
> > + else if (ctx == HAB_CTX_ASSERT)
> > + result = 9;
> > + else if (ctx == HAB_CTX_EXIT)
> > + result = 10;
> > + else
> > + result = 11;
> > + return result;
> > +}
> > +
> > bool is_hab_enabled(void)
> > {
> > struct ocotp_regs *ocotp = (struct ocotp_regs *)OCOTP_BASE_ADDR;
> > @@ -122,6 +336,16 @@ bool is_hab_enabled(void)
> > return (reg & 0x2) == 0x2;
> > }
> >
> > +void process_event_record(uint8_t *event_data, size_t bytes)
> > +{
> > + struct record *rec = (struct record *)event_data;
> > +
> > + printf("\n\n%s", sts_str[get_sts_idx(rec->contents[0])]);
> > + printf("%s", rsn_str[get_rsn_idx(rec->contents[1])]);
> > + printf("%s", ctx_str[get_ctx_idx(rec->contents[2])]);
> > + printf("%s", eng_str[get_eng_idx(rec->contents[3])]);
> > +}
> > +
> > void display_event(uint8_t *event_data, size_t bytes)
> > {
> > uint32_t i;
> > @@ -137,6 +361,8 @@ void display_event(uint8_t *event_data, size_t
> bytes)
> > else
> > printf(" 0x%02x", event_data[i]);
> > }
> > +
> > + process_event_record(event_data, bytes);
> > }
> >
> > int get_hab_status(void)
> > diff --git a/arch/arm/include/asm/arch-mx6/hab.h
> b/arch/arm/include/asm/arch-mx6/hab.h
> > index c9e5318..6b043a9 100644
> > --- a/arch/arm/include/asm/arch-mx6/hab.h
> > +++ b/arch/arm/include/asm/arch-mx6/hab.h
> > @@ -1,5 +1,5 @@
> > /*
> > - * Copyright (C) 2012 Freescale Semiconductor, Inc. All Rights
> Reserved.
> > + * Copyright (C) 2012-2015 Freescale Semiconductor, Inc. All Rights
> Reserved.
> > *
> > * SPDX-License-Identifier: GPL-2.0+
> > *
> > @@ -23,24 +23,68 @@ enum hab_status {
> >
> > /* 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 */
> > + 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_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
> > };
> >
> > +enum hab_reason {
> > + HAB_RSN_ANY = 0x00, /* Match any reason */
> > + HAB_ENG_FAIL = 0x30, /* Engine failure */
> > + HAB_INV_ADDRESS = 0x22, /* Invalid address: access
> denied */
> > + HAB_INV_ASSERTION = 0x0c, /* Invalid assertion */
> > + HAB_INV_CALL = 0x28, /* Function called out of
> sequence */
> > + HAB_INV_CERTIFICATE = 0x21, /* Invalid certificate */
> > + HAB_INV_COMMAND = 0x06, /* Invalid command: command
> malformed */
> > + HAB_INV_CSF = 0x11, /* Invalid csf */
> > + HAB_INV_DCD = 0x27, /* Invalid dcd */
> > + HAB_INV_INDEX = 0x0f, /* Invalid index: access
> denied */
> > + HAB_INV_IVT = 0x05, /* Invalid ivt */
> > + HAB_INV_KEY = 0x1d, /* Invalid key */
> > + HAB_INV_RETURN = 0x1e, /* Failed callback function */
> > + HAB_INV_SIGNATURE = 0x18, /* Invalid signature */
> > + HAB_INV_SIZE = 0x17, /* Invalid data size */
> > + HAB_MEM_FAIL = 0x2e, /* Memory failure */
> > + HAB_OVR_COUNT = 0x2b, /* Expired poll count */
> > + HAB_OVR_STORAGE = 0x2d, /* Exhausted storage region */
> > + HAB_UNS_ALGORITHM = 0x12, /* Unsupported algorithm */
> > + HAB_UNS_COMMAND = 0x03, /* Unsupported command */
> > + HAB_UNS_ENGINE = 0x0a, /* Unsupported engine */
> > + HAB_UNS_ITEM = 0x24, /* Unsupported configuration
> item */
> > + HAB_UNS_KEY = 0x1b, /* Unsupported key
> type/parameters */
> > + HAB_UNS_PROTOCOL = 0x14, /* Unsupported protocol */
> > + HAB_UNS_STATE = 0x09, /* Unsuitable state */
> > + HAB_RSN_MAX
> > +} hab_reason_t;
> > +
> > +enum hab_context {
> > + HAB_CTX_ANY = 0x00, /* Match any context */
> > + HAB_CTX_FAB = 0xff, /* Event logged in
> hab_fab_test() */
> > + HAB_CTX_ENTRY = 0xe1, /* Event logged in
> hab_rvt.entry() */
> > + HAB_CTX_TARGET = 0x33, /* Event logged in
> hab_rvt.check_target() */
> > + HAB_CTX_AUTHENTICATE = 0x0a,/* Logged in
> hab_rvt.authenticate_image() */
> > + HAB_CTX_DCD = 0xdd, /* Event logged in
> hab_rvt.run_dcd() */
> > + HAB_CTX_CSF = 0xcf, /* Event logged in
> hab_rvt.run_csf() */
> > + HAB_CTX_COMMAND = 0xc0, /* Event logged executing
> csf/dcd command */
> > + HAB_CTX_AUT_DAT = 0xdb, /* Authenticated data block */
> > + HAB_CTX_ASSERT = 0xa0, /* Event logged in
> hab_rvt.assert() */
> > + HAB_CTX_EXIT = 0xee, /* Event logged in
> hab_rvt.exit() */
> > + HAB_CTX_MAX
> > +} hab_context_t;
> > +
> > /*Function prototype description*/
> > typedef enum hab_status hab_rvt_report_event_t(enum hab_status,
> uint32_t,
> > uint8_t* , size_t*);
> > @@ -53,6 +97,22 @@ 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_ENG_ANY 0x00 /* Select first compatible
> engine */
> > +#define HAB_ENG_SCC 0x03 /* Security controller */
> > +#define HAB_ENG_RTIC 0x05 /* Run-time integrity checker */
> > +#define HAB_ENG_SAHARA 0x06 /* Crypto accelerator */
> > +#define HAB_ENG_CSU 0x0a /* Central Security Unit */
> > +#define HAB_ENG_SRTC 0x0c /* Secure clock */
> > +#define HAB_ENG_DCP 0x1b /* Data Co-Processor */
> > +#define HAB_ENG_CAAM 0x1d /* CAAM */
> > +#define HAB_ENG_SNVS 0x1e /* Secure Non-Volatile Storage */
> > +#define HAB_ENG_OCOTP 0x21 /* Fuse controller */
> > +#define HAB_ENG_DTCP 0x22 /* DTCP co-processor */
> > +#define HAB_ENG_ROM 0x36 /* Protected ROM area */
> > +#define HAB_ENG_HDCP 0x24 /* HDCP co-processor */
> > +#define HAB_ENG_RTL 0x77 /* RTL simulation engine */
> > +#define HAB_ENG_SW 0xff /* Software engine */
> > +
> > #ifdef CONFIG_MX6SX
> > #define HAB_RVT_BASE 0x00000100
> > #else
> > @@ -73,6 +133,7 @@ typedef void hapi_clock_init_t(void);
> >
> > #define HAB_CID_ROM 0 /**< ROM Caller ID */
> > #define HAB_CID_UBOOT 1 /**< UBOOT Caller ID*/
> > +
> > /* ----------- end of HAB API updates ------------*/
> >
> > #endif
> > --
> > 2.3.2
> >
> > _______________________________________________
> > U-Boot mailing list
> > U-Boot at lists.denx.de <mailto:U-Boot@lists.denx.de>
> > http://lists.denx.de/mailman/listinfo/u-boot
>
prev parent reply other threads:[~2015-07-03 2:36 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-07-02 20:27 [U-Boot] [PATCH] iMX: adding parsing to hab_status command Ulises.Cardenas at freescale.com
2015-07-02 20:56 ` Michael Trimarchi
2015-07-03 2:36 ` Ulises Cardenas [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=5595F51F.5080808@freescale.com \
--to=b45798@freescale.com \
--cc=u-boot@lists.denx.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.