17a29d4fcSLoGin use system_error::SystemError; 27a29d4fcSLoGin 37a29d4fcSLoGin use crate::{libs::rwlock::RwLock, mm::PhysAddr}; 47a29d4fcSLoGin 5*92849878SLoGin use self::{guid::DragonStubPayloadEFI, memmap::EFIMemoryMapInfo}; 67a29d4fcSLoGin 77a29d4fcSLoGin mod fdt; 8*92849878SLoGin pub mod guid; 97a29d4fcSLoGin pub mod init; 107a29d4fcSLoGin pub mod memmap; 11*92849878SLoGin pub mod tables; 127a29d4fcSLoGin 137a29d4fcSLoGin static EFI_MANAGER: EFIManager = EFIManager::new(); 147a29d4fcSLoGin 157a29d4fcSLoGin /// EFI管理器 167a29d4fcSLoGin /// 177a29d4fcSLoGin /// 数据成员可参考: https://code.dragonos.org.cn/xref/linux-6.1.9/include/linux/efi.h#620 187a29d4fcSLoGin #[derive(Debug)] 197a29d4fcSLoGin pub struct EFIManager { 207a29d4fcSLoGin inner: RwLock<InnerEFIManager>, 217a29d4fcSLoGin } 227a29d4fcSLoGin 237a29d4fcSLoGin #[inline(always)] 247a29d4fcSLoGin pub fn efi_manager() -> &'static EFIManager { 257a29d4fcSLoGin &EFI_MANAGER 267a29d4fcSLoGin } 277a29d4fcSLoGin 287a29d4fcSLoGin #[derive(Debug)] 297a29d4fcSLoGin struct InnerEFIManager { 307a29d4fcSLoGin pub mmap: EFIMemoryMapInfo, 317a29d4fcSLoGin /// EFI模块启动时状态的标识 327a29d4fcSLoGin pub init_flags: EFIInitFlags, 337a29d4fcSLoGin /// runtime services的物理地址 347a29d4fcSLoGin pub runtime_paddr: Option<PhysAddr>, 357a29d4fcSLoGin /// runtime services的版本号 367a29d4fcSLoGin pub runtime_service_version: Option<uefi_raw::table::Revision>, 37*92849878SLoGin pub dragonstub_load_info: Option<DragonStubPayloadEFI>, 387a29d4fcSLoGin } 397a29d4fcSLoGin 407a29d4fcSLoGin impl EFIManager { 417a29d4fcSLoGin const fn new() -> Self { 427a29d4fcSLoGin EFIManager { 437a29d4fcSLoGin inner: RwLock::new(InnerEFIManager { 447a29d4fcSLoGin mmap: EFIMemoryMapInfo::DEFAULT, 457a29d4fcSLoGin init_flags: EFIInitFlags::empty(), 467a29d4fcSLoGin runtime_paddr: None, 477a29d4fcSLoGin runtime_service_version: None, 48*92849878SLoGin dragonstub_load_info: None, 497a29d4fcSLoGin }), 507a29d4fcSLoGin } 517a29d4fcSLoGin } 527a29d4fcSLoGin 537a29d4fcSLoGin pub fn desc_version(&self) -> usize { 547a29d4fcSLoGin return self.inner.read().mmap.desc_version; 557a29d4fcSLoGin } 567a29d4fcSLoGin 577a29d4fcSLoGin /// 检查是否为有效的system table表头 587a29d4fcSLoGin /// 597a29d4fcSLoGin /// ## 参数 607a29d4fcSLoGin /// 617a29d4fcSLoGin /// - header: system table表头 627a29d4fcSLoGin /// - min_major: 最小的major版本号。如果不满足,则会输出Warning,并返回Ok 637a29d4fcSLoGin /// 647a29d4fcSLoGin /// ## 返回 657a29d4fcSLoGin /// 667a29d4fcSLoGin /// - Ok(()): 检查通过 677a29d4fcSLoGin /// - Err(SystemError::EINVAL): header无效 687a29d4fcSLoGin pub fn check_system_table_header( 697a29d4fcSLoGin &self, 707a29d4fcSLoGin header: &uefi_raw::table::Header, 717a29d4fcSLoGin min_major: u16, 727a29d4fcSLoGin ) -> Result<(), SystemError> { 737a29d4fcSLoGin if header.signature != uefi_raw::table::system::SystemTable::SIGNATURE { 747a29d4fcSLoGin kerror!("System table signature mismatch!"); 757a29d4fcSLoGin return Err(SystemError::EINVAL); 767a29d4fcSLoGin } 777a29d4fcSLoGin 787a29d4fcSLoGin if header.revision.major() < min_major { 797a29d4fcSLoGin kwarn!( 807a29d4fcSLoGin "System table version: {:?}, expected {}.00 or greater!", 817a29d4fcSLoGin header.revision, 827a29d4fcSLoGin min_major 837a29d4fcSLoGin ); 847a29d4fcSLoGin } 857a29d4fcSLoGin 867a29d4fcSLoGin return Ok(()); 877a29d4fcSLoGin } 887a29d4fcSLoGin } 897a29d4fcSLoGin 907a29d4fcSLoGin // 在Rust中,我们使用枚举和bitflags来表示这些宏 917a29d4fcSLoGin bitflags! { 927a29d4fcSLoGin pub struct EFIInitFlags: u32 { 937a29d4fcSLoGin /// 当前使用EFI启动 947a29d4fcSLoGin const BOOT = 1 << 0; 957a29d4fcSLoGin /// 是否可以使用EFI配置表 967a29d4fcSLoGin const CONFIG_TABLES = 1 << 1; 977a29d4fcSLoGin /// 是否可以使用运行时服务 987a29d4fcSLoGin const RUNTIME_SERVICES = 1 << 2; 997a29d4fcSLoGin /// 是否可以使用EFI内存映射 1007a29d4fcSLoGin const MEMMAP = 1 << 3; 1017a29d4fcSLoGin /// 固件是否为64位 1027a29d4fcSLoGin const EFI_64BIT = 1 << 4; 1037a29d4fcSLoGin /// 访问是否通过虚拟化接口 1047a29d4fcSLoGin const PARAVIRT = 1 << 5; 1057a29d4fcSLoGin /// 第一架构特定位 1067a29d4fcSLoGin const ARCH_1 = 1 << 6; 1077a29d4fcSLoGin /// 打印附加运行时调试信息 1087a29d4fcSLoGin const DBG = 1 << 7; 1097a29d4fcSLoGin /// 是否可以在运行时数据区域映射非可执行 1107a29d4fcSLoGin const NX_PE_DATA = 1 << 8; 1117a29d4fcSLoGin /// 固件是否发布了一个EFI_MEMORY_ATTRIBUTES表 1127a29d4fcSLoGin const MEM_ATTR = 1 << 9; 1137a29d4fcSLoGin /// 内核是否配置为忽略软保留 1147a29d4fcSLoGin const MEM_NO_SOFT_RESERVE = 1 << 10; 1157a29d4fcSLoGin /// 是否可以使用EFI引导服务内存段 1167a29d4fcSLoGin const PRESERVE_BS_REGIONS = 1 << 11; 1177a29d4fcSLoGin 1187a29d4fcSLoGin } 1197a29d4fcSLoGin } 120