]> git.proxmox.com Git - mirror_edk2.git/commitdiff
OvmfPkg: control PXEv4 / PXEv6 boot support from the QEMU command line
authorLaszlo Ersek <lersek@redhat.com>
Fri, 24 Apr 2020 07:53:51 +0000 (09:53 +0200)
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
Tue, 28 Apr 2020 22:37:35 +0000 (22:37 +0000)
Add a minimal, NULL class library called "PxeBcPcdProducerLib" for setting
the "PcdIPv4PXESupport" and "PcdIPv6PXESupport" PCDs of NetworkPkg, from
fw_cfg.

These PCDs control whether the UefiPxeBcDxe driver supports PXEv4 / PXEv6
boot. If a PXE version is disabled, the corresponding LoadFile protocol
instance is not produced by UefiPxeBcDxe, and so
EfiBootManagerRefreshAllBootOption() in UefiBootManagerLib does not
generate corresponding *new* boot options either. (Existent boot options
are not deleted.)

Hook the library into the UefiPxeBcDxe driver. (The driver is already
included from "NetworkComponents.dsc.inc", but we can list it again in the
DSC file, for providing <LibraryClasses> overrides.)

In OVMF, the PCDs could be set in PlatformPei too, but ArmVirtQemu does
not have fw_cfg access in the PEI phase. Hence a NULL class library that
can be linked into UefiPxeBcDxe.

When listing the PCDs under [PcdsDynamicDefault], stick with the DEC
default values.

QEMU switches:

  -fw_cfg name=opt/org.tianocore/IPv4PXESupport,string=[yn]

  -fw_cfg name=opt/org.tianocore/IPv6PXESupport,string=[yn]

The "opt/org.tianocore" prefix follows the "opt/RFQDN/" recommendation
from QEMU's "docs/specs/fw_cfg.txt".

Cc: Ard Biesheuvel <ard.biesheuvel@arm.com>
Cc: Jordan Justen <jordan.l.justen@intel.com>
Cc: Per Sundstrom <per_sundstrom@yahoo.com>
Cc: Philippe Mathieu-Daudé <philmd@redhat.com>
Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=2681
Signed-off-by: Laszlo Ersek <lersek@redhat.com>
Message-Id: <20200424075353.8489-6-lersek@redhat.com>
Reviewed-by: Ard Biesheuvel <ard.biesheuvel@arm.com>
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
OvmfPkg/Library/PxeBcPcdProducerLib/PxeBcPcd.c [new file with mode: 0644]
OvmfPkg/Library/PxeBcPcdProducerLib/PxeBcPcdProducerLib.inf [new file with mode: 0644]
OvmfPkg/OvmfPkgIa32.dsc
OvmfPkg/OvmfPkgIa32X64.dsc
OvmfPkg/OvmfPkgX64.dsc

diff --git a/OvmfPkg/Library/PxeBcPcdProducerLib/PxeBcPcd.c b/OvmfPkg/Library/PxeBcPcdProducerLib/PxeBcPcd.c
new file mode 100644 (file)
index 0000000..7ce2363
--- /dev/null
@@ -0,0 +1,39 @@
+/** @file\r
+  Configure some PCDs dynamically for\r
+  "NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf", from QEMU's fw_cfg.\r
+\r
+  Copyright (C) 2020, Red Hat, Inc.\r
+\r
+  SPDX-License-Identifier: BSD-2-Clause-Patent\r
+**/\r
+\r
+#include <Library/PcdLib.h>\r
+#include <Library/QemuFwCfgSimpleParserLib.h>\r
+\r
+RETURN_STATUS\r
+EFIAPI\r
+SetPxeBcPcds (\r
+  VOID\r
+  )\r
+{\r
+  BOOLEAN       FwCfgBool;\r
+  RETURN_STATUS PcdStatus;\r
+\r
+  if (!RETURN_ERROR (QemuFwCfgParseBool ("opt/org.tianocore/IPv4PXESupport",\r
+                       &FwCfgBool))) {\r
+    PcdStatus = PcdSet8S (PcdIPv4PXESupport, FwCfgBool);\r
+    if (RETURN_ERROR (PcdStatus)) {\r
+      return PcdStatus;\r
+    }\r
+  }\r
+\r
+  if (!RETURN_ERROR (QemuFwCfgParseBool ("opt/org.tianocore/IPv6PXESupport",\r
+                       &FwCfgBool))) {\r
+    PcdStatus = PcdSet8S (PcdIPv6PXESupport, FwCfgBool);\r
+    if (RETURN_ERROR (PcdStatus)) {\r
+      return PcdStatus;\r
+    }\r
+  }\r
+\r
+  return RETURN_SUCCESS;\r
+}\r
diff --git a/OvmfPkg/Library/PxeBcPcdProducerLib/PxeBcPcdProducerLib.inf b/OvmfPkg/Library/PxeBcPcdProducerLib/PxeBcPcdProducerLib.inf
new file mode 100644 (file)
index 0000000..9481332
--- /dev/null
@@ -0,0 +1,33 @@
+## @file\r
+# Configure some PCDs dynamically for\r
+# "NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf", from QEMU's fw_cfg.\r
+#\r
+# Copyright (C) 2020, Red Hat, Inc.\r
+#\r
+# SPDX-License-Identifier: BSD-2-Clause-Patent\r
+##\r
+\r
+[Defines]\r
+  INF_VERSION                    = 1.29\r
+  BASE_NAME                      = PxeBcPcdProducerLib\r
+  FILE_GUID                      = 1da2723f-52df-432a-8d03-6e8fa8acc107\r
+  MODULE_TYPE                    = BASE\r
+  VERSION_STRING                 = 1.0\r
+  LIBRARY_CLASS                  = NULL\r
+  CONSTRUCTOR                    = SetPxeBcPcds\r
+\r
+[Sources]\r
+  PxeBcPcd.c\r
+\r
+[Packages]\r
+  MdePkg/MdePkg.dec\r
+  NetworkPkg/NetworkPkg.dec\r
+  OvmfPkg/OvmfPkg.dec\r
+\r
+[LibraryClasses]\r
+  PcdLib\r
+  QemuFwCfgSimpleParserLib\r
+\r
+[Pcd]\r
+  gEfiNetworkPkgTokenSpaceGuid.PcdIPv4PXESupport       ## SOMETIMES_PRODUCES\r
+  gEfiNetworkPkgTokenSpaceGuid.PcdIPv6PXESupport       ## SOMETIMES_PRODUCES\r
index 5e2972063110ffe56a0b15c216aab282cc37a04c..fcd9779b5ba27bb0992013340263ebacbe5138f2 100644 (file)
   gEfiSecurityPkgTokenSpaceGuid.PcdTpmInstanceGuid|{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}\r
 !endif\r
 \r
+  # IPv4 and IPv6 PXE Boot support.\r
+  gEfiNetworkPkgTokenSpaceGuid.PcdIPv4PXESupport|0x01\r
+  gEfiNetworkPkgTokenSpaceGuid.PcdIPv6PXESupport|0x01\r
+\r
 [PcdsDynamicHii]\r
 !if $(TPM_ENABLE) == TRUE && $(TPM_CONFIG_ENABLE) == TRUE\r
   gEfiSecurityPkgTokenSpaceGuid.PcdTcgPhysicalPresenceInterfaceVer|L"TCG2_VERSION"|gTcg2ConfigFormSetGuid|0x0|"1.3"|NV,BS\r
   #\r
 !include NetworkPkg/NetworkComponents.dsc.inc\r
 \r
+  NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf {\r
+    <LibraryClasses>\r
+      NULL|OvmfPkg/Library/PxeBcPcdProducerLib/PxeBcPcdProducerLib.inf\r
+  }\r
+\r
 !if $(NETWORK_TLS_ENABLE) == TRUE\r
   NetworkPkg/TlsAuthConfigDxe/TlsAuthConfigDxe.inf {\r
     <LibraryClasses>\r
index 18e6909a33fa659366bfeecb80d93fd479ccc575..1626d2415a2c3553d089f47891311f224c26471c 100644 (file)
   gEfiSecurityPkgTokenSpaceGuid.PcdTpmInstanceGuid|{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}\r
 !endif\r
 \r
+[PcdsDynamicDefault.X64]\r
+  # IPv4 and IPv6 PXE Boot support.\r
+  gEfiNetworkPkgTokenSpaceGuid.PcdIPv4PXESupport|0x01\r
+  gEfiNetworkPkgTokenSpaceGuid.PcdIPv6PXESupport|0x01\r
+\r
 [PcdsDynamicHii]\r
 !if $(TPM_ENABLE) == TRUE && $(TPM_CONFIG_ENABLE) == TRUE\r
   gEfiSecurityPkgTokenSpaceGuid.PcdTcgPhysicalPresenceInterfaceVer|L"TCG2_VERSION"|gTcg2ConfigFormSetGuid|0x0|"1.3"|NV,BS\r
   #\r
 !include NetworkPkg/NetworkComponents.dsc.inc\r
 \r
+  NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf {\r
+    <LibraryClasses>\r
+      NULL|OvmfPkg/Library/PxeBcPcdProducerLib/PxeBcPcdProducerLib.inf\r
+  }\r
+\r
 !if $(NETWORK_TLS_ENABLE) == TRUE\r
   NetworkPkg/TlsAuthConfigDxe/TlsAuthConfigDxe.inf {\r
     <LibraryClasses>\r
index 3d24cc4c1cfbb125a92d2d9bc515651d06fc68ae..65cfe957761b1d4a04e13b1a1251decf4d5c154a 100644 (file)
   gEfiSecurityPkgTokenSpaceGuid.PcdTpmInstanceGuid|{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}\r
 !endif\r
 \r
+  # IPv4 and IPv6 PXE Boot support.\r
+  gEfiNetworkPkgTokenSpaceGuid.PcdIPv4PXESupport|0x01\r
+  gEfiNetworkPkgTokenSpaceGuid.PcdIPv6PXESupport|0x01\r
+\r
 [PcdsDynamicHii]\r
 !if $(TPM_ENABLE) == TRUE && $(TPM_CONFIG_ENABLE) == TRUE\r
   gEfiSecurityPkgTokenSpaceGuid.PcdTcgPhysicalPresenceInterfaceVer|L"TCG2_VERSION"|gTcg2ConfigFormSetGuid|0x0|"1.3"|NV,BS\r
   #\r
 !include NetworkPkg/NetworkComponents.dsc.inc\r
 \r
+  NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf {\r
+    <LibraryClasses>\r
+      NULL|OvmfPkg/Library/PxeBcPcdProducerLib/PxeBcPcdProducerLib.inf\r
+  }\r
+\r
 !if $(NETWORK_TLS_ENABLE) == TRUE\r
   NetworkPkg/TlsAuthConfigDxe/TlsAuthConfigDxe.inf {\r
     <LibraryClasses>\r