audk/OvmfPkg/PlatformCI
Ard Biesheuvel 3beb8c9654 OvmfPkg/PlatformCI VS2019: Enable temporary workaround for cpuhp bugfix
QEMU for x86 has a nasty CPU hotplug bug of which the ramifications are
difficult to oversee, even though KVM acceleration seems to be
unaffected. This has been addressed in QEMU mainline, and will percolate
through the ecosystem at its usual pace. In the mean time, due to the
potential impact on production workloads, we will be updating OVMF to
abort the boot when it detects a QEMU build that is affected.

Tiancore's platform CI uses QEMU in TCG mode, and is therefore impacted
by this mitigation, unless its QEMU builds are updated. This has been
done for Ubuntu-GCC5, but Windows-VS2019 still uses a QEMU build that is
affected.

Aborting the boot upon detecting the QEMU issue will render all boot
tests carried out on Windows-VS2019 broken unless we implement the
'escape hatch' that enables proceed-at-your-own-risk mode, and permits
the boot to proceed even if the QEMU issue is detected.

So let's enable this for Windows-VS2019, and remove it again once it is
no longer needed.

Cc: Laszlo Ersek <lersek@redhat.com>
Cc: Gerd Hoffmann <kraxel@redhat.com>
Cc: Jiewen Yao <jiewen.yao@intel.com>
Cc: Michael Brown <mcb30@ipxe.org>
Cc: Oliver Steffen <osteffen@redhat.com>
Cc: Michael Kubacki <michael.kubacki@microsoft.com>

Bugzilla: https://bugzilla.tianocore.org/show_bug.cgi?id=4250
Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
Message-Id: <20230119134302.1524569-1-ardb@kernel.org>
Acked-by: Gerd Hoffmann <kraxel@redhat.com>
Reviewed-by: Michael Kubacki <michael.kubacki@microsoft.com>
Acked-by: Jiewen Yao <Jiewen.yao@Intel.com>
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
2023-01-20 13:41:16 +00:00
..
.azurepipelines OvmfPkg/PlatformCI VS2019: Enable temporary workaround for cpuhp bugfix 2023-01-20 13:41:16 +00:00
AmdSevBuild.py OvmfPkg/PlatformCI: dummy grub.efi for AmdSev 2021-12-13 11:36:57 +00:00
BhyveBuild.py OvmfPkg/PlatformCI: add BhyveBuild.py 2021-12-13 11:36:57 +00:00
CloudHvBuild.py OvmfPkg: Add CloudHvX64 to the CI 2022-01-13 14:54:40 +00:00
IntelTdxBuild.py OvmfPkg/PlatformCI: add IntelTdxBuild.py 2022-07-01 06:48:12 +00:00
MicrovmBuild.py OvmfPkg/PlatformCI: add MicrovmBuild.py 2021-12-13 11:36:57 +00:00
PlatformBuild.py
PlatformBuildLib.py OvmfPkg/PlatformCI VS2019: Enable temporary workaround for cpuhp bugfix 2023-01-20 13:41:16 +00:00
ReadMe.md OvmfPkg: Add reference to new build instructions 2022-12-16 22:17:18 +00:00
XenBuild.py OvmfPkg/PlatformCI: add XenBuild.py 2021-12-13 11:36:57 +00:00
iasl_ext_dep.yaml

ReadMe.md

OvmfPkg - Platform CI

This ReadMe.md describes the Azure DevOps based Platform CI for OvmfPkg and how to use the same Pytools based build infrastructure locally.

Supported Configuration Details

This solution for building and running OvmfPkg has only been validated with Windows 10 with VS2019 and Ubuntu 18.04 with GCC5 toolchain. Four different firmware builds are supported and are described below.

Configuration name Architectures DSC File Additional Flags
IA32 IA32 OvmfPkgIa32.dsc None
X64 X64 OvmfPkgIa64.dsc None
IA32 X64 PEI-IA32 DXE-X64 OvmfPkgIa32X64.dsc None
IA32 X64 Full PEI-IA32 DXE-X64 OvmfPkgIa32X64.dsc SECURE_BOOT_ENABLE=1 SMM_REQUIRE=1 TPM1_ENABLE=1 TPM2_ENABLE=1 NETWORK_TLS_ENABLE=1 NETWORK_IP6_ENABLE=1 NETWORK_HTTP_BOOT_ENABLE=1

EDK2 Developer environment

Note: edksetup, Submodule initialization and manual installation of NASM, iASL, or the required cross-compiler toolchains are not required, this is handled by the Pytools build system.

Building with Pytools for OvmfPkg

If you are unfamiliar with Pytools, it is recommended to first read through the generic set of edk2 Build Instructions.

  1. [Optional] Create a Python Virtual Environment - generally once per workspace

    python -m venv <name of virtual environment>
    
  2. [Optional] Activate Virtual Environment - each time new shell opened

    • Linux

      source <name of virtual environment>/bin/activate
      
    • Windows

      <name of virtual environment>/Scripts/activate.bat
      
  3. Install Pytools - generally once per virtual env or whenever pip-requirements.txt changes

    pip install --upgrade -r pip-requirements.txt
    
  4. Initialize & Update Submodules - only when submodules updated

    stuart_setup -c OvmfPkg/PlatformCI/PlatformBuild.py TOOL_CHAIN_TAG=<TOOL_CHAIN_TAG> -a <TARGET_ARCH>
    
  5. Initialize & Update Dependencies - only as needed when ext_deps change

    stuart_update -c OvmfPkg/PlatformCI/PlatformBuild.py TOOL_CHAIN_TAG=<TOOL_CHAIN_TAG> -a <TARGET_ARCH>
    
  6. Compile the basetools if necessary - only when basetools C source files change

    python BaseTools/Edk2ToolsBuild.py -t <ToolChainTag>
    
  7. Compile Firmware

    • To build IA32
    stuart_build -c OvmfPkg/PlatformCI/PlatformBuild.py -a IA32 TOOL_CHAIN_TAG=<TOOL_CHAIN_TAG>
    
    • To build X64
    stuart_build -c OvmfPkg/PlatformCI/PlatformBuild.py -a X64 TOOL_CHAIN_TAG=<TOOL_CHAIN_TAG>
    
    • To build IA32 X64
    stuart_build -c OvmfPkg/PlatformCI/PlatformBuild.py -a IA32,X64 TOOL_CHAIN_TAG=<TOOL_CHAIN_TAG>
    
    • use stuart_build -c OvmfPkg/PlatformCI/PlatformBuild.py -h option to see additional options like --clean
  8. Running Emulator

    • You can add --FlashRom to the end of your build command and the emulator will run after the build is complete.

    • or use the --FlashOnly feature to just run the emulator.

      stuart_build -c OvmfPkg/PlatformCI/PlatformBuild.py TOOL_CHAIN_TAG=<TOOL_CHAIN_TAG> -a <TARGET_ARCH> --FlashOnly
      

Notes

  1. Configuring ACTIVE_PLATFORM and TARGET_ARCH in Conf/target.txt is not required. This environment is set by PlatformBuild.py based upon the [-a <TARGET_ARCH>] parameter.
  2. QEMU must be on your path. On Windows this is a manual process and not part of the QEMU installer.

NOTE: Logging the execution output will be in the normal stuart log as well as to your console.

Custom Build Options

MAKE_STARTUP_NSH=TRUE will output a startup.nsh file to the location mapped as fs0. This is used in CI in combination with the --FlashOnly feature to run QEMU to the UEFI shell and then execute the contents of startup.nsh.

QEMU_HEADLESS=TRUE Since CI servers run headless QEMU must be told to run with no display otherwise an error occurs. Locally you don't need to set this.

Passing Build Defines

To pass build defines through stuart_build, prepend BLD_*_to the define name and pass it on the command-line. stuart_build currently requires values to be assigned, so add an=1 suffix for bare defines. For example, to enable the TPM2 support, instead of the traditional "-D E1000_ENABLE", the stuart_build command-line would be:

stuart_build -c OvmfPkg/PlatformCI/PlatformBuild.py BLD_*_E1000_ENABLE=1

References