public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
* [PATCH v2 0/2] OvmfPkg: refresh -D E1000_ENABLE (Intel proprietary driver for e1000)
@ 2017-07-04 10:00 Laszlo Ersek
  2017-07-04 10:00 ` [PATCH v2 1/2] OvmfPkg: disable build-time relocation for DXEFV modules Laszlo Ersek
                   ` (2 more replies)
  0 siblings, 3 replies; 6+ messages in thread
From: Laszlo Ersek @ 2017-07-04 10:00 UTC (permalink / raw)
  To: edk2-devel-01; +Cc: Ard Biesheuvel, Jiaxin Wu, Jordan Justen, Liming Gao

Version 2 of the series previously posted at
<https://lists.01.org/pipermail/edk2-devel/2017-June/011964.html>.

In this version, LMFA references in the commit message of patch #1 have
been replaced with Liming's explanation from the mailing list. Patch #2
has been marked with Jiaxin's feedback tags. No code changes in either
patch.

Repo:   https://github.com/lersek/edk2.git
Branch: e1000_refresh_v2

Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Cc: Jiaxin Wu <jiaxin.wu@intel.com>
Cc: Jordan Justen <jordan.l.justen@intel.com>
Cc: Liming Gao <liming.gao@intel.com>

Thanks,
Laszlo

Laszlo Ersek (2):
  OvmfPkg: disable build-time relocation for DXEFV modules
  OvmfPkg: update -D E1000_ENABLE from Intel PROEFI v.07 to BootUtil
    v.22

 OvmfPkg/OvmfPkgIa32.fdf    |  6 +---
 OvmfPkg/OvmfPkgIa32X64.fdf |  3 +-
 OvmfPkg/OvmfPkgX64.fdf     |  3 +-
 OvmfPkg/README             | 31 +++++++++++++-------
 4 files changed, 26 insertions(+), 17 deletions(-)

-- 
2.13.1.3.g8be5a757fa67



^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH v2 1/2] OvmfPkg: disable build-time relocation for DXEFV modules
  2017-07-04 10:00 [PATCH v2 0/2] OvmfPkg: refresh -D E1000_ENABLE (Intel proprietary driver for e1000) Laszlo Ersek
@ 2017-07-04 10:00 ` Laszlo Ersek
  2017-07-04 11:54   ` Gao, Liming
  2017-07-04 10:00 ` [PATCH v2 2/2] OvmfPkg: update -D E1000_ENABLE from Intel PROEFI v.07 to BootUtil v.22 Laszlo Ersek
  2017-07-05 20:14 ` [PATCH v2 0/2] OvmfPkg: refresh -D E1000_ENABLE (Intel proprietary driver for e1000) Laszlo Ersek
  2 siblings, 1 reply; 6+ messages in thread
From: Laszlo Ersek @ 2017-07-04 10:00 UTC (permalink / raw)
  To: edk2-devel-01; +Cc: Ard Biesheuvel, Jordan Justen, Liming Gao

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. Quoting Liming from
  <https://lists.01.org/pipermail/edk2-devel/2017-July/012053.html>:

> PI spec has no limitation that XIP is for PEIM only. DXE driver may be
> built as XIP for other purpose. For example, if DXE driver image address
> is not zero, DxeCore will try allocating the preferred address and load
> it. In another case, once DXE driver is relocated at build time, DxeCore
> will dispatch it and start it directly without loading, it may save boot
> performance.

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|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfPeiMemFvSize
> FV = PEIFV
>
> 0x100000|0xA00000
> gUefiOvmfPkgTokenSpaceGuid.PcdOvmfDxeMemFvBase|gUefiOvmfPkgTokenSpaceGuid.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.

In DXEFV we also have SMM drivers. Those are relocated at boot-time (into
SMRAM) unconditionally; 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>
---

Notes:
    v2:
    - in the commit message, replace LMFA references with Liming's
      explanation from the mailing list
    - no code changes

 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




^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH v2 2/2] OvmfPkg: update -D E1000_ENABLE from Intel PROEFI v.07 to BootUtil v.22
  2017-07-04 10:00 [PATCH v2 0/2] OvmfPkg: refresh -D E1000_ENABLE (Intel proprietary driver for e1000) Laszlo Ersek
  2017-07-04 10:00 ` [PATCH v2 1/2] OvmfPkg: disable build-time relocation for DXEFV modules Laszlo Ersek
@ 2017-07-04 10:00 ` Laszlo Ersek
  2017-07-05 20:14 ` [PATCH v2 0/2] OvmfPkg: refresh -D E1000_ENABLE (Intel proprietary driver for e1000) Laszlo Ersek
  2 siblings, 0 replies; 6+ messages in thread
From: Laszlo Ersek @ 2017-07-04 10:00 UTC (permalink / raw)
  To: edk2-devel-01; +Cc: Jiaxin Wu, Jordan Justen

Jiaxin reports that the OvmfPkg/README instructions for downloading the
Intel PROEFI drivers, and the filenames in OvmfPkg/OvmfPkg*.fdf for
incorporating the same in the OVMF binaries, are no longer up to date; the
download link has stopped working.

Additionally, the IA32 driver binary is no more distributed by Intel.

Update OvmfPkg/README with new download instructions, and adapt the OVMF
FDF files.

With this driver in use for QEMU's e1000 NIC, the DH shell command prints,
as Controller Name, "Intel(R) PRO/1000 MT Network Connection". I
successfully tested DHCP and ping from the UEFI shell.

Cc: Jiaxin Wu <jiaxin.wu@intel.com>
Cc: Jordan Justen <jordan.l.justen@intel.com>
Reported-by: Jiaxin Wu <jiaxin.wu@intel.com>
Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=613
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Laszlo Ersek <lersek@redhat.com>
Tested-by: Wu Jiaxin <jiaxin.wu@intel.com>
Reviewed-by: Wu Jiaxin <jiaxin.wu@intel.com>
---

Notes:
    v2:
    - pick up Jiaxin's T-b and R-b
    - no code changes

 OvmfPkg/OvmfPkgIa32.fdf    |  5 ----
 OvmfPkg/OvmfPkgIa32X64.fdf |  2 +-
 OvmfPkg/OvmfPkgX64.fdf     |  2 +-
 OvmfPkg/README             | 31 +++++++++++++-------
 4 files changed, 23 insertions(+), 17 deletions(-)

diff --git a/OvmfPkg/OvmfPkgIa32.fdf b/OvmfPkg/OvmfPkgIa32.fdf
index 859457e9aae5..cd91bc03a683 100644
--- a/OvmfPkg/OvmfPkgIa32.fdf
+++ b/OvmfPkg/OvmfPkgIa32.fdf
@@ -294,11 +294,6 @@ [FV.DXEFV]
 #
 # Network modules
 #
-!if $(E1000_ENABLE)
-  FILE DRIVER = 5D695E11-9B3F-4b83-B25F-4A8D5D69BE07 {
-    SECTION PE32 = Intel3.5/EFI32/E3507E2.EFI
-  }
-!endif
   INF  MdeModulePkg/Universal/Network/SnpDxe/SnpDxe.inf
   INF  MdeModulePkg/Universal/Network/DpcDxe/DpcDxe.inf
   INF  MdeModulePkg/Universal/Network/MnpDxe/MnpDxe.inf
diff --git a/OvmfPkg/OvmfPkgIa32X64.fdf b/OvmfPkg/OvmfPkgIa32X64.fdf
index 2a0ed8313786..fae82709aee1 100644
--- a/OvmfPkg/OvmfPkgIa32X64.fdf
+++ b/OvmfPkg/OvmfPkgIa32X64.fdf
@@ -296,7 +296,7 @@ [FV.DXEFV]
 #
 !if $(E1000_ENABLE)
   FILE DRIVER = 5D695E11-9B3F-4b83-B25F-4A8D5D69BE07 {
-    SECTION PE32 = Intel3.5/EFIX64/E3507X2.EFI
+    SECTION PE32 = Intel3.5/EFIX64/E3522X2.EFI
   }
 !endif
   INF  MdeModulePkg/Universal/Network/SnpDxe/SnpDxe.inf
diff --git a/OvmfPkg/OvmfPkgX64.fdf b/OvmfPkg/OvmfPkgX64.fdf
index ca61fa125795..4da0b19b94cf 100644
--- a/OvmfPkg/OvmfPkgX64.fdf
+++ b/OvmfPkg/OvmfPkgX64.fdf
@@ -296,7 +296,7 @@ [FV.DXEFV]
 #
 !if $(E1000_ENABLE)
   FILE DRIVER = 5D695E11-9B3F-4b83-B25F-4A8D5D69BE07 {
-    SECTION PE32 = Intel3.5/EFIX64/E3507X2.EFI
+    SECTION PE32 = Intel3.5/EFIX64/E3522X2.EFI
   }
 !endif
   INF  MdeModulePkg/Universal/Network/SnpDxe/SnpDxe.inf
diff --git a/OvmfPkg/README b/OvmfPkg/README
index 33ff9432bb3e..00fb71848200 100644
--- a/OvmfPkg/README
+++ b/OvmfPkg/README
@@ -224,24 +224,35 @@ longer.)
   basic virtio-net driver, located in OvmfPkg/VirtioNetDxe.
 
 * Also independently of the iPXE NIC drivers, Intel's proprietary E1000 NIC
-  driver (PROEFI) can be embedded in the OVMF image at build time:
+  driver (from the BootUtil distribution) can be embedded in the OVMF image at
+  build time:
 
-  - Download UEFI drivers for the e1000 NIC
-    - http://downloadcenter.intel.com/Detail_Desc.aspx?agr=Y&DwnldID=17515&lang=eng
-    - Install the drivers into a directory called Intel3.5 in your WORKSPACE.
+  - Download BootUtil:
+    - Navigate to
+      https://downloadcenter.intel.com/download/19186/Ethernet-Intel-Ethernet-Connections-Boot-Utility-Preboot-Images-and-EFI-Drivers
+    - Click the download link for "PREBOOT.EXE".
+    - Accept the Intel Software License Agreement that appears.
+    - Unzip "PREBOOT.EXE" into a separate directory (this works with the
+      "unzip" utility on platforms different from Windows as well).
+    - Copy the "APPS/EFI/EFIx64/E3522X2.EFI" driver binary to
+      "Intel3.5/EFIX64/E3522X2.EFI" in your WORKSPACE.
+    - Intel have stopped distributing an IA32 driver binary (which used to
+      match the filename pattern "E35??E2.EFI"), thus this method will only
+      work for the IA32X64 and X64 builds of OVMF.
 
   - Include the driver in OVMF during the build:
-    - Add "-D E1000_ENABLE" to your build command,
+    - Add "-D E1000_ENABLE" to your build command (only when building
+      "OvmfPkg/OvmfPkgIa32X64.dsc" or "OvmfPkg/OvmfPkgX64.dsc").
     - For example: "build -D E1000_ENABLE".
 
 * When a matching iPXE driver is configured for a NIC as described above, it
   takes priority over other drivers that could possibly drive the card too:
 
-                 | e1000  ne2k_pci  pcnet  rtl8139  virtio-net-pci
-    -------------+------------------------------------------------
-    iPXE         |   x       x        x       x           x
-    VirtioNetDxe |                                        x
-    Intel PROEFI |   x
+                         | e1000  ne2k_pci  pcnet  rtl8139  virtio-net-pci
+    ---------------------+------------------------------------------------
+    iPXE                 |   x       x        x       x           x
+    VirtioNetDxe         |                                        x
+    Intel BootUtil (X64) |   x
 
 === OVMF Flash Layout ===
 
-- 
2.13.1.3.g8be5a757fa67



^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH v2 1/2] OvmfPkg: disable build-time relocation for DXEFV modules
  2017-07-04 10:00 ` [PATCH v2 1/2] OvmfPkg: disable build-time relocation for DXEFV modules Laszlo Ersek
@ 2017-07-04 11:54   ` Gao, Liming
  2017-07-04 20:02     ` Laszlo Ersek
  0 siblings, 1 reply; 6+ messages in thread
From: Gao, Liming @ 2017-07-04 11:54 UTC (permalink / raw)
  To: Laszlo Ersek, edk2-devel-01; +Cc: Ard Biesheuvel, Justen, Jordan L

Reviewed-by: Liming Gao <liming.gao@intel.com>

> -----Original Message-----
> From: Laszlo Ersek [mailto:lersek@redhat.com]
> Sent: Tuesday, July 4, 2017 6:00 PM
> 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 v2 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. Quoting Liming from
>   <https://lists.01.org/pipermail/edk2-devel/2017-July/012053.html>:
> 
> > PI spec has no limitation that XIP is for PEIM only. DXE driver may be
> > built as XIP for other purpose. For example, if DXE driver image address
> > is not zero, DxeCore will try allocating the preferred address and load
> > it. In another case, once DXE driver is relocated at build time, DxeCore
> > will dispatch it and start it directly without loading, it may save boot
> > performance.
> 
> 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|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfPeiMemFvSize
> > FV = PEIFV
> >
> > 0x100000|0xA00000
> > gUefiOvmfPkgTokenSpaceGuid.PcdOvmfDxeMemFvBase|gUefiOvmfPkgTokenSpaceGuid.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.
> 
> In DXEFV we also have SMM drivers. Those are relocated at boot-time (into
> SMRAM) unconditionally; 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>
> ---
> 
> Notes:
>     v2:
>     - in the commit message, replace LMFA references with Liming's
>       explanation from the mailing list
>     - no code changes
> 
>  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
> 



^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v2 1/2] OvmfPkg: disable build-time relocation for DXEFV modules
  2017-07-04 11:54   ` Gao, Liming
@ 2017-07-04 20:02     ` Laszlo Ersek
  0 siblings, 0 replies; 6+ messages in thread
From: Laszlo Ersek @ 2017-07-04 20:02 UTC (permalink / raw)
  To: Gao, Liming, edk2-devel-01; +Cc: Ard Biesheuvel, Justen, Jordan L

On 07/04/17 13:54, Gao, Liming wrote:
> Reviewed-by: Liming Gao <liming.gao@intel.com>

Thanks for your help, Liming!
Laszlo

>> -----Original Message-----
>> From: Laszlo Ersek [mailto:lersek@redhat.com]
>> Sent: Tuesday, July 4, 2017 6:00 PM
>> 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 v2 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. Quoting Liming from
>>   <https://lists.01.org/pipermail/edk2-devel/2017-July/012053.html>:
>>
>>> PI spec has no limitation that XIP is for PEIM only. DXE driver may be
>>> built as XIP for other purpose. For example, if DXE driver image address
>>> is not zero, DxeCore will try allocating the preferred address and load
>>> it. In another case, once DXE driver is relocated at build time, DxeCore
>>> will dispatch it and start it directly without loading, it may save boot
>>> performance.
>>
>> 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|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfPeiMemFvSize
>>> FV = PEIFV
>>>
>>> 0x100000|0xA00000
>>> gUefiOvmfPkgTokenSpaceGuid.PcdOvmfDxeMemFvBase|gUefiOvmfPkgTokenSpaceGuid.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.
>>
>> In DXEFV we also have SMM drivers. Those are relocated at boot-time (into
>> SMRAM) unconditionally; 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>
>> ---
>>
>> Notes:
>>     v2:
>>     - in the commit message, replace LMFA references with Liming's
>>       explanation from the mailing list
>>     - no code changes
>>
>>  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
>>
> 



^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v2 0/2] OvmfPkg: refresh -D E1000_ENABLE (Intel proprietary driver for e1000)
  2017-07-04 10:00 [PATCH v2 0/2] OvmfPkg: refresh -D E1000_ENABLE (Intel proprietary driver for e1000) Laszlo Ersek
  2017-07-04 10:00 ` [PATCH v2 1/2] OvmfPkg: disable build-time relocation for DXEFV modules Laszlo Ersek
  2017-07-04 10:00 ` [PATCH v2 2/2] OvmfPkg: update -D E1000_ENABLE from Intel PROEFI v.07 to BootUtil v.22 Laszlo Ersek
@ 2017-07-05 20:14 ` Laszlo Ersek
  2 siblings, 0 replies; 6+ messages in thread
From: Laszlo Ersek @ 2017-07-05 20:14 UTC (permalink / raw)
  To: edk2-devel-01; +Cc: Jordan Justen, Jiaxin Wu, Liming Gao, Ard Biesheuvel

On 07/04/17 12:00, Laszlo Ersek wrote:
> Version 2 of the series previously posted at
> <https://lists.01.org/pipermail/edk2-devel/2017-June/011964.html>.
> 
> In this version, LMFA references in the commit message of patch #1 have
> been replaced with Liming's explanation from the mailing list. Patch #2
> has been marked with Jiaxin's feedback tags. No code changes in either
> patch.
> 
> Repo:   https://github.com/lersek/edk2.git
> Branch: e1000_refresh_v2
> 
> Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org>
> Cc: Jiaxin Wu <jiaxin.wu@intel.com>
> Cc: Jordan Justen <jordan.l.justen@intel.com>
> Cc: Liming Gao <liming.gao@intel.com>
> 
> Thanks,
> Laszlo
> 
> Laszlo Ersek (2):
>   OvmfPkg: disable build-time relocation for DXEFV modules
>   OvmfPkg: update -D E1000_ENABLE from Intel PROEFI v.07 to BootUtil
>     v.22
> 
>  OvmfPkg/OvmfPkgIa32.fdf    |  6 +---
>  OvmfPkg/OvmfPkgIa32X64.fdf |  3 +-
>  OvmfPkg/OvmfPkgX64.fdf     |  3 +-
>  OvmfPkg/README             | 31 +++++++++++++-------
>  4 files changed, 26 insertions(+), 17 deletions(-)
> 

Pushed: 59541d41633c..253d81c71f67.

Thanks,
Laszlo


^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2017-07-05 20:13 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-07-04 10:00 [PATCH v2 0/2] OvmfPkg: refresh -D E1000_ENABLE (Intel proprietary driver for e1000) Laszlo Ersek
2017-07-04 10:00 ` [PATCH v2 1/2] OvmfPkg: disable build-time relocation for DXEFV modules Laszlo Ersek
2017-07-04 11:54   ` Gao, Liming
2017-07-04 20:02     ` Laszlo Ersek
2017-07-04 10:00 ` [PATCH v2 2/2] OvmfPkg: update -D E1000_ENABLE from Intel PROEFI v.07 to BootUtil v.22 Laszlo Ersek
2017-07-05 20:14 ` [PATCH v2 0/2] OvmfPkg: refresh -D E1000_ENABLE (Intel proprietary driver for e1000) Laszlo Ersek

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox