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?
Option A: Change the Legacy smbios0 date to 04/01/2014, not sure how this affects machines. Option B: win_bios_date will be 01/01/2011 too - but this will change the SystemBiosDate value - which might break applications that currently rely that it’s 04/01/2014 as reported now. Option C: win_bios_date will always be 04/01/2014, default legacy smbios0.date is 01/01/2011, overriding the legacy smbios0.date will override win_bios_date too.
I’m inclined to implement option C since it doesn’t break current functionality, what do you think?
Sam
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).
-Kevin
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 smbios_romfile_setup(void) 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) {