xref: /DragonOS/kernel/src/driver/firmware/efi/mod.rs (revision 9284987850c1da2ce607a539eeae8a353a8f6df9)
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