16b4e7a29SLoGin use core::fmt::Debug; 26b4e7a29SLoGin 36b4e7a29SLoGin use self::{dir::SysKernDirPriv, file::SysKernFilePriv}; 46b4e7a29SLoGin 506d5e247SLoGin use super::{ 606d5e247SLoGin kernfs::{KernFS, KernFSInode}, 706d5e247SLoGin vfs::{syscall::ModeType, FileSystem}, 8dd9f1fc1STingHuang }; 9dd9f1fc1STingHuang use crate::{ 1006d5e247SLoGin driver::base::kobject::KObject, 1106d5e247SLoGin filesystem::vfs::ROOT_INODE, 1206d5e247SLoGin kinfo, kwarn, 1306d5e247SLoGin libs::{casting::DowncastArc, once::Once}, 14dd9f1fc1STingHuang }; 1506d5e247SLoGin use alloc::sync::Arc; 16*91e9d4abSLoGin use system_error::SystemError; 17dd9f1fc1STingHuang 1806d5e247SLoGin pub mod dir; 1906d5e247SLoGin pub mod file; 2006d5e247SLoGin pub mod group; 2106d5e247SLoGin pub mod symlink; 22dd9f1fc1STingHuang 2306d5e247SLoGin /// 全局的sysfs实例 2406d5e247SLoGin pub(self) static mut SYSFS_INSTANCE: Option<SysFS> = None; 25dd9f1fc1STingHuang 26dd9f1fc1STingHuang #[inline(always)] 2706d5e247SLoGin pub fn sysfs_instance() -> &'static SysFS { 28dd9f1fc1STingHuang unsafe { 2906d5e247SLoGin return &SYSFS_INSTANCE.as_ref().unwrap(); 30dd9f1fc1STingHuang } 31dd9f1fc1STingHuang } 32b087521eSChiichen 33b087521eSChiichen pub fn sysfs_init() -> Result<(), SystemError> { 34b087521eSChiichen static INIT: Once = Once::new(); 35b087521eSChiichen let mut result = None; 36b087521eSChiichen INIT.call_once(|| { 37b087521eSChiichen kinfo!("Initializing SysFS..."); 3806d5e247SLoGin 39b087521eSChiichen // 创建 sysfs 实例 4006d5e247SLoGin // let sysfs: Arc<OldSysFS> = OldSysFS::new(); 4106d5e247SLoGin let sysfs = SysFS::new(); 4206d5e247SLoGin unsafe { SYSFS_INSTANCE = Some(sysfs) }; 43b087521eSChiichen 44b087521eSChiichen // sysfs 挂载 45b087521eSChiichen let _t = ROOT_INODE() 46b087521eSChiichen .find("sys") 47b087521eSChiichen .expect("Cannot find /sys") 4806d5e247SLoGin .mount(sysfs_instance().fs().clone()) 49b087521eSChiichen .expect("Failed to mount sysfs"); 50b087521eSChiichen kinfo!("SysFS mounted."); 51b087521eSChiichen 5206d5e247SLoGin // kdebug!("sys_bus_init result: {:?}", SYS_BUS_INODE().list()); 53b087521eSChiichen result = Some(Ok(())); 54b087521eSChiichen }); 55b087521eSChiichen 56b087521eSChiichen return result.unwrap(); 57b087521eSChiichen } 586b4e7a29SLoGin 596b4e7a29SLoGin /// SysFS在KernFS的inode中的私有信息 606b4e7a29SLoGin #[allow(dead_code)] 616b4e7a29SLoGin #[derive(Debug)] 626b4e7a29SLoGin pub enum SysFSKernPrivateData { 636b4e7a29SLoGin Dir(SysKernDirPriv), 646b4e7a29SLoGin File(SysKernFilePriv), 656b4e7a29SLoGin } 666b4e7a29SLoGin 6706d5e247SLoGin impl SysFSKernPrivateData { 6806d5e247SLoGin #[inline(always)] 6906d5e247SLoGin pub fn callback_read(&self, buf: &mut [u8], offset: usize) -> Result<usize, SystemError> { 7006d5e247SLoGin match self { 7106d5e247SLoGin SysFSKernPrivateData::File(file) => { 727eda31b2SLoGin let len = file.callback_read(buf, offset)?; 737eda31b2SLoGin 7406d5e247SLoGin return Ok(len); 7506d5e247SLoGin } 7606d5e247SLoGin _ => { 7706d5e247SLoGin return Err(SystemError::EOPNOTSUPP_OR_ENOTSUP); 7806d5e247SLoGin } 7906d5e247SLoGin } 8006d5e247SLoGin } 8106d5e247SLoGin 8206d5e247SLoGin #[inline(always)] 837eda31b2SLoGin pub fn callback_write(&self, buf: &[u8], offset: usize) -> Result<usize, SystemError> { 8406d5e247SLoGin match self { 8506d5e247SLoGin SysFSKernPrivateData::File(file) => { 867eda31b2SLoGin return file.callback_write(buf, offset); 8706d5e247SLoGin } 8806d5e247SLoGin _ => { 8906d5e247SLoGin return Err(SystemError::EOPNOTSUPP_OR_ENOTSUP); 9006d5e247SLoGin } 9106d5e247SLoGin } 9206d5e247SLoGin } 9306d5e247SLoGin } 9406d5e247SLoGin 956b4e7a29SLoGin /// sysfs文件目录的属性组 966b4e7a29SLoGin pub trait AttributeGroup: Debug + Send + Sync { 9706d5e247SLoGin /// 属性组的名称 9806d5e247SLoGin /// 9906d5e247SLoGin /// 如果属性组的名称为None,则所有的属性都会被添加到父目录下,而不是创建一个新的目录 10006d5e247SLoGin fn name(&self) -> Option<&str>; 10106d5e247SLoGin /// 属性组的属性列表 1026b4e7a29SLoGin fn attrs(&self) -> &[&'static dyn Attribute]; 10306d5e247SLoGin 10406d5e247SLoGin /// 属性在当前属性组内的权限(该方法可选) 10506d5e247SLoGin /// 10606d5e247SLoGin /// 如果返回None,则使用Attribute的mode()方法返回的权限 10706d5e247SLoGin /// 10806d5e247SLoGin /// 如果返回Some,则使用返回的权限。 10906d5e247SLoGin /// 如果要标识属性不可见,则返回Some(ModeType::empty()) 1107eda31b2SLoGin fn is_visible(&self, kobj: Arc<dyn KObject>, attr: &'static dyn Attribute) -> Option<ModeType>; 1116b4e7a29SLoGin } 1126b4e7a29SLoGin 1136b4e7a29SLoGin /// sysfs文件的属性 1146b4e7a29SLoGin pub trait Attribute: Debug + Send + Sync { 1156b4e7a29SLoGin fn name(&self) -> &str; 1166b4e7a29SLoGin fn mode(&self) -> ModeType; 11706d5e247SLoGin 11806d5e247SLoGin fn support(&self) -> SysFSOpsSupport; 11906d5e247SLoGin 12006d5e247SLoGin fn show(&self, _kobj: Arc<dyn KObject>, _buf: &mut [u8]) -> Result<usize, SystemError> { 12106d5e247SLoGin return Err(SystemError::EOPNOTSUPP_OR_ENOTSUP); 12206d5e247SLoGin } 12306d5e247SLoGin 12406d5e247SLoGin fn store(&self, _kobj: Arc<dyn KObject>, _buf: &[u8]) -> Result<usize, SystemError> { 12506d5e247SLoGin return Err(SystemError::EOPNOTSUPP_OR_ENOTSUP); 12606d5e247SLoGin } 12706d5e247SLoGin } 12806d5e247SLoGin 1297eda31b2SLoGin pub trait BinAttribute: Attribute { 1307eda31b2SLoGin fn support_battr(&self) -> SysFSOpsSupport; 1317eda31b2SLoGin 1327eda31b2SLoGin fn write( 1337eda31b2SLoGin &self, 1347eda31b2SLoGin _kobj: Arc<dyn KObject>, 1357eda31b2SLoGin _buf: &[u8], 1367eda31b2SLoGin _offset: usize, 1377eda31b2SLoGin ) -> Result<usize, SystemError> { 1387eda31b2SLoGin return Err(SystemError::EOPNOTSUPP_OR_ENOTSUP); 1397eda31b2SLoGin } 1407eda31b2SLoGin 1417eda31b2SLoGin fn read( 1427eda31b2SLoGin &self, 1437eda31b2SLoGin _kobj: Arc<dyn KObject>, 1447eda31b2SLoGin _buf: &mut [u8], 1457eda31b2SLoGin _offset: usize, 1467eda31b2SLoGin ) -> Result<usize, SystemError> { 1477eda31b2SLoGin return Err(SystemError::EOPNOTSUPP_OR_ENOTSUP); 1487eda31b2SLoGin } 1497eda31b2SLoGin 1507eda31b2SLoGin fn size(&self) -> usize; 1517eda31b2SLoGin } 1527eda31b2SLoGin 15306d5e247SLoGin pub trait SysFSOps: Debug { 15406d5e247SLoGin /// 获取当前文件的支持的操作 15506d5e247SLoGin fn support(&self, attr: &dyn Attribute) -> SysFSOpsSupport { 15606d5e247SLoGin return attr.support(); 15706d5e247SLoGin } 15806d5e247SLoGin 1597eda31b2SLoGin fn support_battr(&self, attr: &Arc<dyn BinAttribute>) -> SysFSOpsSupport { 1607eda31b2SLoGin return attr.support(); 1617eda31b2SLoGin } 1627eda31b2SLoGin 16306d5e247SLoGin fn show( 16406d5e247SLoGin &self, 16506d5e247SLoGin kobj: Arc<dyn KObject>, 16606d5e247SLoGin attr: &dyn Attribute, 16706d5e247SLoGin buf: &mut [u8], 16806d5e247SLoGin ) -> Result<usize, SystemError>; 16906d5e247SLoGin 17006d5e247SLoGin fn store( 17106d5e247SLoGin &self, 17206d5e247SLoGin kobj: Arc<dyn KObject>, 17306d5e247SLoGin attr: &dyn Attribute, 17406d5e247SLoGin buf: &[u8], 17506d5e247SLoGin ) -> Result<usize, SystemError>; 17606d5e247SLoGin } 17706d5e247SLoGin 17806d5e247SLoGin bitflags! { 17906d5e247SLoGin pub struct SysFSOpsSupport: u8{ 1807eda31b2SLoGin // === for attribute === 18106d5e247SLoGin const SHOW = 1 << 0; 18206d5e247SLoGin const STORE = 1 << 1; 1837eda31b2SLoGin // === for bin attribute === 1847eda31b2SLoGin const READ = 1 << 2; 1857eda31b2SLoGin const WRITE = 1 << 3; 18606d5e247SLoGin } 18706d5e247SLoGin } 18806d5e247SLoGin 18906d5e247SLoGin #[derive(Debug)] 19006d5e247SLoGin pub struct SysFS { 19106d5e247SLoGin root_inode: Arc<KernFSInode>, 19206d5e247SLoGin kernfs: Arc<KernFS>, 19306d5e247SLoGin } 19406d5e247SLoGin 19506d5e247SLoGin impl SysFS { 19606d5e247SLoGin pub fn new() -> Self { 19706d5e247SLoGin let kernfs: Arc<KernFS> = KernFS::new(); 19806d5e247SLoGin 19906d5e247SLoGin let root_inode: Arc<KernFSInode> = kernfs.root_inode().downcast_arc().unwrap(); 20006d5e247SLoGin 20106d5e247SLoGin let sysfs = SysFS { root_inode, kernfs }; 20206d5e247SLoGin 20306d5e247SLoGin return sysfs; 20406d5e247SLoGin } 20506d5e247SLoGin 20606d5e247SLoGin pub fn root_inode(&self) -> &Arc<KernFSInode> { 20706d5e247SLoGin return &self.root_inode; 20806d5e247SLoGin } 20906d5e247SLoGin 21006d5e247SLoGin pub fn fs(&self) -> &Arc<KernFS> { 21106d5e247SLoGin return &self.kernfs; 21206d5e247SLoGin } 21306d5e247SLoGin 21406d5e247SLoGin /// 警告:重复的sysfs entry 21506d5e247SLoGin pub(self) fn warn_duplicate(&self, parent: &Arc<KernFSInode>, name: &str) { 21606d5e247SLoGin let path = self.kernfs_path(parent); 21706d5e247SLoGin kwarn!("duplicate sysfs entry: {path}/{name}"); 21806d5e247SLoGin } 2196b4e7a29SLoGin } 220