svn commit: r307326 - head/sys/boot/efi/loader

Ravi Pokala rpokala at mac.com
Fri Oct 14 17:26:12 UTC 2016


-----Original Message-----
> From: <owner-src-committers at freebsd.org> on behalf of Warner Losh <imp at bsdimp.com>
> Date: 2016-10-14, Friday at 10:16
> To: Doug Ambrisko <ambrisko at freebsd.org>
> Cc: src-committers <src-committers at freebsd.org>, "svn-src-all at freebsd.org" <svn-src-all at freebsd.org>, "svn-src-head at freebsd.org" <svn-src-head at freebsd.org>
> Subject: Re: svn commit: r307326 - head/sys/boot/efi/loader
> 
> Love the functionality,

Ditto! Thank you Doug! :-)

> but don't like using the 'hint' namespace for
> this. Can we change it now before too many things depend on it? We had
> similar issues in ACPI and moved it to the 'acpi' space. Can we move
> this to the 'smbios' space please?
> 
> The reason is that 'hint' is special and sometimes filtered out, so it
> is a poor choice to export data from the boot loader to the kernel.

Loader already exports a bunch of stuff as "smbios.*" kenv variables. So perhaps "smbios.addr" or somesuch?

Thanks,

Ravi (rpokala@)

> Warner
> 
> On Fri, Oct 14, 2016 at 11:10 AM, Doug Ambrisko <ambrisko at freebsd.org> wrote:
>> Author: ambrisko
>> Date: Fri Oct 14 17:10:53 2016
>> New Revision: 307326
>> URL: https://svnweb.freebsd.org/changeset/base/307326
>>
>> Log:
>>   In UEFI mode expose the SMBIOS anchor base address via kenv so the kernel
>>   etc. can find out where the SMBIOS entry point is located.  In pure
>>   UEFI mode the BIOS is not mapped into the standard address space so the
>>   SMBIOS table might not appear between 0xf0000 and 0xfffff.  The
>>   UEFI environment can report this the location of the anchor.  If it is
>>   reported then expose it as hint.smbios.0.mem.  This can then be used
>>   by other tools.  However, we should make smbios(4) useful and have it
>>   take this value and provide accesor function so ipmi(4) etc. don't
>>   have to parse and figure things about the SMBIOS table.  I have some
>>   simple patches to smbios(4) to expose this address as sysctl and
>>   for ipmi(4) to get the base address.  However, the real fix is to
>>   have ipmi(4) ask smbios(4) for what it wants and have smbios(4)
>>   parse it out and return it.  This would make smbios(4) useful and reduce
>>   duplicated code.  If this address doesn't point to the anchor then
>>   finding SMBIOS info. will fail as if this didn't exist.  So there should
>>   be no harm.
>>
>>   With this change and the following hack, dmidecode works on a bunch of
>>   UEFI machines that I tested:
>>
>>     if kenv hint.smbios.0.mem > /dev/null
>>     then
>>           mkdir -p /sys/firmware/efi
>>           mount -t tmpfs -o size=8k tmpfs /sys/firmware/efi
>>           echo "SMBIOS=`kenv hint.smbios.0.mem`" > /sys/firmware/efi/systab
>>     fi
>>
>>   Linux exposes this information via the /sys/firmware/efi/systab file which
>>   dmidecode looks at.  We should update dmidecode to do this the FreeBSD
>>   way when we determine what that is!
>>
>>   Reviewed by:  jhb
>>
>> Modified:
>>   head/sys/boot/efi/loader/main.c
>>
>> Modified: head/sys/boot/efi/loader/main.c
>> ==============================================================================
>> --- head/sys/boot/efi/loader/main.c     Fri Oct 14 17:04:07 2016        (r307325)
>> +++ head/sys/boot/efi/loader/main.c     Fri Oct 14 17:10:53 2016        (r307326)
>> @@ -235,6 +235,7 @@ main(int argc, CHAR16 *argv[])
>>         uint64_t pool_guid;
>>         UINTN k;
>>         int has_kbd;
>> +       char buf[40];
>>
>>         archsw.arch_autoload = efi_autoload;
>>         archsw.arch_getdev = efi_getdev;
>> @@ -447,6 +448,9 @@ main(int argc, CHAR16 *argv[])
>>         for (k = 0; k < ST->NumberOfTableEntries; k++) {
>>                 guid = &ST->ConfigurationTable[k].VendorGuid;
>>                 if (!memcmp(guid, &smbios, sizeof(EFI_GUID))) {
>> +                       snprintf(buf, sizeof(buf), "%p",
>> +                           ST->ConfigurationTable[k].VendorTable);
>> +                       setenv("hint.smbios.0.mem", buf, 1);
>>                         smbios_detect(ST->ConfigurationTable[k].VendorTable);
>>                         break;
>>                 }
>> @@ -603,7 +607,8 @@ command_configuration(int argc, char *ar
>>                 else if (!memcmp(guid, &acpi20, sizeof(EFI_GUID)))
>>                         printf("ACPI 2.0 Table");
>>                 else if (!memcmp(guid, &smbios, sizeof(EFI_GUID)))
>> -                       printf("SMBIOS Table");
>> +                       printf("SMBIOS Table %p",
>> +                           ST->ConfigurationTable[i].VendorTable);
>>                 else if (!memcmp(guid, &dxe, sizeof(EFI_GUID)))
>>                         printf("DXE Table");
>>                 else if (!memcmp(guid, &hoblist, sizeof(EFI_GUID)))
>>





More information about the svn-src-head mailing list