[PATCH] scripts: imx: add support for additional hab Blocks

Denis Osterland-Heim denis.osterland at diehl.com
Mon Mar 22 06:26:20 GMT 2021


Hi Sasha,

Am Montag, den 22.03.2021, 06:50 +0100 schrieb Sascha Hauer:
> Hi Denis,
>
> On Thu, Mar 11, 2021 at 05:07:20PM +0000, Denis Osterland-Heim wrote:
> > From: Denis Osterland-Heim <Denis.Osterland at diehl.com>
> >
> > This allows to specifiy additional singed blocks
> > in the format `offset+size at address` within the imximg.
> >
> > It is needed by the uuu tool, which loads the image different to
> > the imx-usb-loader. It loads the DCD always to 0x910000 in the OCRAM.
> > So this area have to be signed as well.
> >
> > In my case this needs `hab_blocks 0x42c+0x1f0 at 0x910000`.
> >
> > It supports to remove quotes to support Kconfig variable here.
> >
> > Signed-off-by: Denis Osterland-Heim <Denis.Osterland at diehl.com>
> > ---
> >  scripts/imx/imx.c | 62 +++++++++++++++++++++++++++++++++++++++++++++--
> >  1 file changed, 60 insertions(+), 2 deletions(-)
> >
> > diff --git a/scripts/imx/imx.c b/scripts/imx/imx.c
> > index 6b8dabd04..d37e200ca 100644
> > --- a/scripts/imx/imx.c
> > +++ b/scripts/imx/imx.c
> > @@ -328,6 +328,7 @@ static int do_hab_blocks(struct config_data *data, int argc, char *argv[])
> >  {
> >  char *str;
> >  int ret;
> > +int i;
> >  uint32_t signed_size = data->load_size;
> >  uint32_t offset = data->image_ivt_offset;
> >
> > @@ -352,7 +353,7 @@ static int do_hab_blocks(struct config_data *data, int argc, char *argv[])
> >  }
> >
> >  if (signed_size > 0) {
> > -ret = asprintf(&str, "Blocks = 0x%08x 0x%08x 0x%08x \"%s\"\n",
> > +ret = asprintf(&str, "Blocks = 0x%08x 0x%08x 0x%08x \"%s\"",
> >  data->image_load_addr + data->image_ivt_offset, offset,
> >  signed_size - data->image_ivt_offset, data->outfile);
> >  } else {
> > @@ -365,10 +366,67 @@ static int do_hab_blocks(struct config_data *data, int argc, char *argv[])
> >  return -ENOMEM;
> >
> >  ret = hab_add_str(data, str);
> > +free(str);
> >  if (ret)
> >  return ret;
> >
> > -return 0;
> > +for (i = 1; i < argc; i++)
> > +{
>
> Ciding style: The open brace should be on previous line.
okay

>
> > +uint32_t addr;
> > +uint32_t off;
> > +uint32_t size;
> > +char *b;
> > +char *e;
> > +
> > +b = argv[i];
> > +if (b[0] == '"') // remove qoutes
> > +{
> > +b++;
> > +for (e = b; *e; e++)
> > +/* find end of string */;
> > +e--;
> > +if (*e == '"')
> > +*e = '\0';
>
> To make this less efficient but better readable, how about:
>
> e = b + strlen(b) - 1?
definitely easier to read
I will use it

>
> Note this fails when 'b' is an empty string, but your version fails
> there as well. It needs an additional check.
In case of an empty string, b[0] will be '\0' and `b[0] == '"'` will eval to false.
In case of a "\"" input string, first eval of `*e` will be false and your version would give `e = b + 1 - 1`
which looks both correct to me.

But with the hints below, I could remove this lookup entirely
and change to:

```c
char *sep;
if (b[0] == '"')
b++; // remove leading qoute
if (!*b || *b == '"')
continue; // skip if empty
off = strtoul(b, &sep, 0);
if (*sep != '+') {
// complain
}
b = sep + 1;
size = strtoul(b, &sep, 0);
if (*sep != '@') {
// complain
}
b = sep + 1;
addr = strtoul(b, &sep, 0);
if (*sep && *sep != '"') {
// complain
}
```

Regards, Denis

>
> > +else
> > +fprintf(stderr, "warning: no '\"' at the end of '%s' [b=%p'%s', e=%p'%s']\n", argv[i], b, b, e, e);
> > +}
> > +if (!*b)
> > +continue; // skip if empty
> > +
> > +e = strchr(b, '+');
> > +if (!e)
> > +{
> > +fprintf(stderr, "failed to find '+' in '%s'\n", b);
> > +fprintf(stderr, "format off+size at addr expected, but given: %s\n", argv[i]);
> > +return -EINVAL;
> > +}
> > +*e = '\0';
> > +off = strtoul(b, NULL, 0);
>
> No need to set the place where the '+' is to zero. You can do it like
> this:
>
> char *plus;
>
> off = strtoul(b, &plus, 0);
>
> if (*plus != '+')
> /* complain */
>
>
> > +
> > +b = e + 1;
> > +e = strchr(b, '@');
> > +if (!e)
> > +{
> > +fprintf(stderr, "failed to find '@' in '%s'\n", b);
> > +fprintf(stderr, "format off+size at addr expected, but given: %s", argv[i]);
> > +return -EINVAL;
> > +}
> > +*e = '\0';
> > +size = strtoul(b, NULL, 0);
>
> Same here.
>
> Sascha
>
Diehl Connectivity Solutions GmbH
Geschäftsführung: Horst Leonberger
Sitz der Gesellschaft: Nürnberg - Registergericht: Amtsgericht
Nürnberg: HRB 32315

________________________________

Der Inhalt der vorstehenden E-Mail ist nicht rechtlich bindend. Diese E-Mail enthaelt vertrauliche und/oder rechtlich geschuetzte Informationen.
Informieren Sie uns bitte, wenn Sie diese E-Mail faelschlicherweise erhalten haben. Bitte loeschen Sie in diesem Fall die Nachricht.
Jede unerlaubte Form der Reproduktion, Bekanntgabe, Aenderung, Verteilung und/oder Publikation dieser E-Mail ist strengstens untersagt.

- Informationen zum Datenschutz, insbesondere zu Ihren Rechten, erhalten Sie unter:

https://www.diehl.com/group/de/transparenz-und-informationspflichten/

The contents of the above mentioned e-mail is not legally binding. This e-mail contains confidential and/or legally protected information. Please inform us if you have received this e-mail by
mistake and delete it in such a case. Each unauthorized reproduction, disclosure, alteration, distribution and/or publication of this e-mail is strictly prohibited.

- For general information on data protection and your respective rights please visit:

https://www.diehl.com/group/en/transparency-and-information-obligations/




More information about the barebox mailing list