All of lore.kernel.org
 help / color / mirror / Atom feed
From: Stefan Agner <stefan@agner.ch>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH 2/2] tools/env: allow negative offsets
Date: Sun, 17 Jul 2016 10:12:51 -0700	[thread overview]
Message-ID: <a6e1ee031fbcd9b9b445e83e3464da69@agner.ch> (raw)
In-Reply-To: <CALtMJEA+HS+tX9_5qSiH6o=VcPyCmDaFpM59pKpSnL56OYMC5Q@mail.gmail.com>

On 2016-07-17 06:37, Andreas Fenkart wrote:
> Hi,
> 
> 2016-07-14 2:14 GMT+02:00 Stefan Agner <stefan@agner.ch>:
>> From: Stefan Agner <stefan.agner@toradex.com>
>>
>> A negative value for the offset is treated as a backwards offset for
>> from the end of the device/partition for block devices. This aligns
>> the behavior of the config file with the syntax of CONFIG_ENV_OFFSET
>> where the functionality has been introduced with
>> commit 5c088ee841f9 ("env_mmc: allow negative CONFIG_ENV_OFFSET").
>>
>> Signed-off-by: Stefan Agner <stefan.agner@toradex.com>
> lgtm
> 
>> ---
>>
>>  tools/env/fw_env.c      | 39 ++++++++++++++++++++++++++++++---------
>>  tools/env/fw_env.config |  5 +++++
>>  2 files changed, 35 insertions(+), 9 deletions(-)
>>
>> diff --git a/tools/env/fw_env.c b/tools/env/fw_env.c
>> index 06d6865..be338a5b 100644
>> --- a/tools/env/fw_env.c
>> +++ b/tools/env/fw_env.c
>> @@ -14,6 +14,7 @@
>>  #include <errno.h>
>>  #include <env_flags.h>
>>  #include <fcntl.h>
>> +#include <linux/fs.h>
>>  #include <linux/stringify.h>
>>  #include <ctype.h>
>>  #include <stdio.h>
>> @@ -51,7 +52,7 @@ struct env_opts default_opts = {
>>
>>  struct envdev_s {
>>         const char *devname;            /* Device name */
>> -       ulong devoff;                   /* Device offset */
>> +       long long devoff;               /* Device offset */
>>         ulong env_size;                 /* environment size */
>>         ulong erase_size;               /* device erase size */
>>         ulong env_sectors;              /* number of environment sectors */
>> @@ -994,7 +995,7 @@ static int flash_write (int fd_current, int fd_target, int dev_target)
>>         }
>>
>>  #ifdef DEBUG
>> -       fprintf(stderr, "Writing new environment at 0x%lx on %s\n",
>> +       fprintf(stderr, "Writing new environment at 0x%llx on %s\n",
>>                 DEVOFFSET (dev_target), DEVNAME (dev_target));
>>  #endif
>>
>> @@ -1010,7 +1011,7 @@ static int flash_write (int fd_current, int fd_target, int dev_target)
>>                         offsetof (struct env_image_redundant, flags);
>>  #ifdef DEBUG
>>                 fprintf(stderr,
>> -                       "Setting obsolete flag in environment at 0x%lx on %s\n",
>> +                       "Setting obsolete flag in environment at 0x%llx on %s\n",
>>                         DEVOFFSET (dev_current), DEVNAME (dev_current));
>>  #endif
>>                 flash_flag_obsolete (dev_current, fd_current, offset);
>> @@ -1335,7 +1336,27 @@ static int check_device_config(int dev)
>>                 }
>>                 DEVTYPE(dev) = mtdinfo.type;
>>         } else {
>> +               uint64_t size;
>>                 DEVTYPE(dev) = MTD_ABSENT;
>> +
>> +               /*
>> +                * Check for negative offsets, treat it as backwards offset
>> +                * from the end of the block device
>> +                */
>> +               if (DEVOFFSET(dev) < 0) {
>> +                       rc = ioctl(fd, BLKGETSIZE64, &size);
>> +                       if (rc < 0) {
>> +                               fprintf(stderr, "Could not get block device size on %s\n",
>> +                                       DEVNAME(dev));
>> +                               goto err;
>> +                       }
>> +
>> +                       DEVOFFSET(dev) = DEVOFFSET(dev) + size;
> 
> I wonder if we need a check, that the redundant areas don't overlap.
> But we can add that later

We haven't had it before, but yeah I agree it would be a sensible thing
to do. And we have now a good place to add such checks...

--
Stefan

> 
> 
>> +#ifdef DEBUG
>> +                       fprintf(stderr, "Calculated device offset 0x%llx on %s\n",
>> +                               DEVOFFSET(dev), DEVNAME(dev));
>> +#endif
>> +               }
>>         }
>>
>>  err:
>> @@ -1434,12 +1455,12 @@ static int get_config (char *fname)
>>                 if (dump[0] == '#')
>>                         continue;
>>
>> -               rc = sscanf (dump, "%ms %lx %lx %lx %lx",
>> -                            &devname,
>> -                            &DEVOFFSET (i),
>> -                            &ENVSIZE (i),
>> -                            &DEVESIZE (i),
>> -                            &ENVSECTORS (i));
>> +               rc = sscanf(dump, "%ms %lli %lx %lx %lx",
>> +                           &devname,
>> +                           &DEVOFFSET(i),
>> +                           &ENVSIZE(i),
>> +                           &DEVESIZE(i),
>> +                           &ENVSECTORS(i));
>>
>>                 if (rc < 3)
>>                         continue;
>> diff --git a/tools/env/fw_env.config b/tools/env/fw_env.config
>> index 6f216f9..f0f66aa 100644
>> --- a/tools/env/fw_env.config
>> +++ b/tools/env/fw_env.config
>> @@ -4,6 +4,7 @@
>>  # Notice, that the "Number of sectors" is not required on NOR and SPI-dataflash.
>>  # Futhermore, if the Flash sector size is ommitted, this value is assumed to
>>  # be the same as the Environment size, which is valid for NOR and SPI-dataflash
>> +# Device offset must be prefixed with 0x to be parsed as a hexadecimal value.
>>
>>  # NOR example
>>  # MTD device name      Device offset   Env. size       Flash sector size       Number of sectors
>> @@ -18,8 +19,12 @@
>>  # NAND example
>>  #/dev/mtd0             0x4000          0x4000          0x20000                 2
>>
>> +# On a block device a negative offset is treated as a backwards offset from the
>> +# end of the device/partition, rather than a forwards offset from the start.
>> +
>>  # Block device example
>>  #/dev/mmcblk0          0xc0000         0x20000
>> +#/dev/mmcblk0          -0x20000        0x20000
>>
>>  # VFAT example
>>  #/boot/uboot.env       0x0000          0x4000
>> --
>> 2.9.0
>>

  reply	other threads:[~2016-07-17 17:12 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-07-14  0:14 [U-Boot] [PATCH 1/2] tools/env: complete environment device config early Stefan Agner
2016-07-14  0:14 ` [U-Boot] [PATCH 2/2] tools/env: allow negative offsets Stefan Agner
2016-07-17 13:37   ` Andreas Fenkart
2016-07-17 17:12     ` Stefan Agner [this message]
2016-07-23  0:12   ` [U-Boot] [U-Boot,2/2] " Tom Rini
2016-07-17 13:18 ` [U-Boot] [PATCH 1/2] tools/env: complete environment device config early Andreas Fenkart
2016-07-23  0:12 ` [U-Boot] [U-Boot, " Tom Rini

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=a6e1ee031fbcd9b9b445e83e3464da69@agner.ch \
    --to=stefan@agner.ch \
    --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.