patina-v14.4.0
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 nextestIntegration 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