1 use system_error::SystemError; 2 3 use crate::{libs::rwlock::RwLock, mm::PhysAddr}; 4 5 use self::memmap::EFIMemoryMapInfo; 6 7 mod fdt; 8 pub mod init; 9 pub mod memmap; 10 11 static EFI_MANAGER: EFIManager = EFIManager::new(); 12 13 /// EFI管理器 14 /// 15 /// 数据成员可参考: https://code.dragonos.org.cn/xref/linux-6.1.9/include/linux/efi.h#620 16 #[derive(Debug)] 17 pub struct EFIManager { 18 inner: RwLock<InnerEFIManager>, 19 } 20 21 #[inline(always)] 22 pub fn efi_manager() -> &'static EFIManager { 23 &EFI_MANAGER 24 } 25 26 #[derive(Debug)] 27 struct InnerEFIManager { 28 pub mmap: EFIMemoryMapInfo, 29 /// EFI模块启动时状态的标识 30 pub init_flags: EFIInitFlags, 31 /// runtime services的物理地址 32 pub runtime_paddr: Option<PhysAddr>, 33 /// runtime services的版本号 34 pub runtime_service_version: Option<uefi_raw::table::Revision>, 35 } 36 37 impl EFIManager { 38 const fn new() -> Self { 39 EFIManager { 40 inner: RwLock::new(InnerEFIManager { 41 mmap: EFIMemoryMapInfo::DEFAULT, 42 init_flags: EFIInitFlags::empty(), 43 runtime_paddr: None, 44 runtime_service_version: None, 45 }), 46 } 47 } 48 49 pub fn desc_version(&self) -> usize { 50 return self.inner.read().mmap.desc_version; 51 } 52 53 /// 检查是否为有效的system table表头 54 /// 55 /// ## 参数 56 /// 57 /// - header: system table表头 58 /// - min_major: 最小的major版本号。如果不满足,则会输出Warning,并返回Ok 59 /// 60 /// ## 返回 61 /// 62 /// - Ok(()): 检查通过 63 /// - Err(SystemError::EINVAL): header无效 64 pub fn check_system_table_header( 65 &self, 66 header: &uefi_raw::table::Header, 67 min_major: u16, 68 ) -> Result<(), SystemError> { 69 if header.signature != uefi_raw::table::system::SystemTable::SIGNATURE { 70 kerror!("System table signature mismatch!"); 71 return Err(SystemError::EINVAL); 72 } 73 74 if header.revision.major() < min_major { 75 kwarn!( 76 "System table version: {:?}, expected {}.00 or greater!", 77 header.revision, 78 min_major 79 ); 80 } 81 82 return Ok(()); 83 } 84 } 85 86 // 在Rust中,我们使用枚举和bitflags来表示这些宏 87 bitflags! { 88 pub struct EFIInitFlags: u32 { 89 /// 当前使用EFI启动 90 const BOOT = 1 << 0; 91 /// 是否可以使用EFI配置表 92 const CONFIG_TABLES = 1 << 1; 93 /// 是否可以使用运行时服务 94 const RUNTIME_SERVICES = 1 << 2; 95 /// 是否可以使用EFI内存映射 96 const MEMMAP = 1 << 3; 97 /// 固件是否为64位 98 const EFI_64BIT = 1 << 4; 99 /// 访问是否通过虚拟化接口 100 const PARAVIRT = 1 << 5; 101 /// 第一架构特定位 102 const ARCH_1 = 1 << 6; 103 /// 打印附加运行时调试信息 104 const DBG = 1 << 7; 105 /// 是否可以在运行时数据区域映射非可执行 106 const NX_PE_DATA = 1 << 8; 107 /// 固件是否发布了一个EFI_MEMORY_ATTRIBUTES表 108 const MEM_ATTR = 1 << 9; 109 /// 内核是否配置为忽略软保留 110 const MEM_NO_SOFT_RESERVE = 1 << 10; 111 /// 是否可以使用EFI引导服务内存段 112 const PRESERVE_BS_REGIONS = 1 << 11; 113 114 } 115 } 116