On 06/22/15 14:34, Laszlo Ersek wrote:
> On 06/21/15 22:00, Jordan Justen wrote:
>> On 2015-06-19 16:40:51, Laszlo Ersek wrote:
>>> Git commit 54753b60 (SVN r16870), "MdeModulePkg: Update SMBIOS revision to
>>> 3.0." changed PcdSmbiosVersion from 0x0208 to 0x0300. This controls the
>>> version number of the SMBIOS entry point table (and other things) that
>>> "MdeModulePkg/Universal/SmbiosDxe" installs.
>>>
>>> Alas, this change breaks older Linux guests, like RHEL-6 (up to RHEL-6.7);
>>
>> How does it break them? It seems a bit odd that the firmware could
>> break the OS by upgrading its SMBIOS version.
> 
> It breaks them because the SMBIOS 3.0 entry point has a different GUID
> in the UEFI Configuration Table, and older guests don't recognize that
> GUID. Please refer to this upstream kernel patch (from Ard):
> 
> http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=e1ccbbc9d5aa01a6c1c9c78acea6515db4f1be71
> 
> Kernels that do not have this patch (and probably more dependent code)
> won't recognize the SMBIOS 3.0 entry point.
> 
> The mantis ticket for the UEFI spec is
> <https://mantis.uefi.org/mantis/view.php?id=1191>, resolved in UEFI 2.5.

Thanks again for the reviews / acks; I worked the above explanation into
the commit message and committed the patch as SVN r17676.

Cheers
Laszlo


>> Anyway, I think it is good to extract it from QEMU fw-cfg, and I think
>> for now 2.8 seems a reasonable fall-back default.
> 
> Thanks.
> 
>> I wonder if someone wants to do something similar for Xen?
>>
>> Reviewed-by: Jordan Justen <jordan.l.jus...@intel.com>
> 
> Thanks a lot, Jordan!
> Laszlo
> 
>>> those are limited to 2.x (both in the guest kernel firmware driver, and in
>>> the dmidecode utility).
>>>
>>> The v2.1.0+ machine types of QEMU generate SMBIOS payload for the firmware
>>> to install. The payload includes the entry point table ("anchor" table).
>>> OvmfPkg/SmbiosPlatformDxe cannot install the anchor table (because that is
>>> the jurisdiction of the generic "MdeModulePkg/Universal/SmbiosDxe"
>>> driver); however, we can parse the entry point version from QEMU's anchor
>>> table, and instruct "MdeModulePkg/Universal/SmbiosDxe" to adhere to that
>>> version.
>>>
>>> On machine types older than v2.1.0, the feature is not available, but
>>> then, should anything in OVMF install SMBIOS tables, version 2.8 is simply
>>> safer / more widely supported than 3.0 -- hence the default 2.8 value for
>>> the dynamic PCD.
>>>
>>> We set the PCD in PlatformPei (when not on the S3 resume path), because
>>> that's an easy and certain way to set the PCD before a DXE driver reads
>>> it. This follows the example of PcdEmuVariableNvStoreReserved (which is
>>> read by EmuVariableFvbRuntimeDxe).
>>>
>>> RHBZ: https://bugzilla.redhat.com/show_bug.cgi?id=1232876
>>> Cc: Gabriel Somlo <so...@cmu.edu>
>>> Cc: Jordan Justen <jordan.l.jus...@intel.com>
>>> Contributed-under: TianoCore Contribution Agreement 1.0
>>> Signed-off-by: Laszlo Ersek <ler...@redhat.com>
>>> ---
>>>
>>> Notes:
>>>     This simple patch is somewhat urgent for RHEL-7.2, please help me by
>>>     reviewing it quickly. Thanks!
>>>
>>>  OvmfPkg/PlatformPei/PlatformPei.inf |  2 ++
>>>  OvmfPkg/PlatformPei/Platform.c      | 39 
>>> +++++++++++++++++++++++++++++++++++++
>>>  OvmfPkg/OvmfPkgIa32.dsc             |  2 ++
>>>  OvmfPkg/OvmfPkgIa32X64.dsc          |  2 ++
>>>  OvmfPkg/OvmfPkgX64.dsc              |  2 ++
>>>  5 files changed, 47 insertions(+)
>>>
>>> diff --git a/OvmfPkg/PlatformPei/PlatformPei.inf 
>>> b/OvmfPkg/PlatformPei/PlatformPei.inf
>>> index 0307bca..721495b 100644
>>> --- a/OvmfPkg/PlatformPei/PlatformPei.inf
>>> +++ b/OvmfPkg/PlatformPei/PlatformPei.inf
>>> @@ -58,6 +58,7 @@ [LibraryClasses]
>>>    QemuFwCfgLib
>>>    MtrrLib
>>>    PcdLib
>>> +  BaseMemoryLib
>>>  
>>>  [Pcd]
>>>    gUefiOvmfPkgTokenSpaceGuid.PcdOvmfPeiMemFvBase
>>> @@ -81,6 +82,7 @@ [Pcd]
>>>    gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableSize
>>>    gEfiMdeModulePkgTokenSpaceGuid.PcdEmuVariableNvStoreReserved
>>>    gEfiMdeModulePkgTokenSpaceGuid.PcdPciDisableBusEnumeration
>>> +  gEfiMdeModulePkgTokenSpaceGuid.PcdSmbiosVersion
>>>    gUefiCpuPkgTokenSpaceGuid.PcdCpuLocalApicBaseAddress
>>>  
>>>  [Ppis]
>>> diff --git a/OvmfPkg/PlatformPei/Platform.c b/OvmfPkg/PlatformPei/Platform.c
>>> index 2a1b577..fc98fc3 100644
>>> --- a/OvmfPkg/PlatformPei/Platform.c
>>> +++ b/OvmfPkg/PlatformPei/Platform.c
>>> @@ -32,9 +32,11 @@
>>>  #include <Library/PeiServicesLib.h>
>>>  #include <Library/QemuFwCfgLib.h>
>>>  #include <Library/ResourcePublicationLib.h>
>>> +#include <Library/BaseMemoryLib.h>
>>>  #include <Guid/MemoryTypeInformation.h>
>>>  #include <Ppi/MasterBootMode.h>
>>>  #include <IndustryStandard/Pci22.h>
>>> +#include <IndustryStandard/SmBios.h>
>>>  #include <OvmfPlatforms.h>
>>>  
>>>  #include "Platform.h"
>>> @@ -380,6 +382,41 @@ DebugDumpCmos (
>>>  
>>>  
>>>  /**
>>> +  Set the SMBIOS entry point version for the generic SmbiosDxe driver.
>>> +**/
>>> +STATIC
>>> +VOID
>>> +SmbiosVersionInitialization (
>>> +  VOID
>>> +  )
>>> +{
>>> +  FIRMWARE_CONFIG_ITEM     Anchor;
>>> +  UINTN                    AnchorSize;
>>> +  SMBIOS_TABLE_ENTRY_POINT QemuAnchor;
>>> +  UINT16                   SmbiosVersion;
>>> +
>>> +  if (RETURN_ERROR (QemuFwCfgFindFile ("etc/smbios/smbios-anchor", &Anchor,
>>> +                      &AnchorSize)) ||
>>> +      AnchorSize != sizeof QemuAnchor) {
>>> +    return;
>>> +  }
>>> +
>>> +  QemuFwCfgSelectItem (Anchor);
>>> +  QemuFwCfgReadBytes (AnchorSize, &QemuAnchor);
>>> +  if (CompareMem (QemuAnchor.AnchorString, "_SM_", 4) != 0 ||
>>> +      CompareMem (QemuAnchor.IntermediateAnchorString, "_DMI_", 5) != 0) {
>>> +    return;
>>> +  }
>>> +
>>> +  SmbiosVersion = (UINT16)(QemuAnchor.MajorVersion << 8 |
>>> +                           QemuAnchor.MinorVersion);
>>> +  DEBUG ((EFI_D_INFO, "%a: SMBIOS version from QEMU: 0x%04x\n", 
>>> __FUNCTION__,
>>> +    SmbiosVersion));
>>> +  PcdSet16 (PcdSmbiosVersion, SmbiosVersion);
>>> +}
>>> +
>>> +
>>> +/**
>>>    Perform Platform PEI initialization.
>>>  
>>>    @param  FileHandle      Handle of the file being invoked.
>>> @@ -429,6 +466,8 @@ InitializePlatform (
>>>      PeiFvInitialization ();
>>>  
>>>      MemMapInitialization ();
>>> +
>>> +    SmbiosVersionInitialization ();
>>>    }
>>>  
>>>    MiscInitialization ();
>>> diff --git a/OvmfPkg/OvmfPkgIa32.dsc b/OvmfPkg/OvmfPkgIa32.dsc
>>> index ad476da..b71f751 100644
>>> --- a/OvmfPkg/OvmfPkgIa32.dsc
>>> +++ b/OvmfPkg/OvmfPkgIa32.dsc
>>> @@ -380,6 +380,8 @@ [PcdsDynamicDefault]
>>>    gEfiMdeModulePkgTokenSpaceGuid.PcdSetupVideoHorizontalResolution|640
>>>    gEfiMdeModulePkgTokenSpaceGuid.PcdSetupVideoVerticalResolution|480
>>>  
>>> +  gEfiMdeModulePkgTokenSpaceGuid.PcdSmbiosVersion|0x0208
>>> +
>>>  
>>> ################################################################################
>>>  #
>>>  # Components Section - list of all EDK II Modules needed by this Platform.
>>> diff --git a/OvmfPkg/OvmfPkgIa32X64.dsc b/OvmfPkg/OvmfPkgIa32X64.dsc
>>> index 6b65ee8..12818e5 100644
>>> --- a/OvmfPkg/OvmfPkgIa32X64.dsc
>>> +++ b/OvmfPkg/OvmfPkgIa32X64.dsc
>>> @@ -386,6 +386,8 @@ [PcdsDynamicDefault]
>>>    gEfiMdeModulePkgTokenSpaceGuid.PcdSetupVideoHorizontalResolution|640
>>>    gEfiMdeModulePkgTokenSpaceGuid.PcdSetupVideoVerticalResolution|480
>>>  
>>> +  gEfiMdeModulePkgTokenSpaceGuid.PcdSmbiosVersion|0x0208
>>> +
>>>  
>>> ################################################################################
>>>  #
>>>  # Components Section - list of all EDK II Modules needed by this Platform.
>>> diff --git a/OvmfPkg/OvmfPkgX64.dsc b/OvmfPkg/OvmfPkgX64.dsc
>>> index a40d7cb..623033d 100644
>>> --- a/OvmfPkg/OvmfPkgX64.dsc
>>> +++ b/OvmfPkg/OvmfPkgX64.dsc
>>> @@ -385,6 +385,8 @@ [PcdsDynamicDefault]
>>>    gEfiMdeModulePkgTokenSpaceGuid.PcdSetupVideoHorizontalResolution|640
>>>    gEfiMdeModulePkgTokenSpaceGuid.PcdSetupVideoVerticalResolution|480
>>>  
>>> +  gEfiMdeModulePkgTokenSpaceGuid.PcdSmbiosVersion|0x0208
>>> +
>>>  
>>> ################################################################################
>>>  #
>>>  # Components Section - list of all EDK II Modules needed by this Platform.
>>> -- 
>>> 1.8.3.1
>>>
> 
> 
> ------------------------------------------------------------------------------
> Monitor 25 network devices or servers for free with OpManager!
> OpManager is web-based network management software that monitors 
> network devices and physical & virtual servers, alerts via email & sms 
> for fault. Monitor 25 devices for free with no restriction. Download now
> http://ad.doubleclick.net/ddm/clk/292181274;119417398;o
> _______________________________________________
> edk2-devel mailing list
> edk2-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/edk2-devel
> 


------------------------------------------------------------------------------
Monitor 25 network devices or servers for free with OpManager!
OpManager is web-based network management software that monitors 
network devices and physical & virtual servers, alerts via email & sms 
for fault. Monitor 25 devices for free with no restriction. Download now
http://ad.doubleclick.net/ddm/clk/292181274;119417398;o
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/edk2-devel

Reply via email to