Skip to content

patina-v14.4.0

Choose a tag to compare

@github-actions github-actions released this 10 Nov 20:48
· 532 commits to refs/heads/main since this release
1f259e3

What's Changed

  • gcd: Fix Mapping Memory Range Print @os-d (#1017)
    Change Details
      ## Description

    This fixes a print to print out the EFI attributes that are getting set, not the resource attributes (which are capabilities) from the resource descriptor HOB.

    In addition, move this print down to only print when we are actually setting attributes for v2 HOBs, since v1 HOBs will confusingly say we are mapping them with 0 attributes.

    • Impacts functionality?
    • Impacts security?
    • Breaking change?
    • Includes tests?
    • Includes documentation?
    • Creates a new crate?

    How This Was Tested

    N/A.

    Integration Instructions

    N/A.

      </blockquote>
      <hr>
    </details>
    
  • GCD: Move Memory Block Init to Separate Function @os-d (#1033)
    Change Details
      ## Description

    Currently, when the PHIT HOB is processed to update the GCD, it calls add_memory_space() which sees the GCD memory blocks capacity is 0, so it calls init_memory_blocks, which creates capacity in the memory blocks and then calls back into add_memory_space to add the region to the GCD, which this time sees the capacity is non-zero and so does not call init_memory_blocks again.

    This commit breaks the call to init_memory_blocks out into a separately callable function that is called when the PHIT HOB is processed. This is done to simply this call stack, most importantly because it has been observed that speculative execution can mispredict the capacity == 0 branch for other add_memory_space calls and do speculative reads of MMIO (when it believes that this memory region will be the one that is added to initialize the memory blocks) that on some platforms can cause stuck transactions (e.g. if some of the MMIO isn't back by an actual device or memory).

    It is the responsibility of the platform to correctly report its memory resources, but, we can be a bit more defensive here since an active issue was seen and this pattern was convoluted anyway.

    • Impacts functionality?
    • Impacts security?
    • Breaking change?
    • Includes tests?
    • Includes documentation?

    How This Was Tested

    Tested on Q35, SBSA, and a physical ARM64 platform.

    Integration Instructions

    N/A.

      </blockquote>
      <hr>
    </details>
    
  • Debugger: Support Reading MTRR/MAIR via Monitor Command @os-d (#1037)
    Change Details
      ## Description

    This commits an mtrr monitor cmd that accepts an address and returns the cache type for that address.

    This also updates the page fault exception handler to print the caching type since that is not present in the page table dump.

    In order to allow uefiext to parse the cache attributes in the page table walk, print MAIR_EL2 in the arch regs monitor command.

    • Impacts functionality?
    • Impacts security?
    • Breaking change?
    • Includes tests?
    • Includes documentation?

    How This Was Tested

    Tested with the accompanying uefiext changes on Q35 and SBSA.

    Integration Instructions

    N/A. Uefiext release notes will include usage.

      </blockquote>
      <hr>
    </details>
    
  • BugFix: Init GCD/System Table and others before running tests @vineelko (#1022)
    Change Details
      ## Description

    BugFix: Init GCD/System Table and others before running tests

    • Impacts functionality?
    • Impacts security?
    • Breaking change?
    • Includes tests?
    • Includes documentation?
    • Creates a new crate?

    How This Was Tested

    cargo nextest

    Integration Instructions

    NA




🚀 Features & ✨ Enhancements

  • StackTrace: Make resolve\_stacktrace script work cross-platform @vineelko (#1027)
    Change Details
      ## Description
    • Remove the dependency on Visual Studio Build Tools.
    • Remove the dependency on the DIA (Debug Interface Access) COM library, which is available only on Windows.
    • Use offline PDB parsing with native Rust libraries to make it cross-platform.
    • Improve the output of resolved stack traces.

    Fix #708

    C:\> .\resolve_stacktrace.cmd (or ./resolve_stacktrace.sh)
    Enter the PDB directory path (leave empty to use STACKTRACE_PDB_DIR env): C:\temp\stacktrace
    Enter stack trace lines (press Enter twice to finish):
    WARN -       # Child-SP              Return Address         Call Site
    WARN -       0 000001007E2796C0      000001007E27BBDC       qemu_sbsa_dxe_core+185DC
    WARN -       1 000001007E2796F0      000001007E34FB58       qemu_sbsa_dxe_core+1BDC
    WARN -       2 000001007E2797C0      000001007E34F6D0       qemu_sbsa_dxe_core+D5B54
    WARN -       3 000001007E2797F0      000001007E35076C       qemu_sbsa_dxe_core+D56CC
    WARN -       4 000001007E2798A0      000001007E29CEFC       qemu_sbsa_dxe_core+D676C
    WARN -       5 000001007E2798B0      000001007E2A9CB0       qemu_sbsa_dxe_core+22EFC
    WARN -       6 000001007E279920      000001007E2A5EF8       qemu_sbsa_dxe_core+2FCB0
    WARN -       7 000001007E279A00      000001007E2A6628       qemu_sbsa_dxe_core+2BEF8
    WARN -       8 000001007E279A90      000001007E2895A4       qemu_sbsa_dxe_core+2C628
    WARN -       9 000001007E279AD0      000001007E28A1D8       qemu_sbsa_dxe_core+F5A4
    WARN -      10 000001007E279BC0      000001007E27BE24       qemu_sbsa_dxe_core+101D8
    
    ┌────┬──────────────────────────────────────────────────────────────────────┬──────────────────┬──────────────────┬─────────────────────────────────────────────────────────────────────┐
    │ #  ┆ Source Path                                                          ┆ Child-SP         ┆ Return Address   ┆ Call Site                                                           │
    ╞════╪══════════════════════════════════════════════════════════════════════╪══════════════════╪══════════════════╪═════════════════════════════════════════════════════════════════════╡
    │ 0  ┆ /home/vineel/repos/patina/core/patina_stacktrace/src/stacktrace.rs @ ┆ 000001007E2796C0 ┆ 000001007E27BBDC ┆ qemu_sbsa_dxe_core!patina_stacktrace::stacktrace::StackTrace::dump( │
    │    ┆ 144                                                                  ┆                  ┆                  ┆ )+0xC                                                               │
    ├╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
    │ 1  ┆ /home/vineel/repos/patina-dxe-core-qemu/bin/sbsa_dxe_core.rs @ 24    ┆ 000001007E2796F0 ┆ 000001007E34FB58 ┆ qemu_sbsa_dxe_core!qemu_sbsa_dxe_core::panic(core::panic::panic_inf │
    │    ┆                                                                      ┆                  ┆                  ┆ o::PanicInfo*)+0x88                                                 │
    ├╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
    │ 2  ┆ /home/vineel/.rustup/toolchains/1.89.0-x86_64-unknown-linux-gnu/lib/ ┆ 000001007E2797C0 ┆ 000001007E34F6D0 ┆ qemu_sbsa_dxe_core!core::panicking::panic_fmt(core::fmt::Arguments, │
    │    ┆ rustlib/src/rust/library/core/src/panicking.rs @ 75                  ┆                  ┆                  ┆ core::panic::location::Location*)+0x18                              │
    ├╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
    │ 3  ┆ /home/vineel/repos/patina/components/patina_samples/src/component/he ┆ 000001007E2797F0 ┆ 000001007E35076C ┆ qemu_sbsa_dxe_core!patina_samples::component::hello_world::HelloStr │
    │    ┆ llo_world.rs @ 23                                                    ┆                  ┆                  ┆ uct::entry_point(patina_samples::component::hello_world::HelloStruc │
    │    ┆                                                                      ┆                  ┆                  ┆ t, patina::component::params::Config<i32>)+0xC4                     │
    ├╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
    │ 4  ┆ /home/vineel/repos/patina/sdk/patina/src/component/params.rs @ 254   ┆ 000001007E2798A0 ┆ 000001007E29CEFC ┆ qemu_sbsa_dxe_core!patina::component::params::impl$20::run<patina_s │
    │    ┆                                                                      ┆                  ┆                  ┆ amples::component::hello_world::HelloStruct,enum2$<core::result::Re │
    │    ┆                                                                      ┆                  ┆                  ┆ sult<tuple$<>,enum2$<patina::error::EfiError> > >,enum2$<core::resu │
    │    ┆                                                                      ┆                  ┆                  ┆ lt::Result<tuple$<>,enum2$<patina::error::EfiError> > > (*)(patina_ │
    │    ┆                                                                      ┆                  ┆                  ┆ samples::component::hello_world::HelloStruct,patina::component::par │
    │    ┆                                                                      ┆                  ┆                  ┆ ams::Config<i32>),patina::component::params::Config<i32> >(enum2$<c │
    │    ┆                                                                      ┆                  ┆                  ┆ ore::result::Result<tuple$<>,enum2$<patina::error::EfiError> > >    │
    │    ┆                                                                      ┆                  ┆                  ┆ (**)(patina_samples::component::hello_world::HelloStruct,           │
    │    ┆                                                                      ┆                  ┆                  ┆ patina::component::params::Config<i32>), enum2$<core::option::Optio │
    │    ┆                                                                      ┆                  ┆                  ┆ n<patina_samples::component::hello_world::HelloStruct> >*,          │
    │    ┆                                                                      ┆                  ┆                  ┆ tuple$<patina::component::params::Config<i32> >)+0x18               │
    ├╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
    │ 5  ┆ /home/vineel/repos/patina/sdk/patina/src/component/struct_component. ┆ 000001007E2798B0 ┆ 000001007E2A9CB0 ┆ qemu_sbsa_dxe_core!patina::component::struct_component::impl$1::run │
    │    ┆ rs @ 94                                                              ┆                  ┆                  ┆ _unsafe<tuple$<patina::component::params::RunOnce,enum2$<core::resu │
    │    ┆                                                                      ┆                  ┆                  ┆ lt::Result<tuple$<>,enum2$<patina::error::EfiError> > > (*)(patina_ │
    │    ┆                                                                      ┆                  ┆                  ┆ samples::component::hello_world::HelloStruct,patina::component::par │
    │    ┆                                                                      ┆                  ┆                  ┆ ams::Config<i32>)>,patina_samples::component::hello_world::HelloStr │
    │    ┆                                                                      ┆                  ┆                  ┆ uct,enum2$<core::result::Result<tuple$<>,enum2$<patina::error::EfiE │
    │    ┆                                                                      ┆                  ┆                  ┆ rror> > > (*)(patina_samples::component::hello_world::HelloStruct,p │
    │    ┆                                                                      ┆                  ┆                  ┆ atina::component::params::Config<i32>)>(patina::component::struct_c │
    │    ┆                                                                      ┆                  ┆                  ┆ omponent::StructComponent<tuple$<patina::component::params::RunOnce │
    │    ┆                                                                      ┆                  ┆                  ┆ ,enum2$<core::result::Result<tuple$<>,enum2$<patina::error::EfiErro │
    │    ┆                                                                      ┆                  ┆                  ┆ r> > > (*)(patina_samples::component::hello_world::HelloStruct,pati │
    │    ┆                                                                      ┆                  ┆                  ┆ na::component::params::Config<i32>)>,enum2$<core::result::Result<tu │
    │    ┆                                                                      ┆                  ┆                  ┆ ple$<>,enum2$<patina::error::EfiError> > > (*)(patina_samples::comp │
    │    ┆                                                                      ┆                  ┆                  ┆ onent::hello_world::HelloStruct,patina::component::params::Config<i │
    │    ┆                                                                      ┆                  ┆                  ┆ 32>)>*, patina::component::storage::UnsafeStorageCell)+0x58         │
    ├╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
    │ 6  ┆ /home/vineel/repos/patina/patina_dxe_core/src/lib.rs @ 371           ┆ 000001007E279920 ┆ 000001007E2A5EF8 ┆ qemu_sbsa_dxe_core!patina_dxe_core::impl$4::dispatch_components::cl │
    │    ┆                                                                      ┆                  ┆                  ┆ osure$0(patina_dxe_core::impl$4::dispatch_components::closure_env$0 │
    │    ┆                                                                      ┆                  ┆                  ┆ *, alloc::boxed::Box<dyn$<patina::component::Component>,alloc::allo │
    │    ┆                                                                      ┆                  ┆                  ┆ c::Global>*)+0xB8                                                   │
    ├╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
    │ 7  ┆ /home/vineel/.rustup/toolchains/1.89.0-x86_64-unknown-linux-gnu/lib/ ┆ 000001007E279A00 ┆ 000001007E2A6628 ┆ qemu_sbsa_dxe_core!alloc::vec::impl$1::retain_mut::process_loop<pat │
    │    ┆ rustlib/src/rust/library/alloc/src/vec/mod.rs @ 2243                 ┆                  ┆                  ┆ ina_dxe_core::impl$4::dispatch_components::closure_env$0,alloc::box │
    │    ┆                                                                      ┆                  ┆                  ┆ ed::Box<dyn$<patina::component::Component>,alloc::alloc::Global>,al │
    │    ┆                                                                      ┆                  ┆                  ┆ loc::alloc::Global,true>(unsigned long long,                        │
    │    ┆                                                                      ┆                  ┆                  ┆ patina_dxe_core::impl$4::dispatch_components::closure_env$0*, alloc │
    │    ┆                                                                      ┆                  ┆                  ┆ ::vec::impl$1::retain_mut::BackshiftOnDrop<alloc::boxed::Box<dyn$<p │
    │    ┆                                                                      ┆                  ┆                  ┆ atina::component::Component>,alloc::alloc::Global>,alloc::alloc::Gl │
    │    ┆                                                                      ┆                  ┆                  ┆ obal>*)+0x68                                                        │
    ├╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
    │ 8  ┆ /home/vineel/.rustup/toolchains/1.89.0-x86_64-unknown-linux-gnu/lib/ ┆ 000001007E279A90 ┆ 000001007E2895A4 ┆ qemu_sbsa_dxe_core!alloc::vec::Vec<alloc::boxed::Box<dyn$<patina::c │
    │    ┆ rustlib/src/rust/library/alloc/src/vec/mod.rs @ 2275                 ┆                  ┆                  ┆ omponent::Component>,alloc::alloc::Global>,alloc::alloc::Global>::r │
    │    ┆                                                                      ┆                  ┆                  ┆ etain_mut<alloc::boxed::Box<dyn$<patina::component::Component>,allo │
    │    ┆                                                                      ┆                  ┆                  ┆ c::alloc::Global>,alloc::alloc::Global,patina_dxe_core::impl$4::dis │
    │    ┆                                                                      ┆                  ┆                  ┆ patch_components::closure_env$0>(patina_dxe_core::impl$4::dispatch_ │
    │    ┆                                                                      ┆                  ┆                  ┆ components::closure_env$0)+0x44                                     │
    ├╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
    │ 9  ┆ /home/vineel/repos/patina/patina_dxe_core/src/lib.rs @ 398           ┆ 000001007E279AD0 ┆ 000001007E28A1D8 ┆ qemu_sbsa_dxe_core!patina_dxe_core::Core<patina_dxe_core::Alloc>::c │
    │    ┆                                                                      ┆                  ┆                  ┆ ore_dispatcher()+0xA4                                               │
    ├╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
    │ 10 ┆ /home/vineel/repos/patina/patina_dxe_core/src/lib.rs @ 555           ┆ 000001007E279BC0 ┆ 000001007E27BE24 ┆ qemu_sbsa_dxe_core!patina_dxe_core::Core<patina_dxe_core::Alloc>::s │
    │    ┆                                                                      ┆                  ┆                  ┆ tart(patina_dxe_core::Core<patina_dxe_core::Alloc>)+0xAF4           │
    └────┴──────────────────────────────────────────────────────────────────────┴──────────────────┴──────────────────┴─────────────────────────────────────────────────────────────────────┘
    
    C:\> .\resolve_stacktrace.cmd
    Enter the PDB directory path (leave empty to use STACKTRACE_PDB_DIR env): C:\temp\stacktrace
    Enter stack trace lines (press Enter twice to finish):
    WARN -       # Child-SP              Return Address         Call Site
    WARN -       0 000000007E8D4480      000000007E8DC5D5       qemu_q35_dxe_core+206B1
    WARN -       1 000000007E8D44D0      000000007E9E6C32       qemu_q35_dxe_core+75D5
    WARN -       2 000000007E8D45D0      000000007E9E65B2       qemu_q35_dxe_core+111C32
    WARN -       3 000000007E8D4610      000000007E9E7DD1       qemu_q35_dxe_core+1115B2
    WARN -       4 000000007E8D46E0      000000007E906FC8       qemu_q35_dxe_core+112DD1
    WARN -       5 000000007E8D4710      000000007E9070F8       qemu_q35_dxe_core+31FC8
    WARN -       6 000000007E8D47B0      000000007E915B3E       qemu_q35_dxe_core+320F8
    WARN -       7 000000007E8D47F0      000000007E9114C8       qemu_q35_dxe_core+40B3E
    WARN -       8 000000007E8D48F0      000000007E911D81       qemu_q35_dxe_core+3C4C8
    WARN -       9 000000007E8D49A0      000000007E8EB7AE       qemu_q35_dxe_core+3CD81
    WARN -      10 000000007E8D4A10      000000007E8EC7F6       qemu_q35_dxe_core+167AE
    WARN -      11 000000007E8D4B10      000000007E8DCA9D       qemu_q35_dxe_core+177F6
    WARN -      12 000000007E8D4D10      000000007EBE338F       qemu_q35_dxe_core+7A9D
    
    ┌────┬──────────────────────────────────────────────────────────────────────┬──────────────────┬──────────────────┬─────────────────────────────────────────────────────────────────────┐
    │ #  ┆ Source Path                                                          ┆ Child-SP         ┆ Return Address   ┆ Call Site                                                           │
    ╞════╪══════════════════════════════════════════════════════════════════════╪══════════════════╪══════════════════╪═════════════════════════════════════════════════════════════════════╡
    │ 0  ┆ E:\repos\patina\core\patina_stacktrace\src\stacktrace.rs @ 162       ┆ 000000007E8D4480 ┆ 000000007E8DC5D5 ┆ qemu_q35_dxe_core!patina_stacktrace::stacktrace::StackTrace::dump() │
    │    ┆                                                                      ┆                  ┆                  ┆ +0xF                                                                │
    ├╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
    │ 1  ┆ E:\repos\patina-dxe-core-qemu\bin\q35_dxe_core.rs @ 27               ┆ 000000007E8D44D0 ┆ 000000007E9E6C32 ┆ qemu_q35_dxe_core!qemu_q35_dxe_core::panic(core::panic::panic_info: │
    │    ┆                                                                      ┆                  ┆                  ┆ :PanicInfo*)+0xB2                                                   │
    ├╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
    │ 2  ┆ C:\Users\vineelko\.rustup\toolchains\1.89.0-x86_64-pc-windows-msvc\l ┆ 000000007E8D45D0 ┆ 000000007E9E65B2 ┆ qemu_q35_dxe_core!core::panicking::panic_fmt(core::fmt::Arguments,  │
    │    ┆ ib\rustlib\src\rust\library\core\src\panicking.rs @ 75               ┆                  ┆                  ┆ core::panic::location::Location*)+0x1E                              │
    ├╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
    │ 3  ┆ E:\repos\patina\components\patina_samples\src\component\hello_world. ┆ 000000007E8D4610 ┆ 000000007E9E7DD1 ┆ qemu_q35_dxe_core!patina_samples::component::hello_world::HelloStru │
    │    ┆ rs @ 23                                                              ┆                  ┆                  ┆ ct::entry_point(patina_samples::component::hello_world::HelloStruct │
    │    ┆                                                                      ┆                  ┆                  ┆ , patina::component::params::Config<i32>)+0x109                     │
    ├╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
    │ 4  ┆ E:\repos\patina\sdk\patina\src\component\params.rs @ 254             ┆ 000000007E8D46E0 ┆ 000000007E906FC8 ┆ qemu_q35_dxe_core!patina::component::params::impl$20::run<patina_sa │
    │    ┆                                                                      ┆                  ┆                  ┆ mples::component::hello_world::HelloStruct,enum2$<core::result::Res │
    │    ┆                                                                      ┆                  ┆                  ┆ ult<tuple$<>,enum2$<patina::error::EfiError> > >,enum2$<core::resul │
    │    ┆                                                                      ┆                  ┆                  ┆ t::Result<tuple$<>,enum2$<patina::error::EfiError> > > (*)(patina_s │
    │    ┆                                                                      ┆                  ┆                  ┆ amples::component::hello_world::HelloStruct,patina::component::para │
    │    ┆                                                                      ┆                  ┆                  ┆ ms::Config<i32>),patina::component::params::Config<i32> >(enum2$<co │
    │    ┆                                                                      ┆                  ┆                  ┆ re::result::Result<tuple$<>,enum2$<patina::error::EfiError> > >     │
    │    ┆                                                                      ┆                  ┆                  ┆ (**)(patina_samples::component::hello_world::HelloStruct,           │
    │    ┆                                                                      ┆                  ┆                  ┆ patina::component::params::Config<i32>), enum2$<core::option::Optio │
    │    ┆                                                                      ┆                  ┆                  ┆ n<patina_samples::component::hello_world::HelloStruct> >*,          │
    │    ┆                                                                      ┆                  ┆                  ┆ tuple$<patina::component::params::Config<i32> >)+0x29               │
    ├╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
    │ 5  ┆ E:\repos\patina\sdk\patina\src\component\struct_component.rs @ 94    ┆ 000000007E8D4710 ┆ 000000007E9070F8 ┆ qemu_q35_dxe_core!patina::component::struct_component::impl$1::run_ │
    │    ┆                                                                      ┆                  ┆                  ┆ unsafe<tuple$<patina::component::params::RunOnce,enum2$<core::resul │
    │    ┆                                                                      ┆                  ┆                  ┆ t::Result<tuple$<>,enum2$<patina::error::EfiError> > > (*)(patina_s │
    │    ┆                                                                      ┆                  ┆                  ┆ amples::component::hello_world::HelloStruct,patina::component::para │
    │    ┆                                                                      ┆                  ┆                  ┆ ms::Config<i32>)>,patina_samples::component::hello_world::HelloStru │
    │    ┆                                                                      ┆                  ┆                  ┆ ct,enum2$<core::result::Result<tuple$<>,enum2$<patina::error::EfiEr │
    │    ┆                                                                      ┆                  ┆                  ┆ ror> > > (*)(patina_samples::component::hello_world::HelloStruct,pa │
    │    ┆                                                                      ┆                  ┆                  ┆ tina::component::params::Config<i32>)>(patina::component::struct_co │
    │    ┆                                                                      ┆                  ┆                  ┆ mponent::StructComponent<tuple$<patina::component::params::RunOnce, │
    │    ┆                                                                      ┆                  ┆                  ┆ enum2$<core::result::Result<tuple$<>,enum2$<patina::error::EfiError │
    │    ┆                                                                      ┆                  ┆                  ┆ > > > (*)(patina_samples::component::hello_world::HelloStruct,patin │
    │    ┆                                                                      ┆                  ┆                  ┆ a::component::params::Config<i32>)>,enum2$<core::result::Result<tup │
    │    ┆                                                                      ┆                  ┆                  ┆ le$<>,enum2$<patina::error::EfiError> > > (*)(patina_samples::compo │
    │    ┆                                                                      ┆                  ┆                  ┆ nent::hello_world::HelloStruct,patina::component::params::Config<i3 │
    │    ┆                                                                      ┆                  ┆                  ┆ 2>)>*, patina::component::storage::UnsafeStorageCell)+0x63          │
    ├╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
    │ 6  ┆ E:\repos\patina\sdk\patina\src\component.rs @ 165                    ┆ 000000007E8D47B0 ┆ 000000007E915B3E ┆ qemu_q35_dxe_core!patina::component::Component::run<patina::compone │
    │    ┆                                                                      ┆                  ┆                  ┆ nt::struct_component::StructComponent<tuple$<patina::component::par │
    │    ┆                                                                      ┆                  ┆                  ┆ ams::RunOnce,enum2$<core::result::Result<tuple$<>,enum2$<patina::er │
    │    ┆                                                                      ┆                  ┆                  ┆ ror::EfiError> > > (*)(patina_samples::component::hello_world::Hell │
    │    ┆                                                                      ┆                  ┆                  ┆ oStruct,patina::component::params::Config<i32>)>,enum2$<core::resul │
    │    ┆                                                                      ┆                  ┆                  ┆ t::Result<tuple$<>,enum2$<patina::error::EfiError> > > (*)(patina_s │
    │    ┆                                                                      ┆                  ┆                  ┆ amples::component::hello_world::HelloStruct,patina::component::para │
    │    ┆                                                                      ┆                  ┆                  ┆ ms::Config<i32>)> >(patina::component::struct_component::StructComp │
    │    ┆                                                                      ┆                  ┆                  ┆ onent<tuple$<patina::component::params::RunOnce,enum2$<core::result │
    │    ┆                                                                      ┆                  ┆                  ┆ ::Result<tuple$<>,enum2$<patina::error::EfiError> > > (*)(patina_sa │
    │    ┆                                                                      ┆                  ┆                  ┆ mples::component::hello_world::HelloStruct,patina::component::param │
    │    ┆                                                                      ┆                  ┆                  ┆ s::Config<i32>)>,enum2$<core::result::Result<tuple$<>,enum2$<patina │
    │    ┆                                                                      ┆                  ┆                  ┆ ::error::EfiError> > > (*)(patina_samples::component::hello_world:: │
    │    ┆                                                                      ┆                  ┆                  ┆ HelloStruct,patina::component::params::Config<i32>)>*,              │
    │    ┆                                                                      ┆                  ┆                  ┆ patina::component::storage::Storage*)+0x2E                          │
    ├╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
    │ 7  ┆ E:\repos\patina\patina_dxe_core\src\lib.rs @ 371                     ┆ 000000007E8D47F0 ┆ 000000007E9114C8 ┆ qemu_q35_dxe_core!patina_dxe_core::impl$4::dispatch_components::clo │
    │    ┆                                                                      ┆                  ┆                  ┆ sure$0(patina_dxe_core::impl$4::dispatch_components::closure_env$0* │
    │    ┆                                                                      ┆                  ┆                  ┆ , alloc::boxed::Box<dyn$<patina::component::Component>,alloc::alloc │
    │    ┆                                                                      ┆                  ┆                  ┆ ::Global>*)+0xDA                                                    │
    ├╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
    │ 8  ┆ C:\Users\vineelko\.rustup\toolchains\1.89.0-x86_64-pc-windows-msvc\l ┆ 000000007E8D48F0 ┆ 000000007E911D81 ┆ qemu_q35_dxe_core!alloc::vec::impl$1::retain_mut::process_loop<pati │
    │    ┆ ib\rustlib\src\rust\library\alloc\src\vec\mod.rs @ 2243              ┆                  ┆                  ┆ na_dxe_core::impl$4::dispatch_components::closure_env$0,alloc::boxe │
    │    ┆                                                                      ┆                  ┆                  ┆ d::Box<dyn$<patina::component::Component>,alloc::alloc::Global>,all │
    │    ┆                                                                      ┆                  ┆                  ┆ oc::alloc::Global,true>(unsigned long long,                         │
    │    ┆                                                                      ┆                  ┆                  ┆ patina_dxe_core::impl$4::dispatch_components::closure_env$0*, alloc │
    │    ┆                                                                      ┆                  ┆                  ┆ ::vec::impl$1::retain_mut::BackshiftOnDrop<alloc::boxed::Box<dyn$<p │
    │    ┆                                                                      ┆                  ┆                  ┆ atina::component::Component>,alloc::alloc::Global>,alloc::alloc::Gl │
    │    ┆                                                                      ┆                  ┆                  ┆ obal>*)+0x68                                                        │
    ├╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
    │ 9  ┆ C:\Users\vineelko\.rustup\toolchains\1.89.0-x86_64-pc-windows-msvc\l ┆ 000000007E8D49A0 ┆ 000000007E8EB7AE ┆ qemu_q35_dxe_core!alloc::vec::Vec<alloc::boxed::Box<dyn$<patina::co │
    │    ┆ ib\rustlib\src\rust\library\alloc\src\vec\mod.rs @ 2275              ┆                  ┆                  ┆ mponent::Component>,alloc::alloc::Global>,alloc::alloc::Global>::re │
    │    ┆                                                                      ┆                  ┆                  ┆ tain_mut<alloc::boxed::Box<dyn$<patina::component::Component>,alloc │
    │    ┆                                                                      ┆                  ┆                  ┆ ::alloc::Global>,alloc::alloc::Global,patina_dxe_core::impl$4::disp │
    │    ┆                                                                      ┆                  ┆                  ┆ atch_components::closure_env$0>(patina_dxe_core::impl$4::dispatch_c │
    │    ┆                                                                      ┆                  ┆                  ┆ omponents::closure_env$0)+0x50                                      │
    ├╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
    │ 10 ┆ E:\repos\patina\patina_dxe_core\src\lib.rs @ 398                     ┆ 000000007E8D4A10 ┆ 000000007E8EC7F6 ┆ qemu_q35_dxe_core!patina_dxe_core::Core<patina_dxe_core::Alloc>::co │
    │    ┆                                                                      ┆                  ┆                  ┆ re_dispatcher()+0x89                                                │
    ├╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
    │ 11 ┆ E:\repos\patina\patina_dxe_core\src\lib.rs @ 555                     ┆ 000000007E8D4B10 ┆ 000000007E8DCA9D ┆ qemu_q35_dxe_core!patina_dxe_core::Core<patina_dxe_core::Alloc>::st │
    │    ┆                                                                      ┆                  ┆                  ┆ art(patina_dxe_core::Core<patina_dxe_core::Alloc>)+0xEAE            │
    ├╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
    │ 12 ┆ E:\repos\patina-dxe-core-qemu\bin\q35_dxe_core.rs @ 113              ┆ 000000007E8D4D10 ┆ 000000007EBE338F ┆ qemu_q35_dxe_core!qemu_q35_dxe_core::_start(core::ffi::c_void*)+0x4 │
    │    ┆                                                                      ┆                  ┆                  ┆ 14                                                                  │
    └────┴──────────────────────────────────────────────────────────────────────┴──────────────────┴──────────────────┴─────────────────────────────────────────────────────────────────────┘

    The input may include additional whitespace before each frame, a timestamp in
    the format shown, or a log prefix level. All of those are ignored.

    Allowed Examples

    Each of these examples will produce the same output:

    13:39:09.014 : INFO -       # Child-SP              Return Address         Call Site
    13:39:09.014 : INFO -       0 000000007E96F930      000000007E982668       qemu_q35_dxe_core-2d9bed3cc1f2b4ea+6E1BF
    13:39:09.014 : INFO -       1 000000007E96F960      000000007EA8B92F       qemu_q35_dxe_core-2d9bed3cc1f2b4ea+12668
    13:39:09.014 : INFO -       2 000000007E96FA70      000000007E9739E0       qemu_q35_dxe_core-2d9bed3cc1f2b4ea+11B92F
    13:39:09.014 : INFO -       3 000000007E96FAB0      000000007E98301D       qemu_q35_dxe_core-2d9bed3cc1f2b4ea+39E0
    13:39:09.014 : INFO -       4 000000007E96FC00      000000007EBE62F4       qemu_q35_dxe_core-2d9bed3cc1f2b4ea+1301D
    INFO -       # Child-SP              Return Address         Call Site
    INFO -       0 000000007E96F930      000000007E982668       qemu_q35_dxe_core-2d9bed3cc1f2b4ea+6E1BF
    INFO -       1 000000007E96F960      000000007EA8B92F       qemu_q35_dxe_core-2d9bed3cc1f2b4ea+12668
    INFO -       2 000000007E96FA70      000000007E9739E0       qemu_q35_dxe_core-2d9bed3cc1f2b4ea+11B92F
    INFO -       3 000000007E96FAB0      000000007E98301D       qemu_q35_dxe_core-2d9bed3cc1f2b4ea+39E0
    INFO -       4 000000007E96FC00      000000007EBE62F4       qemu_q35_dxe_core-2d9bed3cc1f2b4ea+1301D
    # Child-SP              Return Address         Call Site
    0 000000007E96F930      000000007E982668       qemu_q35_dxe_core-2d9bed3cc1f2b4ea+6E1BF
    1 000000007E96F960      000000007EA8B92F       qemu_q35_dxe_core-2d9bed3cc1f2b4ea+12668
    2 000000007E96FA70      000000007E9739E0       qemu_q35_dxe_core-2d9bed3cc1f2b4ea+11B92F
    3 000000007E96FAB0      000000007E98301D       qemu_q35_dxe_core-2d9bed3cc1f2b4ea+39E0
    4 000000007E96FC00      000000007EBE62F4       qemu_q35_dxe_core-2d9bed3cc1f2b4ea+1301D
    • Impacts functionality?
    • Impacts security?
    • Breaking change?
    • Includes tests?
    • Includes documentation?

    How This Was Tested

    Validated on both Windows/WSL on Q35 and AArch64 flavors.

    Integration Instructions

    On Windows, use .\resolve_stacktrace.cmd. On Linux/WSL, use ./resolve_stacktrace.sh

      </blockquote>
      <hr>
    </details>
    

🐛 Bug Fixes

  • dxe\_core: init\_paging: Ensure Correct Memory Allocation Module @os-d (#1006)
    Change Details
      ## Description

    Many systems only have a single memory allocation module HOB that is produced, which is for DXE Core. However, some systems, such as those using EDK II's Standalone MM IPL, can have additional memory allocation module HOBs.

    This updates the init_paging routine to ensure it is only finding the DXE Core memory allocation module HOB to map; a similar change was made to the image initialization code, but wasn't also done here.

    • Impacts functionality?
    • Impacts security?
    • Breaking change?
    • Includes tests?
    • Includes documentation?
    • Creates a new crate?

    How This Was Tested

    Booting Q35 to Windows.

    Integration Instructions

    N/A.

      </blockquote>
      <hr>
    </details>
    
  • dxe\_core: Always Apply NX to UC Memory @os-d (#1032)
    Change Details
      ## Description

    This commit adds a new memory rules function that is easy to audit the rules that Patina applies to memory. For now, this function consists of a single rule, which is if EFI_MEMORY_UC is set on a range, EFI_MEMORY_XP must also be set.

    In DXE, we should never be executing from UC memory and on AArch64 it is architecturally defined as a programming error to have device memory (what UC maps to) that is not marked XP. EDK II's ArmCpuDxe always sets XP when UC is requested.

    It has been observed that speculative execution on AArch64 platforms can attempt to do an instruction fetch from device memory (which is allowed if XP is not set) and crash the system if the region touched is MMIO that does not have backing memory (say space between device registers).

    For all architectures, Patina enforces that UC memory should not be executed from.

    This commit also makes the XP requirement for all added memory more explicit in adding resource descriptor HOBs, though this is not a functional change.

    • Impacts functionality?
    • Impacts security?
    • Breaking change?
    • Includes tests?
    • Includes documentation?

    How This Was Tested

    Tested by booting to Windows on Q35, SBSA, and physical ARM64 and Intel platforms

    Integration Instructions

    N/A.

      </blockquote>
      <hr>
    </details>
    
  • Fix #176: Reject images when memory protections fail @garybeihl (#1028)
    Change Details
      ## Description

    Fixes #176

    This commit changes apply_image_memory_protections() to return a Result and propagates the error up to core_load_pe_image(). If memory protections cannot be applied to any section, the entire image load fails with an error.


    Previously, when apply_image_memory_protections() failed to set memory space attributes for an image section, the error was logged but the image continued to load. This security risk allowed images to run without proper authentication.

    This commit changes apply_image_memory_protections() to return a Result and propagates the error up to core_load_pe_image(). If memory protections cannot be applied to any section, the entire image load fails with an error.

    Changes:

    • Modified apply_image_memory_protections() signature to return Result<(), EfiError>
    • Added error propagation when core_set_memory_space_attributes() fails
    • Updated call site in core_load_pe_image() to use the ? operator
    • All existing tests (383) pass successfully

    • Impacts functionality?
    • Impacts security?
    • Breaking change?
    • Includes tests?
    • Includes documentation?

    How This Was Tested

    Ran and passed patina_dxe_core test suite

    Integration Instructions

    N/A




🔐 Security Impacting

  • dxe\_core: Always Apply NX to UC Memory @os-d (#1032)
    Change Details
      ## Description

    This commit adds a new memory rules function that is easy to audit the rules that Patina applies to memory. For now, this function consists of a single rule, which is if EFI_MEMORY_UC is set on a range, EFI_MEMORY_XP must also be set.

    In DXE, we should never be executing from UC memory and on AArch64 it is architecturally defined as a programming error to have device memory (what UC maps to) that is not marked XP. EDK II's ArmCpuDxe always sets XP when UC is requested.

    It has been observed that speculative execution on AArch64 platforms can attempt to do an instruction fetch from device memory (which is allowed if XP is not set) and crash the system if the region touched is MMIO that does not have backing memory (say space between device registers).

    For all architectures, Patina enforces that UC memory should not be executed from.

    This commit also makes the XP requirement for all added memory more explicit in adding resource descriptor HOBs, though this is not a functional change.

    • Impacts functionality?
    • Impacts security?
    • Breaking change?
    • Includes tests?
    • Includes documentation?

    How This Was Tested

    Tested by booting to Windows on Q35, SBSA, and physical ARM64 and Intel platforms

    Integration Instructions

    N/A.

      </blockquote>
      <hr>
    </details>
    
  • Fix #176: Reject images when memory protections fail @garybeihl (#1028)
    Change Details
      ## Description

    Fixes #176

    This commit changes apply_image_memory_protections() to return a Result and propagates the error up to core_load_pe_image(). If memory protections cannot be applied to any section, the entire image load fails with an error.


    Previously, when apply_image_memory_protections() failed to set memory space attributes for an image section, the error was logged but the image continued to load. This security risk allowed images to run without proper authentication.

    This commit changes apply_image_memory_protections() to return a Result and propagates the error up to core_load_pe_image(). If memory protections cannot be applied to any section, the entire image load fails with an error.

    Changes:

    • Modified apply_image_memory_protections() signature to return Result<(), EfiError>
    • Added error propagation when core_set_memory_space_attributes() fails
    • Updated call site in core_load_pe_image() to use the ? operator
    • All existing tests (383) pass successfully

    • Impacts functionality?
    • Impacts security?
    • Breaking change?
    • Includes tests?
    • Includes documentation?

    How This Was Tested

    Ran and passed patina_dxe_core test suite

    Integration Instructions

    N/A




📖 Documentation Updates

  • RFC: `AMLParser` UEFI service @berlin-with0ut-return (#883)
    Change Details
      ## Description RFC proposes a new AML handling service.

    Reviewers: please focus on functional and design considerations as Copilot will catch grammatical/formatting errors.

    • Impacts functionality?
    • Impacts security?
    • Breaking change?
    • Includes tests?
    • Includes documentation?

    How This Was Tested

    N/A.

    Integration Instructions

    Will change the RFC# upon merge.

      </blockquote>
      <hr>
    </details>
    
  • mdbook: Introduction: newline between bullets @Javagedes (#1024)
    Change Details
      ## Description

    A minor change to add a newline between bullets so that mdbook formats them correctly.

    • Impacts functionality?
    • Impacts security?
    • Breaking change?
    • Includes tests?
    • Includes documentation?
    • Creates a new crate?

    How This Was Tested

    N/A

    Integration Instructions

    N/A

      </blockquote>
      <hr>
    </details>
    

Full Changelog: patina-v14.3.2...v14.4.0