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