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