I actually love this idea.

So we can now expect only ’06/23/99’ date string to reside in F-SEG at build time.
This will allow setting the SystemBiosDate to all dates from 06/23/99 to 01/01/80 (2080) which is reasonable enough.

So now we will copy the smbios0.date to "char win_bios_date[] VARFSEG” and allow setting the SystemBiosDate to the smbios supplied one.

The only question now is what to do in the Legacy SMBIOS case where the SMBIOS value which is exposed today is 01/01/2011 but the value in SystemBiosDate is 04/01/2014?

I’m inclined to implement option C since it doesn’t break current functionality, what do you think?


On 23 May 2019, at 19:29, Kevin O'Connor <kevin@koconnor.net> wrote:

On Thu, May 23, 2019 at 06:58:57PM +0300, Sam Eiderman wrote:
On 23 May 2019, at 18:54, Kevin O'Connor <kevin@koconnor.net> wrote:
I understand.  If we ensured the smbios date is always in the
f-segment, would that also solve the problem?  (That is, using the
'char win_bios_date[] VARFSEG' method discussed previously.)

That would only be half of the solution, since F-SEG contains the following dates: ['04/01/2014', '01/01/2011', '06/23/99’]
It means that no matter what is found in "char win_bios_date[] VARFSEG”, SystemBiosDate will always be a date of ’04/01/2014’ or later.
To really control the output of SystemBiosDate, all dates in SeaBIOS’s F-SEG should be the desired SystemBiosDate (or older).

Under normal circumstances, the 32bit init code is relocated out of
the f-segment.  Unfortunately, that doesn't work for anonymous
strings.  One simple trick, though, is to force these problematic
strings into named variables (see patch below).


diff --git a/src/fw/biostables.c b/src/fw/biostables.c
index fe8626e..269b858 100644
--- a/src/fw/biostables.c
+++ b/src/fw/biostables.c
@@ -401,7 +401,7 @@ smbios_new_type_0(void *start,

#define BIOS_NAME "SeaBIOS"
-#define BIOS_DATE "04/01/2014"
+static const char BIOS_DATE[] = "04/01/2014";

static int
diff --git a/src/fw/smbios.c b/src/fw/smbios.c
index 62a563b..8e7ee6a 100644
--- a/src/fw/smbios.c
+++ b/src/fw/smbios.c
@@ -161,7 +161,7 @@ get_external(int type, char **p, unsigned *nr_structs,
    } while (0)

/* Type 0 -- BIOS Information */
-#define RELEASE_DATE_STR "01/01/2011"
+static const char RELEASE_DATE_STR[] = "01/01/2011";
static void *
smbios_init_type_0(void *start)