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; 1691e9d4abSLoGin use system_error::SystemError; 17dd9f1fc1STingHuang 1806d5e247SLoGin pub mod dir; 1906d5e247SLoGin pub mod file; 2006d5e247SLoGin pub mod group; 2106d5e247SLoGin pub mod symlink; 22dd9f1fc1STingHuang 2306d5e247SLoGin /// 全局的sysfs实例 24b5b571e0SLoGin static mut SYSFS_INSTANCE: Option<SysFS> = None; 25dd9f1fc1STingHuang 26dd9f1fc1STingHuang #[inline(always)] 2706d5e247SLoGin pub fn sysfs_instance() -> &'static SysFS { 28dd9f1fc1STingHuang unsafe { 29b5b571e0SLoGin 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 挂载 45*1074eb34SSamuel Dai ROOT_INODE() 46*1074eb34SSamuel Dai .mkdir("sys", ModeType::from_bits_truncate(0o755)) 47*1074eb34SSamuel Dai .expect("Unabled to find /sys") 4806d5e247SLoGin .mount(sysfs_instance().fs().clone()) 49*1074eb34SSamuel Dai .expect("Failed to mount at /sys"); 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 _ => { 77*1074eb34SSamuel Dai return Err(SystemError::ENOSYS); 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 _ => { 89*1074eb34SSamuel Dai return Err(SystemError::ENOSYS); 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 113196b75dcSLoGin /// sysfs只读属性文件的权限 114196b75dcSLoGin pub const SYSFS_ATTR_MODE_RO: ModeType = ModeType::from_bits_truncate(0o444); 115196b75dcSLoGin /// sysfs只写属性文件的权限 116196b75dcSLoGin pub const SYSFS_ATTR_MODE_WO: ModeType = ModeType::from_bits_truncate(0o200); 117196b75dcSLoGin /// sysfs读写属性文件的权限 118196b75dcSLoGin pub const SYSFS_ATTR_MODE_RW: ModeType = ModeType::from_bits_truncate(0o644); 119196b75dcSLoGin 1206b4e7a29SLoGin /// sysfs文件的属性 1216b4e7a29SLoGin pub trait Attribute: Debug + Send + Sync { 1226b4e7a29SLoGin fn name(&self) -> &str; 1236b4e7a29SLoGin fn mode(&self) -> ModeType; 12406d5e247SLoGin 12506d5e247SLoGin fn support(&self) -> SysFSOpsSupport; 12606d5e247SLoGin 12706d5e247SLoGin fn show(&self, _kobj: Arc<dyn KObject>, _buf: &mut [u8]) -> Result<usize, SystemError> { 128*1074eb34SSamuel Dai return Err(SystemError::ENOSYS); 12906d5e247SLoGin } 13006d5e247SLoGin 13106d5e247SLoGin fn store(&self, _kobj: Arc<dyn KObject>, _buf: &[u8]) -> Result<usize, SystemError> { 132*1074eb34SSamuel Dai return Err(SystemError::ENOSYS); 13306d5e247SLoGin } 13406d5e247SLoGin } 13506d5e247SLoGin 1367eda31b2SLoGin pub trait BinAttribute: Attribute { 1377eda31b2SLoGin fn support_battr(&self) -> SysFSOpsSupport; 1387eda31b2SLoGin 1397eda31b2SLoGin fn write( 1407eda31b2SLoGin &self, 1417eda31b2SLoGin _kobj: Arc<dyn KObject>, 1427eda31b2SLoGin _buf: &[u8], 1437eda31b2SLoGin _offset: usize, 1447eda31b2SLoGin ) -> Result<usize, SystemError> { 145*1074eb34SSamuel Dai return Err(SystemError::ENOSYS); 1467eda31b2SLoGin } 1477eda31b2SLoGin 1487eda31b2SLoGin fn read( 1497eda31b2SLoGin &self, 1507eda31b2SLoGin _kobj: Arc<dyn KObject>, 1517eda31b2SLoGin _buf: &mut [u8], 1527eda31b2SLoGin _offset: usize, 1537eda31b2SLoGin ) -> Result<usize, SystemError> { 154*1074eb34SSamuel Dai return Err(SystemError::ENOSYS); 1557eda31b2SLoGin } 1567eda31b2SLoGin 1577eda31b2SLoGin fn size(&self) -> usize; 1587eda31b2SLoGin } 1597eda31b2SLoGin 16006d5e247SLoGin pub trait SysFSOps: Debug { 16106d5e247SLoGin /// 获取当前文件的支持的操作 16206d5e247SLoGin fn support(&self, attr: &dyn Attribute) -> SysFSOpsSupport { 16306d5e247SLoGin return attr.support(); 16406d5e247SLoGin } 16506d5e247SLoGin 1667eda31b2SLoGin fn support_battr(&self, attr: &Arc<dyn BinAttribute>) -> SysFSOpsSupport { 1677eda31b2SLoGin return attr.support(); 1687eda31b2SLoGin } 1697eda31b2SLoGin 17006d5e247SLoGin fn show( 17106d5e247SLoGin &self, 17206d5e247SLoGin kobj: Arc<dyn KObject>, 17306d5e247SLoGin attr: &dyn Attribute, 17406d5e247SLoGin buf: &mut [u8], 17506d5e247SLoGin ) -> Result<usize, SystemError>; 17606d5e247SLoGin 17706d5e247SLoGin fn store( 17806d5e247SLoGin &self, 17906d5e247SLoGin kobj: Arc<dyn KObject>, 18006d5e247SLoGin attr: &dyn Attribute, 18106d5e247SLoGin buf: &[u8], 18206d5e247SLoGin ) -> Result<usize, SystemError>; 18306d5e247SLoGin } 18406d5e247SLoGin 18506d5e247SLoGin bitflags! { 18606d5e247SLoGin pub struct SysFSOpsSupport: u8{ 1877eda31b2SLoGin // === for attribute === 188196b75dcSLoGin const ATTR_SHOW = 1 << 0; 189196b75dcSLoGin const ATTR_STORE = 1 << 1; 1907eda31b2SLoGin // === for bin attribute === 191196b75dcSLoGin const BATTR_READ = 1 << 2; 192196b75dcSLoGin const BATTR_WRITE = 1 << 3; 19306d5e247SLoGin } 19406d5e247SLoGin } 19506d5e247SLoGin 19606d5e247SLoGin #[derive(Debug)] 19706d5e247SLoGin pub struct SysFS { 19806d5e247SLoGin root_inode: Arc<KernFSInode>, 19906d5e247SLoGin kernfs: Arc<KernFS>, 20006d5e247SLoGin } 20106d5e247SLoGin 20206d5e247SLoGin impl SysFS { 20306d5e247SLoGin pub fn new() -> Self { 20406d5e247SLoGin let kernfs: Arc<KernFS> = KernFS::new(); 20506d5e247SLoGin 20606d5e247SLoGin let root_inode: Arc<KernFSInode> = kernfs.root_inode().downcast_arc().unwrap(); 20706d5e247SLoGin 20806d5e247SLoGin let sysfs = SysFS { root_inode, kernfs }; 20906d5e247SLoGin 21006d5e247SLoGin return sysfs; 21106d5e247SLoGin } 21206d5e247SLoGin 21306d5e247SLoGin pub fn root_inode(&self) -> &Arc<KernFSInode> { 21406d5e247SLoGin return &self.root_inode; 21506d5e247SLoGin } 21606d5e247SLoGin 21706d5e247SLoGin pub fn fs(&self) -> &Arc<KernFS> { 21806d5e247SLoGin return &self.kernfs; 21906d5e247SLoGin } 22006d5e247SLoGin 22106d5e247SLoGin /// 警告:重复的sysfs entry 22206d5e247SLoGin pub(self) fn warn_duplicate(&self, parent: &Arc<KernFSInode>, name: &str) { 22306d5e247SLoGin let path = self.kernfs_path(parent); 22406d5e247SLoGin kwarn!("duplicate sysfs entry: {path}/{name}"); 22506d5e247SLoGin } 2266b4e7a29SLoGin } 227