public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Pete Batard" <pete@akeo.ie>
To: Leif Lindholm <leif@nuviainc.com>
Cc: devel@edk2.groups.io, ard.biesheuvel@arm.com,
	awarkentin@vmware.com, samer.el-haj-mahmoud@arm.com
Subject: Re: [edk2-platforms][PATCH 1/1] Platforms/RaspberryPi: Fix BIOS Release Date and System Manufacturer
Date: Thu, 23 Jul 2020 15:38:55 +0100	[thread overview]
Message-ID: <a1cf09fa-eed2-b874-3354-285f8ce1336f@akeo.ie> (raw)
In-Reply-To: <20200723110826.GM1337@vanye>

Hi Leif,

On 2020.07.23 12:08, Leif Lindholm wrote:
> On Mon, Jul 20, 2020 at 17:15:07 +0100, Pete Batard wrote:
>> Per SMBIOS specs, The Type 0 BIOS Release Date is not a free form field but
>> must be specified in a US middle-endian format (mm/dd/yyyy), so make sure
>> we populate it accordingly by converting gcc's __DATE__ string. This is
>> required for platforms like Windows, that fail to parse the date otherwise.
>>
>> Also, the system manufacturer should not be set to the same value as the
>> board manufacturer for the Type 1 strings, as, on the Raspberry Pi, this is
>> not representative of the actual manufacturer of the system, which is the
>> Raspberry Pi Foundation always.
>>
>> It should be noted that we do not expect other compilers than ones using
>> a __DATE__ format similar to gcc's to be used for the foreseeable future.
>>
>> Signed-off-by: Pete Batard <pete@akeo.ie>
>> ---
>>   Platform/RaspberryPi/Drivers/PlatformSmbiosDxe/PlatformSmbiosDxe.c | 31 ++++++++++++++++++--
>>   1 file changed, 29 insertions(+), 2 deletions(-)
>>
>> diff --git a/Platform/RaspberryPi/Drivers/PlatformSmbiosDxe/PlatformSmbiosDxe.c b/Platform/RaspberryPi/Drivers/PlatformSmbiosDxe/PlatformSmbiosDxe.c
>> index d5fb843d43ce..fb775d00feba 100644
>> --- a/Platform/RaspberryPi/Drivers/PlatformSmbiosDxe/PlatformSmbiosDxe.c
>> +++ b/Platform/RaspberryPi/Drivers/PlatformSmbiosDxe/PlatformSmbiosDxe.c
>> @@ -119,11 +119,12 @@ SMBIOS_TABLE_TYPE0 mBIOSInfoType0 = {
>>   
>>   CHAR8 mBiosVendor[128]  = "EDK2";
>>   CHAR8 mBiosVersion[128] = "EDK2-DEV";
>> +CHAR8 mBiosDate[12]     = "00/00/0000";
>>   
>>   CHAR8 *mBIOSInfoType0Strings[] = {
>>     mBiosVendor,              // Vendor
>>     mBiosVersion,             // Version
>> -  __DATE__ " " __TIME__,    // Release Date
>> +  mBiosDate,                // Release Date
>>     NULL
>>   };
>>   
>> @@ -149,7 +150,7 @@ CHAR8 mSysInfoSerial[sizeof (UINT64) * 2 + 1];
>>   CHAR8 mSysInfoSKU[sizeof (UINT64) * 2 + 1];
>>   
>>   CHAR8 *mSysInfoType1Strings[] = {
>> -  mSysInfoManufName,
>> +  "Raspberry Pi Foundation",
>>     mSysInfoProductName,
>>     mSysInfoVersionName,
>>     mSysInfoSerial,
>> @@ -626,6 +627,28 @@ BIOSInfoUpdateSmbiosType0 (
>>     INTN   i;
>>     INTN   State = 0;
>>     INTN   Value[2];
>> +  INTN   Year = (__DATE__[7] == '?' ? 1900  \
>> +           : (((__DATE__[7] - '0') * 1000 ) \
>> +           + (__DATE__[8] - '0') * 100      \
>> +           + (__DATE__[9] - '0') * 10       \
>> +           + __DATE__[10] - '0'));
>> +  INTN   Month = ( __DATE__ [2] == '?' ? 1  \
>> +           : __DATE__ [2] == 'n' ? (        \
>> +             __DATE__ [1] == 'a' ? 1 : 6)   \
>> +           : __DATE__ [2] == 'b' ? 2        \
>> +           : __DATE__ [2] == 'r' ? (        \
>> +             __DATE__ [0] == 'M' ? 3 : 4)   \
>> +           : __DATE__ [2] == 'y' ? 5        \
>> +           : __DATE__ [2] == 'l' ? 7        \
>> +           : __DATE__ [2] == 'g' ? 8        \
>> +           : __DATE__ [2] == 'p' ? 9        \
>> +           : __DATE__ [2] == 't' ? 10       \
>> +           : __DATE__ [2] == 'v' ? 11       \
>> +           : 12);
>> +  INTN   Day = ( __DATE__[4] == '?' ? 1     \
>> +           : ((__DATE__[4] == ' ' ? 0 :     \
>> +             ((__DATE__[4] - '0') * 10))    \
>> +           + __DATE__[5] - '0'));
> 
> So, this hunk is very neat, but nigh-on unreviewable.
> I.e. we should defintely have it - but only once.
> 
> Could you break this up into some macros to go into some generic
> helper lib? (I don't have a better idea than EmbeddedPkg TimeBaseLib,
> but then that is already included in this module.)

So you would like to have a set of macros like:
TIME_GET_BUILD_YEAR, TIME_GET_BUILD_MONTH, TIME_GET_BUILD_DAY in 
TimeBaseLib.h that perform the above?

> Would you be OK to break that snippet out separate?

I think that's a good idea, especially as there is a potential 
underlying issue with the __DATE__ format being specific to each 
compiler, so we probably want to handle compiler detection somewhere, 
preferably globally. For instance, the Intel compiler's __DATE__ format 
would not work with the above, so I'll add some "vetted compiler" 
detection for the macros.

The one thing I am not planning to look into is that, of course, as long 
as you don't explicitly force the compiler to rebuild the sources where 
these macros are used, then you may end up with a very obsolete build 
date compared to the actual date of your last re-build. But that's 
mostly because I don't think there exists a generic solution we can ise 
to force recompilation of a file that uses a specific macro and also 
because our main goal with these is to ensure that the Pi firmwares, 
that we produce through AppVeyor, have a proper build date, and AppVeyor 
builds are are always clean.

I'll send an EDK2 patch for the macros, and then a revised patch for 
this when I get a chance.

Regards,

/Pete

> 
> /
>      Leif
> 
>>     // Populate the Firmware major and minor.
>>     Status = mFwProtocol->GetFirmwareRevision (&EpochSeconds);
>> @@ -648,6 +671,10 @@ BIOSInfoUpdateSmbiosType0 (
>>       mBiosVendor, sizeof (mBiosVendor));
>>     UnicodeStrToAsciiStrS ((CHAR16*)PcdGetPtr (PcdFirmwareVersionString),
>>       mBiosVersion, sizeof (mBiosVersion));
>> +  ASSERT (Year >= 0 && Year <= 9999);
>> +  ASSERT (Month >= 1 && Month <= 12);
>> +  ASSERT (Day >= 1 && Day <= 31);
>> +  AsciiSPrint (mBiosDate, sizeof (mBiosDate), "%02d/%02d/%04d", Month, Day, Year);
>>   
>>     // Look for a "x.y" numeric string anywhere in mBiosVersion and
>>     // try to parse it to populate the BIOS major and minor.
>> -- 
>> 2.21.0.windows.1
>>


  reply	other threads:[~2020-07-23 14:38 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-07-20 16:15 [edk2-platforms][PATCH 1/1] Platforms/RaspberryPi: Fix BIOS Release Date and System Manufacturer Pete Batard
2020-07-20 16:47 ` Andrei Warkentin
2020-07-20 16:51 ` Samer El-Haj-Mahmoud
2020-07-23 11:08 ` Leif Lindholm
2020-07-23 14:38   ` Pete Batard [this message]
2020-07-23 15:47     ` Leif Lindholm
2020-07-23 17:15       ` [edk2-devel] " Andrew Fish
2020-07-23 17:44         ` Pete Batard

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-list from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=a1cf09fa-eed2-b874-3354-285f8ce1336f@akeo.ie \
    --to=devel@edk2.groups.io \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox