From mboxrd@z Thu Jan 1 00:00:00 1970 From: Alex Kiernan Date: Tue, 08 May 2018 05:15:13 +0000 Subject: [U-Boot] [PATCH v5 3/7] bootcount: Add function wrappers to handle bootcount increment and error checking In-Reply-To: <20180502141056.23937-4-lukma@denx.de> References: <20180502141056.23937-1-lukma@denx.de> <20180502141056.23937-4-lukma@denx.de> Message-ID: List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de On Wed, May 2, 2018 at 3:11 PM Lukasz Majewski wrote: > Those two functions can be used to provide easy bootcount management. > Signed-off-by: Lukasz Majewski > Reviewed-by: Tom Rini > Reviewed-by: Stefan Roese > --- > Changes in v5: > - Provide parenthesis for #if defined(FOO) && ... > Changes in v4: > - Remove enum bootcount_context and replace it with checking gd_t->flags > (The GD_FLG_SPL_INIT is only set in SPL, it is cleared in u-boot proper, > so can be used as indication if we are in u-boot or SPL). > - Do not call bootcount_store() twice when it is not needed. > - Call env_set_ulong("bootcount", bootcount); only in NON SPL context - > Boards with TINY_PRINTF (in newest mainline) will build break as this function > requires simple_itoa() from vsprintf.c (now not always build in SPL). > Changes in v3: > - Unify those functions to also work with common/autoboot.c code > - Add enum bootcount_context to distinguish between u-boot proper and SPL > Changes in v2: > - None > include/bootcount.h | 47 +++++++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 47 insertions(+) > diff --git a/include/bootcount.h b/include/bootcount.h > index e3b3f7028e..a886c98f44 100644 > --- a/include/bootcount.h > +++ b/include/bootcount.h > @@ -11,6 +11,8 @@ > #include > #include > +#if defined(CONFIG_SPL_BOOTCOUNT_LIMIT) || defined(CONFIG_BOOTCOUNT_LIMIT) > + > #if !defined(CONFIG_SYS_BOOTCOUNT_LE) && !defined(CONFIG_SYS_BOOTCOUNT_BE) > # if __BYTE_ORDER == __LITTLE_ENDIAN > # define CONFIG_SYS_BOOTCOUNT_LE > @@ -40,4 +42,49 @@ static inline u32 raw_bootcount_load(volatile u32 *addr) > return in_be32(addr); > } > #endif > + > +DECLARE_GLOBAL_DATA_PTR; > +static inline int bootcount_error(void) > +{ > + unsigned long bootcount = bootcount_load(); > + unsigned long bootlimit = env_get_ulong("bootlimit", 10, 0); > + > + if (bootlimit && bootcount > bootlimit) { > + printf("Warning: Bootlimit (%lu) exceeded.", bootlimit); > + if (!(gd->flags & GD_FLG_SPL_INIT)) > + printf(" Using altbootcmd."); > + printf("\n"); > + > + return 1; > + } > + > + return 0; > +} > + > +static inline void bootcount_inc(void) > +{ > + unsigned long bootcount = bootcount_load(); > + > + if (gd->flags & GD_FLG_SPL_INIT) { > + bootcount_store(++bootcount); > + return; > + } > + > +#ifndef CONFIG_SPL_BUILD > + /* Only increment bootcount when no bootcount support in SPL */ > +#ifndef CONFIG_SPL_BOOTCOUNT_LIMIT > + bootcount_store(++bootcount); > +#endif > + env_set_ulong("bootcount", bootcount); > +#endif /* !CONFIG_SPL_BUILD */ > +} > + I'm kinda confused by this code... isn't this equivalent.? static inline void bootcount_inc(void) { unsigned long bootcount = bootcount_load(); bootcount_store(++bootcount); #ifndef CONFIG_SPL_BUILD env_set_ulong("bootcount", bootcount); #endif /* !CONFIG_SPL_BUILD */ } Also I suspect bootcount_store() will fail at link time on boards where the bootcount is stored in ext4? > +#if defined(CONFIG_SPL_BUILD) && !defined(CONFIG_SPL_BOOTCOUNT_LIMIT) > +void bootcount_store(ulong a) {}; > +ulong bootcount_load(void) { return 0; } > +#endif /* CONFIG_SPL_BUILD && !CONFIG_SPL_BOOTCOUNT_LIMIT */ > +#else > +static inline int bootcount_error(void) { return 0; } > +static inline void bootcount_inc(void) {} > +#endif /* CONFIG_SPL_BOOTCOUNT_LIMIT || CONFIG_BOOTCOUNT_LIMIT */ > #endif /* _BOOTCOUNT_H__ */ > -- > 2.11.0 -- Alex Kiernan