xref: /DragonOS/kernel/src/driver/acpi/sysfs.rs (revision 2eab6dd743e94a86a685f1f3c01e599adf86610a)
17eda31b2SLoGin use crate::{
27eda31b2SLoGin     driver::{
37eda31b2SLoGin         acpi::acpi_manager,
47eda31b2SLoGin         base::{kobject::KObject, kset::KSet},
57eda31b2SLoGin     },
67eda31b2SLoGin     filesystem::{
7196b75dcSLoGin         sysfs::{
8196b75dcSLoGin             file::sysfs_emit_str, sysfs_instance, Attribute, BinAttribute, SysFSOpsSupport,
9196b75dcSLoGin             SYSFS_ATTR_MODE_RO,
10196b75dcSLoGin         },
117eda31b2SLoGin         vfs::syscall::ModeType,
127eda31b2SLoGin     },
137eda31b2SLoGin     libs::rwlock::RwLock,
147eda31b2SLoGin };
1591e9d4abSLoGin use acpi::sdt::SdtHeader;
1691e9d4abSLoGin use alloc::{
1791e9d4abSLoGin     string::{String, ToString},
1891e9d4abSLoGin     sync::Arc,
1991e9d4abSLoGin     vec::Vec,
2091e9d4abSLoGin };
21*2eab6dd7S曾俊 use log::{debug, error, warn};
2291e9d4abSLoGin use system_error::SystemError;
237eda31b2SLoGin 
247eda31b2SLoGin use super::{acpi_kset, AcpiManager};
257eda31b2SLoGin 
267eda31b2SLoGin static mut __HOTPLUG_KSET_INSTANCE: Option<Arc<KSet>> = None;
277eda31b2SLoGin static mut __ACPI_TABLES_KSET_INSTANCE: Option<Arc<KSet>> = None;
287eda31b2SLoGin static mut __ACPI_TABLES_DATA_KSET_INSTANCE: Option<Arc<KSet>> = None;
297eda31b2SLoGin static mut __ACPI_TABLES_DYNAMIC_KSET_INSTANCE: Option<Arc<KSet>> = None;
307eda31b2SLoGin static mut __ACPI_TABLE_ATTR_LIST: Option<RwLock<Vec<Arc<AttrAcpiTable>>>> = None;
317eda31b2SLoGin 
327eda31b2SLoGin const ACPI_MAX_TABLE_INSTANCES: usize = 999;
337eda31b2SLoGin 
347eda31b2SLoGin #[inline(always)]
357eda31b2SLoGin #[allow(dead_code)]
hotplug_kset() -> Arc<KSet>367eda31b2SLoGin pub fn hotplug_kset() -> Arc<KSet> {
377eda31b2SLoGin     unsafe { __HOTPLUG_KSET_INSTANCE.clone().unwrap() }
387eda31b2SLoGin }
397eda31b2SLoGin 
407eda31b2SLoGin #[inline(always)]
acpi_tables_kset() -> Arc<KSet>417eda31b2SLoGin pub fn acpi_tables_kset() -> Arc<KSet> {
427eda31b2SLoGin     unsafe { __ACPI_TABLES_KSET_INSTANCE.clone().unwrap() }
437eda31b2SLoGin }
447eda31b2SLoGin 
457eda31b2SLoGin #[inline(always)]
467eda31b2SLoGin #[allow(dead_code)]
acpi_tables_data_kset() -> Arc<KSet>477eda31b2SLoGin pub fn acpi_tables_data_kset() -> Arc<KSet> {
487eda31b2SLoGin     unsafe { __ACPI_TABLES_DATA_KSET_INSTANCE.clone().unwrap() }
497eda31b2SLoGin }
507eda31b2SLoGin 
517eda31b2SLoGin #[inline(always)]
527eda31b2SLoGin #[allow(dead_code)]
acpi_tables_dynamic_kset() -> Arc<KSet>537eda31b2SLoGin pub fn acpi_tables_dynamic_kset() -> Arc<KSet> {
547eda31b2SLoGin     unsafe { __ACPI_TABLES_DYNAMIC_KSET_INSTANCE.clone().unwrap() }
557eda31b2SLoGin }
567eda31b2SLoGin 
577eda31b2SLoGin #[inline(always)]
acpi_table_attr_list() -> &'static RwLock<Vec<Arc<AttrAcpiTable>>>587eda31b2SLoGin fn acpi_table_attr_list() -> &'static RwLock<Vec<Arc<AttrAcpiTable>>> {
597eda31b2SLoGin     unsafe {
607eda31b2SLoGin         return __ACPI_TABLE_ATTR_LIST.as_ref().unwrap();
617eda31b2SLoGin     }
627eda31b2SLoGin }
637eda31b2SLoGin 
647eda31b2SLoGin impl AcpiManager {
acpi_sysfs_init(&self) -> Result<(), SystemError>657eda31b2SLoGin     pub(super) fn acpi_sysfs_init(&self) -> Result<(), SystemError> {
667eda31b2SLoGin         unsafe {
677eda31b2SLoGin             __ACPI_TABLE_ATTR_LIST = Some(RwLock::new(Vec::new()));
687eda31b2SLoGin         }
697eda31b2SLoGin         self.acpi_tables_sysfs_init()?;
707eda31b2SLoGin 
717eda31b2SLoGin         let hotplug_kset = KSet::new("hotplug".to_string());
727eda31b2SLoGin         hotplug_kset.register(Some(acpi_kset()))?;
737eda31b2SLoGin 
747eda31b2SLoGin         unsafe {
757eda31b2SLoGin             __HOTPLUG_KSET_INSTANCE = Some(hotplug_kset.clone());
767eda31b2SLoGin         }
777eda31b2SLoGin 
787eda31b2SLoGin         let hotplug_kobj = hotplug_kset as Arc<dyn KObject>;
797eda31b2SLoGin         sysfs_instance().create_file(&hotplug_kobj, &AttrForceRemove)?;
807eda31b2SLoGin 
817eda31b2SLoGin         return Ok(());
827eda31b2SLoGin     }
837eda31b2SLoGin 
847eda31b2SLoGin     /// 在 sysfs 中创建 ACPI 表目录
857eda31b2SLoGin     ///
86e7071df6SLoGin     /// 参考 https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/acpi/sysfs.c?fi=acpi_sysfs_init#488
acpi_tables_sysfs_init(&self) -> Result<(), SystemError>877eda31b2SLoGin     fn acpi_tables_sysfs_init(&self) -> Result<(), SystemError> {
887eda31b2SLoGin         // 创建 `/sys/firmware/acpi/tables` 目录
897eda31b2SLoGin         let acpi_tables_kset = KSet::new("tables".to_string());
907eda31b2SLoGin         acpi_tables_kset.register(Some(acpi_kset()))?;
917eda31b2SLoGin         unsafe {
927eda31b2SLoGin             __ACPI_TABLES_KSET_INSTANCE = Some(acpi_tables_kset.clone());
937eda31b2SLoGin         }
947eda31b2SLoGin 
957eda31b2SLoGin         // 创建 `/sys/firmware/acpi/tables/data` 目录
967eda31b2SLoGin         let acpi_tables_data_kset = KSet::new("data".to_string());
977eda31b2SLoGin         acpi_tables_data_kset.register(Some(acpi_tables_kset.clone()))?;
987eda31b2SLoGin         unsafe {
997eda31b2SLoGin             __ACPI_TABLES_DATA_KSET_INSTANCE = Some(acpi_tables_data_kset);
1007eda31b2SLoGin         }
1017eda31b2SLoGin 
1027eda31b2SLoGin         // 创建 `/sys/firmware/acpi/tables/dynamic` 目录
1037eda31b2SLoGin         let acpi_tables_dynamic_kset = KSet::new("dynamic".to_string());
1047eda31b2SLoGin         acpi_tables_dynamic_kset.register(Some(acpi_tables_kset.clone()))?;
1057eda31b2SLoGin         unsafe {
1067eda31b2SLoGin             __ACPI_TABLES_DYNAMIC_KSET_INSTANCE = Some(acpi_tables_dynamic_kset);
1077eda31b2SLoGin         }
1087eda31b2SLoGin 
1097eda31b2SLoGin         // todo: get acpi tables.
1107eda31b2SLoGin         let tables = self.tables().unwrap();
1117eda31b2SLoGin         let headers = tables.headers();
1127eda31b2SLoGin         for header in headers {
113*2eab6dd7S曾俊             debug!("ACPI header: {:?}", header);
1147eda31b2SLoGin             let attr = AttrAcpiTable::new(&header)?;
1157eda31b2SLoGin             acpi_table_attr_list().write().push(attr);
1167eda31b2SLoGin             self.acpi_table_data_init(&header)?;
1177eda31b2SLoGin         }
1187eda31b2SLoGin 
1197eda31b2SLoGin         return Ok(());
1207eda31b2SLoGin     }
1217eda31b2SLoGin 
122e7071df6SLoGin     /// 参考 https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/acpi/sysfs.c?fi=acpi_sysfs_init#469
acpi_table_data_init(&self, _header: &SdtHeader) -> Result<(), SystemError>1237eda31b2SLoGin     fn acpi_table_data_init(&self, _header: &SdtHeader) -> Result<(), SystemError> {
1247eda31b2SLoGin         // todo!("AcpiManager::acpi_table_data_init()")
1257eda31b2SLoGin         return Ok(());
1267eda31b2SLoGin     }
1277eda31b2SLoGin }
1287eda31b2SLoGin 
1297eda31b2SLoGin #[derive(Debug)]
1307eda31b2SLoGin struct AttrForceRemove;
1317eda31b2SLoGin 
1327eda31b2SLoGin impl Attribute for AttrForceRemove {
name(&self) -> &str1337eda31b2SLoGin     fn name(&self) -> &str {
1347eda31b2SLoGin         "force_remove"
1357eda31b2SLoGin     }
1367eda31b2SLoGin 
mode(&self) -> ModeType1377eda31b2SLoGin     fn mode(&self) -> ModeType {
138196b75dcSLoGin         SYSFS_ATTR_MODE_RO
1397eda31b2SLoGin     }
1407eda31b2SLoGin 
support(&self) -> SysFSOpsSupport1417eda31b2SLoGin     fn support(&self) -> SysFSOpsSupport {
142196b75dcSLoGin         return SysFSOpsSupport::ATTR_SHOW;
1437eda31b2SLoGin     }
1447eda31b2SLoGin 
show(&self, _kobj: Arc<dyn KObject>, buf: &mut [u8]) -> Result<usize, SystemError>1457eda31b2SLoGin     fn show(&self, _kobj: Arc<dyn KObject>, buf: &mut [u8]) -> Result<usize, SystemError> {
1467eda31b2SLoGin         return sysfs_emit_str(buf, "0\n");
1477eda31b2SLoGin     }
1487eda31b2SLoGin }
1497eda31b2SLoGin 
1507eda31b2SLoGin /// ACPI 表在 sysfs 中的属性
1517eda31b2SLoGin #[derive(Debug)]
1527eda31b2SLoGin struct AttrAcpiTable {
1537eda31b2SLoGin     name: String,
1547eda31b2SLoGin     filename: String,
1557eda31b2SLoGin     instance: isize,
1567eda31b2SLoGin     size: usize,
1577eda31b2SLoGin }
1587eda31b2SLoGin 
1597eda31b2SLoGin impl AttrAcpiTable {
new(header: &SdtHeader) -> Result<Arc<Self>, SystemError>1607eda31b2SLoGin     pub fn new(header: &SdtHeader) -> Result<Arc<Self>, SystemError> {
1617eda31b2SLoGin         let mut r = Self {
1627eda31b2SLoGin             name: header.signature.to_string(),
1637eda31b2SLoGin             filename: "".to_string(),
1647eda31b2SLoGin             instance: 0,
1657eda31b2SLoGin             size: header.length as usize,
1667eda31b2SLoGin         };
1677eda31b2SLoGin 
1687eda31b2SLoGin         for attr in acpi_table_attr_list().read().iter() {
1697eda31b2SLoGin             if attr.name == r.name {
1707eda31b2SLoGin                 r.instance = attr.instance;
1717eda31b2SLoGin             }
1727eda31b2SLoGin         }
1737eda31b2SLoGin         // 将当前实例的序号加1
1747eda31b2SLoGin         r.instance += 1;
1757eda31b2SLoGin         if r.instance > ACPI_MAX_TABLE_INSTANCES as isize {
176*2eab6dd7S曾俊             warn!("too many table instances. name: {}", r.name);
1777eda31b2SLoGin             return Err(SystemError::ERANGE);
1787eda31b2SLoGin         }
1797eda31b2SLoGin 
1807eda31b2SLoGin         let mut has_multiple_instances: bool = false;
1817eda31b2SLoGin         let mut tmpcnt = 0;
1827eda31b2SLoGin         for h in acpi_manager().tables().unwrap().headers() {
1837eda31b2SLoGin             if h.signature == header.signature {
1847eda31b2SLoGin                 tmpcnt += 1;
1857eda31b2SLoGin                 if tmpcnt > 1 {
1867eda31b2SLoGin                     has_multiple_instances = true;
1877eda31b2SLoGin                     break;
1887eda31b2SLoGin                 }
1897eda31b2SLoGin             }
1907eda31b2SLoGin         }
1917eda31b2SLoGin 
1927eda31b2SLoGin         if r.instance > 1 || (r.instance == 1 && has_multiple_instances) {
1937eda31b2SLoGin             r.filename = format!("{}{}", r.name, r.instance);
1947eda31b2SLoGin         } else {
1957eda31b2SLoGin             r.filename = r.name.clone();
1967eda31b2SLoGin         }
1977eda31b2SLoGin 
1987eda31b2SLoGin         let result = Arc::new(r);
1997eda31b2SLoGin         sysfs_instance().create_bin_file(
2007eda31b2SLoGin             &(acpi_tables_kset() as Arc<dyn KObject>),
2017eda31b2SLoGin             &(result.clone() as Arc<dyn BinAttribute>),
2027eda31b2SLoGin         )?;
2037eda31b2SLoGin         return Ok(result);
2047eda31b2SLoGin     }
2057eda31b2SLoGin }
2067eda31b2SLoGin 
2077eda31b2SLoGin impl Attribute for AttrAcpiTable {
show(&self, _kobj: Arc<dyn KObject>, _buf: &mut [u8]) -> Result<usize, SystemError>2087eda31b2SLoGin     fn show(&self, _kobj: Arc<dyn KObject>, _buf: &mut [u8]) -> Result<usize, SystemError> {
2091074eb34SSamuel Dai         return Err(SystemError::ENOSYS);
2107eda31b2SLoGin     }
2117eda31b2SLoGin 
store(&self, _kobj: Arc<dyn KObject>, _buf: &[u8]) -> Result<usize, SystemError>2127eda31b2SLoGin     fn store(&self, _kobj: Arc<dyn KObject>, _buf: &[u8]) -> Result<usize, SystemError> {
2131074eb34SSamuel Dai         return Err(SystemError::ENOSYS);
2147eda31b2SLoGin     }
2157eda31b2SLoGin 
name(&self) -> &str2167eda31b2SLoGin     fn name(&self) -> &str {
2177eda31b2SLoGin         return &self.filename;
2187eda31b2SLoGin     }
2197eda31b2SLoGin 
mode(&self) -> ModeType2207eda31b2SLoGin     fn mode(&self) -> ModeType {
2217eda31b2SLoGin         return ModeType::from_bits_truncate(0o400);
2227eda31b2SLoGin     }
2237eda31b2SLoGin 
support(&self) -> SysFSOpsSupport2247eda31b2SLoGin     fn support(&self) -> SysFSOpsSupport {
2257eda31b2SLoGin         return SysFSOpsSupport::empty();
2267eda31b2SLoGin     }
2277eda31b2SLoGin }
2287eda31b2SLoGin 
2297eda31b2SLoGin impl BinAttribute for AttrAcpiTable {
support_battr(&self) -> SysFSOpsSupport2307eda31b2SLoGin     fn support_battr(&self) -> SysFSOpsSupport {
231196b75dcSLoGin         return SysFSOpsSupport::BATTR_READ;
2327eda31b2SLoGin     }
write( &self, _kobj: Arc<dyn KObject>, _buf: &[u8], _offset: usize, ) -> Result<usize, SystemError>2337eda31b2SLoGin     fn write(
2347eda31b2SLoGin         &self,
2357eda31b2SLoGin         _kobj: Arc<dyn KObject>,
2367eda31b2SLoGin         _buf: &[u8],
2377eda31b2SLoGin         _offset: usize,
2387eda31b2SLoGin     ) -> Result<usize, SystemError> {
2391074eb34SSamuel Dai         return Err(SystemError::ENOSYS);
2407eda31b2SLoGin     }
2417eda31b2SLoGin 
2427eda31b2SLoGin     /// 展示 ACPI 表的内容
2437eda31b2SLoGin     ///
244e7071df6SLoGin     /// 参考 https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/acpi/sysfs.c?fi=acpi_sysfs_init#320
read( &self, _kobj: Arc<dyn KObject>, buf: &mut [u8], offset: usize, ) -> Result<usize, SystemError>2457eda31b2SLoGin     fn read(
2467eda31b2SLoGin         &self,
2477eda31b2SLoGin         _kobj: Arc<dyn KObject>,
2487eda31b2SLoGin         buf: &mut [u8],
2497eda31b2SLoGin         offset: usize,
2507eda31b2SLoGin     ) -> Result<usize, SystemError> {
2517eda31b2SLoGin         macro_rules! copy_data {
2527eda31b2SLoGin             ($table:expr) => {
2537eda31b2SLoGin                 let from = unsafe {
2547eda31b2SLoGin                     core::slice::from_raw_parts(
2557eda31b2SLoGin                         $table.virtual_start().as_ptr() as *const u8,
2567eda31b2SLoGin                         $table.region_length(),
2577eda31b2SLoGin                     )
2587eda31b2SLoGin                 };
2597eda31b2SLoGin                 if offset >= from.len() {
2607eda31b2SLoGin                     return Ok(0);
2617eda31b2SLoGin                 }
2627eda31b2SLoGin                 let mut count = buf.len();
2637eda31b2SLoGin                 if count > from.len() - offset {
2647eda31b2SLoGin                     count = from.len() - offset;
2657eda31b2SLoGin                 }
2667eda31b2SLoGin                 buf[0..count].copy_from_slice(&from[offset..offset + count]);
2677eda31b2SLoGin                 return Ok(count);
2687eda31b2SLoGin             };
2697eda31b2SLoGin         }
2707eda31b2SLoGin 
2717eda31b2SLoGin         macro_rules! define_struct {
2727eda31b2SLoGin             ($name:ident) => {
2737eda31b2SLoGin                 #[repr(transparent)]
2747eda31b2SLoGin                 #[allow(non_snake_case)]
2757eda31b2SLoGin                 #[allow(non_camel_case_types)]
2767eda31b2SLoGin                 struct $name {
2777eda31b2SLoGin                     header: SdtHeader,
2787eda31b2SLoGin                 }
2797eda31b2SLoGin 
2807eda31b2SLoGin                 unsafe impl acpi::AcpiTable for $name {
2817eda31b2SLoGin                     const SIGNATURE: acpi::sdt::Signature = acpi::sdt::Signature::$name;
2827eda31b2SLoGin                     fn header(&self) -> &acpi::sdt::SdtHeader {
2837eda31b2SLoGin                         return &self.header;
2847eda31b2SLoGin                     }
2857eda31b2SLoGin                 }
2867eda31b2SLoGin             };
2877eda31b2SLoGin         }
2887eda31b2SLoGin 
2897eda31b2SLoGin         macro_rules! handle {
2907eda31b2SLoGin             ($name: ident, $tables: expr) => {
2917eda31b2SLoGin                 define_struct!($name);
2927eda31b2SLoGin                 let table = $tables.find_entire_table::<$name>().map_err(|e| {
293*2eab6dd7S曾俊                     warn!(
2947eda31b2SLoGin                         "AttrAcpiTable::read(): failed to find table. name: {}, error: {:?}",
295*2eab6dd7S曾俊                         self.name, e
2967eda31b2SLoGin                     );
2977eda31b2SLoGin                     SystemError::ENODEV
2987eda31b2SLoGin                 })?;
2997eda31b2SLoGin 
3007eda31b2SLoGin                 copy_data!(table);
3017eda31b2SLoGin             };
3027eda31b2SLoGin         }
3037eda31b2SLoGin 
3047eda31b2SLoGin         let tables = acpi_manager().tables().unwrap();
3057eda31b2SLoGin         match self.name.as_str() {
3067eda31b2SLoGin             "RSDT" => {
3077eda31b2SLoGin                 handle!(RSDT, tables);
3087eda31b2SLoGin             }
3097eda31b2SLoGin             "XSDT" => {
3107eda31b2SLoGin                 handle!(XSDT, tables);
3117eda31b2SLoGin             }
3127eda31b2SLoGin             "FACP" => {
3137eda31b2SLoGin                 handle!(FADT, tables);
3147eda31b2SLoGin             }
3157eda31b2SLoGin             "HPET" => {
3167eda31b2SLoGin                 handle!(HPET, tables);
3177eda31b2SLoGin             }
3187eda31b2SLoGin             "APIC" => {
3197eda31b2SLoGin                 handle!(MADT, tables);
3207eda31b2SLoGin             }
3217eda31b2SLoGin             "MCFG" => {
3227eda31b2SLoGin                 handle!(MCFG, tables);
3237eda31b2SLoGin             }
3247eda31b2SLoGin             "SSDT" => {
3257eda31b2SLoGin                 handle!(SSDT, tables);
3267eda31b2SLoGin             }
3277eda31b2SLoGin             "BERT" => {
3287eda31b2SLoGin                 handle!(BERT, tables);
3297eda31b2SLoGin             }
3307eda31b2SLoGin             "BGRT" => {
3317eda31b2SLoGin                 handle!(BGRT, tables);
3327eda31b2SLoGin             }
3337eda31b2SLoGin             "CPEP" => {
3347eda31b2SLoGin                 handle!(CPEP, tables);
3357eda31b2SLoGin             }
3367eda31b2SLoGin             "DSDT" => {
3377eda31b2SLoGin                 handle!(DSDT, tables);
3387eda31b2SLoGin             }
3397eda31b2SLoGin             "ECDT" => {
3407eda31b2SLoGin                 handle!(ECDT, tables);
3417eda31b2SLoGin             }
3427eda31b2SLoGin             "EINJ" => {
3437eda31b2SLoGin                 handle!(EINJ, tables);
3447eda31b2SLoGin             }
3457eda31b2SLoGin             "ERST" => {
3467eda31b2SLoGin                 handle!(ERST, tables);
3477eda31b2SLoGin             }
3487eda31b2SLoGin             "FACS" => {
3497eda31b2SLoGin                 handle!(FACS, tables);
3507eda31b2SLoGin             }
3517eda31b2SLoGin             "FPDT" => {
3527eda31b2SLoGin                 handle!(FPDT, tables);
3537eda31b2SLoGin             }
3547eda31b2SLoGin             "GTDT" => {
3557eda31b2SLoGin                 handle!(GTDT, tables);
3567eda31b2SLoGin             }
3577eda31b2SLoGin             "HEST" => {
3587eda31b2SLoGin                 handle!(HEST, tables);
3597eda31b2SLoGin             }
3607eda31b2SLoGin             "MSCT" => {
3617eda31b2SLoGin                 handle!(MSCT, tables);
3627eda31b2SLoGin             }
3637eda31b2SLoGin             "MPST" => {
3647eda31b2SLoGin                 handle!(MPST, tables);
3657eda31b2SLoGin             }
3667eda31b2SLoGin             "NFIT" => {
3677eda31b2SLoGin                 handle!(NFIT, tables);
3687eda31b2SLoGin             }
3697eda31b2SLoGin             "PCCT" => {
3707eda31b2SLoGin                 handle!(PCCT, tables);
3717eda31b2SLoGin             }
3727eda31b2SLoGin             "PHAT" => {
3737eda31b2SLoGin                 handle!(PHAT, tables);
3747eda31b2SLoGin             }
3757eda31b2SLoGin             "PMTT" => {
3767eda31b2SLoGin                 handle!(PMTT, tables);
3777eda31b2SLoGin             }
3787eda31b2SLoGin             "PSDT" => {
3797eda31b2SLoGin                 handle!(PSDT, tables);
3807eda31b2SLoGin             }
3817eda31b2SLoGin             "RASF" => {
3827eda31b2SLoGin                 handle!(RASF, tables);
3837eda31b2SLoGin             }
3847eda31b2SLoGin             "SBST" => {
3857eda31b2SLoGin                 handle!(SBST, tables);
3867eda31b2SLoGin             }
3877eda31b2SLoGin             "SDEV" => {
3887eda31b2SLoGin                 handle!(SDEV, tables);
3897eda31b2SLoGin             }
3907eda31b2SLoGin             "SLIT" => {
3917eda31b2SLoGin                 handle!(SLIT, tables);
3927eda31b2SLoGin             }
3937eda31b2SLoGin             "SRAT" => {
3947eda31b2SLoGin                 handle!(SRAT, tables);
3957eda31b2SLoGin             }
3967eda31b2SLoGin             "AEST" => {
3977eda31b2SLoGin                 handle!(AEST, tables);
3987eda31b2SLoGin             }
3997eda31b2SLoGin             "BDAT" => {
4007eda31b2SLoGin                 handle!(BDAT, tables);
4017eda31b2SLoGin             }
4027eda31b2SLoGin             "CDIT" => {
4037eda31b2SLoGin                 handle!(CDIT, tables);
4047eda31b2SLoGin             }
4057eda31b2SLoGin             "CEDT" => {
4067eda31b2SLoGin                 handle!(CEDT, tables);
4077eda31b2SLoGin             }
4087eda31b2SLoGin             "CRAT" => {
4097eda31b2SLoGin                 handle!(CRAT, tables);
4107eda31b2SLoGin             }
4117eda31b2SLoGin             "CSRT" => {
4127eda31b2SLoGin                 handle!(CSRT, tables);
4137eda31b2SLoGin             }
4147eda31b2SLoGin             "DBGP" => {
4157eda31b2SLoGin                 handle!(DBGP, tables);
4167eda31b2SLoGin             }
4177eda31b2SLoGin             "DBG2" => {
4187eda31b2SLoGin                 handle!(DBG2, tables);
4197eda31b2SLoGin             }
4207eda31b2SLoGin             "DMAR" => {
4217eda31b2SLoGin                 handle!(DMAR, tables);
4227eda31b2SLoGin             }
4237eda31b2SLoGin             "DRTM" => {
4247eda31b2SLoGin                 handle!(DRTM, tables);
4257eda31b2SLoGin             }
4267eda31b2SLoGin             "ETDT" => {
4277eda31b2SLoGin                 handle!(ETDT, tables);
4287eda31b2SLoGin             }
4297eda31b2SLoGin             "IBFT" => {
4307eda31b2SLoGin                 handle!(IBFT, tables);
4317eda31b2SLoGin             }
4327eda31b2SLoGin             "IORT" => {
4337eda31b2SLoGin                 handle!(IORT, tables);
4347eda31b2SLoGin             }
4357eda31b2SLoGin             "IVRS" => {
4367eda31b2SLoGin                 handle!(IVRS, tables);
4377eda31b2SLoGin             }
4387eda31b2SLoGin             "LPIT" => {
4397eda31b2SLoGin                 handle!(LPIT, tables);
4407eda31b2SLoGin             }
4417eda31b2SLoGin             "MCHI" => {
4427eda31b2SLoGin                 handle!(MCHI, tables);
4437eda31b2SLoGin             }
4447eda31b2SLoGin             "MPAM" => {
4457eda31b2SLoGin                 handle!(MPAM, tables);
4467eda31b2SLoGin             }
4477eda31b2SLoGin             "MSDM" => {
4487eda31b2SLoGin                 handle!(MSDM, tables);
4497eda31b2SLoGin             }
4507eda31b2SLoGin             "PRMT" => {
4517eda31b2SLoGin                 handle!(PRMT, tables);
4527eda31b2SLoGin             }
4537eda31b2SLoGin             "RGRT" => {
4547eda31b2SLoGin                 handle!(RGRT, tables);
4557eda31b2SLoGin             }
4567eda31b2SLoGin             "SDEI" => {
4577eda31b2SLoGin                 handle!(SDEI, tables);
4587eda31b2SLoGin             }
4597eda31b2SLoGin             "SLIC" => {
4607eda31b2SLoGin                 handle!(SLIC, tables);
4617eda31b2SLoGin             }
4627eda31b2SLoGin             "SPCR" => {
4637eda31b2SLoGin                 handle!(SPCR, tables);
4647eda31b2SLoGin             }
4657eda31b2SLoGin             "SPMI" => {
4667eda31b2SLoGin                 handle!(SPMI, tables);
4677eda31b2SLoGin             }
4687eda31b2SLoGin             "STAO" => {
4697eda31b2SLoGin                 handle!(STAO, tables);
4707eda31b2SLoGin             }
4717eda31b2SLoGin             "SVKL" => {
4727eda31b2SLoGin                 handle!(SVKL, tables);
4737eda31b2SLoGin             }
4747eda31b2SLoGin             "TCPA" => {
4757eda31b2SLoGin                 handle!(TCPA, tables);
4767eda31b2SLoGin             }
4777eda31b2SLoGin             "TPM2" => {
4787eda31b2SLoGin                 handle!(TPM2, tables);
4797eda31b2SLoGin             }
4807eda31b2SLoGin             "UEFI" => {
4817eda31b2SLoGin                 handle!(UEFI, tables);
4827eda31b2SLoGin             }
4837eda31b2SLoGin             "WAET" => {
4847eda31b2SLoGin                 handle!(WAET, tables);
4857eda31b2SLoGin             }
4867eda31b2SLoGin             "WDAT" => {
4877eda31b2SLoGin                 handle!(WDAT, tables);
4887eda31b2SLoGin             }
4897eda31b2SLoGin             "WDRT" => {
4907eda31b2SLoGin                 handle!(WDRT, tables);
4917eda31b2SLoGin             }
4927eda31b2SLoGin             "WPBT" => {
4937eda31b2SLoGin                 handle!(WPBT, tables);
4947eda31b2SLoGin             }
4957eda31b2SLoGin             "WSMT" => {
4967eda31b2SLoGin                 handle!(WSMT, tables);
4977eda31b2SLoGin             }
4987eda31b2SLoGin             "XENV" => {
4997eda31b2SLoGin                 handle!(XENV, tables);
5007eda31b2SLoGin             }
5017eda31b2SLoGin 
5027eda31b2SLoGin             _ => {
503*2eab6dd7S曾俊                 error!("AttrAcpiTable::read(): unknown table. name: {}", self.name);
5047eda31b2SLoGin                 return Err(SystemError::ENODEV);
5057eda31b2SLoGin             }
5067eda31b2SLoGin         };
5077eda31b2SLoGin     }
5087eda31b2SLoGin 
size(&self) -> usize5097eda31b2SLoGin     fn size(&self) -> usize {
5107eda31b2SLoGin         return self.size;
5117eda31b2SLoGin     }
5127eda31b2SLoGin }
513