Introduction
Welcome to the Patina QEMU Platforms book. This book documents the two virtual platforms maintained in the
patina-qemu repository and the workflows used to build,
debug, and validate them.
The primary purpose of patina-qemu is to serve as a test vehicle for the Patina
project. It can also be used as a reference for a simple integration of Patina with EDK II components. The repository
contains a permanent fork of OvmfPkg from EDK II adapted for
Patina.
Platforms:
- QEMU Q35 - an x86_64 platform based on the Q35 chipset.
- QEMU ARM Virt - an AArch64 platform based on the Arm Server Base System Architecture.
What is in this book
This book is organized into the following sections:
- Building and Running - Setting up your environment, compiling the firmware, running it in QEMU, and the rapid Patina iteration workflow used by most Patina developers.
- Debugging - Connecting WinDbg to UEFI firmware running in QEMU and to a Windows guest OS booted on top of it.
- Testing - Scheduled regression tests run against the default branch.
- Performance - Collecting and interpreting boot performance data, and the size of the Patina DXE Core release binary.
Related Documentation
- Open Device Partnership (ODP)
- Patina project documentation - the main Patina book
- Patina GitHub organization
- Patina DXE Core QEMU - the Patina DXE Core binary crate consumed by this repository
High-Level Overview of Rust Integration
At a high level, there are two basic approaches to integrate Rust code into a UEFI build process:
- Build the code using Rust tools in a stand-alone workspace to produce an
.efibinary that is later integrated into the Firmware Device (FD) image. - Add support to the EDK II build infrastructure to compile the Rust source code alongside the C source code when processing each module specified in a DSC file.
The Patina project uses the first option of pre-compiling Rust-based modules to produce .efi binaries, then adding
the file paths to the platform .fdf file to be ingested when creating the firmware volumes and final firmware device
file.
There are several reasons why this approach was chosen:
- The Rust toolchain is not integrated into the EDK II build system, so it is not possible to build Rust code directly from the EDK II build system without adding additional complexity to the build process.
- Rust uses Cargo as its build system, which is opinionated about how it builds, organizes files in a workspace, and manages dependencies. This conflicts with the EDK II build system, which is also opinionated about how it builds, organizes files, and manages dependencies. The two do not complement each other.
- Rust tooling and crate management get in the way of normal C development, forcing all C developers to understand and manage Rust toolchains and environments just to continue building C code.
- C toolchain management and EDK II-specific build complexities get in the way of normal Rust development, coupling what is otherwise a publicly well-documented and standardized Rust build process with other systems that do not add value to Rust development.
- Keeping C code and Rust code in a single workspace encourages the development of Rust code that is tightly coupled with C code, which is directly in opposition to the Patina goal of pure Rust UEFI firmware.
- Using a binary allows the EDK II and C build process to be skipped entirely when just editing Rust code (with binary patching). Since the Rust build is significantly faster than an EDK II C build, this allows Rust changes to be tested in seconds instead of minutes.
The Patina team previously made changes to the EDK II build system to support building Rust code directly and used that model for a few years. Based on the drawbacks experienced with that approach (outlined above), the team did not upstream those build changes to EDK II and highly discourages taking this approach.
Stand-Alone Build Integration
The Patina DXE Core QEMU repository provides an
.efi DXE Core binary that is ingested by this repository: one binary for ArmVirt (AARCH64) and one for Q35 (X64).
The binaries are published in that repository as GitHub releases - patina-dxe-core-qemu Releases.
This repository, Patina QEMU UEFI, automatically pulls the
release version specified in
QemuPkg/Binaries/DXECORE.QEMU_ext_dep.json
during the patina-qemu firmware build process.
The QemuQ35Pkg.fdf
and QemuArmVirtPkg.fdf
files both include the binary the same way, differing only in the DXE Core binary's file name (qemu_q35_dxe_core.efi
vs. qemu_armvirt_dxe_core.efi). The ArmVirt version is shown below for reference:
FILE DXE_CORE = 23C9322F-2AF2-476A-BC4C-26BC88266C71 {
!ifdef $(DXE_CORE_BINARY_OVERRIDE)
SECTION PE32 = $(DXE_CORE_BINARY_OVERRIDE) # User defined override
!else
!if $(TARGET) == RELEASE
SECTION PE32 = $(DXE_CORE_PATH)/release/qemu_armvirt_dxe_core.efi # Nuget feed release build
!else
SECTION PE32 = $(DXE_CORE_PATH)/debug/qemu_armvirt_dxe_core.efi
!endif
!endif
SECTION UI = "DxeCore"
}
The DXE_CORE_PATH variable is automatically set by the build system to the location of the downloaded binaries.
Stand-Alone Build Options
These .fdf files also support a DXE_CORE_BINARY_OVERRIDE build variable that can be set on the command line to
take precedence over the default binary:
stuart_build -c Platforms\QemuQ35Pkg\PlatformBuild.py --FlashRom BLD_*_DXE_CORE_BINARY_OVERRIDE="<new dxe core file path>"
Rather than rebuilding the full platform to test a new DXE Core binary, these platforms can patch Rust code directly
into a prebuilt platform firmware binary (FD file) and boot it within seconds using the build_and_run_rust_binary.py
script. See Rapid Patina Iteration for details.
QEMU Q35
QemuQ35Pkg...
- Is a derivative of OvmfPkg.
- Will not support Legacy BIOS or CSM.
- Will not support S3 sleep functionality.
- Has a 32-bit PEI phase and a 64-bit DXE phase.
- Targets a tightly constrained virtual platform based on the QEMU Q35 machine type.
By focusing solely on the Q35 chipset, this package is allowed to break compatibility with other QEMU supported chipsets in exchange for a simpler, more consistent target. The Q35 chipset can be paired with an IA32 or X64 processor to emulate PC class hardware with industry standard features like SMM and PCI-E.
Q35 Machine Type
Q35 emulates the ICH9 (I/O Controller Hub).
The advantages of ICH9 over the I440FX (the chipset QEMU emulates by default) are:
- PCI-E support, instead of just PCI.
- An integrated AHCI controller.
- No ISA bus.
For more information see the QEMU Q35 feature wiki.
Building and Running
QemuQ35Pkg uses the Patina repositories and EDK II PyTools for its build operations. See
Building the Firmware for full instructions.
QEMU Arm Virt
QemuArmVirtPkg...
- Is a derivative of ArmVirtPkg based on the QEMU ARM-Virt machine type.
- Will not support Legacy BIOS or CSM.
- Will not support S3 sleep functionality.
- Has 64-bit SEC and DXE phases.
- Targets a tightly constrained virtual platform based on the QEMU ARM CPUs.
By focusing solely on the ARM chipset, this package is allowed to break compatibility with other QEMU supported chipsets. The ARM chipset can be paired with an AArch64 processor to emulate ARM-based hardware with industry standard features like TrustZone and PCI-E.
Building and Running
QemuArmVirtPkg uses the Patina repositories and EDK II PyTools for its build operations. See
Building the Firmware for full instructions.
Building the Firmware
Steps to set up your environment, compile, and run QemuQ35Pkg and QemuArmVirtPkg.
Developer Environment
This is a Stuart-based platform, so the default environment requirements come from the How to Build with Stuart instructions.
QEMU is used to run the locally compiled firmware on a virtual platform.
- Windows: No action is needed. An external dependency in the repository provides the necessary QEMU binaries.
- Linux: Install QEMU.
This build uses edk2-pytools for its functionality. On most Linux distros, mono and nuget support require an extra step. See: A note on nuget on Linux.
CLANGPDB Toolchain
Both QemuQ35Pkg and QemuArmVirtPkg use the CLANGPDB toolchain exclusively. This enables development of both
architectures on Linux and Windows, native PE/COFF image generation, and PDBs that work with the
uefi_debug_tools WinDbg infrastructure or
lldb.
LLVM version 21 or greater is recommended for use with EDK II and related projects. It can be downloaded from
LLVM itself. Add the directory containing the clang executable to
your PATH (restarting the terminal if necessary) and follow the steps below to build with Stuart.
By default, Hafnium and TF-A (used in the QemuArmVirtPkg build) are pulled in as precompiled binaries. Passing
HAF_TFA_BUILD=TRUE on the stuart_build command line recompiles these components. This is only supported on Linux
as those projects do not build natively on Windows. They still use clang to compile.
Building with Pytools
-
[Optional] Create a Python virtual environment. Generally once per workspace.
python -m venv <name of virtual environment> -
[Optional] Activate the virtual environment. Each time a new shell is opened.
-
Linux
source <name of virtual environment>/bin/activate -
Windows
<name of virtual environment>/Scripts/activate.bat
-
-
Install Pytools. Generally once per virtual env or whenever
pip-requirements.txtchanges.pip install --upgrade -r pip-requirements.txt -
Initialize and update submodules. Only when submodules have updated.
First time setup:
stuart_setup -c Platforms/<Package>/PlatformBuild.pySubsequent submodule updates:
git submodule update --recursive -
Initialize and update dependencies. Only as needed when
ext_deps change.stuart_update -c Platforms/<Package>/PlatformBuild.py -
Compile firmware.
stuart_build -c Platforms/<Package>/PlatformBuild.pyUse
stuart_build -c Platforms/<Package>/PlatformBuild.py -hto see additional options like--clean. -
Running QEMU.
-
Append
--FlashRomto the build command and QEMU will run after the build completes, booting the new firmware. -
Or use
--FlashOnlyto skip the build and launch QEMU with the last built firmware:stuart_build -c Platforms/<Package>/PlatformBuild.py --FlashOnly
-
- QEMU is provided on Windows via an external dependency located at
QemuPkg/Binaries. QEMU must be manually downloaded on Linux. - QEMU on Linux requires at least version 9.0.2 when booting an operating system. If you are only booting to shell, matching the version of the Windows external dependency is acceptable.
- To override the external dependency on Windows, or the installed version on Linux, use
QEMU_PATH=<path>on the command line.
Custom Build Options
| Option | Effect |
|---|---|
SHUTDOWN_AFTER_RUN=TRUE | Outputs a startup.nsh file to the location mapped as fs0 with reset -s as the final line. Used in CI in combination with --FlashOnly to run QEMU to the UEFI shell and then execute the contents of startup.nsh. |
QEMU_PATH=<path> | Use a specific QEMU binary. |
QEMU_HEADLESS=TRUE | Run QEMU with no display. CI servers run headless and require this; locally it is not needed. |
GDB_SERVER=<TCP port> | Enables the QEMU GDB server at the provided TCP port. Connect a GDB client for hardware-level debugging. |
SERIAL_PORT=<TCP port> | Enables the specified serial port. Primarily used to connect to the software debugger when enabled. |
ENABLE_NETWORK=TRUE | Enables networking. Currently only supported on the Q35 platform. |
PATH_TO_OS=<path> | Boots an OS image (VHDX or QCOW2) instead of stopping at the UEFI shell. |
SERIAL_PORT defaults:
- Q35: defaults to
Noneto avoid unintended port conflicts in the pipeline. The build_and_run_rust_binary.py script defaults to port50001. - ARM Virt: defaults to
None. When set, a separate virtio serial port is exposed on the specified TCP port for use by the software debugger. Log output continues to be sent to stdio regardless of this setting, consistent with Q35 where the serial port is separate fromdebugconused for logging.
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 requires values to be assigned, so add a =1 suffix for bare defines.
For example, to enable E1000 network support, instead of the traditional -D E1000_ENABLE:
stuart_build -c Platforms/<Package>/PlatformBuild.py BLD_*_E1000_ENABLE=1
References
Rapid Patina Iteration
The build_and_run_rust_binary.py script is intended for rapid development of Patina in this repository. It takes a
prebuilt FD (from a previous stuart_build invocation) and patches a new Patina DXE Core into it. This greatly speeds
up the development loop because none of the C components are rebuilt.
When a C component is changed, stuart_build must be re-run to rebuild the full platform. The patcher only updates
the Patina DXE Core within an existing FD.
Prerequisites
The script requires that the following repositories are cloned locally:
patina-dxe-core-qemu- the Patina DXE Core source used by this repository.patina-fw-patcher- the patcher tool that injects the new DXE Core into a built FD.
How it Works
The script will:
- Build a new Patina DXE Core from
patina-dxe-core-qemufor the requested platform. - Use the patcher to patch the new DXE Core into the existing FD.
- Launch QEMU to execute the patched FD.
Running the Script
python build_and_run_rust_binary.py -p Q35
Use python build_and_run_rust_binary.py -h to see all related options, including the ARM Virt platform target and
debugger configuration flags.
🐞 WinDbg + QEMU + Patina UEFI - Debugging Guide
Overview
QEMU can expose two serial ports: one for software debugging and another for hardware debugging.
-
Software Debugging Serial Port Used for communicating with the UEFI SW debugger.
-
Hardware Debugging Serial Port Used for low-level QEMU hardware debugging.
Each serial port can be used independently or simultaneously. Both expose the GDB Remote Serial Protocol.

WinDbg communicates with QEMU using the EXDi Interface. The EXDi interface allows WinDbg to interact with transports like the GDB Remote Serial Protocol that QEMU provides.
The ExdiGdbSrv.dll in WinDbg acts as a GDB client.

End-to-End Communication Flow
Software Debugging: WinDbg ↔ EXDi ↔ GDB Stub ↔ Serial Port ↔ UEFI Debugger

Hardware Debugging: WinDbg ↔ EXDi ↔ GDB Stub ↔ Serial Port ↔ QEMU HW

Setting Up WinDbg
- Download and install WinDbg.
- Verify that
ExdiGdbSrv.dllandexdiConfigData.xmlwere installed into theC:\Program Files\WindowsApps\Microsoft.WinDbg.Fast_1.xxxxxxxxx\amd64directory. - Download the latest release of the UEFI WinDbg Extension from uefi_debug_tools releases.
- Extract its contents to
%LOCALAPPDATA%\Dbg\EngineExtensions\.
Launching Patina QEMU UEFI with Debugging Enabled
The patina-qemu UEFI platform build, by default, uses a pre-compiled DXE Core binary from a NuGet feed provided by
the patina-dxe-core-qemu repository. Since these
binaries have debug disabled, the following steps enable debug and override the default.
The following steps are for the Q35 build, but the same can be done for the ARM Virt build. They use the build
command-line parameter BLD_*_DXE_CORE_BINARY_OVERRIDE to override the current DXE Core with the new file. For other
options such as patching a UEFI FD binary, see the Rapid Patina Iteration page.
-
Clone the Patina DXE Core QEMU repository into a new directory.
-
Build it:
- Debug build (debugger included):
cargo make q35 - Release build:
cargo make q35-release --features build_debugger
- Debug build (debugger included):
-
The output file will be:
/target/x86_64-unknown-uefi/debug/qemu_q35_dxe_core.efiThe output
.efifile contains only the.pdbfile name, not the full path. When using WinDbg, set the path to the directory containing the.pdbfile appropriately (as described in Software Debugging). -
Return to this repository's directory and rebuild the
patina-qemuUEFI using theBLD_*_DXE_CORE_BINARY_OVERRIDEcommand-line parameter to indicate which override DXE Core driver to use:stuart_build -c Platforms/QemuQ35Pkg/PlatformBuild.py GDB_SERVER=5555 SERIAL_PORT=56789 --FlashRom BLD_*_DXE_CORE_BINARY_OVERRIDE="<patina dxe core qemu repo path>/target/x86_64-unknown-uefi/debug/qemu_q35_dxe_core.efi" -
The
stuart_buildcommand will also launch QEMU and wait for the initial break-in:

Launching WinDbg Instances
Instance 1: Software Debugging
-
Launch WinDbg. This will connect to the QEMU SW serial port (
56789).
-
Set symbol and source paths:
.sympath+ <path to pdb dir> ; usually <cloned dir>\target\x86_64-unknown-uefi\debug\deps .srcpath+ <path to src dir> ; usually <cloned dir>\srcYou can avoid setting this for every debug session by configuring the
_NT_SYMBOL_PATHenvironment variable, for example:C:\repos\patina-dxe-core-qemu\target\x86_64-unknown-uefi\debug;C:\repos\patina-dxe-core-qemu\target\aarch64-unknown-uefi\debug;srv*c:\symbolspri*https://symweb.azurefd.net;srv*C:\Symbols*https://msdl.microsoft.com/download/symbols -
Initialize the UEFI debugger extension:
!uefiext.init -
!uefiext.helplists all available commands.
Instance 2: Hardware Debugging (Optional)
-
Launch another WinDbg instance.

-
It should automatically connect to the QEMU HW serial port (
5555).
🐞 WinDbg + QEMU + Patina UEFI + 🪟 Windows OS - Debugging Guide
In addition to the steps discussed in WinDbg + QEMU + Patina UEFI Debugging, this document describes how to launch Windows and perform kernel debugging on QEMU. Unlike the UEFI software debugger and the QEMU hardware debugger, Windows does not require EXDi — it natively communicates with WinDbg using the KDCOM transport.

Prepare the OS Image
-
Download the original OS image in either VHDX or QCOW2 format. If the image has never been booted before, use Hyper-V to boot it once and complete the OOBE (Out-of-Box Experience) process if any. Recommended references:
-
Although QEMU supports both VHDX and QCOW2 formats, using a QCOW2 image is recommended for reliability. Convert VHDX to QCOW2 with:
qemu-img convert -f vhdx -p -c -O qcow2 Windows11.vhdx Windows11.qcow2
Launch QEMU with Patina UEFI and Windows
By default, the patina-qemu build uses a pre-compiled Patina DXE Core binary, which is sufficient to boot and debug
Windows as outlined here. If debugging of the Patina UEFI or any other UEFI driver is needed, see the
WinDbg + QEMU + Patina UEFI - Debugging Guide.
To compile the firmware image and launch QEMU with serial and GDB support:
stuart_build -c Platforms/QemuQ35Pkg/PlatformBuild.py GDB_SERVER=5555 SERIAL_PORT=56789 --FlashRom PATH_TO_OS="C:\Windows11.qcow2"
Enable Kernel Debugging on the QEMU Guest (Windows)
After booting to the Windows desktop, open a Command Prompt and run the following commands to enable kernel and boot debugging (boot debugging is optional):
bcdedit /dbgsettings serial debugport:1 baudrate:115200
bcdedit /set {default} debug on
bcdedit /set {default} bootdebug on
shutdown -r -t 0 :: reboot for the above settings to take effect
Launch WinDbg for Kernel Debugging
Once Windows reboots, run the following to connect WinDbg:
windbgx -k com:ipport=56789,port=127.0.0.1 -v
Or via UI:


Serial Console for UEFI
Use a terminal application such as PuTTY or Tera Term to connect to the <port number> you configured for QEMU,
using the Raw TCP/IP protocol to 127.0.0.1.
- You must release this console for the kernel debugger to attach.
- Some terminal applications enable "local line editing" by default on raw connections. Turn this off to avoid sending garbage keystrokes.
Regression Testing
This repository performs scheduled testing against the default branch to detect regressions for common firmware paths. The sections below describe the categories of tests (nightly, weekly, etc.) being performed. Not all tests have been implemented yet:
- ✅ Means the regression tests are implemented and enabled.
- ❌ Means the regression tests are not implemented or enabled.
OS Boot Validation
OS boot is critical to a platform being considered "correct", but the validation and continuous integration steps performed when validating a pull request only boot to the UEFI shell, rather than any given operating system. A nightly OS boot test exists to test common ways of booting an operating system. This includes booting from an internal drive, from a USB drive, and from a PXE server.
-
✅ Q35 Internal Drive Windows Validation OS boot
-
✅ Q35 Internal Drive Ubuntu 24.04 Server OS boot
-
✅ ArmVirt Internal Drive Windows Validation OS boot
-
✅ ArmVirt Internal Drive Ubuntu 24.04 Server OS boot
-
✅ Q35 USB Drive Windows Validation OS boot
-
✅ Q35 USB Drive Ubuntu 24.04 Server OS boot
-
✅ ArmVirt USB Drive Windows Validation OS boot
-
✅ ArmVirt USB Drive Ubuntu 24.04 Server OS boot
-
❌ Q35 PXE Windows Validation OS boot
-
❌ Q35 PXE Ubuntu 24.04 Server OS boot
-
❌ ArmVirt PXE Windows Validation OS boot
-
❌ ArmVirt PXE Ubuntu 24.04 Server OS boot
The .github/workflows/nightly-os-boot.yml
workflow is responsible for the nightly OS boot testing mentioned above. It first downloads and prepares the OS
images that will be booted so that, once booted, they automatically shut down. The firmware is then compiled and
flashed to the two virtual platforms, and BDS automatically detects the operating system and boots. In addition to
the nightly schedule, this workflow also runs on pull requests to catch OS boot regressions before they merge.
Advanced Logger Log Gathering
The advanced logger is a logger implementation for UEFI firmware that writes its log files to a special partition during boot. Since it is uncommon to need to pull logs off of a device (thanks to flashing and booting under a debugger), it can take time to notice if this functionality is broken. This nightly test ensures that platform boot logs exist and are retrievable from Windows systems once booted to the operating system.
- ✅ Q35 advanced logger boot log gathering via UEFI application
- ✅ ArmVirt advanced logger boot log gathering via UEFI application
- ❌ Q35 advanced logger boot log gathering via Windows Validation OS
- ❌ ArmVirt advanced logger boot log gathering via Windows Validation OS
Debugger Connection
This flow is exercised fairly frequently, but it is important enough that any regression should be detected immediately. Nightly tests boot with the debugger and initial breakpoint enabled, and a script sends GDB Remote Serial Protocol communication to ensure the debugger successfully connects and continues from the initial breakpoint.
- ❌ Q35 debugger connection boot
- ❌ ArmVirt debugger connection boot
Hibernation
While hibernation is not strictly a UEFI feature, its implementation is highly dependent on the memory layout provided by firmware via the UEFI memory map. Successful hibernation requires that runtime memory regions remain stable across boots. Historically, even minor firmware changes have broken hibernation, demonstrating how sensitive and error-prone this path can be.
To validate hibernation support, tests are implemented that repeatedly boot the operating system, extract the UEFI memory map from logs, and compare it against the previous boot to ensure memory layout stability. Each iteration then performs a hibernate-resume cycle. This process is repeated multiple times to detect nondeterministic firmware behavior that could cause resume failures.
- ❌ Q35 hibernate resume
- ❌ ArmVirt hibernate resume
Self-Certification Tests (SCTs)
SCTs are the de-facto way to validate a platform's firmware implementation is compliant with the UEFI specification. It is important to monitor and stay compliant with these tests. Unlike other tests documented here, SCTs are run on a weekly basis due to the time it takes to run them.
- ❌ Q35 self-certification tests
- ❌ ArmVirt self-certification tests
Performance Monitoring
Boot performance is an important aspect of platform firmware and must be monitored to ensure it does not degrade over time. Performance tracking is performed by the EDK II performance measurement protocol and can be retrieved from the operating system via the FBPT. We can boot to the operating system, retrieve the boot measurements, and publish the results.
Performance monitoring happens in two parts. On a weekly schedule, a workflow runs to gather the current performance measurements and produce them as an artifact. A second workflow runs when a pull request is created that updates the Patina QEMU DXE Core external dependency. This workflow performs the same performance measurements and additionally compares them against the most recent measurements from the scheduled run, commenting on the pull request with the performance changes.
- ❌ Q35 Release Performance Measurement tracking
- ❌ ArmVirt Release Performance Measurement tracking
Self Certification Tests
The UEFI Self Certification Tests (SCT) are an EFI application suite managed by TianoCore that allow Platform Vendors and IHVs (Independent Hardware Vendors) to test their platform's conformance to the UEFI specification.
The core managed repository is located at edk2-test and the releases section contains the associated binaries for testing. Simply pick the application type and necessary architecture.
Here is a quick rundown of the different test types provided by the SCTs. However, the focus of these instructions is to prepare the system for the UEFI SCTs.
- UEFI SCT: Focuses on Platform / System conformance to the UEFI specification, both in terms of functionality and expected interfaces (such as return values under specific circumstances).
- IHV SCT: Focuses on Device and Driver conformance to the UEFI specification.
- SCRT: Focuses on Runtime conformance to the UEFI specification.
- EMS: Focuses on network stack conformance.
There are also two execution modes available to users wishing to run the SCTs: Native mode (host only) and Passive mode (host & target).
For detailed information, refer to the User Guide.
Running the SCTs
These instructions run the SCTs in Native mode, which is to say, directly on the machine. The first thing to note is that the SCTs expect at least 100MB of free space on the disk where they are installed. The typical workflow for a physical platform is to load a USB drive with the installer, then install the SCTs to a local drive. Since this is a virtual platform, the installer is instead placed on the virtual drive and the SCTs are installed to that same location.
Build the platform
The first step is to build the platform with enough space on the virtual drive. The commands shown throughout this
document are for the Q35 platform, but similar steps apply to QemuArmVirtPkg. By default, Q35 only creates a virtual
drive with 60MB of space, so that default must be overridden via a build variable provided on the command line.
stuart_build -c Platforms/QemuQ35Pkg/PlatformBuild.py TARGET=RELEASE BLD_*_MEMORY_PROTECTION=FALSE VIRTUAL_DRIVE_SIZE=200 EMPTY_DRIVE=TRUE --FlashRom
Memory protections are disabled because the current compiled SCTs do not have the NX-compatibility flag set, so the system will not run them with memory protections enabled.
A GitHub issue has been opened to track this: edk2-test#364
- An existing virtual drive is not overwritten unless
EMPTY_DRIVE=TRUEis set. - The virtual drive contents are only written out when QEMU actually flashes and runs, so
--FlashRomis used here (instead of just compiling) to ensure the drive is created.
Loading the SCTs on the drive
If the above command was run, QEMU should have opened, loaded to the UEFI shell, and shut down (assuming the default
startup.nsh was not cancelled). If it did not close, simply close QEMU. All that mattered was that the platform was
built and the drive was created.
The next step is to download the SCT binaries from the releases section of the edk2-test GitHub repository, specifically:
- For
QemuQ35Pkg:SctPackageX64.7z - For
QemuArmVirtPkg:SctPackageAARCH64.tar.gz
Unzip the archive and place everything from the appropriate package at the root of the virtual hard drive created in the
previous step. For Q35, this is SctPackageX64. At the root of the drive, there should now be 3 items: X64,
InstallX64.efi, SctStartup.nsh. Delete STARTUP.NSH if it exists.
- The virtual drive is located in the
Buildoutput directory. - Don't forget to unmount the virtual drive once finished with it.
Install the SCTs
Now that the files are placed and the virtual drive is unmounted, load back into QEMU:
stuart_build -c Platforms/QemuQ35Pkg/PlatformBuild.py TARGET=RELEASE SHUTDOWN_AFTER_RUN=FALSE --FlashOnly
From the UEFI shell:
FS0:InstallX64.efi
Follow the prompts to install the SCTs to the only drive space available.
SHUTDOWN_AFTER_RUN=FALSEensures astartup.nshscript does not override the one provided by the SCT installer.--FlashOnlyis used here (instead of--FlashRom) to reuse the existing build and avoid wasting time rebuilding.
Running
It is easiest to run the SCTs in user mode (a GUI). However, it is also possible to run them through the shell command line only.
The SCTs provide a User Guide covering advanced usage. A simple test run is described below.
From the root of FS0::
cd SCTSCT -u- Press enter on "Test Case Management".
- Select / deselect test groups to run by pressing space.
- Each test group has either one or two levels of drill down. Tests or test groups can be selected / deselected at any level.
- Press
F9to run the tests.
The below commands show how to generate a report after the tests have completed.
FS0:cd SCTSCT -uTest Report GeneratorF2- Type the name of the file and press enter.
- Close QEMU.
- Open the VHD and navigate to
SCT/Report, then open the report. - (Optional) Logs for each test are located at
SCT/Log.
Q35 Performance
Performance on Q35 is managed by a Rust component that writes and publishes the
Firmware Basic Boot Performance Table (FBPT).
For more information on the functionality of the performance component, see the
performance component documentation
in the main patina repo. This document focuses on how to collect and interpret performance results.
Collecting Performance
1. Enable the Performance Component
The performance component must be enabled to collect FBPT results. Example code can be found under
Enabling Performance Measurements
in the main patina repo.
Performance collection is already enabled by default
for Q35 in patina-dxe-core-qemu.
2. Boot and Collect FBPT Binary
When enabled, the performance component collects FBPT results during UEFI boot. This is done by setting
BLD_*_PERF_TRACE_ENABLE=TRUE as a build variable to stuart_build:
stuart_build -c Platforms/QemuQ35Pkg/PlatformBuild.py --flashrom BLD_*_PERF_TRACE_ENABLE=TRUE
For more information on the stuart system, see Building the Firmware.
To collect raw FBPT results from the UEFI shell, FbptDump.efi must be built. Add the following to your platform
.dsc:
UefiTestingPkg\PerfTests\FbptDump\FbptDump.inf
The
source code for FbptDump
is in mu_plus.
3. Interpret Performance Results
Pip Modules
Two tools are necessary to convert the resulting .bin file into a readable HTML results file.
First, install edk2-pytool-extensions:
pip install edk2-pytool-extensions
Then, run fpdt_parser to retrieve the XML, and perf_report_generator to retrieve the final HTML page:
fpdt_parser -b path_to_bin_file.bin -x output_file_name.xml
perf_report_generator -i path_to_xml_file.xml -r output_file_name.html -s path_to_directory_with_guids/
Scripts
There are
two scripts to
convert the FBPT binary dump into usable results in edk2-pytool-extensions:
fpdt_parser.pyconverts the.binfile into XML.perf_report_generator.pyconverts the XML into an HTML page with filtering and graphing options.
Sample Result
An example of these results can be found in the Sample Q35 Performance Report.
Patina DXE Core Release Binary Composition and Size Optimizations
This document is a reference for the current set of size-related optimizations performed on the Patina DXE Core release binary.
Summary of the current status of the QEMU DXE Core binary size, marking the logical conclusion of the size optimization efforts:
- Rust compiler size related optimizations (Applied)
- Disabling logging can save an additional 150 KB (Not Applied)
- Defaulting to UEFI decompression in the section extractor while skipping Brotli and CRC32 can save another 150 KB (Not Applied)
- Excluding Patina debugger support saves another 55 KB (Not Applied)
Bringing the size from 1,162 KB to 406 KB (a reduction of 65%). The details are documented below.
1. Common Rust Compiler Optimizations Focused on Reducing Binary Size
Optimization Status: Applied
[profile.release]
codegen-units = 1 # Default is 16; setting it to 1 prioritizes size over compilation speed.
debug = "full"
lto = true # Enables Link Time Optimization - significant size reduction.
opt-level = "s" # Optimize for size - significant size reduction.
split-debuginfo = "packed"
strip = "symbols" # Remove symbol information from the final binary (not very relevant for PE files).
incremental = true
Below is the composition of the Patina DXE Core release binary for QEMU, located at
target\x86_64-unknown-uefi\release\qemu_q35_dxe_core.efi. This represents the final binary after applying the
non-destructive compiler optimizations outlined in
PR #19:
| Segment | Size on Disk |
|---|---|
| .text | 495.0 KB |
| .rdata | 249.5 KB |
| .data | 3.0 KB |
| .pdata | 11.0 KB |
| miscellaneous | 4.0 KB |
| Total | 762 KB |
Results: 1,162 KB down to 762 KB (a reduction of approximately 35%).
2. Logging: Reducing Binary Size by Disabling Logging
Optimization Status: Not Applied
The other substantial reduction in the release binary size is observed when logging is completely disabled, as shown
below in \patina-dxe-core-qemu\Cargo.toml using release_max_level_off.
[dependencies]
log = { version = "^0.4", default-features = false, features = ["release_max_level_off"] }
Results: 762 KB to 599 KB (a reduction of approximately 160 KB (21%)).
3. Decompression: Reducing Binary Size by Defaulting to UEFI Decompression
Optimization Status: Not Applied
Defaulting to UEFI decompression in the section extractor while skipping Brotli and CRC32 can save another 140 KB.
[dependencies]
patina_section_extractor = { version = "4", registry = "patina-fw", default-features = false, features = ["uefi_decompress"] }
Results: 599 KB to 460 KB (a reduction of approximately 140 KB (23%)).
4. Debugger: Reducing Binary Size by Excluding Debugger Support
Optimization Status: Not Applied
Excluding debugger support can save another 55 KB. This reduces the size from 460 KB to ~406 KB.
#![allow(unused)] fn main() { // Commenting below lines will exclude debugger support static DEBUGGER: patina_debugger::PatinaDebugger<Uart16550> = patina_debugger::PatinaDebugger::new(Uart16550::Io { base: 0x3F8 }) .with_force_enable(false) .with_log_policy(patina_debugger::DebuggerLoggingPolicy::FullLogging); patina_debugger::set_debugger(&DEBUGGER); }
[dependencies]
# Commenting below line will exclude debugger support
# patina_debugger = { version = "4", registry = "patina-fw" }
Results: 460 KB to 406 KB (a reduction of approximately 55 KB (11%)).
Release Binary Size After Above Optimizations
C:\r\patina-dxe-core-qemu>dir C:\r\patina-dxe-core-qemu\target\x86_64-unknown-uefi\release\qemu_q35_dxe_core.efi
Volume in drive C has no label.
Volume Serial Number is 40DF-F702
Directory of C:\r\patina-dxe-core-qemu\target\x86_64-unknown-uefi\release
06/24/2025 04:53 PM 406,528 qemu_q35_dxe_core.efi
1 File(s) 406,528 bytes
0 Dir(s) 183,428,534,272 bytes free
Project MU vs Patina FV Size Comparison
Up to this point, we have seen what constitutes the Rust DXE Core binary and how it can be optimized. This section performs a platform image-level comparison between a C-based UEFI firmware image and a Rust-based Patina UEFI firmware image. There are many components that differ between the C-based UEFI and the Rust-based UEFI images. Below is a summary of the components that have been folded into the Rust DXE Core. On the left is the size represented by the Project MU-based QEMU FV file (DxeCore, RuntimeDxe, CpuDxe), and on the right the size represented by the Patina FV file (DxeCore).
| Module | Mu | Patina |
|---|---|---|
| DxeCore | 0x2EC3E (188.0 KB) | 0x63430 (405.0 KB) |
| RuntimeDxe | 0x206E (8.1 KB) | |
| CpuDxe | 0x19266 (100.2 KB) | |
| TOTAL | 0x49F12 (296.3 KB) | 0x63430 (405.0 KB) |
The Rust binary includes the following additional features that are not available in the C-based UEFI image, with a size increase of approximately 110 KB compared to the C-based image:
- Functionality that is typically split across multiple EFI binaries (DxeCore, RuntimeDxe, CpuDxe) in C-based implementations.
- Advanced features such as built-in source-level debugging capabilities.
- Two dispatchers: pure Rust component dispatch and FFS dispatch.
- Stringent memory protection features not present in most C-based DXE Core implementations.
Sample Table
| Type | GUID | GUID Value | Description | Start Time (ms) | Length (ms) |
|---|---|---|---|---|---|
| Event | N/A | N/A | ResetEnd | 0 | 1e-06 |
| Process | N/A | N/A | ExitBootServices | 0 | 0 |
| Event | 52C05B14-0B98-496C-BC3B-04B50211D680 | PeiCore | Event measurement from module PeiCore with label SEC | 876.095 | 1e-06 |
| Inmodule | 52C05B14-0B98-496C-BC3B-04B50211D680 | PeiCore | Inmodule measurement from module PeiCore with label PreMem | 876.692 | 40.3289 |
| Entrypoint | 9B3ADA4F-AE56-4C24-8DEA-F03B7558AE50 | PcdPeim | Entrypoint measurement for module PcdPeim | 886.482 | 2.17402 |
| Entrypoint | A3610442-E69F-4DF3-82CA-2360C4031A23 | ReportStatusCodeRouterPei | Entrypoint measurement for module ReportStatusCodeRouterPei | 889.035 | 0.837258 |
| Entrypoint | 9D225237-FA01-464C-A949-BAABC02D31D0 | StatusCodeHandlerPei | Entrypoint measurement for module StatusCodeHandlerPei | 889.982 | 0.808482 |
| Entrypoint | D9B35295-D8BB-463E-B7EC-1FD05E5687C1 | RngPei | Entrypoint measurement for module RngPei | 890.851 | 0.70372 |
| Entrypoint | 222C386D-5ABC-4FB4-B124-FBB82488ACF4 | PlatformPei | Entrypoint measurement for module PlatformPei | 891.622 | 20.537 |
| Inmodule | 52C05B14-0B98-496C-BC3B-04B50211D680 | PeiCore | Inmodule measurement from module PeiCore with label PostMem | 917.526 | 2335.45 |
| Inmodule | 52C05B14-0B98-496C-BC3B-04B50211D680 | PeiCore | Inmodule measurement from module PeiCore with label DisMem | 920.854 | 1.52142 |
| Entrypoint | 9B3ADA4F-AE56-4C24-8DEA-F03B7558AE50 | PcdPeim | Entrypoint measurement for module PcdPeim | 926.478 | 0.752889 |
| Entrypoint | 86D70125-BAA3-4296-A62F-602BEBBB9081 | DxeIpl | Entrypoint measurement for module DxeIpl | 928.143 | 1.24122 |
| Entrypoint | AAC33064-9ED0-4B89-A5AD-3EA767960B22 | FaultTolerantWritePei | Entrypoint measurement for module FaultTolerantWritePei | 929.775 | 0.729981 |
| Entrypoint | 34C8C28F-B61C-45A2-8F2E-89E46BECC63B | PeiVariable | Entrypoint measurement for module PeiVariable | 930.589 | 2.49808 |
| Entrypoint | 6C0E75B4-B0B9-44D1-8210-3377D7B4E066 | SmmAccessPei | Entrypoint measurement for module SmmAccessPei | 935.254 | 2.80343 |
| Entrypoint | A7290DBE-F769-40F2-8CC0-D4A6B37E8126 | MmCommunicationBufferPei | Entrypoint measurement for module MmCommunicationBufferPei | 938.243 | 1.01242 |
| Entrypoint | EDADEB9D-DDBA-48BD-9D22-C1C169C8C5C6 | CpuMpPei | Entrypoint measurement for module CpuMpPei | 939.502 | 81.2726 |
| Entrypoint | 6141E486-7543-4F1A-A579-FF532ED78E75 | ResetSystemPei | Entrypoint measurement for module ResetSystemPei | 1020.92 | 0.881118 |
| Entrypoint | 254B3E77-863A-43A0-9287-8979B2D0513F | SerialStatusCodeHandlerPei | Entrypoint measurement for module SerialStatusCodeHandlerPei | 1021.88 | 2.2542 |
| Entrypoint | 10D70125-BAA3-4296-A62F-602BEBBB9010 | GuidedSectionExtract | Entrypoint measurement for module GuidedSectionExtract | 1024.24 | 1.83766 |
| Entrypoint | 57A2921A-7BC2-43C5-AA5D-064EDCBB992F | MsWheaReportPei | Entrypoint measurement for module MsWheaReportPei | 1026.61 | 2.80762 |
| Entrypoint | 6076A6DB-3CE5-4D08-ACA3-740A679E1A5C | MfciPei | Entrypoint measurement for module MfciPei | 1029.54 | 1.01856 |
| Entrypoint | 2580FE68-B683-4FFC-A43E-25A088299102 | MsUiThemePpi | Entrypoint measurement for module MsUiThemePpi | 1030.66 | 1.23284 |
| Entrypoint | 95F6849D-E6C1-41BB-B7AB-8DEA44B1B09B | MsEarlyGraphicsPei | Entrypoint measurement for module MsEarlyGraphicsPei | 1031.98 | 1.26804 |
| Entrypoint | ADF01BF6-47D6-495D-B95B-687777807214 | FirmwarePerformancePei | Entrypoint measurement for module FirmwarePerformancePei | 1033.34 | 1.05377 |
| Entrypoint | A124F01D-89F2-46C5-A4C0-DA1630CEC15C | PolicyPei | Entrypoint measurement for module PolicyPei | 1034.48 | 0.293613 |
| Entrypoint | E6ED744A-8DB0-42B8-A507-8909782E2E10 | BaseCryptoDriverPeiX64 | Entrypoint measurement for module BaseCryptoDriverPeiX64 | 1035.29 | 0.497549 |
| Entrypoint | A0DBE438-701C-44AF-AB4A-25545B86B565 | MmControlPei | Entrypoint measurement for module MmControlPei | 1037.05 | 1.70832 |
| Entrypoint | E6D1F588-F107-41DE-9832-CEA334B33C1F | MmIplPei | Entrypoint measurement for module MmIplPei | 1038.93 | 1.31525 |
| Event | N/A | N/A | OSLoaderLoadImageStart | 1163.65 | 1e-06 |
| Event | N/A | N/A | OSLoaderStartImageStart | 1181.01 | 1e-06 |
| Inmodule | 52C05B14-0B98-496C-BC3B-04B50211D680 | PeiCore | Inmodule measurement from module PeiCore with label PerfDelayedDispatchEndO | 3258.36 | 0.080178 |
| LoadImage | 80CF7257-87AB-47F9-A3FED50B76D89541 | UNKNOWN-f2ab | LoadImage measurement for module UNKNOWN-f2ab | 5472.16 | 6.08519 |
| Entrypoint | 80CF7257-87AB-47F9-A3FE-D50B76D89541 | PcdDxe | Entrypoint measurement for module PcdDxe | 5479.4 | 5.1468 |
| LoadImage | 9B680FCE-AD6B-4F3A-B60BF59899003443 | UNKNOWN-1c1c | LoadImage measurement for module UNKNOWN-1c1c | 5485.34 | 0.619696 |
| Entrypoint | 9B680FCE-AD6B-4F3A-B60B-F59899003443 | DevicePathDxe | Entrypoint measurement for module DevicePathDxe | 5486.55 | 0.246756 |
| LoadImage | D93CE3D8-A7EB-4730-8C8ECC466A9ECC3C | UNKNOWN-1deb | LoadImage measurement for module UNKNOWN-1deb | 5491.55 | 0.921415 |
| Entrypoint | D93CE3D8-A7EB-4730-8C8E-CC466A9ECC3C | ReportStatusCodeRouterRuntimeDxe | Entrypoint measurement for module ReportStatusCodeRouterRuntimeDxe | 5493.01 | 1.63529 |
| LoadImage | B601F8C4-43B7-4784-95B1F4226CB40CEE | UNKNOWN-26b8 | LoadImage measurement for module UNKNOWN-26b8 | 5494.82 | 0.425257 |
| Entrypoint | B601F8C4-43B7-4784-95B1-F4226CB40CEE | RuntimeDxe | Entrypoint measurement for module RuntimeDxe | 5495.73 | 2.04363 |
| LoadImage | 245CB4DA-8E15-4A1B-87E39878FFA07520 | UNKNOWN-8ee4 | LoadImage measurement for module UNKNOWN-8ee4 | 5498.17 | 0.48126 |
| Entrypoint | 245CB4DA-8E15-4A1B-87E3-9878FFA07520 | Legacy8259 | Entrypoint measurement for module Legacy8259 | 5499.19 | 0.486891 |
| LoadImage | A19B1FE7-C1BC-49F8-875F54A5D542443F | UNKNOWN-1acd | LoadImage measurement for module UNKNOWN-1acd | 5499.85 | 0.442038 |
| Entrypoint | A19B1FE7-C1BC-49F8-875F-54A5D542443F | CpuIo2Dxe | Entrypoint measurement for module CpuIo2Dxe | 5500.76 | 0.285608 |
| LoadImage | 94598893-936A-481E-998E1B0880916AE4 | UNKNOWN-5976 | LoadImage measurement for module UNKNOWN-5976 | 5501.2 | 0.656986 |
| Entrypoint | 94598893-936A-481E-998E-1B0880916AE4 | MpDxe | Entrypoint measurement for module MpDxe | 5502.41 | 50.8581 |
| LoadImage | F6697AC4-A776-4EE1-B6431FEFF2B615BB | UNKNOWN-4d1d | LoadImage measurement for module UNKNOWN-4d1d | 5553.49 | 0.561569 |
| Entrypoint | F6697AC4-A776-4EE1-B643-1FEFF2B615BB | IncompatiblePciDeviceSupportDxe | Entrypoint measurement for module IncompatiblePciDeviceSupportDxe | 5554.69 | 0.51891 |
| LoadImage | 11A6EDF6-A9BE-426D-A6CCB22FE51D9224 | UNKNOWN-2a05 | LoadImage measurement for module UNKNOWN-2a05 | 5555.37 | 0.350438 |
| Entrypoint | 11A6EDF6-A9BE-426D-A6CC-B22FE51D9224 | PciHotPlugInitDxe | Entrypoint measurement for module PciHotPlugInitDxe | 5556.21 | 0.334299 |
| LoadImage | 4B28E4C7-FF36-4E10-93CFA82159E777C5 | UNKNOWN-5286 | LoadImage measurement for module UNKNOWN-5286 | 5556.7 | 0.406452 |
| Entrypoint | 4B28E4C7-FF36-4E10-93CF-A82159E777C5 | ResetSystemRuntimeDxe | Entrypoint measurement for module ResetSystemRuntimeDxe | 5557.59 | 1.70017 |
| LoadImage | C8339973-A563-4561-B858D8476F9DEFC4 | UNKNOWN-ca98 | LoadImage measurement for module UNKNOWN-ca98 | 5559.57 | 1.10245 |
| Entrypoint | C8339973-A563-4561-B858-D8476F9DEFC4 | Metronome | Entrypoint measurement for module Metronome | 5561.16 | 1.07885 |
| LoadImage | F5E4F8D3-9975-4263-8BB567178988429E | UNKNOWN-b24d | LoadImage measurement for module UNKNOWN-b24d | 5562.42 | 0.399239 |
| Entrypoint | F5E4F8D3-9975-4263-8BB5-67178988429E | CpuInfoDxe | Entrypoint measurement for module CpuInfoDxe | 5563.34 | 2.46794 |
| LoadImage | B981A835-6EE8-4F4C-AE0B210AA0BFBF01 | UNKNOWN-016b | LoadImage measurement for module UNKNOWN-016b | 5565.98 | 0.394389 |
| Entrypoint | B981A835-6EE8-4F4C-AE0B-210AA0BFBF01 | RngDxe | Entrypoint measurement for module RngDxe | 5566.89 | 0.696529 |
| LoadImage | 79E4A61C-ED73-4312-94FEE3E7563362A9 | UNKNOWN-b0df | LoadImage measurement for module UNKNOWN-b0df | 5567.76 | 0.439293 |
| Entrypoint | 79E4A61C-ED73-4312-94FE-E3E7563362A9 | PrintDxe | Entrypoint measurement for module PrintDxe | 5568.71 | 0.317597 |
| LoadImage | 348C4D62-BFBD-4882-9ECEC80BB1C4783B | UNKNOWN-175e | LoadImage measurement for module UNKNOWN-175e | 5569.19 | 0.655133 |
| Entrypoint | 348C4D62-BFBD-4882-9ECE-C80BB1C4783B | HiiDatabase | Entrypoint measurement for module HiiDatabase | 5570.34 | 0.814617 |
| LoadImage | 96B5C032-DF4C-4B6E-8232438DCF448D0E | UNKNOWN-71da | LoadImage measurement for module UNKNOWN-71da | 5571.32 | 0.560948 |
| Entrypoint | 96B5C032-DF4C-4B6E-8232-438DCF448D0E | NullMemoryTestDxe | Entrypoint measurement for module NullMemoryTestDxe | 5572.36 | 0.514502 |
| LoadImage | 9622E42C-8E38-4A08-9E8F54F784652F6B | UNKNOWN-bdb1 | LoadImage measurement for module UNKNOWN-bdb1 | 5573.04 | 0.457647 |
| Entrypoint | 9622E42C-8E38-4A08-9E8F-54F784652F6B | AcpiTableDxe | Entrypoint measurement for module AcpiTableDxe | 5574.02 | 3.30629 |
| LoadImage | A210F973-229D-4F4D-AA379895E6C9EABA | UNKNOWN-c86d | LoadImage measurement for module UNKNOWN-c86d | 5577.51 | 0.831198 |
| Entrypoint | A210F973-229D-4F4D-AA37-9895E6C9EABA | DpcDxe | Entrypoint measurement for module DpcDxe | 5578.83 | 0.375755 |
| LoadImage | FA1BB8AF-71F0-4E2E-BA780FB10F8367DD | UNKNOWN-de8c | LoadImage measurement for module UNKNOWN-de8c | 5579.37 | 0.405941 |
| Entrypoint | FA1BB8AF-71F0-4E2E-BA78-0FB10F8367DD | PolicyDxe | Entrypoint measurement for module PolicyDxe | 5580.26 | 2.29656 |
| LoadImage | 8657015B-EA43-440D-949AAF3BE365C0FC | UNKNOWN-37da | LoadImage measurement for module UNKNOWN-37da | 5582.72 | 0.343386 |
| Entrypoint | 8657015B-EA43-440D-949A-AF3BE365C0FC | IoMmuDxe | Entrypoint measurement for module IoMmuDxe | 5583.55 | 0.198497 |
| LoadImage | AC95AD3D-4366-44BF-9A62E4B29D7A2206 | UNKNOWN-11ce | LoadImage measurement for module UNKNOWN-11ce | 5583.9 | 0.417633 |
| Entrypoint | AC95AD3D-4366-44BF-9A62-E4B29D7A2206 | SmmAccess2Dxe | Entrypoint measurement for module SmmAccess2Dxe | 5584.81 | 0.531303 |
| LoadImage | 06E49122-4EF4-45FE-9766E2EAF2F9472F | UNKNOWN-af76 | LoadImage measurement for module UNKNOWN-af76 | 5585.51 | 0.453349 |
| Entrypoint | 06E49122-4EF4-45FE-9766-E2EAF2F9472F | AdvancedFileLogger | Entrypoint measurement for module AdvancedFileLogger | 5586.46 | 5.44123 |
| Inmodule | 06E49122-4EF4-45FE-9766-E2EAF2F9472F | AdvancedFileLogger | Inmodule measurement from module AdvancedFileLogger with label AdvLogger All files | 5590.37 | 0.573411 |
| LoadImage | E9BADBB6-0228-43FB-A3675F3677CDC9E0 | UNKNOWN-d02b | LoadImage measurement for module UNKNOWN-d02b | 5592.1 | 0.450654 |
| Entrypoint | E9BADBB6-0228-43FB-A367-5F3677CDC9E0 | StandaloneMmUnblockMem | Entrypoint measurement for module StandaloneMmUnblockMem | 5593.04 | 0.884547 |
| LoadImage | FF626DA9-17EE-4949-A8B8B10FA0044E9F | UNKNOWN-81fe | LoadImage measurement for module UNKNOWN-81fe | 5594.17 | 0.374503 |
| Entrypoint | FF626DA9-17EE-4949-A8B8-B10FA0044E9F | EsrtFmpDxe | Entrypoint measurement for module EsrtFmpDxe | 5595.03 | 0.371588 |
| LoadImage | D118A4C4-DEB6-4B7A-B3EBE071148C1C6C | UNKNOWN-6b89 | LoadImage measurement for module UNKNOWN-6b89 | 5595.56 | 0.354957 |
| Entrypoint | D118A4C4-DEB6-4B7A-B3EB-E071148C1C6C | AcpiRgrt | Entrypoint measurement for module AcpiRgrt | 5596.4 | 2.12271 |
| LoadImage | 18D93D57-0B00-4213-B0A2A2FF5EC214E4 | UNKNOWN-8163 | LoadImage measurement for module UNKNOWN-8163 | 5598.72 | 0.452327 |
| Entrypoint | 18D93D57-0B00-4213-B0A2-A2FF5EC214E4 | PrmConfigDxe | Entrypoint measurement for module PrmConfigDxe | 5599.67 | 3.2557 |
| LoadImage | DC2A58A6-5927-4776-B995D118A27335A2 | UNKNOWN-f81a | LoadImage measurement for module UNKNOWN-f81a | 5603.18 | 2.06208 |
| Entrypoint | DC2A58A6-5927-4776-B995-D118A27335A2 | PrmSampleAcpiParameterBufferModule | Entrypoint measurement for module PrmSampleAcpiParameterBufferModule | 5605.73 | 0.69737 |
| LoadImage | 5A6CF42B-8BB4-472C-A2335C4DC4033DC7 | UNKNOWN-71b5 | LoadImage measurement for module UNKNOWN-71b5 | 5606.61 | 0.458369 |
| Entrypoint | 5A6CF42B-8BB4-472C-A233-5C4DC4033DC7 | PrmSampleContextBufferModule | Entrypoint measurement for module PrmSampleContextBufferModule | 5607.55 | 1.896 |
| LoadImage | 226A500A-E14F-414A-A95640E5762D3D1E | UNKNOWN-1044 | LoadImage measurement for module UNKNOWN-1044 | 5609.63 | 0.409818 |
| Entrypoint | 226A500A-E14F-414A-A956-40E5762D3D1E | PrmLoaderDxe | Entrypoint measurement for module PrmLoaderDxe | 5610.53 | 1.58146 |
| LoadImage | 16A5DD36-4C29-4E85-B0B9C05883753DE7 | UNKNOWN-cea0 | LoadImage measurement for module UNKNOWN-cea0 | 5612.28 | 0.386485 |
| Entrypoint | 16A5DD36-4C29-4E85-B0B9-C05883753DE7 | MsUiThemeProtocol | Entrypoint measurement for module MsUiThemeProtocol | 5613.15 | 1.35979 |
| LoadImage | 02AA389E-CA29-43BF-BE05A4CA038812F2 | UNKNOWN-e949 | LoadImage measurement for module UNKNOWN-e949 | 5614.67 | 0.498262 |
| Entrypoint | 02AA389E-CA29-43BF-BE05-A4CA038812F2 | RenderingEngineDxe | Entrypoint measurement for module RenderingEngineDxe | 5615.68 | 0.66428 |
| LoadImage | 6C2004EF-4E0E-4BE4-B14C340EB4AA5891 | UNKNOWN-b88a | LoadImage measurement for module UNKNOWN-b88a | 5625.32 | 0.540591 |
| Entrypoint | 6C2004EF-4E0E-4BE4-B14C-340EB4AA5891 | StatusCodeHandlerRuntimeDxe | Entrypoint measurement for module StatusCodeHandlerRuntimeDxe | 5626.59 | 2.29051 |
| LoadImage | C190FE35-44AA-41A1-8AEA4947BC60E09D | UNKNOWN-9db7 | LoadImage measurement for module UNKNOWN-9db7 | 5629.09 | 0.500576 |
| Entrypoint | C190FE35-44AA-41A1-8AEA-4947BC60E09D | Timer | Entrypoint measurement for module Timer | 5630.08 | 2.01572 |
| LoadImage | 128FB770-5E79-4176-9E519BB268A17DD1 | UNKNOWN-97b8 | LoadImage measurement for module UNKNOWN-97b8 | 5632.29 | 0.49742 |
| Entrypoint | 128FB770-5E79-4176-9E51-9BB268A17DD1 | PciHostBridgeDxe | Entrypoint measurement for module PciHostBridgeDxe | 5633.28 | 22.8341 |
| LoadImage | EBF342FE-B1D3-4EF8-957C8048606FF671 | UNKNOWN-c9ff | LoadImage measurement for module UNKNOWN-c9ff | 5656.33 | 0.766148 |
| Entrypoint | EBF342FE-B1D3-4EF8-957C-8048606FF671 | SetupBrowser | Entrypoint measurement for module SetupBrowser | 5657.64 | 1.1681 |
| LoadImage | 17985E6F-E778-4D94-AEFAC5DD2B77E186 | UNKNOWN-a187 | LoadImage measurement for module UNKNOWN-a187 | 5658.98 | 0.456534 |
| Entrypoint | 17985E6F-E778-4D94-AEFA-C5DD2B77E186 | QemuFwCfgAcpiPlatform | Entrypoint measurement for module QemuFwCfgAcpiPlatform | 5659.93 | 2.57724 |
| LoadImage | A487A478-51EF-48AA-87947BEE2A0562F1 | UNKNOWN-57ff | LoadImage measurement for module UNKNOWN-57ff | 5662.69 | 2.01802 |
| Entrypoint | A487A478-51EF-48AA-8794-7BEE2A0562F1 | tftpDynamicCommand | Entrypoint measurement for module tftpDynamicCommand | 5665.27 | 3.32385 |
| LoadImage | 19618BCE-55AE-09C6-37E94CE04084C7A1 | UNKNOWN-eadd | LoadImage measurement for module UNKNOWN-eadd | 5668.77 | 0.635135 |
| Entrypoint | 19618BCE-55AE-09C6-37E9-4CE04084C7A1 | httpDynamicCommand | Entrypoint measurement for module httpDynamicCommand | 5669.97 | 0.874498 |
| LoadImage | 17D0EF2A-5933-4007-89505749169D3DC5 | UNKNOWN-a58d | LoadImage measurement for module UNKNOWN-a58d | 5671.01 | 0.595893 |
| Entrypoint | 17D0EF2A-5933-4007-8950-5749169D3DC5 | VariablePolicyDynamicCommand | Entrypoint measurement for module VariablePolicyDynamicCommand | 5672.24 | 0.703221 |
| LoadImage | 2F30DA26-F51B-4B6F-85C431873C281BCA | UNKNOWN-fea5 | LoadImage measurement for module UNKNOWN-fea5 | 5673.1 | 0.598457 |
| Entrypoint | 2F30DA26-F51B-4B6F-85C4-31873C281BCA | LinuxInitrdDynamicShellCommand | Entrypoint measurement for module LinuxInitrdDynamicShellCommand | 5674.26 | 0.720704 |
| LoadImage | 22EA234F-E72A-11E4-91F928D2447C4829 | UNKNOWN-374a | LoadImage measurement for module UNKNOWN-374a | 5675.14 | 0.429274 |
| Entrypoint | 22EA234F-E72A-11E4-91F9-28D2447C4829 | HttpUtilitiesDxe | Entrypoint measurement for module HttpUtilitiesDxe | 5676.08 | 0.327085 |
| LoadImage | DCE1B094-7DC6-45D0-9FDDD7FC3CC3E4EF | UNKNOWN-dc04 | LoadImage measurement for module UNKNOWN-dc04 | 5676.57 | 0.598397 |
| Entrypoint | DCE1B094-7DC6-45D0-9FDD-D7FC3CC3E4EF | QemuRamfbDxe | Entrypoint measurement for module QemuRamfbDxe | 5677.69 | 2.71692 |
| LoadImage | 1206F7CA-A475-4624-A83EE6FC9BB38E49 | UNKNOWN-5c32 | LoadImage measurement for module UNKNOWN-5c32 | 5680.57 | 0.43216 |
| Entrypoint | 1206F7CA-A475-4624-A83E-E6FC9BB38E49 | SmmControl2Dxe | Entrypoint measurement for module SmmControl2Dxe | 5681.5 | 4.63418 |
| LoadImage | C5D0E6B2-A841-4C67-A0E392354DE07E51 | UNKNOWN-ad2f | LoadImage measurement for module UNKNOWN-ad2f | 5686.37 | 0.490066 |
| Entrypoint | C5D0E6B2-A841-4C67-A0E3-92354DE07E51 | SerialStatusCodeHandlerDxe | Entrypoint measurement for module SerialStatusCodeHandlerDxe | 5687.41 | 0.776727 |
| LoadImage | 00160F8D-2B35-4DF2-BBE0B272A8D631F0 | UNKNOWN-0cb4 | LoadImage measurement for module UNKNOWN-0cb4 | 5688.36 | 0.437649 |
| Entrypoint | 00160F8D-2B35-4DF2-BBE0-B272A8D631F0 | FirmwarePerformanceDxe | Entrypoint measurement for module FirmwarePerformanceDxe | 5689.51 | 2.77495 |
| LoadImage | 3977D4C4-B0EB-4548-96B9671FA2E36820 | UNKNOWN-6fc7 | LoadImage measurement for module UNKNOWN-6fc7 | 5692.48 | 0.412192 |
| Entrypoint | 3977D4C4-B0EB-4548-96B9-671FA2E36820 | MsEarlyGraphicsDxe | Entrypoint measurement for module MsEarlyGraphicsDxe | 5693.42 | 1.66904 |
| LoadImage | 995F045B-0265-46A4-8D21001211A24A4F | UNKNOWN-e530 | LoadImage measurement for module UNKNOWN-e530 | 5695.26 | 0.462646 |
| Entrypoint | 995F045B-0265-46A4-8D21-001211A24A4F | MsWheaReportDxe | Entrypoint measurement for module MsWheaReportDxe | 5696.28 | 2.51534 |
| LoadImage | BDEE011F-87F2-4A7F-BC5E44B6B61F2E20 | UNKNOWN-de4c | LoadImage measurement for module UNKNOWN-de4c | 5698.96 | 4.60551 |
| Entrypoint | BDEE011F-87F2-4A7F-BC5E-44B6B61F2E20 | BaseCryptoDriverDxeX64 | Entrypoint measurement for module BaseCryptoDriverDxeX64 | 5704.48 | 1.09027 |
| LoadImage | B0423E2F-3B2C-4A36-BF983EB3B4B7CB0E | UNKNOWN-b932 | LoadImage measurement for module UNKNOWN-b932 | 5705.74 | 0.531493 |
| Entrypoint | B0423E2F-3B2C-4A36-BF98-3EB3B4B7CB0E | PrmSsdtInstallDxe | Entrypoint measurement for module PrmSsdtInstallDxe | 5706.78 | 3.60892 |
| LoadImage | E622443C-284E-4B47-A984FD66B482DAC0 | UNKNOWN-6530 | LoadImage measurement for module UNKNOWN-6530 | 5710.58 | 0.527436 |
| Entrypoint | E622443C-284E-4B47-A984-FD66B482DAC0 | BootManagerPolicyDxe | Entrypoint measurement for module BootManagerPolicyDxe | 5711.61 | 3.03113 |
| LoadImage | F80697E9-7FD6-4665-864688E33EF71DFC | UNKNOWN-ed8d | LoadImage measurement for module UNKNOWN-ed8d | 5719.99 | 0.739769 |
| Entrypoint | F80697E9-7FD6-4665-8646-88E33EF71DFC | SecurityStubDxe | Entrypoint measurement for module SecurityStubDxe | 5721.27 | 2.16234 |
| LoadImage | F099D67F-71AE-4C36-B2A3DCEB0EB2B7D8 | UNKNOWN-d9d9 | LoadImage measurement for module UNKNOWN-d9d9 | 5723.64 | 1.27116 |
| Entrypoint | F099D67F-71AE-4C36-B2A3-DCEB0EB2B7D8 | WatchdogTimer | Entrypoint measurement for module WatchdogTimer | 5725.44 | 0.656214 |
| LoadImage | EBF8ED7C-0DD1-4787-84F1F48D537DCACF | UNKNOWN-75ef | LoadImage measurement for module UNKNOWN-75ef | 5726.26 | 0.589801 |
| Entrypoint | EBF8ED7C-0DD1-4787-84F1-F48D537DCACF | DriverHealthManagerDxe | Entrypoint measurement for module DriverHealthManagerDxe | 5727.4 | 5.00008 |
| LoadImage | 28A03FF4-12B3-4305-A417BB1A4F94081E | UNKNOWN-aa71 | LoadImage measurement for module UNKNOWN-aa71 | 5732.62 | 0.717668 |
| Entrypoint | 28A03FF4-12B3-4305-A417-BB1A4F94081E | RamDiskDxe | Entrypoint measurement for module RamDiskDxe | 5733.87 | 2.80092 |
| LoadImage | F0825F4F-D6A2-4F61-A6C05F01A86C80FF | UNKNOWN-95d9 | LoadImage measurement for module UNKNOWN-95d9 | 5736.84 | 0.682353 |
| Entrypoint | F0825F4F-D6A2-4F61-A6C0-5F01A86C80FF | MmDxeSupport | Entrypoint measurement for module MmDxeSupport | 5738.04 | 9.77979 |
| LoadImage | 8D4B8BC7-E66B-4BE2-ADD84988E08743ED | UNKNOWN-0436 | LoadImage measurement for module UNKNOWN-0436 | 5748.06 | 0.645464 |
| Entrypoint | 8D4B8BC7-E66B-4BE2-ADD8-4988E08743ED | MmCommunicationDxe | Entrypoint measurement for module MmCommunicationDxe | 5749.2 | 3.06176 |
| LoadImage | C9B8B0B7-9C85-46E8-B343362FBD26E8F3 | UNKNOWN-abbd | LoadImage measurement for module UNKNOWN-abbd | 5752.51 | 0.616571 |
| Entrypoint | C9B8B0B7-9C85-46E8-B343-362FBD26E8F3 | MuCryptoDxe | Entrypoint measurement for module MuCryptoDxe | 5753.64 | 0.732816 |
| LoadImage | 9F7DCADE-11EA-448A-A46F76E003657DD1 | UNKNOWN-f493 | LoadImage measurement for module UNKNOWN-f493 | 5759.26 | 0.705625 |
| Entrypoint | 9F7DCADE-11EA-448A-A46F-76E003657DD1 | VariableSmmRuntimeDxe | Entrypoint measurement for module VariableSmmRuntimeDxe | 5760.47 | 16.7094 |
| LoadImage | 378D7B65-8DA9-4773-B6E4A47826A833E1 | UNKNOWN-8bd8 | LoadImage measurement for module UNKNOWN-8bd8 | 5782.48 | 0.702329 |
| Entrypoint | 378D7B65-8DA9-4773-B6E4-A47826A833E1 | PcRtc | Entrypoint measurement for module PcRtc | 5783.7 | 12.1131 |
| LoadImage | AD608272-D07F-4964-801E7BD3B7888652 | UNKNOWN-02d4 | LoadImage measurement for module UNKNOWN-02d4 | 5796.05 | 0.679405 |
| Entrypoint | AD608272-D07F-4964-801E-7BD3B7888652 | MonotonicCounterRuntimeDxe | Entrypoint measurement for module MonotonicCounterRuntimeDxe | 5797.28 | 17.0902 |
| LoadImage | 42857F0A-13F2-4B21-8A2353D3F714B840 | UNKNOWN-213d | LoadImage measurement for module UNKNOWN-213d | 5814.62 | 0.904934 |
| Entrypoint | 42857F0A-13F2-4B21-8A23-53D3F714B840 | CapsuleRuntimeDxe | Entrypoint measurement for module CapsuleRuntimeDxe | 5816.05 | 3.77314 |
| LoadImage | 6D33944A-EC75-4855-A54D809C75241F6C | UNKNOWN-5330 | LoadImage measurement for module UNKNOWN-5330 | 5820.03 | 1.48964 |
| Entrypoint | 6D33944A-EC75-4855-A54D-809C75241F6C | BdsDxe | Entrypoint measurement for module BdsDxe | 5822.11 | 9.83149 |
| LoadImage | 8C7DB881-DA76-4486-86548152EE3470A3 | UNKNOWN-3cfe | LoadImage measurement for module UNKNOWN-3cfe | 5832.25 | 1.02112 |
| Entrypoint | 8C7DB881-DA76-4486-8654-8152EE3470A3 | MuVarPolicyFoundationDxe | Entrypoint measurement for module MuVarPolicyFoundationDxe | 5833.8 | 1.85105 |
| LoadImage | 47F4201B-6DE1-4A65-B9225E026E0FF436 | UNKNOWN-9774 | LoadImage measurement for module UNKNOWN-9774 | 5835.85 | 0.695477 |
| Entrypoint | 47F4201B-6DE1-4A65-B922-5E026E0FF436 | LoadOptionVariablePolicyDxe | Entrypoint measurement for module LoadOptionVariablePolicyDxe | 5837.06 | 6.46132 |
| LoadImage | D4ABC208-E91F-4A5C-880B7063A0393E4C | UNKNOWN-d696 | LoadImage measurement for module UNKNOWN-d696 | 5843.76 | 0.78891 |
| Entrypoint | D4ABC208-E91F-4A5C-880B-7063A0393E4C | MfciDxe | Entrypoint measurement for module MfciDxe | 5845.08 | 11.5434 |
| LoadImage | 93B80004-9FB3-11D4-9A3A0090273FC14D | UNKNOWN-42fb | LoadImage measurement for module UNKNOWN-42fb | 5861.02 | 0.817002 |
| Entrypoint | 93B80004-9FB3-11D4-9A3A-0090273FC14D | PciBusDxe | Entrypoint measurement for module PciBusDxe | 5862.48 | 2.00377 |
| LoadImage | 83DD3B39-7CAF-4FAC-A542E050B767E3A7 | UNKNOWN-4e2d | LoadImage measurement for module UNKNOWN-4e2d | 5864.67 | 0.692381 |
| Entrypoint | 83DD3B39-7CAF-4FAC-A542-E050B767E3A7 | VirtioPciDeviceDxe | Entrypoint measurement for module VirtioPciDeviceDxe | 5865.9 | 0.397786 |
| LoadImage | 0170F60C-1D40-4651-956DF0BD9879D527 | UNKNOWN-1a6f | LoadImage measurement for module UNKNOWN-1a6f | 5866.47 | 0.687332 |
| Entrypoint | 0170F60C-1D40-4651-956D-F0BD9879D527 | Virtio10 | Entrypoint measurement for module Virtio10 | 5867.71 | 0.429696 |
| LoadImage | 11D92DFB-3CA9-4F93-BA2E4780ED3E03B5 | UNKNOWN-b387 | LoadImage measurement for module UNKNOWN-b387 | 5868.31 | 0.651826 |
| Entrypoint | 11D92DFB-3CA9-4F93-BA2E-4780ED3E03B5 | VirtioBlkDxe | Entrypoint measurement for module VirtioBlkDxe | 5869.53 | 0.400261 |
| LoadImage | FAB5D4F4-83C0-4AAF-8480442D11DF6CEA | UNKNOWN-77e9 | LoadImage measurement for module UNKNOWN-77e9 | 5870.14 | 0.82164 |
| Entrypoint | FAB5D4F4-83C0-4AAF-8480-442D11DF6CEA | VirtioScsiDxe | Entrypoint measurement for module VirtioScsiDxe | 5871.63 | 0.490938 |
| LoadImage | 58E26F0D-CBAC-4BBA-B70F18221415665A | UNKNOWN-9866 | LoadImage measurement for module UNKNOWN-9866 | 5872.31 | 0.710855 |
| Entrypoint | 58E26F0D-CBAC-4BBA-B70F-18221415665A | VirtioRngDxe | Entrypoint measurement for module VirtioRngDxe | 5873.55 | 0.396954 |
| LoadImage | 51CCF399-4FDF-4E55-A45BE123F84D456A | UNKNOWN-f2ca | LoadImage measurement for module UNKNOWN-f2ca | 5874.12 | 0.708872 |
| Entrypoint | 51CCF399-4FDF-4E55-A45B-E123F84D456A | ConPlatformDxe | Entrypoint measurement for module ConPlatformDxe | 5875.41 | 2.84884 |
| LoadImage | 408EDCEC-CF6D-477C-A5A8B4844E3DE281 | UNKNOWN-c912 | LoadImage measurement for module UNKNOWN-c912 | 5878.46 | 0.742193 |
| Entrypoint | 408EDCEC-CF6D-477C-A5A8-B4844E3DE281 | ConSplitterDxe | Entrypoint measurement for module ConSplitterDxe | 5879.74 | 2.84396 |
| LoadImage | CCCB0C28-4B24-11D5-9A5A0090273FC14D | UNKNOWN-d4e0 | LoadImage measurement for module UNKNOWN-d4e0 | 5882.79 | 0.71348 |
| Entrypoint | CCCB0C28-4B24-11D5-9A5A-0090273FC14D | GraphicsConsoleDxe | Entrypoint measurement for module GraphicsConsoleDxe | 5884.08 | 1.93321 |
| LoadImage | 9E863906-A40F-4875-977F5B93FF237FC6 | UNKNOWN-bdfc | LoadImage measurement for module UNKNOWN-bdfc | 5886.23 | 0.788248 |
| Entrypoint | 9E863906-A40F-4875-977F-5B93FF237FC6 | TerminalDxe | Entrypoint measurement for module TerminalDxe | 5887.56 | 0.527406 |
| LoadImage | 806040CA-DAD9-4978-A3B42D2AB0C8A48F | UNKNOWN-7898 | LoadImage measurement for module UNKNOWN-7898 | 5888.27 | 0.715043 |
| Entrypoint | 806040CA-DAD9-4978-A3B4-2D2AB0C8A48F | QemuKernelLoaderFsDxe | Entrypoint measurement for module QemuKernelLoaderFsDxe | 5889.54 | 3.00358 |
| LoadImage | 6B38F7B4-AD98-40E9-9093ACA2B5A253C4 | UNKNOWN-5bd4 | LoadImage measurement for module UNKNOWN-5bd4 | 5892.75 | 0.729109 |
| Entrypoint | 6B38F7B4-AD98-40E9-9093-ACA2B5A253C4 | DiskIoDxe | Entrypoint measurement for module DiskIoDxe | 5894.03 | 0.450383 |
| LoadImage | 1FA1F39E-FEFF-4AAE-BD7B38A070A3B609 | UNKNOWN-12cc | LoadImage measurement for module UNKNOWN-12cc | 5894.66 | 0.755799 |
| Entrypoint | 1FA1F39E-FEFF-4AAE-BD7B-38A070A3B609 | PartitionDxe | Entrypoint measurement for module PartitionDxe | 5896.05 | 0.458678 |
| LoadImage | CD3BAFB6-50FB-4FE8-8E4EAB74D2C1A600 | UNKNOWN-dbcd | LoadImage measurement for module UNKNOWN-dbcd | 5896.69 | 0.690087 |
| Entrypoint | CD3BAFB6-50FB-4FE8-8E4E-AB74D2C1A600 | EnglishDxe | Entrypoint measurement for module EnglishDxe | 5897.91 | 0.359044 |
| LoadImage | 0167CCC4-D0F7-4F21-A3EF9E64B7CDCE8B | UNKNOWN-7394 | LoadImage measurement for module UNKNOWN-7394 | 5898.48 | 0.730311 |
| Entrypoint | 0167CCC4-D0F7-4F21-A3EF-9E64B7CDCE8B | ScsiBus | Entrypoint measurement for module ScsiBus | 5899.74 | 0.528478 |
| LoadImage | 0A66E322-3740-4CCE-AD62BD172CECCA35 | UNKNOWN-1792 | LoadImage measurement for module UNKNOWN-1792 | 5900.45 | 0.888153 |
| Entrypoint | 0A66E322-3740-4CCE-AD62-BD172CECCA35 | ScsiDisk | Entrypoint measurement for module ScsiDisk | 5902.11 | 0.524521 |
| LoadImage | 021722D8-522B-4079-852AFE44C2C13F49 | UNKNOWN-62e6 | LoadImage measurement for module UNKNOWN-62e6 | 5902.87 | 1.13578 |
| Entrypoint | 021722D8-522B-4079-852A-FE44C2C13F49 | SataController | Entrypoint measurement for module SataController | 5904.62 | 0.427351 |
| LoadImage | 5E523CB4-D397-4986-87BDA6DD8B22F455 | UNKNOWN-a967 | LoadImage measurement for module UNKNOWN-a967 | 5905.22 | 0.886099 |
| Entrypoint | 5E523CB4-D397-4986-87BD-A6DD8B22F455 | AtaAtapiPassThruDxe | Entrypoint measurement for module AtaAtapiPassThruDxe | 5906.69 | 0.663357 |
| LoadImage | 19DF145A-B1D4-453F-850738816676D7F6 | UNKNOWN-d19b | LoadImage measurement for module UNKNOWN-d19b | 5907.55 | 0.753013 |
| Entrypoint | 19DF145A-B1D4-453F-8507-38816676D7F6 | AtaBusDxe | Entrypoint measurement for module AtaBusDxe | 5908.89 | 0.675701 |
| LoadImage | 5BE3BDF4-53CF-46A3-A6A973C34A6E5EE3 | UNKNOWN-4120 | LoadImage measurement for module UNKNOWN-4120 | 5909.76 | 0.795111 |
| Entrypoint | 5BE3BDF4-53CF-46A3-A6A9-73C34A6E5EE3 | NvmExpressDxe | Entrypoint measurement for module NvmExpressDxe | 5911.13 | 0.801092 |
| LoadImage | 864E1CA8-85EB-4D63-9DCC6E0FC90FFD55 | UNKNOWN-66d2 | LoadImage measurement for module UNKNOWN-66d2 | 5912.14 | 0.769864 |
| Entrypoint | 864E1CA8-85EB-4D63-9DCC-6E0FC90FFD55 | SioBusDxe | Entrypoint measurement for module SioBusDxe | 5913.48 | 0.561018 |
| LoadImage | C4D1F932-821F-4744-BF066D30F7730F8D | UNKNOWN-a31d | LoadImage measurement for module UNKNOWN-a31d | 5914.22 | 0.750338 |
| Entrypoint | C4D1F932-821F-4744-BF06-6D30F7730F8D | Ps2KeyboardDxe | Entrypoint measurement for module Ps2KeyboardDxe | 5915.52 | 0.739338 |
| LoadImage | B8E62775-BB0A-43F0-A8435BE8B14F8CCD | UNKNOWN-481e | LoadImage measurement for module UNKNOWN-481e | 5916.52 | 0.741152 |
| Entrypoint | B8E62775-BB0A-43F0-A843-5BE8B14F8CCD | BootGraphicsResourceTableDxe | Entrypoint measurement for module BootGraphicsResourceTableDxe | 5917.8 | 0.762732 |
| LoadImage | 961578FE-B6B7-44C3-AF356BC705CD2B1F | UNKNOWN-6a2f | LoadImage measurement for module UNKNOWN-6a2f | 5918.75 | 0.813445 |
| Entrypoint | 961578FE-B6B7-44C3-AF35-6BC705CD2B1F | Fat | Entrypoint measurement for module Fat | 5920.12 | 0.495427 |
| LoadImage | 905F13B0-8F91-4B0A-BD76E1E78F9422E4 | UNKNOWN-b319 | LoadImage measurement for module UNKNOWN-b319 | 5920.79 | 1.01328 |
| Entrypoint | 905F13B0-8F91-4B0A-BD76-E1E78F9422E4 | UdfDxe | Entrypoint measurement for module UdfDxe | 5922.54 | 0.47547 |
| LoadImage | A2F436EA-A127-4EF8-957C8048606FF670 | UNKNOWN-6b44 | LoadImage measurement for module UNKNOWN-6b44 | 5923.19 | 0.765527 |
| Entrypoint | A2F436EA-A127-4EF8-957C-8048606FF670 | SnpDxe | Entrypoint measurement for module SnpDxe | 5924.5 | 0.476842 |
| LoadImage | 025BBFC7-E6A9-4B8B-82AD6815A1AEAF4A | UNKNOWN-24f6 | LoadImage measurement for module UNKNOWN-24f6 | 5925.17 | 0.792968 |
| Entrypoint | 025BBFC7-E6A9-4B8B-82AD-6815A1AEAF4A | MnpDxe | Entrypoint measurement for module MnpDxe | 5926.52 | 0.507529 |
| LoadImage | 529D3F93-E8E9-4E73-B1E1BDF6A9D50113 | UNKNOWN-024b | LoadImage measurement for module UNKNOWN-024b | 5927.2 | 0.850721 |
| Entrypoint | 529D3F93-E8E9-4E73-B1E1-BDF6A9D50113 | ArpDxe | Entrypoint measurement for module ArpDxe | 5928.64 | 0.546622 |
| LoadImage | 94734718-0BBC-47FB-96A5EE7A5AE6A2AD | UNKNOWN-b76a | LoadImage measurement for module UNKNOWN-b76a | 5929.37 | 0.810159 |
| Entrypoint | 94734718-0BBC-47FB-96A5-EE7A5AE6A2AD | Dhcp4Dxe | Entrypoint measurement for module Dhcp4Dxe | 5930.73 | 0.537234 |
| LoadImage | 9FB1A1F3-3B71-4324-B39A745CBB015FFF | UNKNOWN-a23a | LoadImage measurement for module UNKNOWN-a23a | 5931.6 | 0.927135 |
| Entrypoint | 9FB1A1F3-3B71-4324-B39A-745CBB015FFF | Ip4Dxe | Entrypoint measurement for module Ip4Dxe | 5933.09 | 1.13174 |
| LoadImage | 6D6963AB-906D-4A65-A7CABD40E5D6AF2B | UNKNOWN-f922 | LoadImage measurement for module UNKNOWN-f922 | 5934.45 | 0.818575 |
| Entrypoint | 6D6963AB-906D-4A65-A7CA-BD40E5D6AF2B | Udp4Dxe | Entrypoint measurement for module Udp4Dxe | 5935.86 | 1.07077 |
| LoadImage | DC3641B8-2FA8-4ED3-BC1FF9962A03454B | UNKNOWN-bff6 | LoadImage measurement for module UNKNOWN-bff6 | 5937.11 | 0.78887 |
| Entrypoint | DC3641B8-2FA8-4ED3-BC1F-F9962A03454B | Mtftp4Dxe | Entrypoint measurement for module Mtftp4Dxe | 5938.45 | 0.60565 |
| LoadImage | 95E3669D-34BE-4775-A6517EA41B69D89E | UNKNOWN-11ad | LoadImage measurement for module UNKNOWN-11ad | 5939.23 | 0.811321 |
| Entrypoint | 95E3669D-34BE-4775-A651-7EA41B69D89E | Dhcp6Dxe | Entrypoint measurement for module Dhcp6Dxe | 5940.6 | 0.523318 |
| LoadImage | 5BEDB5CC-D830-4EB2-87422D4CC9B54F2C | UNKNOWN-0134 | LoadImage measurement for module UNKNOWN-0134 | 5941.3 | 0.971087 |
| Entrypoint | 5BEDB5CC-D830-4EB2-8742-2D4CC9B54F2C | Ip6Dxe | Entrypoint measurement for module Ip6Dxe | 5942.9 | 1.09609 |
| LoadImage | D912C7BC-F098-4367-92BAE911083C7B0E | UNKNOWN-b8fb | LoadImage measurement for module UNKNOWN-b8fb | 5944.19 | 1.27499 |
| Entrypoint | D912C7BC-F098-4367-92BA-E911083C7B0E | Udp6Dxe | Entrypoint measurement for module Udp6Dxe | 5946.06 | 1.04279 |
| LoadImage | 99F03B99-98D8-49DD-A8D33219D0FFE41E | UNKNOWN-11f3 | LoadImage measurement for module UNKNOWN-11f3 | 5947.34 | 0.890618 |
| Entrypoint | 99F03B99-98D8-49DD-A8D3-3219D0FFE41E | Mtftp6Dxe | Entrypoint measurement for module Mtftp6Dxe | 5948.82 | 0.551981 |
| LoadImage | 1A7E4468-2F55-4A56-903C01265EB7622B | UNKNOWN-8f64 | LoadImage measurement for module UNKNOWN-8f64 | 5949.55 | 0.894716 |
| Entrypoint | 1A7E4468-2F55-4A56-903C-01265EB7622B | TcpDxe | Entrypoint measurement for module TcpDxe | 5951.04 | 0.903131 |
| LoadImage | B95E9FDA-26DE-48D2-88071F9107AC5E3A | UNKNOWN-fd51 | LoadImage measurement for module UNKNOWN-fd51 | 5952.13 | 1.22939 |
| Entrypoint | B95E9FDA-26DE-48D2-8807-1F9107AC5E3A | UefiPxeBcDxe | Entrypoint measurement for module UefiPxeBcDxe | 5953.94 | 3.5583 |
| LoadImage | 3ACEB0C0-3C72-11E4-9A5674D435052646 | UNKNOWN-fb66 | LoadImage measurement for module UNKNOWN-fb66 | 5957.68 | 0.891299 |
| Entrypoint | 3ACEB0C0-3C72-11E4-9A56-74D435052646 | TlsDxe | Entrypoint measurement for module TlsDxe | 5959.12 | 28.0589 |
| LoadImage | B219E140-DFFC-11E3-B9560022681E6906 | UNKNOWN-1082 | LoadImage measurement for module UNKNOWN-1082 | 5987.49 | 1.03651 |
| Entrypoint | B219E140-DFFC-11E3-B956-0022681E6906 | DnsDxe | Entrypoint measurement for module DnsDxe | 5989.1 | 1.00414 |
| LoadImage | 2366C20F-E15A-11E3-8BF1E4115B28BC50 | UNKNOWN-7c2e | LoadImage measurement for module UNKNOWN-7c2e | 5990.28 | 0.922267 |
| Entrypoint | 2366C20F-E15A-11E3-8BF1-E4115B28BC50 | HttpDxe | Entrypoint measurement for module HttpDxe | 5991.83 | 0.717988 |
| LoadImage | ECEBCB00-D9C8-11E4-AF3D8CDCD426C973 | UNKNOWN-086f | LoadImage measurement for module UNKNOWN-086f | 5992.74 | 0.93497 |
| Entrypoint | ECEBCB00-D9C8-11E4-AF3D-8CDCD426C973 | HttpBootDxe | Entrypoint measurement for module HttpBootDxe | 5994.25 | 3.80991 |
| LoadImage | A92CDB4B-82F1-4E0B-A5168A655D371524 | UNKNOWN-e77e | LoadImage measurement for module UNKNOWN-e77e | 5998.29 | 0.9028 |
| Entrypoint | A92CDB4B-82F1-4E0B-A516-8A655D371524 | VirtioNetDxe | Entrypoint measurement for module VirtioNetDxe | 5999.75 | 0.446476 |
| LoadImage | 2FB92EFA-2EE0-4BAE-9EB67464125E1EF7 | UNKNOWN-0b00 | LoadImage measurement for module UNKNOWN-0b00 | 6000.39 | 0.841437 |
| Entrypoint | 2FB92EFA-2EE0-4BAE-9EB6-7464125E1EF7 | UhciDxe | Entrypoint measurement for module UhciDxe | 6001.85 | 0.586054 |
| LoadImage | BDFE430E-8F2A-4DB0-99916F856594777E | UNKNOWN-de80 | LoadImage measurement for module UNKNOWN-de80 | 6002.62 | 0.981015 |
| Entrypoint | BDFE430E-8F2A-4DB0-9991-6F856594777E | EhciDxe | Entrypoint measurement for module EhciDxe | 6004.18 | 0.498302 |
| LoadImage | B7F50E91-A759-412C-ADE4DCD03E7F7C28 | UNKNOWN-c7e8 | LoadImage measurement for module UNKNOWN-c7e8 | 6004.88 | 0.901138 |
| Entrypoint | B7F50E91-A759-412C-ADE4-DCD03E7F7C28 | XhciDxe | Entrypoint measurement for module XhciDxe | 6006.4 | 0.774483 |
| LoadImage | 240612B7-A063-11D4-9A3A0090273FC14D | UNKNOWN-ddbc | LoadImage measurement for module UNKNOWN-ddbc | 6007.42 | 0.888263 |
| Entrypoint | 240612B7-A063-11D4-9A3A-0090273FC14D | UsbBusDxe | Entrypoint measurement for module UsbBusDxe | 6008.9 | 0.518409 |
| LoadImage | 2D2E62CF-9ECF-43B7-821994E7FC713DFE | UNKNOWN-8b5f | LoadImage measurement for module UNKNOWN-8b5f | 6009.6 | 0.83728 |
| Entrypoint | 2D2E62CF-9ECF-43B7-8219-94E7FC713DFE | UsbKbDxe | Entrypoint measurement for module UsbKbDxe | 6011.06 | 0.907338 |
| LoadImage | 9FB4B4A7-42C0-4BCD-85409BCC6711F83E | UNKNOWN-9e13 | LoadImage measurement for module UNKNOWN-9e13 | 6012.18 | 0.873706 |
| Entrypoint | 9FB4B4A7-42C0-4BCD-8540-9BCC6711F83E | UsbMassStorageDxe | Entrypoint measurement for module UsbMassStorageDxe | 6013.64 | 0.419867 |
| LoadImage | E3752948-B9A1-4770-90C4DF41C38986BE | UNKNOWN-27ef | LoadImage measurement for module UNKNOWN-27ef | 6014.25 | 0.839613 |
| Entrypoint | E3752948-B9A1-4770-90C4-DF41C38986BE | QemuVideoDxe | Entrypoint measurement for module QemuVideoDxe | 6015.64 | 0.581896 |
| LoadImage | 4EA43463-747C-46EB-97FBB0E5C5F05306 | UNKNOWN-afed | LoadImage measurement for module UNKNOWN-afed | 6016.43 | 0.828273 |
| Entrypoint | 4EA43463-747C-46EB-97FB-B0E5C5F05306 | UsbMouseAbsolutePointerDxe | Entrypoint measurement for module UsbMouseAbsolutePointerDxe | 6017.84 | 0.538747 |
| LoadImage | 63E3BDCF-2AC7-4AC0-9B9203A7541422FF | UNKNOWN-fd6a | LoadImage measurement for module UNKNOWN-fd6a | 6018.59 | 0.808326 |
| Entrypoint | 63E3BDCF-2AC7-4AC0-9B92-03A7541422FF | Hash2DxeCrypto | Entrypoint measurement for module Hash2DxeCrypto | 6019.96 | 0.708471 |
| LoadImage | 917C56F2-2FE3-498F-AFFB87AC0E19FE5E | UNKNOWN-9bee | LoadImage measurement for module UNKNOWN-9bee | 6020.86 | 1.14593 |
| Entrypoint | 917C56F2-2FE3-498F-AFFB-87AC0E19FE5E | OnScreenKeyboardDxe | Entrypoint measurement for module OnScreenKeyboardDxe | 6022.67 | 2.93143 |
| LoadImage | 8E747032-7D55-4D95-9A8477F83370B3A4 | UNKNOWN-9c76 | LoadImage measurement for module UNKNOWN-9c76 | 6025.8 | 1.04515 |
| Entrypoint | 8E747032-7D55-4D95-9A84-77F83370B3A4 | SimpleWindowManagerDxe | Entrypoint measurement for module SimpleWindowManagerDxe | 6027.5 | 2.53172 |
| Crossmodule | 6D33944A-EC75-4855-A54D-809C75241F6C, 6D33944A-EC75-4855-A54D-809C75241F6C | BdsDxe, BdsDxe | Crossmodule measurement from BdsDxe to BdsDxe with label BDS | 6035.6 | 1998.45 |
| Inmodule | 6D33944A-EC75-4855-A54D-809C75241F6C | BdsDxe | Inmodule measurement from module BdsDxe with label PlatformBootManagerBeforeConsole | 6059.14 | 492.015 |
| Function | 6D33944A-EC75-4855-A54D-809C75241F6C | BdsDxe | Function measurement from module BdsDxe with label ConnectRootBridge | 6062.08 | 58.8947 |
| BindingStart | 93B80004-9FB3-11D4-9A3A0090273FC14D | UNKNOWN-42fb | BindingStart measurement for module UNKNOWN-42fb and device Unknown Device | 6073.07 | 45.2086 |
| BindingStart | E3752948-B9A1-4770-90C4DF41C38986BE | UNKNOWN-27ef | BindingStart measurement for module UNKNOWN-27ef and device Unknown Device | 6151.65 | 47.8352 |
| BindingStart | 02AA389E-CA29-43BF-BE05A4CA038812F2 | UNKNOWN-e949 | BindingStart measurement for module UNKNOWN-e949 and device Unknown Device | 6378.03 | 10.2228 |
| BindingStart | CCCB0C28-4B24-11D5-9A5A0090273FC14D | UNKNOWN-d4e0 | BindingStart measurement for module UNKNOWN-d4e0 and device Unknown Device | 6388.87 | 2.75265 |
| BindingStart | 51CCF399-4FDF-4E55-A45BE123F84D456A | UNKNOWN-f2ca | BindingStart measurement for module UNKNOWN-f2ca and device Unknown Device | 6391.7 | 7.24758 |
| Function | 6D33944A-EC75-4855-A54D-809C75241F6C | BdsDxe | Function measurement from module BdsDxe with label ExitPmAuth | 6509.36 | 41.2806 |
| Inmodule | 6D33944A-EC75-4855-A54D-809C75241F6C | BdsDxe | Inmodule measurement from module BdsDxe with label EfiBootManagerConnectAllDefaultConsoles | 6551.46 | 147.713 |
| BindingStart | 864E1CA8-85EB-4D63-9DCC6E0FC90FFD55 | UNKNOWN-66d2 | BindingStart measurement for module UNKNOWN-66d2 and device Unknown Device | 6553.41 | 2.4672 |
| LoadImage | EA205B85-27E0-44E6-96437E808368550F | UNKNOWN-1fad | LoadImage measurement for module UNKNOWN-1fad | 6559.46 | 1.58371 |
| Entrypoint | EA205B85-27E0-44E6-9643-7E808368550F | PrintScreenLogger | Entrypoint measurement for module PrintScreenLogger | 6562.02 | 3.29504 |
| LoadImage | C09E4CE4-AE29-4340-B941078871BD89D1 | UNKNOWN-1b38 | LoadImage measurement for module UNKNOWN-1b38 | 6565.61 | 1.14999 |
| Entrypoint | C09E4CE4-AE29-4340-B941-078871BD89D1 | DisplayEngine | Entrypoint measurement for module DisplayEngine | 6567.49 | 9.49393 |
| BindingStart | 51CCF399-4FDF-4E55-A45BE123F84D456A | UNKNOWN-f2ca | BindingStart measurement for module UNKNOWN-f2ca and device Unknown Device | 6643.55 | 0.630587 |
| BindingStart | 408EDCEC-CF6D-477C-A5A8B4844E3DE281 | UNKNOWN-c912 | BindingStart measurement for module UNKNOWN-c912 and device Unknown Device | 6644.47 | 2.43571 |
| Inmodule | 6D33944A-EC75-4855-A54D-809C75241F6C | BdsDxe | Inmodule measurement from module BdsDxe with label PlatformBootManagerAfterConsole | 6699.22 | 16.4374 |
| Function | 6D33944A-EC75-4855-A54D-809C75241F6C | BdsDxe | Function measurement from module BdsDxe with label ConnectSequence | 6714.89 | 0.146842 |
| Inmodule | 6D33944A-EC75-4855-A54D-809C75241F6C | BdsDxe | Inmodule measurement from module BdsDxe with label BdsWait | 6718.48 | 0.213956 |
| EventSignal | 7B94C75C-36A4-4AA4-A1DF-14BC9A049AE4, 6D33944A-EC75-4855-A54D-809C75241F6C | gEfiEventPreReadyToBootGuid, BdsDxe | EventSignal measurement from module gEfiEventPreReadyToBootGuid and trigger/event BdsDxe | 6721.02 | 0.504354 |
| EventSignal | 7CE88FB3-4BD7-4679-87A8-A8D8DEE50D2B, 6D33944A-EC75-4855-A54D-809C75241F6C | gEfiEventReadyToBootGuid, BdsDxe | EventSignal measurement from module gEfiEventReadyToBootGuid and trigger/event BdsDxe | 6721.56 | 15.6147 |
| Callback | 7CE88FB3-4BD7-4679-87A8-A8D8DEE50D2B, FF626DA9-17EE-4949-A8B8-B10FA0044E9F | gEfiEventReadyToBootGuid, EsrtFmpDxe | Callback measurement from module gEfiEventReadyToBootGuid and trigger/event EsrtFmpDxe | 6727.25 | 1.42931 |
| Inmodule | 06E49122-4EF4-45FE-9766-E2EAF2F9472F | AdvancedFileLogger | Inmodule measurement from module AdvancedFileLogger with label AdvLogger All files | 6728.74 | 0.011942 |
| EventSignal | A5B489B4-18FD-4425-91A4-613ADDD27405, 6D33944A-EC75-4855-A54D-809C75241F6C | gEfiEventPostReadyToBootGuid, BdsDxe | EventSignal measurement from module gEfiEventPostReadyToBootGuid and trigger/event BdsDxe | 6737.21 | 1287.97 |
| Event | 6D33944A-EC75-4855-A54D-809C75241F6C | BdsDxe | Event measurement from module BdsDxe with label ConOutReady | 6744.79 | 1e-06 |
| BindingStart | B7F50E91-A759-412C-ADE4DCD03E7F7C28 | UNKNOWN-c7e8 | BindingStart measurement for module UNKNOWN-c7e8 and device Unknown Device | 6745.99 | 12.2868 |
| BindingStart | 240612B7-A063-11D4-9A3A0090273FC14D | UNKNOWN-ddbc | BindingStart measurement for module UNKNOWN-ddbc and device Unknown Device | 6758.86 | 502.498 |
| BindingStart | C4D1F932-821F-4744-BF066D30F7730F8D | UNKNOWN-a31d | BindingStart measurement for module UNKNOWN-a31d and device Unknown Device | 7263.18 | 73.6554 |
| BindingStart | 51CCF399-4FDF-4E55-A45BE123F84D456A | UNKNOWN-f2ca | BindingStart measurement for module UNKNOWN-f2ca and device Unknown Device | 7337.22 | 1.75533 |
| BindingStart | 408EDCEC-CF6D-477C-A5A8B4844E3DE281 | UNKNOWN-c912 | BindingStart measurement for module UNKNOWN-c912 and device Unknown Device | 7339.37 | 1.19264 |
| Event | 6D33944A-EC75-4855-A54D-809C75241F6C | BdsDxe | Event measurement from module BdsDxe with label ConInReady | 7392.81 | 1e-06 |
| Event | 6D33944A-EC75-4855-A54D-809C75241F6C | BdsDxe | Event measurement from module BdsDxe with label ErrOutReady | 7394.44 | 1e-06 |
| BindingStart | 93B80004-9FB3-11D4-9A3A0090273FC14D | UNKNOWN-42fb | BindingStart measurement for module UNKNOWN-42fb and device Unknown Device | 7448.09 | 0.500206 |
| BindingStart | 83DD3B39-7CAF-4FAC-A542E050B767E3A7 | UNKNOWN-4e2d | BindingStart measurement for module UNKNOWN-4e2d and device Unknown Device | 7450.57 | 0.938738 |
| BindingStart | 11D92DFB-3CA9-4F93-BA2E4780ED3E03B5 | UNKNOWN-b387 | BindingStart measurement for module UNKNOWN-b387 and device Unknown Device | 7451.61 | 4.41196 |
| BindingStart | 6B38F7B4-AD98-40E9-9093ACA2B5A253C4 | UNKNOWN-5bd4 | BindingStart measurement for module UNKNOWN-5bd4 and device Unknown Device | 7456.3 | 0.820107 |
| BindingStart | 905F13B0-8F91-4B0A-BD76E1E78F9422E4 | UNKNOWN-b319 | BindingStart measurement for module UNKNOWN-b319 and device Unknown Device | 7457.41 | 0.446475 |
| BindingStart | 1FA1F39E-FEFF-4AAE-BD7B38A070A3B609 | UNKNOWN-12cc | BindingStart measurement for module UNKNOWN-12cc and device Unknown Device | 7457.98 | 9.59673 |
| BindingStart | 6B38F7B4-AD98-40E9-9093ACA2B5A253C4 | UNKNOWN-5bd4 | BindingStart measurement for module UNKNOWN-5bd4 and device Unknown Device | 7469.14 | 0.217343 |
| BindingStart | 905F13B0-8F91-4B0A-BD76E1E78F9422E4 | UNKNOWN-b319 | BindingStart measurement for module UNKNOWN-b319 and device Unknown Device | 7469.55 | 0.07034 |
| BindingStart | 1FA1F39E-FEFF-4AAE-BD7B38A070A3B609 | UNKNOWN-12cc | BindingStart measurement for module UNKNOWN-12cc and device Unknown Device | 7469.67 | 1.72834 |
| BindingStart | 961578FE-B6B7-44C3-AF356BC705CD2B1F | UNKNOWN-6a2f | BindingStart measurement for module UNKNOWN-6a2f and device Unknown Device | 7471.51 | 5.73551 |
| BindingStart | 021722D8-522B-4079-852AFE44C2C13F49 | UNKNOWN-62e6 | BindingStart measurement for module UNKNOWN-62e6 and device Unknown Device | 7484.01 | 2.19288 |
| BindingStart | 5E523CB4-D397-4986-87BDA6DD8B22F455 | UNKNOWN-a967 | BindingStart measurement for module UNKNOWN-a967 and device Unknown Device | 7486.43 | 85.4523 |
| BindingStart | 19DF145A-B1D4-453F-850738816676D7F6 | UNKNOWN-d19b | BindingStart measurement for module UNKNOWN-d19b and device Unknown Device | 7572.01 | 1.42146 |
| BindingStart | 0167CCC4-D0F7-4F21-A3EF9E64B7CDCE8B | UNKNOWN-7394 | BindingStart measurement for module UNKNOWN-7394 and device Unknown Device | 7573.77 | 5.62197 |
| BindingStart | 0A66E322-3740-4CCE-AD62BD172CECCA35 | UNKNOWN-1792 | BindingStart measurement for module UNKNOWN-1792 and device Unknown Device | 7581.03 | 12.93 |
| BindingStart | 6B38F7B4-AD98-40E9-9093ACA2B5A253C4 | UNKNOWN-5bd4 | BindingStart measurement for module UNKNOWN-5bd4 and device Unknown Device | 7594.48 | 0.33535 |
| BindingStart | 905F13B0-8F91-4B0A-BD76E1E78F9422E4 | UNKNOWN-b319 | BindingStart measurement for module UNKNOWN-b319 and device Unknown Device | 7595 | 0.042899 |
| BindingStart | 1FA1F39E-FEFF-4AAE-BD7B38A070A3B609 | UNKNOWN-12cc | BindingStart measurement for module UNKNOWN-12cc and device Unknown Device | 7595.09 | 3.74149 |
| BindingStart | 961578FE-B6B7-44C3-AF356BC705CD2B1F | UNKNOWN-6a2f | BindingStart measurement for module UNKNOWN-6a2f and device Unknown Device | 7598.91 | 3.93806 |
| BindingStart | 240612B7-A063-11D4-9A3A0090273FC14D | UNKNOWN-ddbc | BindingStart measurement for module UNKNOWN-ddbc and device Unknown Device | 7604.24 | 9.44338 |
| BindingStart | 4EA43463-747C-46EB-97FBB0E5C5F05306 | UNKNOWN-afed | BindingStart measurement for module UNKNOWN-afed and device Unknown Device | 7606.43 | 5.74607 |
| BindingStart | 8E747032-7D55-4D95-9A8477F83370B3A4 | UNKNOWN-9c76 | BindingStart measurement for module UNKNOWN-9c76 and device Unknown Device | 7612.3 | 0.536473 |
| BindingStart | 8E747032-7D55-4D95-9A8477F83370B3A4 | UNKNOWN-9c76 | BindingStart measurement for module UNKNOWN-9c76 and device Unknown Device | 7614.69 | 0.20528 |
| BindingStart | 917C56F2-2FE3-498F-AFFB87AC0E19FE5E | UNKNOWN-9bee | BindingStart measurement for module UNKNOWN-9bee and device Unknown Device | 7710.23 | 131.24 |
| BindingStart | 408EDCEC-CF6D-477C-A5A8B4844E3DE281 | UNKNOWN-c912 | BindingStart measurement for module UNKNOWN-c912 and device Unknown Device | 7842 | 0.061894 |
| BindingStart | 51CCF399-4FDF-4E55-A45BE123F84D456A | UNKNOWN-f2ca | BindingStart measurement for module UNKNOWN-f2ca and device Unknown Device | 7842.13 | 1.4037 |
| BindingStart | 408EDCEC-CF6D-477C-A5A8B4844E3DE281 | UNKNOWN-c912 | BindingStart measurement for module UNKNOWN-c912 and device Unknown Device | 7845.23 | 0.113059 |
| BindingStart | 240612B7-A063-11D4-9A3A0090273FC14D | UNKNOWN-ddbc | BindingStart measurement for module UNKNOWN-ddbc and device Unknown Device | 7850.47 | 0.29682 |
| BindingStart | 8E747032-7D55-4D95-9A8477F83370B3A4 | UNKNOWN-9c76 | BindingStart measurement for module UNKNOWN-9c76 and device Unknown Device | 7851.62 | 0.077233 |
| BindingStart | 1FA1F39E-FEFF-4AAE-BD7B38A070A3B609 | UNKNOWN-12cc | BindingStart measurement for module UNKNOWN-12cc and device Unknown Device | 7853.22 | 2.36849 |
| BindingStart | 19DF145A-B1D4-453F-850738816676D7F6 | UNKNOWN-d19b | BindingStart measurement for module UNKNOWN-d19b and device Unknown Device | 7861.08 | 0.302049 |
| BindingStart | 0167CCC4-D0F7-4F21-A3EF9E64B7CDCE8B | UNKNOWN-7394 | BindingStart measurement for module UNKNOWN-7394 and device Unknown Device | 7861.59 | 0.765737 |
| BindingStart | 021722D8-522B-4079-852AFE44C2C13F49 | UNKNOWN-62e6 | BindingStart measurement for module UNKNOWN-62e6 and device Unknown Device | 7862.42 | 0.107098 |
| BindingStart | 905F13B0-8F91-4B0A-BD76E1E78F9422E4 | UNKNOWN-b319 | BindingStart measurement for module UNKNOWN-b319 and device Unknown Device | 7863.5 | 0.044703 |
| BindingStart | 1FA1F39E-FEFF-4AAE-BD7B38A070A3B609 | UNKNOWN-12cc | BindingStart measurement for module UNKNOWN-12cc and device Unknown Device | 7863.59 | 3.86613 |
| BindingStart | 961578FE-B6B7-44C3-AF356BC705CD2B1F | UNKNOWN-6a2f | BindingStart measurement for module UNKNOWN-6a2f and device Unknown Device | 7867.53 | 3.93847 |
| BindingStart | 8E747032-7D55-4D95-9A8477F83370B3A4 | UNKNOWN-9c76 | BindingStart measurement for module UNKNOWN-9c76 and device Unknown Device | 7884.82 | 0.093223 |
| Event | 6D33944A-EC75-4855-A54D-809C75241F6C | BdsDxe | Event measurement from module BdsDxe with label ConOutReady | 7892.46 | 1e-06 |
| BindingStart | 240612B7-A063-11D4-9A3A0090273FC14D | UNKNOWN-ddbc | BindingStart measurement for module UNKNOWN-ddbc and device Unknown Device | 7893.45 | 0.326484 |
| Event | 6D33944A-EC75-4855-A54D-809C75241F6C | BdsDxe | Event measurement from module BdsDxe with label ConInReady | 7895.39 | 1e-06 |
| Event | 6D33944A-EC75-4855-A54D-809C75241F6C | BdsDxe | Event measurement from module BdsDxe with label ErrOutReady | 7896.58 | 1e-06 |
| Inmodule | 06E49122-4EF4-45FE-9766-E2EAF2F9472F | AdvancedFileLogger | Inmodule measurement from module AdvancedFileLogger with label AdvLogger All files | 7920.83 | 104.019 |
| Inmodule | 6D33944A-EC75-4855-A54D-809C75241F6C | BdsDxe | Inmodule measurement from module BdsDxe with label BdsAttempt | 8026.06 | 7.95619 |
| LoadImage | 50670071-478F-4BE7-AD138754F379C62F | UNKNOWN-7d03 | LoadImage measurement for module UNKNOWN-7d03 | 8031.97 | 1.82033 |
| Crossmodule | 6D33944A-EC75-4855-A54D-809C75241F6C, 6D33944A-EC75-4855-A54D-809C75241F6C | BdsDxe, BdsDxe | Crossmodule measurement from BdsDxe to BdsDxe with label BDS | 8034.06 | 352.362 |
| Entrypoint | 50670071-478F-4BE7-AD13-8754F379C62F | MsBootPolicy | Entrypoint measurement for module MsBootPolicy | 8035.06 | 297.936 |
| Event | 50670071-478F-4BE7-AD13-8754F379C62F | MsBootPolicy | Event measurement from module MsBootPolicy with label ConOutReady | 8047.48 | 1e-06 |
| BindingStart | 240612B7-A063-11D4-9A3A0090273FC14D | UNKNOWN-ddbc | BindingStart measurement for module UNKNOWN-ddbc and device Unknown Device | 8048.56 | 0.298361 |
| Event | 50670071-478F-4BE7-AD13-8754F379C62F | MsBootPolicy | Event measurement from module MsBootPolicy with label ConInReady | 8050.45 | 1e-06 |
| Event | 50670071-478F-4BE7-AD13-8754F379C62F | MsBootPolicy | Event measurement from module MsBootPolicy with label ErrOutReady | 8052.13 | 1e-06 |
| BindingStart | 93B80004-9FB3-11D4-9A3A0090273FC14D | UNKNOWN-42fb | BindingStart measurement for module UNKNOWN-42fb and device Unknown Device | 8102.74 | 0.420478 |
| BindingStart | 1FA1F39E-FEFF-4AAE-BD7B38A070A3B609 | UNKNOWN-12cc | BindingStart measurement for module UNKNOWN-12cc and device Unknown Device | 8104.19 | 2.27086 |
| BindingStart | 19DF145A-B1D4-453F-850738816676D7F6 | UNKNOWN-d19b | BindingStart measurement for module UNKNOWN-d19b and device Unknown Device | 8112.33 | 0.619697 |
| BindingStart | 0167CCC4-D0F7-4F21-A3EF9E64B7CDCE8B | UNKNOWN-7394 | BindingStart measurement for module UNKNOWN-7394 and device Unknown Device | 8113.29 | 0.460462 |
| BindingStart | 021722D8-522B-4079-852AFE44C2C13F49 | UNKNOWN-62e6 | BindingStart measurement for module UNKNOWN-62e6 and device Unknown Device | 8113.8 | 0.050825 |
| BindingStart | 905F13B0-8F91-4B0A-BD76E1E78F9422E4 | UNKNOWN-b319 | BindingStart measurement for module UNKNOWN-b319 and device Unknown Device | 8114.67 | 0.041336 |
| BindingStart | 1FA1F39E-FEFF-4AAE-BD7B38A070A3B609 | UNKNOWN-12cc | BindingStart measurement for module UNKNOWN-12cc and device Unknown Device | 8114.75 | 3.501 |
| BindingStart | 961578FE-B6B7-44C3-AF356BC705CD2B1F | UNKNOWN-6a2f | BindingStart measurement for module UNKNOWN-6a2f and device Unknown Device | 8118.34 | 4.13703 |
| BindingStart | 240612B7-A063-11D4-9A3A0090273FC14D | UNKNOWN-ddbc | BindingStart measurement for module UNKNOWN-ddbc and device Unknown Device | 8124.01 | 0.347082 |
| BindingStart | 8E747032-7D55-4D95-9A8477F83370B3A4 | UNKNOWN-9c76 | BindingStart measurement for module UNKNOWN-9c76 and device Unknown Device | 8125.14 | 0.080038 |
| BindingStart | 51CCF399-4FDF-4E55-A45BE123F84D456A | UNKNOWN-f2ca | BindingStart measurement for module UNKNOWN-f2ca and device Unknown Device | 8211.3 | 0.478367 |
| BindingStart | 240612B7-A063-11D4-9A3A0090273FC14D | UNKNOWN-ddbc | BindingStart measurement for module UNKNOWN-ddbc and device Unknown Device | 8218.09 | 0.343135 |
| BindingStart | 8E747032-7D55-4D95-9A8477F83370B3A4 | UNKNOWN-9c76 | BindingStart measurement for module UNKNOWN-9c76 and device Unknown Device | 8219.19 | 0.073827 |
| BindingStart | 1FA1F39E-FEFF-4AAE-BD7B38A070A3B609 | UNKNOWN-12cc | BindingStart measurement for module UNKNOWN-12cc and device Unknown Device | 8220.27 | 2.53853 |
| BindingStart | 19DF145A-B1D4-453F-850738816676D7F6 | UNKNOWN-d19b | BindingStart measurement for module UNKNOWN-d19b and device Unknown Device | 8227.98 | 0.218395 |
| BindingStart | 0167CCC4-D0F7-4F21-A3EF9E64B7CDCE8B | UNKNOWN-7394 | BindingStart measurement for module UNKNOWN-7394 and device Unknown Device | 8228.38 | 0.413515 |
| BindingStart | 021722D8-522B-4079-852AFE44C2C13F49 | UNKNOWN-62e6 | BindingStart measurement for module UNKNOWN-62e6 and device Unknown Device | 8228.84 | 0.049332 |
| BindingStart | 905F13B0-8F91-4B0A-BD76E1E78F9422E4 | UNKNOWN-b319 | BindingStart measurement for module UNKNOWN-b319 and device Unknown Device | 8229.71 | 0.041707 |
| BindingStart | 1FA1F39E-FEFF-4AAE-BD7B38A070A3B609 | UNKNOWN-12cc | BindingStart measurement for module UNKNOWN-12cc and device Unknown Device | 8229.8 | 3.84143 |
| BindingStart | 961578FE-B6B7-44C3-AF356BC705CD2B1F | UNKNOWN-6a2f | BindingStart measurement for module UNKNOWN-6a2f and device Unknown Device | 8233.73 | 3.35637 |
| BindingStart | 8E747032-7D55-4D95-9A8477F83370B3A4 | UNKNOWN-9c76 | BindingStart measurement for module UNKNOWN-9c76 and device Unknown Device | 8248.98 | 0.09217 |
| BindingStart | 905F13B0-8F91-4B0A-BD76E1E78F9422E4 | UNKNOWN-b319 | BindingStart measurement for module UNKNOWN-b319 and device Unknown Device | 8250.8 | 0.041326 |
| BindingStart | 1FA1F39E-FEFF-4AAE-BD7B38A070A3B609 | UNKNOWN-12cc | BindingStart measurement for module UNKNOWN-12cc and device Unknown Device | 8250.89 | 3.72045 |
| BindingStart | 961578FE-B6B7-44C3-AF356BC705CD2B1F | UNKNOWN-6a2f | BindingStart measurement for module UNKNOWN-6a2f and device Unknown Device | 8254.68 | 3.32879 |
| Event | 50670071-478F-4BE7-AD13-8754F379C62F | MsBootPolicy | Event measurement from module MsBootPolicy with label ConOutReady | 8265.82 | 1e-06 |
| BindingStart | 240612B7-A063-11D4-9A3A0090273FC14D | UNKNOWN-ddbc | BindingStart measurement for module UNKNOWN-ddbc and device Unknown Device | 8266.63 | 0.282473 |
| Event | 50670071-478F-4BE7-AD13-8754F379C62F | MsBootPolicy | Event measurement from module MsBootPolicy with label ConInReady | 8268.25 | 1e-06 |
| Event | 50670071-478F-4BE7-AD13-8754F379C62F | MsBootPolicy | Event measurement from module MsBootPolicy with label ErrOutReady | 8269.48 | 1e-06 |
| EventSignal | 7B94C75C-36A4-4AA4-A1DF-14BC9A049AE4, 50670071-478F-4BE7-AD13-8754F379C62F | gEfiEventPreReadyToBootGuid, MsBootPolicy | EventSignal measurement from module gEfiEventPreReadyToBootGuid and trigger/event MsBootPolicy | 8295.81 | 0.156971 |
| EventSignal | 7CE88FB3-4BD7-4679-87A8-A8D8DEE50D2B, 50670071-478F-4BE7-AD13-8754F379C62F | gEfiEventReadyToBootGuid, MsBootPolicy | EventSignal measurement from module gEfiEventReadyToBootGuid and trigger/event MsBootPolicy | 8295.99 | 12.4434 |
| Inmodule | 06E49122-4EF4-45FE-9766-E2EAF2F9472F | AdvancedFileLogger | Inmodule measurement from module AdvancedFileLogger with label AdvLogger All files | 8296.9 | 11.2628 |
| EventSignal | A5B489B4-18FD-4425-91A4-613ADDD27405, 50670071-478F-4BE7-AD13-8754F379C62F | gEfiEventPostReadyToBootGuid, MsBootPolicy | EventSignal measurement from module gEfiEventPostReadyToBootGuid and trigger/event MsBootPolicy | 8308.46 | 1.63578 |
| EventSignal | 7B94C75C-36A4-4AA4-A1DF-14BC9A049AE4, 6D33944A-EC75-4855-A54D-809C75241F6C | gEfiEventPreReadyToBootGuid, BdsDxe | EventSignal measurement from module gEfiEventPreReadyToBootGuid and trigger/event BdsDxe | 8341.31 | 0.077955 |
| EventSignal | 7CE88FB3-4BD7-4679-87A8-A8D8DEE50D2B, 6D33944A-EC75-4855-A54D-809C75241F6C | gEfiEventReadyToBootGuid, BdsDxe | EventSignal measurement from module gEfiEventReadyToBootGuid and trigger/event BdsDxe | 8341.4 | 15.2971 |
| Inmodule | 06E49122-4EF4-45FE-9766-E2EAF2F9472F | AdvancedFileLogger | Inmodule measurement from module AdvancedFileLogger with label AdvLogger All files | 8345.61 | 10.8993 |
| EventSignal | A5B489B4-18FD-4425-91A4-613ADDD27405, 6D33944A-EC75-4855-A54D-809C75241F6C | gEfiEventPostReadyToBootGuid, BdsDxe | EventSignal measurement from module gEfiEventPostReadyToBootGuid and trigger/event BdsDxe | 8356.71 | 1.41217 |
| Inmodule | 6D33944A-EC75-4855-A54D-809C75241F6C | BdsDxe | Inmodule measurement from module BdsDxe with label BdsAttempt | 8358.52 | 27.8785 |
| LoadImage | 50670071-478F-4BE7-AD138754F379C62F | UNKNOWN-7d03 | LoadImage measurement for module UNKNOWN-7d03 | 8361.52 | 24.7417 |
| Crossmodule | 6D33944A-EC75-4855-A54D-809C75241F6C, 6D33944A-EC75-4855-A54D-809C75241F6C | BdsDxe, BdsDxe | Crossmodule measurement from BdsDxe to BdsDxe with label BDS | 8386.43 | 6306.03 |
| Entrypoint | 50670071-478F-4BE7-AD13-8754F379C62F | MsBootPolicy | Entrypoint measurement for module MsBootPolicy | 8388.66 | 6256.75 |
| Event | 50670071-478F-4BE7-AD13-8754F379C62F | MsBootPolicy | Event measurement from module MsBootPolicy with label ConOutReady | 8401.25 | 1e-06 |
| BindingStart | 240612B7-A063-11D4-9A3A0090273FC14D | UNKNOWN-ddbc | BindingStart measurement for module UNKNOWN-ddbc and device Unknown Device | 8403.09 | 0.420581 |
| Event | 50670071-478F-4BE7-AD13-8754F379C62F | MsBootPolicy | Event measurement from module MsBootPolicy with label ConInReady | 8405.17 | 1e-06 |
| Event | 50670071-478F-4BE7-AD13-8754F379C62F | MsBootPolicy | Event measurement from module MsBootPolicy with label ErrOutReady | 8407.05 | 1e-06 |
| BindingStart | 93B80004-9FB3-11D4-9A3A0090273FC14D | UNKNOWN-42fb | BindingStart measurement for module UNKNOWN-42fb and device Unknown Device | 8455.5 | 0.422334 |
| BindingStart | 1FA1F39E-FEFF-4AAE-BD7B38A070A3B609 | UNKNOWN-12cc | BindingStart measurement for module UNKNOWN-12cc and device Unknown Device | 8456.94 | 2.38053 |
| BindingStart | 19DF145A-B1D4-453F-850738816676D7F6 | UNKNOWN-d19b | BindingStart measurement for module UNKNOWN-d19b and device Unknown Device | 8465.67 | 0.414758 |
| BindingStart | 0167CCC4-D0F7-4F21-A3EF9E64B7CDCE8B | UNKNOWN-7394 | BindingStart measurement for module UNKNOWN-7394 and device Unknown Device | 8466.28 | 0.468316 |
| BindingStart | 021722D8-522B-4079-852AFE44C2C13F49 | UNKNOWN-62e6 | BindingStart measurement for module UNKNOWN-62e6 and device Unknown Device | 8466.79 | 0.049972 |
| BindingStart | 905F13B0-8F91-4B0A-BD76E1E78F9422E4 | UNKNOWN-b319 | BindingStart measurement for module UNKNOWN-b319 and device Unknown Device | 8467.65 | 0.041887 |
| BindingStart | 1FA1F39E-FEFF-4AAE-BD7B38A070A3B609 | UNKNOWN-12cc | BindingStart measurement for module UNKNOWN-12cc and device Unknown Device | 8467.73 | 3.56617 |
| BindingStart | 961578FE-B6B7-44C3-AF356BC705CD2B1F | UNKNOWN-6a2f | BindingStart measurement for module UNKNOWN-6a2f and device Unknown Device | 8471.37 | 3.73859 |
| BindingStart | 240612B7-A063-11D4-9A3A0090273FC14D | UNKNOWN-ddbc | BindingStart measurement for module UNKNOWN-ddbc and device Unknown Device | 8476.56 | 0.303992 |
| BindingStart | 8E747032-7D55-4D95-9A8477F83370B3A4 | UNKNOWN-9c76 | BindingStart measurement for module UNKNOWN-9c76 and device Unknown Device | 8477.66 | 0.073105 |
| BindingStart | 51CCF399-4FDF-4E55-A45BE123F84D456A | UNKNOWN-f2ca | BindingStart measurement for module UNKNOWN-f2ca and device Unknown Device | 8566.49 | 0.265531 |
| BindingStart | 240612B7-A063-11D4-9A3A0090273FC14D | UNKNOWN-ddbc | BindingStart measurement for module UNKNOWN-ddbc and device Unknown Device | 8572.79 | 0.354416 |
| BindingStart | 8E747032-7D55-4D95-9A8477F83370B3A4 | UNKNOWN-9c76 | BindingStart measurement for module UNKNOWN-9c76 and device Unknown Device | 8573.96 | 0.092421 |
| BindingStart | 1FA1F39E-FEFF-4AAE-BD7B38A070A3B609 | UNKNOWN-12cc | BindingStart measurement for module UNKNOWN-12cc and device Unknown Device | 8575.2 | 2.28164 |
| BindingStart | 19DF145A-B1D4-453F-850738816676D7F6 | UNKNOWN-d19b | BindingStart measurement for module UNKNOWN-d19b and device Unknown Device | 8583.17 | 0.263357 |
| BindingStart | 0167CCC4-D0F7-4F21-A3EF9E64B7CDCE8B | UNKNOWN-7394 | BindingStart measurement for module UNKNOWN-7394 and device Unknown Device | 8583.62 | 0.412313 |
| BindingStart | 021722D8-522B-4079-852AFE44C2C13F49 | UNKNOWN-62e6 | BindingStart measurement for module UNKNOWN-62e6 and device Unknown Device | 8584.07 | 0.049281 |
| BindingStart | 905F13B0-8F91-4B0A-BD76E1E78F9422E4 | UNKNOWN-b319 | BindingStart measurement for module UNKNOWN-b319 and device Unknown Device | 8584.95 | 0.041516 |
| BindingStart | 1FA1F39E-FEFF-4AAE-BD7B38A070A3B609 | UNKNOWN-12cc | BindingStart measurement for module UNKNOWN-12cc and device Unknown Device | 8585.04 | 3.42566 |
| BindingStart | 961578FE-B6B7-44C3-AF356BC705CD2B1F | UNKNOWN-6a2f | BindingStart measurement for module UNKNOWN-6a2f and device Unknown Device | 8588.53 | 4.09073 |
| BindingStart | 8E747032-7D55-4D95-9A8477F83370B3A4 | UNKNOWN-9c76 | BindingStart measurement for module UNKNOWN-9c76 and device Unknown Device | 8604.9 | 0.100687 |
| BindingStart | 905F13B0-8F91-4B0A-BD76E1E78F9422E4 | UNKNOWN-b319 | BindingStart measurement for module UNKNOWN-b319 and device Unknown Device | 8606.88 | 0.044111 |
| BindingStart | 1FA1F39E-FEFF-4AAE-BD7B38A070A3B609 | UNKNOWN-12cc | BindingStart measurement for module UNKNOWN-12cc and device Unknown Device | 8606.97 | 3.51924 |
| BindingStart | 961578FE-B6B7-44C3-AF356BC705CD2B1F | UNKNOWN-6a2f | BindingStart measurement for module UNKNOWN-6a2f and device Unknown Device | 8610.56 | 3.74672 |
| Event | 50670071-478F-4BE7-AD13-8754F379C62F | MsBootPolicy | Event measurement from module MsBootPolicy with label ConOutReady | 8622.97 | 1e-06 |
| BindingStart | 240612B7-A063-11D4-9A3A0090273FC14D | UNKNOWN-ddbc | BindingStart measurement for module UNKNOWN-ddbc and device Unknown Device | 8623.84 | 0.370124 |
| Event | 50670071-478F-4BE7-AD13-8754F379C62F | MsBootPolicy | Event measurement from module MsBootPolicy with label ConInReady | 8625.45 | 1e-06 |
| Event | 50670071-478F-4BE7-AD13-8754F379C62F | MsBootPolicy | Event measurement from module MsBootPolicy with label ErrOutReady | 8626.68 | 1e-06 |
| EventSignal | 7B94C75C-36A4-4AA4-A1DF-14BC9A049AE4, 6D33944A-EC75-4855-A54D-809C75241F6C | gEfiEventPreReadyToBootGuid, BdsDxe | EventSignal measurement from module gEfiEventPreReadyToBootGuid and trigger/event BdsDxe | 14650.9 | 0.052758 |
| EventSignal | 7CE88FB3-4BD7-4679-87A8-A8D8DEE50D2B, 6D33944A-EC75-4855-A54D-809C75241F6C | gEfiEventReadyToBootGuid, BdsDxe | EventSignal measurement from module gEfiEventReadyToBootGuid and trigger/event BdsDxe | 14651 | 19.5895 |
| Inmodule | 06E49122-4EF4-45FE-9766-E2EAF2F9472F | AdvancedFileLogger | Inmodule measurement from module AdvancedFileLogger with label AdvLogger All files | 14653.2 | 17.1572 |
| EventSignal | A5B489B4-18FD-4425-91A4-613ADDD27405, 6D33944A-EC75-4855-A54D-809C75241F6C | gEfiEventPostReadyToBootGuid, BdsDxe | EventSignal measurement from module gEfiEventPostReadyToBootGuid and trigger/event BdsDxe | 14670.6 | 1.41146 |
| Inmodule | 6D33944A-EC75-4855-A54D-809C75241F6C | BdsDxe | Inmodule measurement from module BdsDxe with label BdsAttempt | 14672.4 | 20.028 |
| LoadImage | 50670071-478F-4BE7-AD138754F379C62F | UNKNOWN-7d03 | LoadImage measurement for module UNKNOWN-7d03 | 14675.8 | 16.5516 |
| Crossmodule | 6D33944A-EC75-4855-A54D-809C75241F6C, 6D33944A-EC75-4855-A54D-809C75241F6C | BdsDxe, BdsDxe | Crossmodule measurement from BdsDxe to BdsDxe with label BDS | 14692.5 | 548.833 |
| Entrypoint | 50670071-478F-4BE7-AD13-8754F379C62F | MsBootPolicy | Entrypoint measurement for module MsBootPolicy | 14693.2 | 252.278 |
| Event | 50670071-478F-4BE7-AD13-8754F379C62F | MsBootPolicy | Event measurement from module MsBootPolicy with label ConOutReady | 14706.5 | 1e-06 |
| BindingStart | 240612B7-A063-11D4-9A3A0090273FC14D | UNKNOWN-ddbc | BindingStart measurement for module UNKNOWN-ddbc and device Unknown Device | 14707.7 | 0.300055 |
| Event | 50670071-478F-4BE7-AD13-8754F379C62F | MsBootPolicy | Event measurement from module MsBootPolicy with label ConInReady | 14709.4 | 1e-06 |
| Event | 50670071-478F-4BE7-AD13-8754F379C62F | MsBootPolicy | Event measurement from module MsBootPolicy with label ErrOutReady | 14711 | 1e-06 |
| BindingStart | 93B80004-9FB3-11D4-9A3A0090273FC14D | UNKNOWN-42fb | BindingStart measurement for module UNKNOWN-42fb and device Unknown Device | 14759.5 | 0.376947 |
| BindingStart | 1FA1F39E-FEFF-4AAE-BD7B38A070A3B609 | UNKNOWN-12cc | BindingStart measurement for module UNKNOWN-12cc and device Unknown Device | 14760.8 | 2.48957 |
| BindingStart | 19DF145A-B1D4-453F-850738816676D7F6 | UNKNOWN-d19b | BindingStart measurement for module UNKNOWN-d19b and device Unknown Device | 14769.3 | 0.219315 |
| BindingStart | 0167CCC4-D0F7-4F21-A3EF9E64B7CDCE8B | UNKNOWN-7394 | BindingStart measurement for module UNKNOWN-7394 and device Unknown Device | 14769.7 | 0.356239 |
| BindingStart | 021722D8-522B-4079-852AFE44C2C13F49 | UNKNOWN-62e6 | BindingStart measurement for module UNKNOWN-62e6 and device Unknown Device | 14770.1 | 0.052206 |
| BindingStart | 905F13B0-8F91-4B0A-BD76E1E78F9422E4 | UNKNOWN-b319 | BindingStart measurement for module UNKNOWN-b319 and device Unknown Device | 14771 | 0.040755 |
| BindingStart | 1FA1F39E-FEFF-4AAE-BD7B38A070A3B609 | UNKNOWN-12cc | BindingStart measurement for module UNKNOWN-12cc and device Unknown Device | 14771.1 | 3.60081 |
| BindingStart | 961578FE-B6B7-44C3-AF356BC705CD2B1F | UNKNOWN-6a2f | BindingStart measurement for module UNKNOWN-6a2f and device Unknown Device | 14774.7 | 3.52031 |
| BindingStart | 240612B7-A063-11D4-9A3A0090273FC14D | UNKNOWN-ddbc | BindingStart measurement for module UNKNOWN-ddbc and device Unknown Device | 14779.7 | 0.323408 |
| BindingStart | 8E747032-7D55-4D95-9A8477F83370B3A4 | UNKNOWN-9c76 | BindingStart measurement for module UNKNOWN-9c76 and device Unknown Device | 14780.9 | 0.076382 |
| BindingStart | 51CCF399-4FDF-4E55-A45BE123F84D456A | UNKNOWN-f2ca | BindingStart measurement for module UNKNOWN-f2ca and device Unknown Device | 14867.9 | 0.257927 |
| BindingStart | 240612B7-A063-11D4-9A3A0090273FC14D | UNKNOWN-ddbc | BindingStart measurement for module UNKNOWN-ddbc and device Unknown Device | 14874.3 | 0.419702 |
| BindingStart | 8E747032-7D55-4D95-9A8477F83370B3A4 | UNKNOWN-9c76 | BindingStart measurement for module UNKNOWN-9c76 and device Unknown Device | 14875.6 | 0.075219 |
| BindingStart | 1FA1F39E-FEFF-4AAE-BD7B38A070A3B609 | UNKNOWN-12cc | BindingStart measurement for module UNKNOWN-12cc and device Unknown Device | 14876.8 | 2.60477 |
| BindingStart | 19DF145A-B1D4-453F-850738816676D7F6 | UNKNOWN-d19b | BindingStart measurement for module UNKNOWN-d19b and device Unknown Device | 14884.6 | 0.212353 |
| BindingStart | 0167CCC4-D0F7-4F21-A3EF9E64B7CDCE8B | UNKNOWN-7394 | BindingStart measurement for module UNKNOWN-7394 and device Unknown Device | 14885 | 0.38369 |
| BindingStart | 021722D8-522B-4079-852AFE44C2C13F49 | UNKNOWN-62e6 | BindingStart measurement for module UNKNOWN-62e6 and device Unknown Device | 14885.4 | 0.046176 |
| BindingStart | 905F13B0-8F91-4B0A-BD76E1E78F9422E4 | UNKNOWN-b319 | BindingStart measurement for module UNKNOWN-b319 and device Unknown Device | 14886.4 | 0.041036 |
| BindingStart | 1FA1F39E-FEFF-4AAE-BD7B38A070A3B609 | UNKNOWN-12cc | BindingStart measurement for module UNKNOWN-12cc and device Unknown Device | 14886.5 | 3.41274 |
| BindingStart | 961578FE-B6B7-44C3-AF356BC705CD2B1F | UNKNOWN-6a2f | BindingStart measurement for module UNKNOWN-6a2f and device Unknown Device | 14889.9 | 3.72274 |
| BindingStart | 8E747032-7D55-4D95-9A8477F83370B3A4 | UNKNOWN-9c76 | BindingStart measurement for module UNKNOWN-9c76 and device Unknown Device | 14905.9 | 0.094255 |
| BindingStart | 905F13B0-8F91-4B0A-BD76E1E78F9422E4 | UNKNOWN-b319 | BindingStart measurement for module UNKNOWN-b319 and device Unknown Device | 14907.8 | 0.041016 |
| BindingStart | 1FA1F39E-FEFF-4AAE-BD7B38A070A3B609 | UNKNOWN-12cc | BindingStart measurement for module UNKNOWN-12cc and device Unknown Device | 14907.8 | 3.97072 |
| BindingStart | 961578FE-B6B7-44C3-AF356BC705CD2B1F | UNKNOWN-6a2f | BindingStart measurement for module UNKNOWN-6a2f and device Unknown Device | 14912.2 | 3.54877 |
| Event | 50670071-478F-4BE7-AD13-8754F379C62F | MsBootPolicy | Event measurement from module MsBootPolicy with label ConOutReady | 14923.3 | 1e-06 |
| BindingStart | 240612B7-A063-11D4-9A3A0090273FC14D | UNKNOWN-ddbc | BindingStart measurement for module UNKNOWN-ddbc and device Unknown Device | 14924.2 | 0.308331 |
| Event | 50670071-478F-4BE7-AD13-8754F379C62F | MsBootPolicy | Event measurement from module MsBootPolicy with label ConInReady | 14925.8 | 1e-06 |
| Event | 50670071-478F-4BE7-AD13-8754F379C62F | MsBootPolicy | Event measurement from module MsBootPolicy with label ErrOutReady | 14926.9 | 1e-06 |
| EventSignal | 7B94C75C-36A4-4AA4-A1DF-14BC9A049AE4, 6D33944A-EC75-4855-A54D-809C75241F6C | gEfiEventPreReadyToBootGuid, BdsDxe | EventSignal measurement from module gEfiEventPreReadyToBootGuid and trigger/event BdsDxe | 14954.1 | 0.055984 |
| EventSignal | 7CE88FB3-4BD7-4679-87A8-A8D8DEE50D2B, 6D33944A-EC75-4855-A54D-809C75241F6C | gEfiEventReadyToBootGuid, BdsDxe | EventSignal measurement from module gEfiEventReadyToBootGuid and trigger/event BdsDxe | 14954.2 | 16.445 |
| Inmodule | 06E49122-4EF4-45FE-9766-E2EAF2F9472F | AdvancedFileLogger | Inmodule measurement from module AdvancedFileLogger with label AdvLogger All files | 14955.7 | 14.6699 |
| EventSignal | A5B489B4-18FD-4425-91A4-613ADDD27405, 6D33944A-EC75-4855-A54D-809C75241F6C | gEfiEventPostReadyToBootGuid, BdsDxe | EventSignal measurement from module gEfiEventPostReadyToBootGuid and trigger/event BdsDxe | 14970.6 | 248.442 |
| Event | 6D33944A-EC75-4855-A54D-809C75241F6C | BdsDxe | Event measurement from module BdsDxe with label ConOutReady | 14979.1 | 1e-06 |
| BindingStart | 240612B7-A063-11D4-9A3A0090273FC14D | UNKNOWN-ddbc | BindingStart measurement for module UNKNOWN-ddbc and device Unknown Device | 14980 | 0.344509 |
| Event | 6D33944A-EC75-4855-A54D-809C75241F6C | BdsDxe | Event measurement from module BdsDxe with label ConInReady | 14982.2 | 1e-06 |
| Event | 6D33944A-EC75-4855-A54D-809C75241F6C | BdsDxe | Event measurement from module BdsDxe with label ErrOutReady | 14983.4 | 1e-06 |
| BindingStart | 93B80004-9FB3-11D4-9A3A0090273FC14D | UNKNOWN-42fb | BindingStart measurement for module UNKNOWN-42fb and device Unknown Device | 15035.4 | 0.359475 |
| BindingStart | 1FA1F39E-FEFF-4AAE-BD7B38A070A3B609 | UNKNOWN-12cc | BindingStart measurement for module UNKNOWN-12cc and device Unknown Device | 15036.8 | 2.56378 |
| BindingStart | 19DF145A-B1D4-453F-850738816676D7F6 | UNKNOWN-d19b | BindingStart measurement for module UNKNOWN-d19b and device Unknown Device | 15046.1 | 0.239583 |
| BindingStart | 0167CCC4-D0F7-4F21-A3EF9E64B7CDCE8B | UNKNOWN-7394 | BindingStart measurement for module UNKNOWN-7394 and device Unknown Device | 15046.5 | 0.438412 |
| BindingStart | 021722D8-522B-4079-852AFE44C2C13F49 | UNKNOWN-62e6 | BindingStart measurement for module UNKNOWN-62e6 and device Unknown Device | 15047 | 0.05434 |
| BindingStart | 905F13B0-8F91-4B0A-BD76E1E78F9422E4 | UNKNOWN-b319 | BindingStart measurement for module UNKNOWN-b319 and device Unknown Device | 15047.9 | 0.043591 |
| BindingStart | 1FA1F39E-FEFF-4AAE-BD7B38A070A3B609 | UNKNOWN-12cc | BindingStart measurement for module UNKNOWN-12cc and device Unknown Device | 15048 | 3.77206 |
| BindingStart | 961578FE-B6B7-44C3-AF356BC705CD2B1F | UNKNOWN-6a2f | BindingStart measurement for module UNKNOWN-6a2f and device Unknown Device | 15051.9 | 3.45818 |
| BindingStart | 240612B7-A063-11D4-9A3A0090273FC14D | UNKNOWN-ddbc | BindingStart measurement for module UNKNOWN-ddbc and device Unknown Device | 15056.8 | 0.303061 |
| BindingStart | 8E747032-7D55-4D95-9A8477F83370B3A4 | UNKNOWN-9c76 | BindingStart measurement for module UNKNOWN-9c76 and device Unknown Device | 15057.9 | 0.071973 |
| BindingStart | 51CCF399-4FDF-4E55-A45BE123F84D456A | UNKNOWN-f2ca | BindingStart measurement for module UNKNOWN-f2ca and device Unknown Device | 15153.5 | 0.261083 |
| BindingStart | 240612B7-A063-11D4-9A3A0090273FC14D | UNKNOWN-ddbc | BindingStart measurement for module UNKNOWN-ddbc and device Unknown Device | 15159.9 | 0.41697 |
| BindingStart | 8E747032-7D55-4D95-9A8477F83370B3A4 | UNKNOWN-9c76 | BindingStart measurement for module UNKNOWN-9c76 and device Unknown Device | 15161.4 | 0.096739 |
| BindingStart | 1FA1F39E-FEFF-4AAE-BD7B38A070A3B609 | UNKNOWN-12cc | BindingStart measurement for module UNKNOWN-12cc and device Unknown Device | 15162.7 | 2.84319 |
| BindingStart | 19DF145A-B1D4-453F-850738816676D7F6 | UNKNOWN-d19b | BindingStart measurement for module UNKNOWN-d19b and device Unknown Device | 15171.2 | 0.51299 |
| BindingStart | 0167CCC4-D0F7-4F21-A3EF9E64B7CDCE8B | UNKNOWN-7394 | BindingStart measurement for module UNKNOWN-7394 and device Unknown Device | 15172 | 0.449151 |
| BindingStart | 021722D8-522B-4079-852AFE44C2C13F49 | UNKNOWN-62e6 | BindingStart measurement for module UNKNOWN-62e6 and device Unknown Device | 15172.5 | 0.052236 |
| BindingStart | 905F13B0-8F91-4B0A-BD76E1E78F9422E4 | UNKNOWN-b319 | BindingStart measurement for module UNKNOWN-b319 and device Unknown Device | 15173.4 | 0.043911 |
| BindingStart | 1FA1F39E-FEFF-4AAE-BD7B38A070A3B609 | UNKNOWN-12cc | BindingStart measurement for module UNKNOWN-12cc and device Unknown Device | 15173.5 | 3.46476 |
| BindingStart | 961578FE-B6B7-44C3-AF356BC705CD2B1F | UNKNOWN-6a2f | BindingStart measurement for module UNKNOWN-6a2f and device Unknown Device | 15177.1 | 3.45033 |
| BindingStart | 8E747032-7D55-4D95-9A8477F83370B3A4 | UNKNOWN-9c76 | BindingStart measurement for module UNKNOWN-9c76 and device Unknown Device | 15193.9 | 0.096048 |
| BindingStart | 905F13B0-8F91-4B0A-BD76E1E78F9422E4 | UNKNOWN-b319 | BindingStart measurement for module UNKNOWN-b319 and device Unknown Device | 15195.9 | 0.044963 |
| BindingStart | 1FA1F39E-FEFF-4AAE-BD7B38A070A3B609 | UNKNOWN-12cc | BindingStart measurement for module UNKNOWN-12cc and device Unknown Device | 15196 | 3.47776 |
| BindingStart | 961578FE-B6B7-44C3-AF356BC705CD2B1F | UNKNOWN-6a2f | BindingStart measurement for module UNKNOWN-6a2f and device Unknown Device | 15199.6 | 5.76944 |
| Event | 6D33944A-EC75-4855-A54D-809C75241F6C | BdsDxe | Event measurement from module BdsDxe with label ConOutReady | 15212.9 | 1e-06 |
| BindingStart | 240612B7-A063-11D4-9A3A0090273FC14D | UNKNOWN-ddbc | BindingStart measurement for module UNKNOWN-ddbc and device Unknown Device | 15213.8 | 0.291609 |
| Event | 6D33944A-EC75-4855-A54D-809C75241F6C | BdsDxe | Event measurement from module BdsDxe with label ConInReady | 15215.9 | 1e-06 |
| Event | 6D33944A-EC75-4855-A54D-809C75241F6C | BdsDxe | Event measurement from module BdsDxe with label ErrOutReady | 15217.5 | 1e-06 |
| Inmodule | 6D33944A-EC75-4855-A54D-809C75241F6C | BdsDxe | Inmodule measurement from module BdsDxe with label BdsAttempt | 15219.4 | 21.9109 |
| LoadImage | C57AD6B7-0515-40A8-9D21551652854E37 | UNKNOWN-0a9b | LoadImage measurement for module UNKNOWN-0a9b | 15224.4 | 16.7819 |
| BindingStart | 8E747032-7D55-4D95-9A8477F83370B3A4 | UNKNOWN-9c76 | BindingStart measurement for module UNKNOWN-9c76 and device Unknown Device | 16353.5 | 0.105406 |
| BindingStart | 240612B7-A063-11D4-9A3A0090273FC14D | UNKNOWN-ddbc | BindingStart measurement for module UNKNOWN-ddbc and device Unknown Device | 16355.5 | 0.37832 |
| LoadImage | 00000000-0000-0000-0000000000000000 | UNKNOWN-df79 | LoadImage measurement for module UNKNOWN-df79 | 33997.3 | 9.88227 |
TpmShellApp on QEMU Platforms
Platform-specific guidance for running TpmShellApp on the QEMU Q35 and Arm Virt platforms.
Table of Contents
- FDF Placement
- Protocol Availability
- Running on QEMU Arm Virt
- Running on QEMU Q35
- Hash Algorithm Configuration
- Expected Behavior with MinimumLib
- Event Log and Replay
- Findings
FDF Placement
On Arm Virt, add the INF to FV.FvMain. On Q35, add it to FV.DXEFV:
INF SecurityPkg/Applications/TpmShellApp/TpmShellApp.inf
Protocol Availability
The EFI_TCG2_PROTOCOL is installed by Tcg2Dxe.efi, which only loads when
TPM2_ENABLE=TRUE.
Running on QEMU Arm Virt
On QEMU Arm Virt, the TpmShellApp is placed directly in the firmware volume, which is mapped as an
FSx: device in the UEFI shell. Build with:
stuart_build -c Platforms/QemuArmVirtPkg/PlatformBuild.py --FlashRom BLD_*_TPM2_ENABLE=TRUE
At the UEFI shell, run:
Shell> TpmShellApp.efi help
Shell> TpmShellApp.efi info
Shell> TpmShellApp.efi eventlog
Shell> TpmShellApp.efi replay
Or navigate to the correct FS mapping first:
Shell> map -r
Shell> FS0:
FS0:\> TpmShellApp.efi info
Running on QEMU Q35
On Q35, shell applications are loaded from a virtual drive (FAT filesystem image), not
directly from the firmware volume. The FILE_REGEX build parameter controls which
binaries are copied to the virtual drive:
stuart_build -c Platforms/QemuQ35Pkg/PlatformBuild.py --FlashRom \
BLD_*_TPM2_ENABLE=TRUE \
FILE_REGEX=TpmShellApp.efi
At the UEFI shell, find the virtual drive's FS mapping (typically backed by a PCI device,
not Fv(...)) and run:
Shell> map -r
Shell> FS0:
FS0:\> TpmShellApp.efi info
If the app is not found, verify the virtual drive was created with the binary:
Shell> FS0:
FS0:\> dir
Hash Algorithm Configuration
Both QEMU platforms set PcdTpm2HashMask to 0x02 (SHA256 only). This means the app
will typically only see SHA256 as supported and active, even though swtpm may support all
five algorithms. To see additional algorithms, update PcdTpm2HashMask in the platform
DSC.
Expected Behavior with MinimumLib
Both QEMU platforms use DxeTcg2PhysicalPresenceMinimumLib when TPM is enabled. This
library has specific behaviors that affect TpmShellApp results:
setpcr with Already-Active Banks
When the requested banks match the currently active banks, Tcg2Dxe sends
TCG2_PHYSICAL_PRESENCE_NO_ACTION to the PP library. MinimumLib processes NO_ACTION
successfully, returning EFI_SUCCESS.
Shell> TpmShellApp setpcr 0x2 (SHA256 already active)
Submitting SetActivePcrBanks with parameter 2
Status: Success
Request submitted. Changes will take effect after reboot.
setpcr with Different Banks
When the requested banks differ from active banks, Tcg2Dxe sends
TCG2_PHYSICAL_PRESENCE_SET_PCR_BANKS to the PP library. MinimumLib rejects this
operation as it only supports Clear operations.
Shell> TpmShellApp setpcr 0x4 (SHA384, not currently active)
Submitting SetActivePcrBanks with parameter 4
Status: Unsupported
SetActivePcrBanks failed.
This is expected and correct behavior — MinimumLib is designed to block PCR bank changes.
logall Expected Behavior
If the platform only has SHA256 registered (default), logall requests the same bank
that's already active, resulting in a NO_ACTION → EFI_SUCCESS. If additional
algorithms were registered, it would request banks different from the active set,
triggering a SET_PCR_BANKS rejection.
lastresponse Expected Behavior
Reports the result stored in the Tcg2PhysicalPresence NV variable by
ProcessRequest. If no prior SetActivePcrBanks was processed through a reboot cycle,
the response will show no operation present.
Shell> TpmShellApp lastresponse
Operation present: NO
Response code: 0
Event Log and Replay
eventlog on QEMU
The eventlog command dumps the crypto-agile TCG2 event log. On QEMU with the default
SHA256-only configuration, each event contains a single SHA256 digest.
Shell> TpmShellApp.efi eventlog
[TCG2 Event Log]
Spec ID Event: 1 algorithm(s)
SHA256 (alg 0xb, digest 32 bytes)
Event 1: PCR 0 EV_S_CRTM_VERSION (0x8)
SHA256: ab cd ef ...
Event data: 2 bytes
Event 2: PCR 0 EV_EFI_PLATFORM_FIRMWARE_BLOB (0x80000008)
SHA256: 01 23 45 ...
Event data: 16 bytes
...
Total: N event(s)
If PcdTpm2HashMask is updated to enable additional algorithms (e.g., 0x06 for
SHA256 + SHA384), each event will contain multiple digests — one per active algorithm.
replay on QEMU
The replay command replays extend operations from the event log to compute expected
PCR values, then reads the actual PCR values from the TPM via SubmitCommand and
compares them.
Shell> TpmShellApp.efi replay
[Event Log Replay]
Replayed N event(s) across 1 algorithm(s).
PCR 0:
SHA256 Replayed: aa bb cc ...
SHA256 Actual: aa bb cc ...
Result: PASS
PCR 1:
SHA256 Replayed: 11 22 33 ...
SHA256 Actual: 11 22 33 ...
Result: PASS
...
Summary: M PCR bank(s) verified, M PASS, 0 FAIL
On a freshly booted QEMU platform with swtpm, all PCRs should show PASS. A FAIL
indicates that either the event log is incomplete (e.g., truncated) or an extend
operation occurred outside the logged event flow.
Replay with Multiple Algorithms
When multiple hash algorithms are active, the replay verifies each algorithm
independently. Algorithms not supported by BaseCryptLib (e.g., SM3_256) are skipped
with a message:
PCR 0:
SHA256 Replayed: ...
SHA256 Actual: ...
Result: PASS
SM3_256: (replay not supported, skipped)
Truncated Event Log
If the firmware's event log buffer was exhausted, the eventlog and replay commands
print a warning:
Warning: Event log was truncated.
For replay, a truncated log means the replayed PCR values will not include all
extensions, so mismatches are expected.
Findings
April 2026:
Manually updating Tpm2HashMask in the platform .dsc is dangerous. On Q35, PEI picks up
the change and automatically enables/disables any PCR banks that differ from the current
active banks in the TPM (see Tcg2Pei - SyncPcrAllocationsAndPcrMask). If the platform also
disables (i.e. removes) any of the supported hashing algorithms from the platform .dsc,
there are no safeguards to prevent the TPM from enabling/disabling active banks based on
platform support. Because of this, there can be active banks that show up as active when
querying the TPM directly but do not show up as active in the Tcg2Protocol call.
Example:
-
Tpm2HashMaskis updated to0x06(i.e. SHA256 + SHA384 supported). -
SHA384 support is removed from
Tcg2PeiandTcg2Dxe. -
Build/Run the Q35 platform.
-
TPM reports SHA256 as the only active PCR bank.
-
Tcg2Peirecognizes there is a mismatch between platform support (i.e.Tpm2HashMask) and TPM active banks. It activates SHA384 and triggers aResetCold. -
TPM reports SHA256 + SHA384 as active PCR banks.
-
HashLibBaseCryptoRouterPeiandHashLibBaseCryptoRouterDxesetPcdTcg2HashAlgorithmBitmapbased on successfully registered hash algorithms. -
Tcg2Peiregisters SHA256 but is unable to register SHA384. -
Tcg2Dxeregisters SHA256 but is unable to register SHA384. -
Tcg2Dxesets local variables based on what the TPM reports andPcdTcg2HashAlgorithmBitmap.mTcgDxeData.BsCap.HashAlgorithmBitmap = TpmHashAlgorithmBitmap & PcdGet32 (PcdTcg2HashAlgorithmBitmap); mTcgDxeData.BsCap.ActivePcrBanks = ActivePCRBanks & PcdGet32 (PcdTcg2HashAlgorithmBitmap); -
Tcg2Protocolis installed with only SHA256 support reported even though SHA384 is active.
TPM on QEMU Arm Virt
This document describes the TPM 2.0 architecture for the QEMU Arm Virt platform. Arm Virt uses a dual-CRB design with an FF-A (Firmware Framework for Arm A-Profile) mediated communication path between the normal world and the secure world.
Table of Contents
- Requirements
- Build Configuration
- Platform Memory Layout
- Architecture Overview
- Secure Partitions
- CRB Regions
- FF-A Communication Protocol
- Hash Library Architecture
- Physical Presence Interface
- ACPI Integration
- swtpm Setup
- Communication Flow
- PCDs Reference
Requirements
| Requirement | Notes |
|---|---|
| Host OS | Linux (native) or WSL on Windows. Native Windows is not supported. |
| swtpm | TPM 2.0 emulator. Install via your distro's package manager (e.g. apt install swtpm swtpm-tools). |
| QEMU | Built with tpm-tis-device support (standard upstream QEMU includes this). |
| Build host | Same Linux/WSL environment used to run stuart_build and launch QEMU. |
See swtpm Setup for the full setup commands.
Build Configuration
The TPM is disabled by default. To enable it, set BLD_*_TPM2_ENABLE=TRUE on the command line or in a
BuildConfig.conf file placed at the root level of the repo:
stuart_build -c Platforms/QemuArmVirtPkg/PlatformBuild.py --FlashRom BLD_*_TPM2_ENABLE=TRUE
The following defines control TPM behavior in QemuArmVirtPkg.dsc:
| Define | Default | Purpose |
|---|---|---|
TPM2_ENABLE | FALSE | Master switch. Guards all TPM drivers, libraries, and PCDs. |
TPM2_CONFIG_ENABLE | FALSE | Enables Tcg2ConfigDxe HII configuration UI. |
When TPM2_ENABLE=TRUE, the build additionally passes -DTPM2_ENABLE to the C compiler
via build options, allowing C code to use #ifdef TPM2_ENABLE guards.
Platform Memory Layout
The Arm Virt platform defines two distinct TPM memory regions:
| Region | Address | Size | Visibility |
|---|---|---|---|
| Internal CRB | 0x40200000 | 0x10 pages | Normal world + Secure world |
| External CRB | 0x0c000000 | 0x10 pages | Secure world only |
The Internal CRB address is published via PCDs:
PcdTpmBaseAddress=0x40200000PcdTpmMaxAddress=0x40204FFF(5 localities × 0x1000)
The Internal CRB is marked as EfiACPIMemoryNVS via a HOB in ArmPlatformLibQemu.c
so the OS can locate it through the ACPI TPM2 table.
Architecture Overview
┌──────────────────────────────────────────────────────────────────────────────────┐
│ UEFI Firmware (AARCH64) │
│ │
│ ┌─── SEC Phase ──────────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ Tpm2StartupLib │ │
│ │ │ 1. Tpm2RequestUseTpm() │ │
│ │ │ 2. Tpm2Startup(TPM_SU_CLEAR) │ │
│ └────┼───────────────────────────────────────────────────────────────────────┘ │
│ ▼ │
│ ┌─── DXE Phase ──────────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ HashLibBaseCryptoRouterDxe + HashInstanceLib* │ │
│ │ │ 1. Constructors register each enabled hash algorithm │ │
│ │ │ 2. Filtered by PcdTpm2HashMask → PcdTcg2HashAlgorithmBitmap │ │
│ │ ▼ │ │
│ │ Tcg2Dxe │ │
│ │ │ 1. Verify PcdTpmInstanceGuid is TPM 2.0 │ │
│ │ │ 2. Verify no TpmErrorHob is present │ │
│ │ │ 3. Tpm2RequestUseTpm() │ │
│ │ │ 4. Query TPM capabilities │ │
│ │ │ ├── Manufacturer │ │
│ │ │ ├── Firmware version │ │
│ │ │ └── Max cmd/resp size │ │
│ │ │ 5. Get supported/active PCR banks filtered by → HashAlgorithmBitmap │ │
│ │ │ 6. Decide SupportedEventLogs (TCG_1_2 only if SHA1 active) │ │
│ │ │ 7. SetupEventLog │ │
│ │ │ ├── Allocate log area(s) │ │
│ │ │ └── Acquire and log pre-DXE HOB(s) │ │
│ │ │ 8. Register events │ │
│ │ │ ├── ReadyToBoot │ │
│ │ │ ├── ExitBootServices │ │
│ │ │ └── ExitBootServices Failed │ │
│ │ │ 9. Register protocol notifies │ │
│ │ │ ├── VariableWriteArch (SecureBoot) │ │
│ │ │ └── ResetNotification (TPM shutdown) │ │
│ │ │ 10. Install Tcg2Protocol │ │
│ │ ▼ │ │
│ │ Tcg2AcpiFfa │ │
│ │ │ 1. Publish TPM2 ACPI table │ │
│ │ │ 2. Publish SSDT with TPM0 device node │ │
│ └────┼───────────────────────────────────────────────────────────────────────┘ │
│ ▼ │
│ ┌─── BDS Phase ──────────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ DeviceBootManagerAfterConsole │ │
│ │ │ 1. Tcg2PhysicalPresenceLibProcessRequest (NULL) │ │
│ │ │ 2. Process any pending PP request before shell launch │ │
│ │ │ 3. Create TCG2_PHYSICAL_PRESENCE_VARIABLE if it doesn't exist │ │
│ └────┼───────────────────────────────────────────────────────────────────────┘ │
│ ▼ │
│ ┌─── UEFI Shell ─────────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ UEFI Shell / OS / TpmShellApp │ │
│ │ │ 1. gBS->LocateProtocol(&gEfiTcg2ProtocolGuid) │ │
│ │ │ 2. Tcg2Protocol->GetCapability / SetActivePcrBanks / etc. │ │
│ └────┼───────────────────────────────────────────────────────────────────────┘ │
│ ▼ │
│ Tpm2DeviceLibFfa ─ writes to Internal CRB @ 0x40200000 │
│ │ then sends FF-A DirectReq2 to the TpmService │
│ │ │
├───────┼──────────────────────────────────────────────────────────────────────────┤
│ EL3 (SPMC / TF-A) ─ routes FF-A message to partition 0x8002 │
├───────┼──────────────────────────────────────────────────────────────────────────┤
│ ▼ │
│ SECURE WORLD (SEL1) │
│ │
│ MSSP (MsSecurePartition, id=0x8002) │
│ │ │
│ ▼ │
│ TpmServiceLib ─ State machine (IDLE → READY → COMPLETE → IDLE) │
│ │ │
│ ▼ │
│ TpmServiceStateTranslationLib ─ Translates CRB style communications │
│ │ to the style supported by the TPM │
│ │ i.e. FIFO for QEMU Arm Virt │
│ │ Library Responsibilities: │
│ │ 1. Copy command from Internal CRB → local buffer │
│ │ 2. Write command to External CRB @ 0x0c000000 │
│ │ 3. Trigger execution on external TPM through the CRB MMIO │
│ │ 4. Read response from External CRB │
│ │ 5. Copy response back to Internal CRB │
│ │ │
├───────┼──────────────────────────────────────────────────────────────────────────┤
│ ▼ │
│ QEMU TPM device (MMIO @ 0x0c000000) │
│ │ │
│ ▼ │
│ Unix socket ─ swtpm process (--tpm2) │
└──────────────────────────────────────────────────────────────────────────────────┘
Secure Partitions
Two FF-A Secure Partitions are involved in TPM operations.
MSSP — Microsoft Secure Services Partition (id=0x8002)
Configured in Platforms/QemuArmVirtPkg/fdts/qemu_virt_mssp_rust_config.dts:
| Property | Value |
|---|---|
| Partition ID | 0x8002 |
| Exception Level | SEL1 |
| Execution State | AARCH64 |
| Load Address | 0x0e700000 |
| Image Size | 4 MiB |
| Boot Order | 2 |
The MSSP hosts the TPM service and is granted access to both CRB regions:
device-regions {
internal_tpm_crb {
base-address = <0x40200000>;
pages-count = <0x10>;
attributes = <SECURE_RW>;
};
external_tpm_crb {
base-address = <0x0c000000>;
pages-count = <0x10>;
attributes = <SECURE_RW>;
};
};
The MSSP publishes three service UUIDs. The TPM service UUID is:
17b862a4-1806-4faf-86b3-089a58353861
Key libraries running inside the MSSP:
- TpmServiceLib — handles incoming FF-A messages, implements the CRB state machine (IDLE → cmdReady → READY → start → COMPLETE → goIdle → IDLE). Note that this service is based on the CRB over FF-A specification released by ARM. See: TPM Service Command Response Buffer Interface Over FF-A
- TpmServiceStateTranslationLib — translates between the Internal CRB (CRB interface) and the External CRB (which may be CRB or FIFO depending on QEMU configuration). On QEMU Arm Virt the external interface is FIFO.
StMM — Standalone MM Partition (id=0x8001)
Configured in Platforms/QemuArmVirtPkg/fdts/qemu_virt_stmm_config.dts:
| Property | Value |
|---|---|
| Partition ID | 0x8001 |
| Exception Level | SEL0 |
| Execution State | AARCH64 |
| Load Address | 0x0e400000 |
| Image Size | 3 MiB |
| Boot Order | 0 |
The StMM partition hosts secure variable storage (FTW, VariableRuntimeDxe), and the
Tcg2StandaloneMmArm driver which processes Physical Presence Interface commands from
the normal world for NV variable access.
CRB Regions
CRB Register Layout (PTP CRB Interface)
Each locality occupies 0x1000 bytes. The CRB register layout is defined by the TCG
PC Client Platform TPM Profile (PTP) specification (and mirrored in TpmPtp.h):
- TCG PC Client Platform TPM Profile (PTP) Specification —
Section 6 "Command Response Buffer Interface" describes
LocalityState,LocalityControl,InterfaceId,CrbControlRequest,CrbControlStart,CrbControlCommand*/CrbControlResponse*, and the sharedCrbDataBuffer.
Internal CRB (0x40200000)
This is the CRB visible to normal-world firmware (DXE drivers and UEFI applications).
Tpm2DeviceLibFfa writes TPM commands into this CRB's data buffer and reads responses
from it. The Internal CRB uses the standard CRB register interface. It is the TPM
service's responsibility to set up and maintain this region. The goal is for this region
to mimic a normal MMIO CRB region, with the added caveat that an FF-A message must be sent
for any register modification to take effect.
The normal-world code performs MMIO writes to the CRB control registers (cmdReady, Start, goIdle) and then sends FF-A messages to notify the secure partition. The secure partition reads the command data from the Internal CRB, proxies it to the External CRB, and writes the response back.
External CRB (0x0c000000)
This is the QEMU-emulated TPM device MMIO region. It is only accessible from the secure
world i.e. the TPM Service within the MSSP secure partition. On QEMU Arm Virt, this region
presents a FIFO interface (not CRB), which the TpmServiceStateTranslationLib handles by
detecting the interface type at initialization and using the appropriate FIFO
command/response protocol (burst-count reads, data register writes).
The external CRB connects to the swtpm process through QEMU's chardev/tpmdev
infrastructure:
QEMU args: -chardev socket,id=chrtpm,path={BUILD_OUTPUT_BASE}/swtpm-sock
-tpmdev emulator,id=tpm0,chardev=chrtpm
FF-A Communication Protocol
All TPM commands from normal world to secure world use FF-A Direct Request/Response messaging (FFA_MSG_SEND_DIRECT_REQ2 / FFA_MSG_SEND_DIRECT_RESP2) to/from the TPM Service.
Service Discovery
On first use, Tpm2DeviceLibFfa discovers the TPM service partition:
ArmFfaLibGetPartitionInfo(&gTpm2ServiceFfaGuid, &TpmPartInfo);
This queries the SPMC (EL3) for the partition hosting UUID 17b862a4-1806-4faf-86b3-089a58353861,
which returns partition ID 0x8002. This information can be found in the manifest of the secure
partition.
Function IDs
| ID | Name | Direction | Supported |
|---|---|---|---|
0x0f000001 | TPM2_FFA_GET_INTERFACE_VERSION | NW → SW | YES |
0x0f000101 | TPM2_FFA_GET_FEATURE_INFO | NW → SW | NO |
0x0f000201 | TPM2_FFA_START | NW → SW | YES |
0x0f000301 | TPM2_FFA_REGISTER_FOR_NOTIFICATION | NW → SW | NO |
0x0f000401 | TPM2_FFA_UNREGISTER_FROM_NOTIFICATION | NW → SW | NO |
0x0f000501 | TPM2_FFA_FINISH_NOTIFIED | NW → SW | NO |
0x1f000001 | TPM2_FFA_MANAGE_LOCALITY | TF-A → SW only | YES |
The TPM2_FFA_START function carries a qualifier in Arg1:
| Qualifier | Value | Purpose |
|---|---|---|
TPM2_FFA_START_FUNC_QUALIFIER_COMMAND | 0x0 | Execute a CRB state transition (cmdReady, start, or goIdle) |
TPM2_FFA_START_FUNC_QUALIFIER_LOCALITY | 0x1 | Request or relinquish locality access |
The TPM2_FFA_MANAGE_LOCALITY function carries a qualifier in Arg1:
| Qualifier | Value | Purpose |
|---|---|---|
TPM2_FFA_MANAGE_LOCALITY_OPEN | 0x0 | Allows access to a locality |
TPM2_FFA_MANAGE_LOCALITY_CLOSE | 0x1 | Prevents access to a locality |
Note that for both TPM2_FFA_START and TPM2_FFA_MANAGE_LOCALITY Arg2 specifies
the locality to take action upon.
FF-A Message Sequence (Per TPM Command)
A locality must first be requested before any commands can be sent to
the TPM via that locality's CRB region. The active locality must be
relinquished before another locality is requested. The entity currently
engaging with the TPM is responsible for relinquishing the active locality
when it is no longer in use. If the locality being requested is CLOSED, a
DENIED error is returned. If the locality being relinquished is not the
current active locality, a DENIED error is returned.
A single TPM command requires multiple FF-A round trips:
sequenceDiagram
participant NW as Normal World
participant SW as Secure World (MSSP)
Note over NW: Write LocalityControl = request access
NW->>SW: FFA DirectReq2(START, LOCALITY)
Note over SW: LocalityX becomes active
SW-->>NW: FFA DirectResp2(SUCCESS)
Note over NW: Write CrbControlRequest = cmdReady
NW->>SW: FFA DirectReq2(START, COMMAND)
Note over SW: State: IDLE → READY<br/>(prepare external TPM)
SW-->>NW: FFA DirectResp2(SUCCESS)
Note over NW: Write command to CrbDataBuffer<br/>Write CrbControlStart = 1
NW->>SW: FFA DirectReq2(START, COMMAND)
Note over SW: State: READY → COMPLETE<br/>• Copy cmd from Internal CRB<br/>• Write cmd to External CRB<br/>• Trigger external TPM<br/>• Read response from External CRB<br/>• Copy response to Internal CRB
SW-->>NW: FFA DirectResp2(SUCCESS)
Note over NW: Read response from CrbDataBuffer<br/>Write CrbControlRequest = goIdle
NW->>SW: FFA DirectReq2(START, COMMAND)
Note over SW: State: COMPLETE → IDLE<br/>(idle external TPM)
SW-->>NW: FFA DirectResp2(SUCCESS)
rect rgba(200, 200, 200, 0.2)
Note over NW,SW: OPTIONAL
Note over NW: Write LocalityControl = relinquish access
NW->>SW: FFA DirectReq2(START, LOCALITY)
Note over SW: LocalityX is relinquished
SW-->>NW: FFA DirectResp2(SUCCESS)
end
If the secure partition is preempted by a non-secure interrupt during processing, the FF-A
call returns EFI_INTERRUPT_PENDING. The normal-world code handles this by calling
ArmFfaLibRun() in a loop until the operation completes. Note that this can only happen if
ns-interrupts-action in the secure partition's manifest is set to 0x02, otherwise, the
non-secure interrupt is queued and the service continues execution until it completes or
responds with a YIELD.
Hash Library Architecture
Tcg2Dxe uses HashLibBaseCryptoRouterDxe with all hash instance libraries included.
Registration Flow
HashLibBaseCryptoRouterConstructorresetsPcdTcg2HashAlgorithmBitmapto 0.- Each
HashInstanceLibconstructor callsRegisterHashInterfaceLib(). RegisterHashInterfaceLib()checks the algorithm againstPcdTpm2HashMask(0x02= SHA256 only). Algorithms not in the mask returnEFI_UNSUPPORTED.
Hash Algorithm Bitmask Values
The bit positions used in PcdTpm2HashMask, PcdTcg2HashAlgorithmBitmap, and the
EFI_TCG2_BOOT_SERVICE_CAPABILITY.HashAlgorithmBitmap field are defined by the EFI
TCG2 protocol and the TCG algorithm registry:
- UEFI TCG2 Protocol Specification — see
EFI_TCG2_BOOT_HASH_ALG_*(SHA1= BIT0,SHA256= BIT1,SHA384= BIT2,SHA512= BIT3,SM3_256= BIT4). - TCG Algorithm Registry — canonical list of TPM hash algorithm IDs.
For this platform, PcdTpm2HashMask = 0x02 enables SHA256 only.
Filtering Chain
PcdTpm2HashMask (0x02)
│
▼
RegisterHashInterfaceLib() ── gates which HashInstanceLibs register
│
▼
PcdTcg2HashAlgorithmBitmap ── result of all successful registrations
│
▼
Tcg2Dxe intersects with TPM-reported capabilities
│
▼
Final ActivePcrBanks / HashAlgorithmBitmap in EFI_TCG2_BOOT_SERVICE_CAPABILITY
Physical Presence Interface
Library Selection
TPM2_ENABLE | Library | Behavior |
|---|---|---|
FALSE | Tcg2PhysicalPresenceLibNull | All functions stubbed |
TRUE | DxeTcg2PhysicalPresenceMinimumLib | Auto-confirms Clear; rejects all other operations |
The MinimumLib implementation:
- Auto-confirms TPM Clear operations without user prompting.
- Rejects SET_PCR_BANKS, LOG_ALL_DIGESTS, and other operations with
TCG_PP_RETURN_TPM_OPERATION_RESPONSE_FAILURE. - Does not create or use
TCG2_PHYSICAL_PRESENCE_FLAGS_VARIABLE.
ProcessRequest in BDS
Tcg2PhysicalPresenceLibProcessRequest() is invoked from the platform's
DeviceBootManagerLib during DeviceBootManagerAfterConsole(), before the shell
launches. It:
- Reads the
Tcg2PhysicalPresenceNV variable (creates it if missing). - Executes any pending PP request stored in the variable.
- Stores the result back for
ReturnOperationResponseToOsFunction()to report.
Tcg2StandaloneMmArm (Secure World)
The Tcg2StandaloneMmArm driver runs in the StMM partition (id=0x8001). It handles
Physical Presence NV variable operations when called from the DXE-phase PP library via
MM communicate. This is necessary because NV variable writes go through the secure
variable store in StMM.
ACPI Integration
TPM2 ACPI Table
Published by Tcg2AcpiFfa.c:
| Field | Value |
|---|---|
| Start Method | CRB with FF-A (0x0C) |
| Control Area Address | PcdTpmBaseAddress + 0x40 |
| Command Buffer | PcdTpmBaseAddress + 0x80, size 0xF80 |
| Response Buffer | PcdTpmBaseAddress + 0x80, size 0xF80 |
| Platform Parameters | Partition ID from PcdTpmServiceFfaPartitionId |
TPM ACPI Device (SSDT)
An SSDT is published with a TPM0 device node containing:
_HIDpatched with the TPM manufacturer ID read from hardware._CRSwith a QWordMemory resource pointing toPcdTpmBaseAddressthroughPcdTpmMaxAddress._DSMimplementing TCG PPI operations 1–8 for OS-initiated Physical Presence requests.- An
FFixedHwOperationRegion for FF-A DirectReq2 passthrough from the OS.
swtpm Setup
Installation
swtpm requires Unix sockets, so it must run in a Linux environment. On Windows, use WSL (Windows Subsystem for Linux).
# Windows (from a WSL terminal)
wsl --install # if WSL is not yet enabled
wsl # enter the WSL environment
# Ubuntu/Debian (native or WSL)
sudo apt install swtpm swtpm-tools
# Fedora
sudo dnf install swtpm swtpm-tools
Manual Setup
Create the TPM state directory and start swtpm before launching QEMU:
mkdir -p /tmp/mytpm1
swtpm socket \
--tpmstate dir=/tmp/mytpm1 \
--ctrl type=unixio,path=/tmp/mytpm1/swtpm-sock \
--tpm2 \
--log level=20
Automatic Setup (QemuRunner)
When SWTPM_ENABLE=TRUE, QemuRunner.py automatically starts swtpm as a subprocess before
launching QEMU. The swtpm state directory is set to BUILD_OUTPUT_BASE and the Unix socket
is placed at {BUILD_OUTPUT_BASE}/swtpm-sock:
# Platforms/QemuArmVirtPkg/Plugins/QemuRunner/QemuRunner.py
@staticmethod
def StartSwTpm(tpm_dir, tpm_sock):
"""Starts the swtpm emulator and returns its Popen handle."""
cmd = [
"swtpm", "socket",
"--tpmstate", f"dir={tpm_dir}",
"--ctrl", f"type=unixio,path={tpm_sock}",
"--tpm2",
"--log", "level=1",
]
return subprocess.Popen(cmd)
swtpm is started before QEMU launches. QemuRunner then waits (up to 30 seconds) for the
Unix socket to appear before starting QEMU, and terminates the swtpm process so it doesn't
outlive the run. SWTPM is enabled by default. Disable it by setting SWTPM_ENABLE=FALSE on
the command line or in the BuildConfig.conf file.
SWTPM is only available on Linux builds. QemuRunner automatically disables it on Windows
hosts even if SWTPM_ENABLE=TRUE.
QEMU Arguments
When SWTPM_ENABLE=TRUE, QemuRunner.py adds the following to the QEMU command line
(with the socket path under BUILD_OUTPUT_BASE):
-chardev socket,id=chrtpm,path={BUILD_OUTPUT_BASE}/swtpm-sock
-tpmdev emulator,id=tpm0,chardev=chrtpm
-device tpm-tis-device,tpmdev=tpm0
The -device tpm-tis-device argument is Arm-specific. It attaches a sysbus TIS-compatible
TPM device to the Arm Virt machine at the Internal CRB address 0x40200000. This differs
from Q35, which uses the ISA/PCI tpm-tis device instead (see TPM on QEMU Q35).
Communication Flow
Complete path from a shell application to swtpm:
TpmShellApp (UEFI Shell)
│ gBS->LocateProtocol(&gEfiTcg2ProtocolGuid)
│ Tcg2Protocol->SetActivePcrBanks(0x02)
▼
Tcg2Dxe (EFI_TCG2_PROTOCOL)
│ Validates bank mask against HashAlgorithmBitmap
│ Calls Tcg2PhysicalPresenceLibSubmitRequestToPreOSFunction()
│ ├── MinimumLib: rejects SET_PCR_BANKS → returns EFI_UNSUPPORTED
│ └── MinimumLib: NO_ACTION (already-active) → writes to NV variable → EFI_SUCCESS
▼
Tpm2CommandLib (for direct TPM commands like GetCapability)
│ Serializes TPM2_CC command structure into byte buffer
│ Calls Tpm2SubmitCommand(cmdBuffer, cmdSize, rspBuffer, &rspSize)
▼
Tpm2DeviceLibFfa — FfaTpm2SubmitCommand()
│ PtpCrbTpmCommand(CrbReg = PcdTpmBaseAddress)
│
│ ┌─ STEP 1: cmdReady ──────────────────────────────────────────┐
│ │ MmioWrite32(&CrbReg->CrbControlRequest, PTP_CRB_CONTROL │
│ │ _AREA_REQUEST_COMMAND_READY) │
│ │ Tpm2ServiceStart(QUALIFIER_COMMAND, 0) ── FF-A ──► MSSP │
│ └─────────────────────────────────────────────────────────────┘
│
│ ┌─ STEP 2: submit ────────────────────────────────────────────┐
│ │ CopyMem(CrbReg->CrbDataBuffer, cmdBuffer, cmdSize) │
│ │ MmioWrite32(&CrbReg->CrbControlStart, 1) │
│ │ Tpm2ServiceStart(QUALIFIER_COMMAND, 0) ── FF-A ──► MSSP │
│ └─────────────────────────────────────────────────────────────┘
│
│ ════ WORLD SWITCH ════
│
│ MSSP (secure world, partition 0x8002):
│ TpmServiceLib: state READY → execute
│ TpmServiceStateTranslationLib:
│ 1. Read command from Internal CRB data buffer
│ 2. CopyCommandData() → write to External CRB @ 0x0c000000 (FIFO)
│ 3. StartCommand() → trigger TPM execution
│ 4. CopyResponseData() → read response from External CRB
│ 5. Write response to Internal CRB data buffer
│
│ ════ QEMU MMIO ════
│
│ QEMU TPM device @ 0x0c000000
│ └── Unix socket ──── swtpm process
│
│ ════ WORLD SWITCH BACK ════
│
│ ┌─ STEP 3: goIdle ────────────────────────────────────────────┐
│ │ Read response from CrbReg->CrbDataBuffer │
│ │ MmioWrite32(&CrbReg->CrbControlRequest, PTP_CRB_CONTROL │
│ │ _AREA_REQUEST_GO_IDLE) │
│ │ Tpm2ServiceStart(QUALIFIER_COMMAND, 0) ── FF-A ──► MSSP │
│ └─────────────────────────────────────────────────────────────┘
▼
Response returned to caller
PCDs Reference
Required PCDs (set when TPM2_ENABLE=TRUE)
| PCD | Value | Type | Purpose |
|---|---|---|---|
PcdTpmBaseAddress | 0x40200000 | FixedAtBuild | Internal CRB base address |
PcdTpmMaxAddress | 0x40204FFF | FixedAtBuild | Internal CRB end address (5 localities) |
PcdTpm2HashMask | 0x02 | DynamicDefault | Hash algorithm filter (SHA256 only) |
PcdTpmInstanceGuid | gEfiTpmDeviceInstanceTpm20DtpmGuid | FixedAtBuild | Selects discrete TPM 2.0 device type |
PcdTpm2AcpiTableRev | 5 | DynamicHii | ACPI TPM2 table revision |
PcdUserPhysicalPresence | FALSE | FixedAtBuild | No physical user presence assertion |
Memory Type PCDs
| PCD | Value | Purpose |
|---|---|---|
PcdMemoryTypeEfiACPIReclaimMemory | 0x143 | ACPI reclaim memory pages (includes TPM ACPI tables) |
PcdMemoryTypeEfiACPIMemoryNVS | 0x3C | ACPI NVS pages (includes CRB region) |
PcdMemoryTypeEfiRuntimeServicesData | 0x642 | Runtime services data pages |
PcdMemoryTypeEfiRuntimeServicesCode | 0x424 | Runtime services code pages |
PcdMemoryTypeEfiReservedMemoryType | 0x505 | Reserved memory pages |
Conditional PCDs (TPM2_CONFIG_ENABLE=TRUE)
| PCD | Value | Purpose |
|---|---|---|
PcdTcgPhysicalPresenceInterfaceVer | "1.3" | TCG PPI specification version reported to OS |
TPM on QEMU Q35
This document describes the TPM 2.0 architecture for the QEMU Q35 platform. Q35 uses a direct CRB/FIFO path between firmware and the TPM device.
Table of Contents
- Requirements
- Build Configuration
- Platform Memory Layout
- Architecture Overview
- TPM Device Library Stack
- Hash Library Architecture
- Physical Presence Interface
- swtpm Setup
- Communication Flow
- PCDs Reference
Requirements
| Requirement | Notes |
|---|---|
| Host OS | Linux (native) or WSL on Windows. Native Windows is not supported. |
| swtpm | TPM 2.0 emulator. Install via your distro's package manager (e.g. apt install swtpm swtpm-tools). |
| QEMU | Built with tpm-tis device support (standard upstream QEMU includes this). |
| Build host | Same Linux/WSL environment used to run stuart_build and launch QEMU. |
See swtpm Setup for the full setup commands.
Build Configuration
The TPM is disabled by default. To enable it, set BLD_*_TPM2_ENABLE=TRUE on the command line or in a
BuildConfig.conf file placed at the root level of the repo:
stuart_build -c Platforms/QemuQ35Pkg/PlatformBuild.py --FlashRom BLD_*_TPM2_ENABLE=TRUE
The following defines control TPM behavior in QemuQ35Pkg.dsc:
| Define | Default | Purpose |
|---|---|---|
TPM2_ENABLE | FALSE | Master switch. Guards all TPM drivers, libraries, and PCDs. |
TPM_CONFIG_ENABLE | FALSE | Enables Tcg2ConfigDxe HII configuration UI. |
TPM_REPLAY_ENABLED | FALSE | Enables TPM Replay overrides (uses TpmTestingPkg variants of Tcg2Dxe and DxeTpm2MeasureBootLib). |
Platform Memory Layout
Q35 uses the standard x86 TPM memory-mapped I/O region:
| Region | Address | Size | Interface |
|---|---|---|---|
| TPM TIS/CRB | 0xFED40000 | 0x5000 (20 KiB) | CRB or TIS (auto-detected) |
The firmware communicates directly with the TPM device via MMIO, and QEMU forwards the I/O to swtpm over a Unix socket.
The base address comes from the SecurityPkg package declaration default
(PcdTpmBaseAddress = 0xFED40000). The Q35 DSC does not override it explicitly. The
Tcg2ConfigPei driver detects the TPM at this address during PEI.
Architecture Overview
┌──────────────────────────────────────────────────────────────────────────────────┐
│ UEFI Firmware (x86_64) │
│ │
│ ┌─── PEI Phase ──────────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ Tcg2ConfigPei │ │
│ │ │ 1. Detect TPM 1.2 vs 2.0 at 0xFED40000 │ │
│ │ │ 2. Set PcdTpmInstanceGuid │ │
│ │ ▼ │ │
│ │ HashLibBaseCryptoRouterPei + HashInstanceLib* │ │
│ │ │ 1. Constructors register each enabled hash algorithm │ │
│ │ │ 2. Filtered by PcdTpm2HashMask → PcdTcg2HashAlgorithmBitmap │ │
│ │ ▼ │ │
│ │ Tcg2Pei │ │
│ │ │ 1. Tpm2RequestUseTpm() │ │
│ │ │ 2. Tpm2Startup(TPM_SU_CLEAR) │ │
│ │ │ 3. SyncPcrAllocationsAndPcrMask() │ │
│ │ │ 4. Tpm2SelfTest() │ │
│ │ │ 5. Measure firmware volumes (CRTM) into PCR[0-7] │ │
│ │ │ 6. Install TpmInitializedPpi │ │
│ └────┼───────────────────────────────────────────────────────────────────────┘ │
│ ▼ │
│ ┌─── DXE Phase ──────────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ HashLibBaseCryptoRouterDxe + HashInstanceLib* │ │
│ │ │ 1. Constructors register each enabled hash algorithm │ │
│ │ │ 2. Filtered by PcdTpm2HashMask → PcdTcg2HashAlgorithmBitmap │ │
│ │ ▼ │ │
│ │ Tcg2Dxe │ │
│ │ │ 1. Verify PcdTpmInstanceGuid is TPM 2.0 │ │
│ │ │ 2. Verify no TpmErrorHob is present │ │
│ │ │ 3. Tpm2RequestUseTpm() │ │
│ │ │ 4. Query TPM capabilities │ │
│ │ │ ├── Manufacturer │ │
│ │ │ ├── Firmware version │ │
│ │ │ └── Max cmd/resp size │ │
│ │ │ 5. Get supported/active PCR banks filtered by → HashAlgorithmBitmap │ │
│ │ │ 6. Decide SupportedEventLogs (TCG_1_2 only if SHA1 active) │ │
│ │ │ 7. SetupEventLog │ │
│ │ │ ├── Allocate log area(s) │ │
│ │ │ └── Acquire and log pre-DXE HOB(s) │ │
│ │ │ 8. Register events │ │
│ │ │ ├── ReadyToBoot │ │
│ │ │ ├── ExitBootServices │ │
│ │ │ └── ExitBootServices Failed │ │
│ │ │ 9. Register protocol notifies │ │
│ │ │ ├── VariableWriteArch (SecureBoot) │ │
│ │ │ └── ResetNotification (TPM shutdown) │ │
│ │ │ 10. Install Tcg2Protocol │ │
│ └────┼───────────────────────────────────────────────────────────────────────┘ │
│ ▼ │
│ ┌─── BDS Phase ──────────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ DeviceBootManagerAfterConsole │ │
│ │ │ 1. Tcg2PhysicalPresenceLibProcessRequest (NULL) │ │
│ │ │ 2. Process any pending PP request before shell launch │ │
│ │ │ 3. Create TCG2_PHYSICAL_PRESENCE_VARIABLE if it doesn't exist │ │
│ └────┼───────────────────────────────────────────────────────────────────────┘ │
│ ▼ │
│ ┌─── UEFI Shell ─────────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ UEFI Shell / OS / TpmShellApp │ │
│ │ │ 1. gBS->LocateProtocol(&gEfiTcg2ProtocolGuid) │ │
│ │ │ 2. Tcg2Protocol->GetCapability / SetActivePcrBanks / etc. │ │
│ └────┼───────────────────────────────────────────────────────────────────────┘ │
│ ▼ │
│ Tpm2DeviceLibDTpm ─ direct MMIO reads/writes to 0xFED40000 │
│ │ │
├───────┼──────────────────────────────────────────────────────────────────────────┤
│ ▼ │
│ QEMU TPM TIS device (-device tpm-tis,tpmdev=tpm0) │
│ │ │
│ ▼ │
│ Unix socket ─ swtpm process (--tpm2) │
└──────────────────────────────────────────────────────────────────────────────────┘
TPM Device Library Stack
Q35 uses two different patterns for accessing the TPM, depending on the firmware phase:
PEI Phase: Direct MMIO (Tpm2DeviceLibDTpm)
Tcg2Pei
│ Tpm2SubmitCommand()
▼
Tpm2DeviceLibDTpm
│ Auto-detects CRB vs TIS vs FIFO via InterfaceId register
│ DTpm2SubmitCommand() dispatches:
│ CRB → PtpCrbTpmCommand()
│ FIFO → Tpm2TisTpmCommand()
│ TIS → Tpm2TisTpmCommand()
▼
Direct MMIO to 0xFED40000
Tpm2DeviceLibDTpm reads the InterfaceId register at PcdTpmBaseAddress + 0x30 to
determine the interface type. QEMU's tpm-tis device presents a TIS/FIFO interface.
DXE Phase: Router Pattern (Tpm2DeviceLibRouter)
Tcg2Dxe
│ Tpm2SubmitCommand()
▼
Tpm2DeviceLibRouterDxe
│ Delegates to registered TPM2_DEVICE_INTERFACE
▼
Tpm2InstanceLibDTpm (constructor registers with router)
│ DTpm2SubmitCommand() — same dispatch as PEI
▼
Direct MMIO to 0xFED40000
The router pattern exists to support future scenarios where multiple TPM device types
could coexist. The router accepts only the instance whose ProviderGuid matches
PcdTpmInstanceGuid.
Other DXE Drivers: TCG2 Protocol (Tpm2DeviceLibTcg2)
Most DXE drivers that need TPM access use Tpm2DeviceLibTcg2, which goes through the
TCG2 Protocol rather than direct MMIO. Only Tcg2Dxe itself uses Tpm2DeviceLibRouter
with direct MMIO.
CRB Register Layout
If the TPM presents a CRB interface (as opposed to TIS/FIFO), the register layout is defined by the TCG PC Client Platform TPM Profile (PTP) specification. See:
- TCG PC Client Platform TPM Profile (PTP) Specification —
Section 6 "Command Response Buffer Interface" describes
LocalityState,LocalityControl,InterfaceId,CrbControlRequest,CrbControlStart,CrbControlCommand*/CrbControlResponse*, and the sharedCrbDataBuffer.
The key register for this platform is InterfaceId at PcdTpmBaseAddress + 0x30, which
Tpm2DeviceLibDTpm reads to decide between CRB and TIS/FIFO dispatch paths.
TIS Register Layout
QEMU's tpm-tis device presents a TIS (TPM Interface Specification) / FIFO interface.
The register layout is defined by:
- TCG PC Client Specific TPM Interface Specification (TIS) —
defines
Access,IntEnable/IntVector,STS(withcommandReady,tpmGo,dataAvail,burstCount),DataFifo, and theVid/Did/Rididentification registers.
The TIS flow uses BurstCount from the STS register to pace reads and writes through
the DataFifo register, one burst at a time.
Hash Library Architecture
Tcg2Dxe uses HashLibBaseCryptoRouterDxe while Tcg2Pei uses HashLibBaseCryptoRouterPei
with all hash instance libraries included.
Registration Flow
HashLibBaseCryptoRouterConstructorresetsPcdTcg2HashAlgorithmBitmapto 0.- Each
HashInstanceLibconstructor callsRegisterHashInterfaceLib(). RegisterHashInterfaceLib()checks the algorithm againstPcdTpm2HashMask(0x02= SHA256 only). Algorithms not in the mask returnEFI_UNSUPPORTED.
Hash Algorithm Bitmask Values
The bit positions used in PcdTpm2HashMask, PcdTcg2HashAlgorithmBitmap, and the
EFI_TCG2_BOOT_SERVICE_CAPABILITY.HashAlgorithmBitmap field are defined by the EFI
TCG2 protocol and the TCG algorithm registry:
- UEFI TCG2 Protocol Specification — see
EFI_TCG2_BOOT_HASH_ALG_*(SHA1= BIT0,SHA256= BIT1,SHA384= BIT2,SHA512= BIT3,SM3_256= BIT4). - TCG Algorithm Registry — canonical list of TPM hash algorithm IDs.
For this platform, PcdTpm2HashMask = 0x02 enables SHA256 only.
Filtering Chain
PcdTpm2HashMask (0x02)
│
▼
RegisterHashInterfaceLib() ── gates which HashInstanceLibs register
│
▼
PcdTcg2HashAlgorithmBitmap ── result of all successful registrations
│
▼
Tcg2Dxe intersects with TPM-reported capabilities
│
▼
Final ActivePcrBanks / HashAlgorithmBitmap in EFI_TCG2_BOOT_SERVICE_CAPABILITY
Physical Presence Interface
Library Selection
TPM2_ENABLE | Library | Behavior |
|---|---|---|
FALSE | Tcg2PhysicalPresenceLibNull | All functions stubbed |
TRUE | DxeTcg2PhysicalPresenceMinimumLib | Auto-confirms Clear; rejects all other operations |
The MinimumLib implementation:
- Auto-confirms TPM Clear operations without user prompting.
- Rejects SET_PCR_BANKS, LOG_ALL_DIGESTS, and other operations with
TCG_PP_RETURN_TPM_OPERATION_RESPONSE_FAILURE. - Does not create or use
TCG2_PHYSICAL_PRESENCE_FLAGS_VARIABLE.
ProcessRequest in BDS
Tcg2PhysicalPresenceLibProcessRequest() is invoked from the platform's
DeviceBootManagerLib during DeviceBootManagerAfterConsole(), before the shell
launches. It:
- Reads the
Tcg2PhysicalPresenceNV variable (creates it if missing). - Executes any pending PP request stored in the variable.
- Stores the result back for
ReturnOperationResponseToOsFunction()to report.
swtpm Setup
Installation
swtpm requires Unix sockets, so it must run in a Linux environment. On Windows, use WSL (Windows Subsystem for Linux).
# Windows (from a WSL terminal)
wsl --install # if WSL is not yet enabled
wsl # enter the WSL environment
# Ubuntu/Debian (native or WSL)
sudo apt install swtpm swtpm-tools
# Fedora
sudo dnf install swtpm swtpm-tools
Manual Setup
Create the TPM state directory and start swtpm before launching QEMU:
mkdir -p /tmp/mytpm1
swtpm socket \
--tpmstate dir=/tmp/mytpm1 \
--ctrl type=unixio,path=/tmp/mytpm1/swtpm-sock \
--tpm2 \
--log level=20
Automatic Setup (QemuRunner)
When SWTPM_ENABLE=TRUE, QemuRunner.py automatically starts swtpm as a subprocess before
launching QEMU. The swtpm state directory is set to BUILD_OUTPUT_BASE and the Unix socket
is placed at {BUILD_OUTPUT_BASE}/swtpm-sock:
# Platforms/QemuQ35Pkg/Plugins/QemuRunner/QemuRunner.py
@staticmethod
def StartSwTpm(tpm_dir, tpm_sock):
"""Starts the swtpm emulator and returns its Popen handle."""
cmd = [
"swtpm", "socket",
"--tpmstate", f"dir={tpm_dir}",
"--ctrl", f"type=unixio,path={tpm_sock}",
"--tpm2",
"--log", "level=1",
]
return subprocess.Popen(cmd)
swtpm is started before QEMU launches. QemuRunner then waits (up to 30 seconds) for the
Unix socket to appear before starting QEMU, and terminates the swtpm process so it doesn't
outlive the run. SWTPM is enabled by default. Disable it by setting SWTPM_ENABLE=FALSE on
the command line or in the BuildConfig.conf file.
SWTPM is only available on Linux builds. QemuRunner automatically disables it on Windows
hosts even if SWTPM_ENABLE=TRUE.
QEMU Arguments
When SWTPM_ENABLE=TRUE, QemuRunner.py adds the following to the QEMU command line
(with the socket path under BUILD_OUTPUT_BASE):
-chardev socket,id=chrtpm,path={BUILD_OUTPUT_BASE}/swtpm-sock
-tpmdev emulator,id=tpm0,chardev=chrtpm
-device tpm-tis,tpmdev=tpm0
The -device tpm-tis argument is Q35-specific — it attaches a TIS-compatible TPM device
to the Q35 chipset at the standard address 0xFED40000.
Communication Flow
Complete path from a shell application to swtpm:
TpmShellApp (UEFI Shell)
│ gBS->LocateProtocol(&gEfiTcg2ProtocolGuid)
│ Tcg2Protocol->SetActivePcrBanks(0x02)
▼
Tcg2Dxe (EFI_TCG2_PROTOCOL)
│ Validates bank mask against HashAlgorithmBitmap
│ Calls Tcg2PhysicalPresenceLibSubmitRequestToPreOSFunction()
│ ├── MinimumLib: rejects SET_PCR_BANKS → returns EFI_UNSUPPORTED
│ └── MinimumLib: NO_ACTION (already-active) → writes NV variable → EFI_SUCCESS
▼
Tpm2CommandLib (for direct TPM commands like GetCapability)
│ Serializes TPM2 command structure into byte buffer
│ Calls Tpm2SubmitCommand(cmdBuffer, cmdSize, rspBuffer, &rspSize)
▼
Tpm2DeviceLibRouter → Tpm2InstanceLibDTpm
│ DTpm2SubmitCommand() — detects interface type (TIS on QEMU)
▼
Tpm2TisTpmCommand (Tpm2Tis.c)
│ 1. TisPcPrepareCommand: set TIS_PC_STS_COMMAND_READY
│ 2. Write command bytes to DataFifo (paced by BurstCount)
│ 3. Set TIS_PC_STS_GO to start execution
│ 4. Poll STS for DataAvail (90 second timeout)
│ 5. Read response header from DataFifo
│ 6. Read remaining response bytes (paced by BurstCount)
│ 7. Set TIS_PC_STS_READY (return to idle)
▼
MMIO to 0xFED40000 (QEMU TIS device)
│
▼
QEMU tpm-tis device ──── Unix socket ──── swtpm process
PCDs Reference
Required PCDs (set when TPM2_ENABLE=TRUE)
| PCD | Value | Type | Purpose |
|---|---|---|---|
PcdTpmBaseAddress | 0xFED40000 (package default) | DynamicDefault | TPM TIS/CRB MMIO base address |
PcdTpm2HashMask | 0x02 | DynamicDefault | Hash algorithm filter (SHA256 only) |
PcdTpmInstanceGuid | gEfiTpmDeviceInstanceTpm20DtpmGuid | DynamicDefault | Selects discrete TPM 2.0 device type (set by Tcg2ConfigPei at runtime) |
PcdTpm2AcpiTableRev | 4 | DynamicHii | ACPI TPM2 table revision |
PcdUserPhysicalPresence | FALSE | FixedAtBuild | No physical user presence assertion |
Memory Type PCDs
| PCD | Value (pages) | Purpose |
|---|---|---|
PcdMemoryTypeEfiACPIReclaimMemory | 0x2B (43) | Includes TPM ACPI tables |
PcdMemoryTypeEfiACPIMemoryNVS | 0x80 (128) | ACPI NVS memory |
PcdMemoryTypeEfiReservedMemoryType | 0x510 | Reserved memory |
PcdMemoryTypeEfiRuntimeServicesCode | 0x100 | Runtime code |
PcdMemoryTypeEfiRuntimeServicesData | 0x700 | Runtime data |
Conditional PCDs (TPM_CONFIG_ENABLE=TRUE)
| PCD | Value | Purpose |
|---|---|---|
PcdTcgPhysicalPresenceInterfaceVer | "1.3" | TCG PPI specification version reported to OS |