On 02/18/16 11:16, Laszlo Ersek wrote: > On 02/18/16 10:13, Ard Biesheuvel wrote: >> The legacy 32-bit SMBIOS entry point has little use on AARCH64 systems, >> since many such systems have no 32-bit addressable physical RAM, and so >> OSes that implement SMBIOS will have to be able to deal with the 64-bit >> entry point anyway. So don't expose the 32-bit entry point at all, and >> save some memory below 4 GB. >> >> Contributed-under: TianoCore Contribution Agreement 1.0 >> Signed-off-by: Ard Biesheuvel <[email protected]> >> --- >> >> Note to Laszlo: >> For some background, this is not just about saving a couple of KB of memory, >> it is about >> a) saving memory below 4 GB for 32-bit DMA, this is not currently an issue >> under >> virt but it may be with direct device assignment and no IOMMU, > > Device assignment without an IOMMU should never be done. > >> but in the >> general case, this is one reason we should standardize on the 64-bit >> versions >> of these structures >> b) the OS will map main memory in 1 GB chunks if it can, and punching a 1 >> page >> hole (e.g., for SMBIOS data) into it will result in the whole page being >> mapped using 2 MB and 4 KB blocks instead, and under virt, each *level* of >> lookup at stage 1 (the guest virtual page table) will result in a full >> page >> table walk at level 2 (the guest PA to host PA mapping), so being able to >> map >> RAM as efficiently as possible is important. > > I think reason (b) is important; please add (b) to the commit message. > > Also, there's a typo in it I think: instead of > > ... will result in the whole page being mapped using 2 MB ... > > it should say > > ... will result in the 1GB chunk being mapped using 2 MB ... > >> >> ArmVirtPkg/ArmVirtQemu.dsc | 8 ++++++++ >> 1 file changed, 8 insertions(+) >> >> diff --git a/ArmVirtPkg/ArmVirtQemu.dsc b/ArmVirtPkg/ArmVirtQemu.dsc >> index 7c6419fbb92f..5a77cb239076 100644 >> --- a/ArmVirtPkg/ArmVirtQemu.dsc >> +++ b/ArmVirtPkg/ArmVirtQemu.dsc >> @@ -224,6 +224,14 @@ [PcdsDynamicDefault.common] >> gEfiMdeModulePkgTokenSpaceGuid.PcdSmbiosDocRev|0x0 >> gUefiOvmfPkgTokenSpaceGuid.PcdQemuSmbiosValidated|FALSE >> >> +[PcdsFixedAtBuild.AARCH64] >> + # QEMU/mach-virt provides at least version 3.0 SMBIOS entry point and >> tables, > > Okay, so this aspect was something that I tried to validate extensively, > before reading your comments here. :) Because, I thought it would be > brittle to rely on this. > > We set the SMBIOS entry point version in > "OvmfPkg/Library/SmbiosVersionLib". Theoretically, on the aarch64 target > QEMU could export a 2.x entry point. (It would be a QEMU bug of course.) > For some reason I felt that we shouldn't depend on QEMU being correct here. > > Turns out we don't actually depend on it. Namely, clearing BIT0 (and > BIT0 *only*) in PcdSmbiosEntryPointProvideMethod has an effect only if > the entry point version is >= 3.0 (see > "MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.c".) > > If the entry point version is < 3.0, for whatever reason, then clearing > BIT0 in the PCD has no effect. > > ... I realize that in practice, "entry point version < 3.0" and > "[PcdsFixedAtBuild.AARCH64]" never happen at the same time (because QEMU > is not buggy), but I still feel that it's important that > MdeModulePkg/Universal/SmbiosDxe will ignore BIT0, if the entry point is > < 3.0 -- this makes our SmbiosVersionLib more robust. > > Initially I worried that by clearing BIT0, < 3.0 entry points could be > broken *in general*. With that in mind, I wanted to ask you to add some > ASSERT()s to SmbiosVersionLib -- when the entry point exported by QEMU > is < 3.0, then BIT0 should be set --, but after all this is not > necessary, due to SmbiosDxe giving first priority to the entry point > version. > > Ultimately, my point is, please drop the above remark from the comment. > We should instead say, > > Clearing BIT0 in this PCD prevents installing a 32-bit SMBIOS entry > point, if the entry point version is >= 3.0. > >> + # and AARCH64 OSes cannot assume the presence of the 32-bit entry point >> + # anyway (because many AARCH64 systems don't have 32-bit addressable >> physical >> + # RAM). Since the additional allocations below 4 GB needlessly fragment >> the >> + # memory map, expose the 64-bit entry point only. > > and here I suggest, for the end: > > ... expose the 64-bit entry point only, for entry point versions > >= 3.0. > >> + gEfiMdeModulePkgTokenSpaceGuid.PcdSmbiosEntryPointProvideMethod|2 > > Because this is a bitmap, I propose 0x2. > >> + >> >> ################################################################################ >> # >> # Components Section - list of all EDK II Modules needed by this Platform >> > > Summary: > (1) please fix the "whole page" --> "1GB chunk" typo in note (b) > (2) please merge note (b) into the commit message > (3) drop the QEMU/mach-virt reference from the code comment, instead > state what effect clearing BIT0 has, and only when > (4) again restrict the last sentence with "for EP vers >= 3.0".
(5) Please reflect the same in the subject of the patch -- sth like ArmVirtPkg: ArmVirtQemu: expose only 64-bit entry point for v3.0+ SMBIOS (72 characters.) Thanks! Laszlo _______________________________________________ edk2-devel mailing list [email protected] https://lists.01.org/mailman/listinfo/edk2-devel

