public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Gao, Liming" <liming.gao@intel.com>
To: Laszlo Ersek <lersek@redhat.com>,
	edk2-devel-01 <edk2-devel@lists.01.org>
Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org>,
	"Justen, Jordan L" <jordan.l.justen@intel.com>
Subject: Re: [PATCH 1/2] OvmfPkg: disable build-time relocation for DXEFV modules
Date: Thu, 29 Jun 2017 03:32:54 +0000	[thread overview]
Message-ID: <4A89E2EF3DFEDB4C8BFDE51014F606A14D74FBA1@shsmsx102.ccr.corp.intel.com> (raw)
In-Reply-To: <20170628220645.26413-2-lersek@redhat.com>

Laszlo:
  LMFA feature doesn't do PE image rebase at build time. Only XIP module needs to be rebased at build time. LMFA feature will specify the loaded memory address for each PE image. At build time, build tool records the memory address into the one field of PE image. It doesn't rebase PE image. At boot time, PeiCore/DxeCore/SmmCore will parse PE image, and try to load it at the preferred memory address. If the preferred memory address is not available, PE image will be loaded to other memory address. LMFA feature only supports the source build EFI image, not support the binary EFI image. This is a debug feature. 

  For this case, OvmfPkg DXEFV doesn't require to run as XIP. So, it doesn't require rebase. I agree this change. 

Thanks
Liming
>-----Original Message-----
>From: Laszlo Ersek [mailto:lersek@redhat.com]
>Sent: Thursday, June 29, 2017 6:07 AM
>To: edk2-devel-01 <edk2-devel@lists.01.org>
>Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org>; Justen, Jordan L
><jordan.l.justen@intel.com>; Gao, Liming <liming.gao@intel.com>
>Subject: [PATCH 1/2] OvmfPkg: disable build-time relocation for DXEFV
>modules
>
>When the GenFv utility from BaseTools composes a firmware volume, it
>checks whether modules in the firmware volume are subject to build-time
>relocation. The primary indication for relocation is whether the firmware
>volume has a nonzero base address, according to the [FD] section(s) in the
>FDF file that refer to the firmware volume.
>
>The idea behind build-time relocation is that XIP (execute in place)
>modules will not be relocated at boot-time:
>
>- Pre-DXE phase modules generally execute in place.
>
>  (OVMF is no exception, despite the fact that we have writeable memory
>  even in SEC: PEI_CORE and PEIMs run in-place from PEIFV, after SEC
>  decompresses PEIFV and DXEFV from FVMAIN_COMPACT (flash) to RAM.
>  PEI_CORE and the PEIMs are relocated at boot-time only after PlatformPei
>  installs the permanent PEI RAM, and the RAM migration occurs.)
>
>- Modules dispatched by the DXE Core are generally relocated at boot-time.
>  However, this is not necessarily so, the LMFA (Load Modules at Fixed
>  Address) feature apparently allows in-place execution for such modules
>  as well, deriving the load address from the containing firmware volume's
>  base address at build time.
>
>  (LMFA is controlled by the
>  gEfiMdeModulePkgTokenSpaceGuid.PcdLoadModuleAtFixAddressEnable
>fixed
>  PCD, which we leave disabled in OVMF.)
>
>Therefore GenFv relocates even DXE and UEFI driver modules if the
>containing firmware volume has a nonzero base address.
>
>In OVMF, this is the case for both PEIV and DXEFV:
>
>> [FD.MEMFD]
>> BaseAddress   = $(MEMFD_BASE_ADDRESS)
>> Size          = 0xB00000
>> ErasePolarity = 1
>> BlockSize     = 0x10000
>> NumBlocks     = 0xB0
>> ...
>> 0x020000|0x0E0000
>>
>gUefiOvmfPkgTokenSpaceGuid.PcdOvmfPeiMemFvBase|gUefiOvmfPkgToke
>nSpaceGuid.PcdOvmfPeiMemFvSize
>> FV = PEIFV
>>
>> 0x100000|0xA00000
>>
>gUefiOvmfPkgTokenSpaceGuid.PcdOvmfDxeMemFvBase|gUefiOvmfPkgTok
>enSpaceGuid.PcdOvmfDxeMemFvSize
>> FV = DXEFV
>
>While the build-time relocation certainly makes sense for PEIFV (see
>above), the reasons for which we specify DXEFV under [FD.MEMFD] are
>weaker:
>
>- we set the PcdOvmfDxeMemFvBase and PcdOvmfDxeMemFvSize PCDs
>here,
>
>- and we ascertain that DXEFV, when decompressed by SEC from
>  FVMAIN_COMPACT, will fit into the area allotted here, at build time.
>
>In other words, the build-time relocation of the modules in DXEFV is a
>waste of resources. But, it gets worse:
>
>Build-time relocation of an executable is only possible if the on-disk and
>in-memory layouts are identical, i.e., if the sections of the PE/COFF
>image adhere to the same alignment on disk and in memory. Put differently,
>the FileAlignment and SectionAlignment headers must be equal.
>
>For boot-time modules that we build as part of edk2, both alignment values
>are 0x20 bytes. For runtime modules that we build as part of edk2, both
>alignment values are 0x1000 bytes. This is why the DXEFV relocation,
>albeit wasteful, is also successful every time.
>
>Unfortunately, if we try to include a PE/COFF binary in DXEFV that
>originates from outside of edk2, the DXEFV relocation can fail due to the
>binary having unmatched FileAlignment and SectionAlignment headers. This
>is precisely the case with the E3522X2.EFI network driver for the e1000
>NIC, from Intel's BootUtil / PREBOOT.EXE distribution.
>
>The solution is to use the FvForceRebase=FALSE override under [FV.DXEFV].
>This tells GenFv not to perform build-time relocation on the firmware
>volume, despite the FV having a nonzero base address. As stated above,
>this relocation has always been useless and wasteful in OVMF, because we
>never enable LMFA.
>
>(Put differently, E3522X2.EFI could never be loaded from an FV with LMFA
>enabled for the platform because E3522X2.EFI has unmatched FileAlignment
>and SectionAlignment headers.)
>
>In DXEFV we also have SMM drivers. Those are relocated at boot-time (into
>SMRAM) unconditionally, regardless of LMFA; SMRAM is always discovered at
>boot-time.
>
>Kudos to Ard and Liming for the PE/COFF sections & relocations
>explanation, and for the FvForceRebase=FALSE tip.
>
>I regression-tested this change in the following configurations (all with
>normal boot and S3 suspend/resume):
>
>  IA32,     q35,     SMM,     Linux
>  IA32X64,  q35,     SMM,     Linux
>  IA32X64,  q35,     SMM,     Windows-8.1
>  X64,      i440fx,  no-SMM,  Linux
>
>Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org>
>Cc: Jordan Justen <jordan.l.justen@intel.com>
>Cc: Liming Gao <liming.gao@intel.com>
>Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=613
>Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=615
>Suggested-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
>Suggested-by: Liming Gao <liming.gao@intel.com>
>Contributed-under: TianoCore Contribution Agreement 1.0
>Signed-off-by: Laszlo Ersek <lersek@redhat.com>
>---
> OvmfPkg/OvmfPkgIa32.fdf    | 1 +
> OvmfPkg/OvmfPkgIa32X64.fdf | 1 +
> OvmfPkg/OvmfPkgX64.fdf     | 1 +
> 3 files changed, 3 insertions(+)
>
>diff --git a/OvmfPkg/OvmfPkgIa32.fdf b/OvmfPkg/OvmfPkgIa32.fdf
>index 09c165882c3f..859457e9aae5 100644
>--- a/OvmfPkg/OvmfPkgIa32.fdf
>+++ b/OvmfPkg/OvmfPkgIa32.fdf
>@@ -168,6 +168,7 @@ [FV.PEIFV]
>
>###########################################################
>#####################
>
> [FV.DXEFV]
>+FvForceRebase      = FALSE
> FvNameGuid         = 7CB8BDC9-F8EB-4F34-AAEA-3EE4AF6516A1
> BlockSize          = 0x10000
> FvAlignment        = 16
>diff --git a/OvmfPkg/OvmfPkgIa32X64.fdf b/OvmfPkg/OvmfPkgIa32X64.fdf
>index 5233314139bc..2a0ed8313786 100644
>--- a/OvmfPkg/OvmfPkgIa32X64.fdf
>+++ b/OvmfPkg/OvmfPkgIa32X64.fdf
>@@ -168,6 +168,7 @@ [FV.PEIFV]
>
>###########################################################
>#####################
>
> [FV.DXEFV]
>+FvForceRebase      = FALSE
> FvNameGuid         = 7CB8BDC9-F8EB-4F34-AAEA-3EE4AF6516A1
> BlockSize          = 0x10000
> FvAlignment        = 16
>diff --git a/OvmfPkg/OvmfPkgX64.fdf b/OvmfPkg/OvmfPkgX64.fdf
>index 36150101e784..ca61fa125795 100644
>--- a/OvmfPkg/OvmfPkgX64.fdf
>+++ b/OvmfPkg/OvmfPkgX64.fdf
>@@ -168,6 +168,7 @@ [FV.PEIFV]
>
>###########################################################
>#####################
>
> [FV.DXEFV]
>+FvForceRebase      = FALSE
> FvNameGuid         = 7CB8BDC9-F8EB-4F34-AAEA-3EE4AF6516A1
> BlockSize          = 0x10000
> FvAlignment        = 16
>--
>2.13.1.3.g8be5a757fa67
>



  reply	other threads:[~2017-06-29  3:31 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-06-28 22:06 [PATCH 0/2] OvmfPkg: refresh -D E1000_ENABLE (Intel proprietary driver for e1000) Laszlo Ersek
2017-06-28 22:06 ` [PATCH 1/2] OvmfPkg: disable build-time relocation for DXEFV modules Laszlo Ersek
2017-06-29  3:32   ` Gao, Liming [this message]
2017-07-01 20:36     ` Laszlo Ersek
2017-07-03 15:08       ` Gao, Liming
2017-07-03 17:53         ` Laszlo Ersek
2017-07-05 17:48     ` Jordan Justen
2017-07-05 17:55       ` Laszlo Ersek
2017-06-28 22:06 ` [PATCH 2/2] OvmfPkg: update -D E1000_ENABLE from Intel PROEFI v.07 to BootUtil v.22 Laszlo Ersek
2017-06-30  1:20   ` Wu, Jiaxin
2017-07-01 20:22     ` Laszlo Ersek

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=4A89E2EF3DFEDB4C8BFDE51014F606A14D74FBA1@shsmsx102.ccr.corp.intel.com \
    --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