
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@kernel.org Reviewed-by: Simon Glass sjg@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"'; \
else \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'; \
@@ -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_BUILD_DATE 0x%Y%m%d'; \ LC_ALL=C date +'#define U_BOOT_EPOCH %s'; \ fi)LC_ALL=C date +'#define U_BOOT_DMI_DATE "%m/%d/%Y"'; \
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;
/**