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