17a29d4fcSLoGin use system_error::SystemError; 27a29d4fcSLoGin 3*471d65cfSLoGin use crate::{ 4*471d65cfSLoGin libs::rwlock::{RwLock, RwLockReadGuard, RwLockWriteGuard}, 5*471d65cfSLoGin mm::PhysAddr, 6*471d65cfSLoGin }; 77a29d4fcSLoGin 892849878SLoGin use self::{guid::DragonStubPayloadEFI, memmap::EFIMemoryMapInfo}; 97a29d4fcSLoGin 10*471d65cfSLoGin pub mod esrt; 117a29d4fcSLoGin mod fdt; 1292849878SLoGin pub mod guid; 137a29d4fcSLoGin pub mod init; 147a29d4fcSLoGin pub mod memmap; 1592849878SLoGin pub mod tables; 167a29d4fcSLoGin 177a29d4fcSLoGin static EFI_MANAGER: EFIManager = EFIManager::new(); 187a29d4fcSLoGin 197a29d4fcSLoGin /// EFI管理器 207a29d4fcSLoGin /// 217a29d4fcSLoGin /// 数据成员可参考: https://code.dragonos.org.cn/xref/linux-6.1.9/include/linux/efi.h#620 227a29d4fcSLoGin #[derive(Debug)] 237a29d4fcSLoGin pub struct EFIManager { 247a29d4fcSLoGin inner: RwLock<InnerEFIManager>, 257a29d4fcSLoGin } 267a29d4fcSLoGin 277a29d4fcSLoGin #[inline(always)] 287a29d4fcSLoGin pub fn efi_manager() -> &'static EFIManager { 297a29d4fcSLoGin &EFI_MANAGER 307a29d4fcSLoGin } 317a29d4fcSLoGin 327a29d4fcSLoGin #[derive(Debug)] 337a29d4fcSLoGin struct InnerEFIManager { 347a29d4fcSLoGin pub mmap: EFIMemoryMapInfo, 357a29d4fcSLoGin /// EFI模块启动时状态的标识 367a29d4fcSLoGin pub init_flags: EFIInitFlags, 377a29d4fcSLoGin /// runtime services的物理地址 387a29d4fcSLoGin pub runtime_paddr: Option<PhysAddr>, 397a29d4fcSLoGin /// runtime services的版本号 407a29d4fcSLoGin pub runtime_service_version: Option<uefi_raw::table::Revision>, 4192849878SLoGin pub dragonstub_load_info: Option<DragonStubPayloadEFI>, 42453452ccSLoGin /// uefi 内存属性表的物理地址 43453452ccSLoGin pub memory_attribute_table_paddr: Option<PhysAddr>, 44453452ccSLoGin /// uefi 内存保留表的物理地址 45453452ccSLoGin pub memreserve_table_paddr: Option<PhysAddr>, 46*471d65cfSLoGin /// uefi esrt表的物理地址 47*471d65cfSLoGin pub esrt_table_paddr: Option<PhysAddr>, 487a29d4fcSLoGin } 497a29d4fcSLoGin 507a29d4fcSLoGin impl EFIManager { 517a29d4fcSLoGin const fn new() -> Self { 527a29d4fcSLoGin EFIManager { 537a29d4fcSLoGin inner: RwLock::new(InnerEFIManager { 547a29d4fcSLoGin mmap: EFIMemoryMapInfo::DEFAULT, 557a29d4fcSLoGin init_flags: EFIInitFlags::empty(), 567a29d4fcSLoGin runtime_paddr: None, 577a29d4fcSLoGin runtime_service_version: None, 5892849878SLoGin dragonstub_load_info: None, 59453452ccSLoGin memory_attribute_table_paddr: None, 60453452ccSLoGin memreserve_table_paddr: None, 61*471d65cfSLoGin esrt_table_paddr: None, 627a29d4fcSLoGin }), 637a29d4fcSLoGin } 647a29d4fcSLoGin } 657a29d4fcSLoGin 667a29d4fcSLoGin pub fn desc_version(&self) -> usize { 677a29d4fcSLoGin return self.inner.read().mmap.desc_version; 687a29d4fcSLoGin } 697a29d4fcSLoGin 70453452ccSLoGin /// 内核加载的地址、大小的信息 71453452ccSLoGin #[allow(dead_code)] 72453452ccSLoGin pub fn kernel_load_info(&self) -> Option<DragonStubPayloadEFI> { 73453452ccSLoGin return self.inner.read().dragonstub_load_info; 74453452ccSLoGin } 75453452ccSLoGin 767a29d4fcSLoGin /// 检查是否为有效的system table表头 777a29d4fcSLoGin /// 787a29d4fcSLoGin /// ## 参数 797a29d4fcSLoGin /// 807a29d4fcSLoGin /// - header: system table表头 817a29d4fcSLoGin /// - min_major: 最小的major版本号。如果不满足,则会输出Warning,并返回Ok 827a29d4fcSLoGin /// 837a29d4fcSLoGin /// ## 返回 847a29d4fcSLoGin /// 857a29d4fcSLoGin /// - Ok(()): 检查通过 867a29d4fcSLoGin /// - Err(SystemError::EINVAL): header无效 877a29d4fcSLoGin pub fn check_system_table_header( 887a29d4fcSLoGin &self, 897a29d4fcSLoGin header: &uefi_raw::table::Header, 907a29d4fcSLoGin min_major: u16, 917a29d4fcSLoGin ) -> Result<(), SystemError> { 927a29d4fcSLoGin if header.signature != uefi_raw::table::system::SystemTable::SIGNATURE { 937a29d4fcSLoGin kerror!("System table signature mismatch!"); 947a29d4fcSLoGin return Err(SystemError::EINVAL); 957a29d4fcSLoGin } 967a29d4fcSLoGin 977a29d4fcSLoGin if header.revision.major() < min_major { 987a29d4fcSLoGin kwarn!( 997a29d4fcSLoGin "System table version: {:?}, expected {}.00 or greater!", 1007a29d4fcSLoGin header.revision, 1017a29d4fcSLoGin min_major 1027a29d4fcSLoGin ); 1037a29d4fcSLoGin } 1047a29d4fcSLoGin 1057a29d4fcSLoGin return Ok(()); 1067a29d4fcSLoGin } 107*471d65cfSLoGin 108*471d65cfSLoGin fn inner_read(&self) -> RwLockReadGuard<InnerEFIManager> { 109*471d65cfSLoGin self.inner.read() 110*471d65cfSLoGin } 111*471d65cfSLoGin 112*471d65cfSLoGin fn inner_write(&self) -> RwLockWriteGuard<InnerEFIManager> { 113*471d65cfSLoGin self.inner.write() 114*471d65cfSLoGin } 115*471d65cfSLoGin 116*471d65cfSLoGin /// 是否存在ESRT表 117*471d65cfSLoGin fn esrt_table_exists(&self) -> bool { 118*471d65cfSLoGin self.inner_read().esrt_table_paddr.is_some() 119*471d65cfSLoGin } 1207a29d4fcSLoGin } 1217a29d4fcSLoGin 1227a29d4fcSLoGin // 在Rust中,我们使用枚举和bitflags来表示这些宏 1237a29d4fcSLoGin bitflags! { 1247a29d4fcSLoGin pub struct EFIInitFlags: u32 { 1257a29d4fcSLoGin /// 当前使用EFI启动 1267a29d4fcSLoGin const BOOT = 1 << 0; 1277a29d4fcSLoGin /// 是否可以使用EFI配置表 1287a29d4fcSLoGin const CONFIG_TABLES = 1 << 1; 1297a29d4fcSLoGin /// 是否可以使用运行时服务 1307a29d4fcSLoGin const RUNTIME_SERVICES = 1 << 2; 1317a29d4fcSLoGin /// 是否可以使用EFI内存映射 1327a29d4fcSLoGin const MEMMAP = 1 << 3; 1337a29d4fcSLoGin /// 固件是否为64位 1347a29d4fcSLoGin const EFI_64BIT = 1 << 4; 1357a29d4fcSLoGin /// 访问是否通过虚拟化接口 1367a29d4fcSLoGin const PARAVIRT = 1 << 5; 1377a29d4fcSLoGin /// 第一架构特定位 1387a29d4fcSLoGin const ARCH_1 = 1 << 6; 1397a29d4fcSLoGin /// 打印附加运行时调试信息 1407a29d4fcSLoGin const DBG = 1 << 7; 1417a29d4fcSLoGin /// 是否可以在运行时数据区域映射非可执行 1427a29d4fcSLoGin const NX_PE_DATA = 1 << 8; 1437a29d4fcSLoGin /// 固件是否发布了一个EFI_MEMORY_ATTRIBUTES表 1447a29d4fcSLoGin const MEM_ATTR = 1 << 9; 1457a29d4fcSLoGin /// 内核是否配置为忽略软保留 1467a29d4fcSLoGin const MEM_NO_SOFT_RESERVE = 1 << 10; 1477a29d4fcSLoGin /// 是否可以使用EFI引导服务内存段 1487a29d4fcSLoGin const PRESERVE_BS_REGIONS = 1 << 11; 1497a29d4fcSLoGin 1507a29d4fcSLoGin } 1517a29d4fcSLoGin } 152