[PATCH] smbios: Fix calculating BIOS Release Date

Pali Rohár pali at kernel.org
Fri Jul 16 11:56:21 CEST 2021


On Friday 16 July 2021 08:39:05 Heinrich Schuchardt wrote:
> On 4/22/21 6:09 PM, Pali Rohár wrote:
> > BIOS Release Date must be in format mm/dd/yyyy and must be release date.
> 
> %s/BIOS/The SMBIOS/

No. In SMBIOS specification and also in U-Boot structures it is called
"BIOS Release Date". Not "SMBIOS Release Date".

> Please add a reference to the System Management BIOS (SMBIOS) Reference
> Specification here an as comment in the code.

Ok, I will include it.

FYI Spec DSP0134 from https://www.dmtf.org/standards/smbios
In version 3.4.0 is "Type 0" "BIOS Release Date" described at page 33.

> > U-Boot currently sets BIOS Release Date from U_BOOT_DMI_DATE macro which is
> > generated from current build timestamp.
> 
> %s/BIOS/the SMBIOS/
> 
> Please, describe in the commit message that you want to achieve
> reproducible builds.

It is not only reproducible build, but also fixing behavior of OSes (as
written below). But I can add info also about reproducible builds.

> > 
> > Fix this issue by setting U_BOOT_DMI_DATE macro to U-Boot version which is
> > better approximation of U-Boot release date than current build timestamp.
> > Current U-Boot versioning is in format yyyy.mm so as a day choose 01.
> > 
> > Some operating systems are using BIOS Release Date for detecting when was
> > SMBIOS table filled or if it could support some feature (e.g. BIOS from
> > 1990 cannot support features invented in 2000). So this change also ensures
> > that recompiling U-Boot from same sources but in different year does not
> > change behavior of some operating systems.
> > 
> > Macro U_BOOT_DMI_DATE is not used in other file than lib/smbios.c
> > so remove it from global autogenerated files and also from Makefile.
> > 
> > Signed-off-by: Pali Rohár <pali at kernel.org>
> > Reviewed-by: Simon Glass <sjg at chromium.org>
> > ---
> >   Makefile                |  2 --
> >   doc/develop/version.rst |  1 -
> >   lib/smbios.c            | 23 +++++++++++++++++++++++
> >   3 files changed, 23 insertions(+), 3 deletions(-)
> > 
> > diff --git a/Makefile b/Makefile
> > index e423f6de7468..4cd28bce237b 100644
> > --- a/Makefile
> > +++ b/Makefile
> > @@ -1832,7 +1832,6 @@ define filechk_timestamp.h
> >   			LC_ALL=C $${DATE} -u -d "$${SOURCE_DATE}" +'#define U_BOOT_DATE "%b %d %C%y"'; \
> >   			LC_ALL=C $${DATE} -u -d "$${SOURCE_DATE}" +'#define U_BOOT_TIME "%T"'; \
> >   			LC_ALL=C $${DATE} -u -d "$${SOURCE_DATE}" +'#define U_BOOT_TZ "%z"'; \
> > -			LC_ALL=C $${DATE} -u -d "$${SOURCE_DATE}" +'#define U_BOOT_DMI_DATE "%m/%d/%Y"'; \
> >   			LC_ALL=C $${DATE} -u -d "$${SOURCE_DATE}" +'#define U_BOOT_BUILD_DATE 0x%Y%m%d'; \
> >   			LC_ALL=C $${DATE} -u -d "$${SOURCE_DATE}" +'#define U_BOOT_EPOCH %s'; \
> >   		else \
> > @@ -1842,7 +1841,6 @@ define filechk_timestamp.h
> >   		LC_ALL=C date +'#define U_BOOT_DATE "%b %d %C%y"'; \
> >   		LC_ALL=C date +'#define U_BOOT_TIME "%T"'; \
> >   		LC_ALL=C date +'#define U_BOOT_TZ "%z"'; \
> > -		LC_ALL=C date +'#define U_BOOT_DMI_DATE "%m/%d/%Y"'; \
> >   		LC_ALL=C date +'#define U_BOOT_BUILD_DATE 0x%Y%m%d'; \
> >   		LC_ALL=C date +'#define U_BOOT_EPOCH %s'; \
> >   	fi)
> > diff --git a/doc/develop/version.rst b/doc/develop/version.rst
> > index a7797db41bb2..066901bcd2d9 100644
> > --- a/doc/develop/version.rst
> > +++ b/doc/develop/version.rst
> > @@ -84,7 +84,6 @@ fields. For example::
> >      #define U_BOOT_DATE "Jan 06 2021"     (US format only)
> >      #define U_BOOT_TIME "08:50:36"        (24-hour clock)
> >      #define U_BOOT_TZ "-0700"             (Time zone in hours)
> > -   #define U_BOOT_DMI_DATE "01/06/2021"  (US format only)
> >      #define U_BOOT_BUILD_DATE 0x20210106  (hex yyyymmdd format)
> >      #define U_BOOT_EPOCH 1609948236
> > 
> > diff --git a/lib/smbios.c b/lib/smbios.c
> > index 9eb226ec9fbd..e5cf05073543 100644
> > --- a/lib/smbios.c
> > +++ b/lib/smbios.c
> > @@ -8,6 +8,7 @@
> >   #include <common.h>
> >   #include <dm.h>
> >   #include <env.h>
> > +#include <linux/stringify.h>
> >   #include <mapmem.h>
> >   #include <smbios.h>
> >   #include <sysinfo.h>
> > @@ -18,6 +19,28 @@
> >   #include <dm/uclass-internal.h>
> >   #endif
> > 
> > +/* Safeguard for checking that U_BOOT_VERSION_NUM macros are compatible with U_BOOT_DMI */
> > +#if U_BOOT_VERSION_NUM < 2000 || U_BOOT_VERSION_NUM > 2099 || \
> > +    U_BOOT_VERSION_NUM_PATCH < 1 || U_BOOT_VERSION_NUM_PATCH > 12
> > +#error U_BOOT_VERSION_NUM macros are not compatible with DMI, fix U_BOOT_DMI macros
> > +#endif
> > +
> > +/*
> > + * U_BOOT_DMI_DATE contains BIOS Release Date in format mm/dd/yyyy.
> 
> Why should we call this DMI_DATE and not SMBIOS_RELEASE_DATE?

I really do not know. It was called DMI_DATE also prior this my change.
I'm not changing name of this constant. If it is needed / required then
it can be done in other followup patch.

> Best regards
> 
> Heinrich
> 
> > + * BIOS Release Date is calculated from U-Boot version and fixed day 01.
> > + * So for U-Boot version 2021.04 it is calculated as "04/01/2021".
> > + * BIOS Release Date should contain date when code was released
> > + * and not when it was built or compiled.
> > + */
> > +#if U_BOOT_VERSION_NUM_PATCH < 10
> > +#define U_BOOT_DMI_MONTH "0" __stringify(U_BOOT_VERSION_NUM_PATCH)
> > +#else
> > +#define U_BOOT_DMI_MONTH __stringify(U_BOOT_VERSION_NUM_PATCH)
> > +#endif
> > +#define U_BOOT_DMI_DAY "01"
> > +#define U_BOOT_DMI_YEAR __stringify(U_BOOT_VERSION_NUM)
> > +#define U_BOOT_DMI_DATE U_BOOT_DMI_MONTH "/" U_BOOT_DMI_DAY "/" U_BOOT_DMI_YEAR
> > +
> >   DECLARE_GLOBAL_DATA_PTR;
> > 
> >   /**
> > 
> 


More information about the U-Boot mailing list