uefi_loader/
rsdp.rs

1//! # Root/Extended System Description Pointer
2
3use uefi::prelude::*;
4use uefi::table::cfg::{ACPI_GUID, ACPI2_GUID};
5
6/// Returns the physical address of the RSDP if present, else 0.
7pub fn find_rsdp_addr() -> u64 {
8    system::with_config_table(|table| {
9        // Prefer ACPI 2.0 RSDP if available
10        table
11            .iter()
12            .find(|entry| entry.guid == ACPI2_GUID)
13            .map_or_else(
14                || {
15                    // Find ACPI 1.0 RSDP
16                    table
17                        .iter()
18                        .find(|entry| entry.guid == ACPI_GUID)
19                        .map_or(0, |entry| entry.address as usize as u64)
20                },
21                |entry| entry.address as usize as u64,
22            )
23    })
24}