1*2eab6dd7S曾俊 use log::{error, warn};
27a29d4fcSLoGin use system_error::SystemError;
37a29d4fcSLoGin
4471d65cfSLoGin use crate::{
5471d65cfSLoGin libs::rwlock::{RwLock, RwLockReadGuard, RwLockWriteGuard},
6471d65cfSLoGin mm::PhysAddr,
7471d65cfSLoGin };
87a29d4fcSLoGin
992849878SLoGin use self::{guid::DragonStubPayloadEFI, memmap::EFIMemoryMapInfo};
107a29d4fcSLoGin
11471d65cfSLoGin pub mod esrt;
127a29d4fcSLoGin mod fdt;
1392849878SLoGin pub mod guid;
147a29d4fcSLoGin pub mod init;
157a29d4fcSLoGin pub mod memmap;
1692849878SLoGin pub mod tables;
177a29d4fcSLoGin
187a29d4fcSLoGin static EFI_MANAGER: EFIManager = EFIManager::new();
197a29d4fcSLoGin
207a29d4fcSLoGin /// EFI管理器
217a29d4fcSLoGin ///
227a29d4fcSLoGin /// 数据成员可参考: https://code.dragonos.org.cn/xref/linux-6.1.9/include/linux/efi.h#620
237a29d4fcSLoGin #[derive(Debug)]
247a29d4fcSLoGin pub struct EFIManager {
257a29d4fcSLoGin inner: RwLock<InnerEFIManager>,
267a29d4fcSLoGin }
277a29d4fcSLoGin
287a29d4fcSLoGin #[inline(always)]
efi_manager() -> &'static EFIManager297a29d4fcSLoGin pub fn efi_manager() -> &'static EFIManager {
307a29d4fcSLoGin &EFI_MANAGER
317a29d4fcSLoGin }
327a29d4fcSLoGin
337a29d4fcSLoGin #[derive(Debug)]
347a29d4fcSLoGin struct InnerEFIManager {
357a29d4fcSLoGin pub mmap: EFIMemoryMapInfo,
367a29d4fcSLoGin /// EFI模块启动时状态的标识
377a29d4fcSLoGin pub init_flags: EFIInitFlags,
387a29d4fcSLoGin /// runtime services的物理地址
397a29d4fcSLoGin pub runtime_paddr: Option<PhysAddr>,
407a29d4fcSLoGin /// runtime services的版本号
417a29d4fcSLoGin pub runtime_service_version: Option<uefi_raw::table::Revision>,
4292849878SLoGin pub dragonstub_load_info: Option<DragonStubPayloadEFI>,
43453452ccSLoGin /// uefi 内存属性表的物理地址
44453452ccSLoGin pub memory_attribute_table_paddr: Option<PhysAddr>,
45453452ccSLoGin /// uefi 内存保留表的物理地址
46453452ccSLoGin pub memreserve_table_paddr: Option<PhysAddr>,
47471d65cfSLoGin /// uefi esrt表的物理地址
48471d65cfSLoGin pub esrt_table_paddr: Option<PhysAddr>,
497a29d4fcSLoGin }
507a29d4fcSLoGin
517a29d4fcSLoGin impl EFIManager {
new() -> Self527a29d4fcSLoGin const fn new() -> Self {
537a29d4fcSLoGin EFIManager {
547a29d4fcSLoGin inner: RwLock::new(InnerEFIManager {
557a29d4fcSLoGin mmap: EFIMemoryMapInfo::DEFAULT,
567a29d4fcSLoGin init_flags: EFIInitFlags::empty(),
577a29d4fcSLoGin runtime_paddr: None,
587a29d4fcSLoGin runtime_service_version: None,
5992849878SLoGin dragonstub_load_info: None,
60453452ccSLoGin memory_attribute_table_paddr: None,
61453452ccSLoGin memreserve_table_paddr: None,
62471d65cfSLoGin esrt_table_paddr: None,
637a29d4fcSLoGin }),
647a29d4fcSLoGin }
657a29d4fcSLoGin }
667a29d4fcSLoGin
desc_version(&self) -> usize677a29d4fcSLoGin pub fn desc_version(&self) -> usize {
687a29d4fcSLoGin return self.inner.read().mmap.desc_version;
697a29d4fcSLoGin }
707a29d4fcSLoGin
71453452ccSLoGin /// 内核加载的地址、大小的信息
72453452ccSLoGin #[allow(dead_code)]
kernel_load_info(&self) -> Option<DragonStubPayloadEFI>73453452ccSLoGin pub fn kernel_load_info(&self) -> Option<DragonStubPayloadEFI> {
74453452ccSLoGin return self.inner.read().dragonstub_load_info;
75453452ccSLoGin }
76453452ccSLoGin
777a29d4fcSLoGin /// 检查是否为有效的system table表头
787a29d4fcSLoGin ///
797a29d4fcSLoGin /// ## 参数
807a29d4fcSLoGin ///
817a29d4fcSLoGin /// - header: system table表头
827a29d4fcSLoGin /// - min_major: 最小的major版本号。如果不满足,则会输出Warning,并返回Ok
837a29d4fcSLoGin ///
847a29d4fcSLoGin /// ## 返回
857a29d4fcSLoGin ///
867a29d4fcSLoGin /// - Ok(()): 检查通过
877a29d4fcSLoGin /// - Err(SystemError::EINVAL): header无效
check_system_table_header( &self, header: &uefi_raw::table::Header, min_major: u16, ) -> Result<(), SystemError>887a29d4fcSLoGin pub fn check_system_table_header(
897a29d4fcSLoGin &self,
907a29d4fcSLoGin header: &uefi_raw::table::Header,
917a29d4fcSLoGin min_major: u16,
927a29d4fcSLoGin ) -> Result<(), SystemError> {
937a29d4fcSLoGin if header.signature != uefi_raw::table::system::SystemTable::SIGNATURE {
94*2eab6dd7S曾俊 error!("System table signature mismatch!");
957a29d4fcSLoGin return Err(SystemError::EINVAL);
967a29d4fcSLoGin }
977a29d4fcSLoGin
987a29d4fcSLoGin if header.revision.major() < min_major {
99*2eab6dd7S曾俊 warn!(
1007a29d4fcSLoGin "System table version: {:?}, expected {}.00 or greater!",
101*2eab6dd7S曾俊 header.revision, min_major
1027a29d4fcSLoGin );
1037a29d4fcSLoGin }
1047a29d4fcSLoGin
1057a29d4fcSLoGin return Ok(());
1067a29d4fcSLoGin }
107471d65cfSLoGin
inner_read(&self) -> RwLockReadGuard<InnerEFIManager>108471d65cfSLoGin fn inner_read(&self) -> RwLockReadGuard<InnerEFIManager> {
109471d65cfSLoGin self.inner.read()
110471d65cfSLoGin }
111471d65cfSLoGin
inner_write(&self) -> RwLockWriteGuard<InnerEFIManager>112471d65cfSLoGin fn inner_write(&self) -> RwLockWriteGuard<InnerEFIManager> {
113471d65cfSLoGin self.inner.write()
114471d65cfSLoGin }
115471d65cfSLoGin
116471d65cfSLoGin /// 是否存在ESRT表
esrt_table_exists(&self) -> bool117471d65cfSLoGin fn esrt_table_exists(&self) -> bool {
118471d65cfSLoGin self.inner_read().esrt_table_paddr.is_some()
119471d65cfSLoGin }
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