All of lore.kernel.org
 help / color / mirror / Atom feed
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
>

      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.