16b4e7a29SLoGin use core::fmt::Debug; 26b4e7a29SLoGin 36b4e7a29SLoGin use self::{dir::SysKernDirPriv, file::SysKernFilePriv}; 46b4e7a29SLoGin 5*06d5e247SLoGin use super::{ 6*06d5e247SLoGin kernfs::{KernFS, KernFSInode}, 7*06d5e247SLoGin vfs::{syscall::ModeType, FileSystem}, 8dd9f1fc1STingHuang }; 9dd9f1fc1STingHuang use crate::{ 10*06d5e247SLoGin driver::base::kobject::KObject, 11*06d5e247SLoGin filesystem::vfs::ROOT_INODE, 12*06d5e247SLoGin kinfo, kwarn, 13*06d5e247SLoGin libs::{casting::DowncastArc, once::Once}, 14dd9f1fc1STingHuang syscall::SystemError, 15dd9f1fc1STingHuang }; 16*06d5e247SLoGin use alloc::sync::Arc; 17dd9f1fc1STingHuang 18*06d5e247SLoGin pub mod dir; 19*06d5e247SLoGin pub mod file; 20*06d5e247SLoGin pub mod group; 21*06d5e247SLoGin pub mod symlink; 22dd9f1fc1STingHuang 23*06d5e247SLoGin /// 全局的sysfs实例 24*06d5e247SLoGin pub(self) static mut SYSFS_INSTANCE: Option<SysFS> = None; 25dd9f1fc1STingHuang 26dd9f1fc1STingHuang #[inline(always)] 27*06d5e247SLoGin pub fn sysfs_instance() -> &'static SysFS { 28dd9f1fc1STingHuang unsafe { 29*06d5e247SLoGin 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..."); 38*06d5e247SLoGin 39b087521eSChiichen // 创建 sysfs 实例 40*06d5e247SLoGin // let sysfs: Arc<OldSysFS> = OldSysFS::new(); 41*06d5e247SLoGin let sysfs = SysFS::new(); 42*06d5e247SLoGin unsafe { SYSFS_INSTANCE = Some(sysfs) }; 43b087521eSChiichen 44b087521eSChiichen // sysfs 挂载 45b087521eSChiichen let _t = ROOT_INODE() 46b087521eSChiichen .find("sys") 47b087521eSChiichen .expect("Cannot find /sys") 48*06d5e247SLoGin .mount(sysfs_instance().fs().clone()) 49b087521eSChiichen .expect("Failed to mount sysfs"); 50b087521eSChiichen kinfo!("SysFS mounted."); 51b087521eSChiichen 52*06d5e247SLoGin // 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 67*06d5e247SLoGin impl SysFSKernPrivateData { 68*06d5e247SLoGin #[inline(always)] 69*06d5e247SLoGin pub fn callback_read(&self, buf: &mut [u8], offset: usize) -> Result<usize, SystemError> { 70*06d5e247SLoGin match self { 71*06d5e247SLoGin SysFSKernPrivateData::File(file) => { 72*06d5e247SLoGin let len = file.callback_read(buf)?; 73*06d5e247SLoGin if offset > 0 { 74*06d5e247SLoGin if len <= offset { 75*06d5e247SLoGin return Ok(0); 76*06d5e247SLoGin } 77*06d5e247SLoGin let len = len - offset; 78*06d5e247SLoGin buf.copy_within(offset..offset + len, 0); 79*06d5e247SLoGin buf[len] = 0; 80*06d5e247SLoGin } 81*06d5e247SLoGin return Ok(len); 82*06d5e247SLoGin } 83*06d5e247SLoGin _ => { 84*06d5e247SLoGin return Err(SystemError::EOPNOTSUPP_OR_ENOTSUP); 85*06d5e247SLoGin } 86*06d5e247SLoGin } 87*06d5e247SLoGin } 88*06d5e247SLoGin 89*06d5e247SLoGin #[inline(always)] 90*06d5e247SLoGin pub fn callback_write(&self, buf: &[u8], _offset: usize) -> Result<usize, SystemError> { 91*06d5e247SLoGin match self { 92*06d5e247SLoGin SysFSKernPrivateData::File(file) => { 93*06d5e247SLoGin return file.callback_write(buf); 94*06d5e247SLoGin } 95*06d5e247SLoGin _ => { 96*06d5e247SLoGin return Err(SystemError::EOPNOTSUPP_OR_ENOTSUP); 97*06d5e247SLoGin } 98*06d5e247SLoGin } 99*06d5e247SLoGin } 100*06d5e247SLoGin } 101*06d5e247SLoGin 1026b4e7a29SLoGin /// sysfs文件目录的属性组 1036b4e7a29SLoGin pub trait AttributeGroup: Debug + Send + Sync { 104*06d5e247SLoGin /// 属性组的名称 105*06d5e247SLoGin /// 106*06d5e247SLoGin /// 如果属性组的名称为None,则所有的属性都会被添加到父目录下,而不是创建一个新的目录 107*06d5e247SLoGin fn name(&self) -> Option<&str>; 108*06d5e247SLoGin /// 属性组的属性列表 1096b4e7a29SLoGin fn attrs(&self) -> &[&'static dyn Attribute]; 110*06d5e247SLoGin 111*06d5e247SLoGin /// 属性在当前属性组内的权限(该方法可选) 112*06d5e247SLoGin /// 113*06d5e247SLoGin /// 如果返回None,则使用Attribute的mode()方法返回的权限 114*06d5e247SLoGin /// 115*06d5e247SLoGin /// 如果返回Some,则使用返回的权限。 116*06d5e247SLoGin /// 如果要标识属性不可见,则返回Some(ModeType::empty()) 117*06d5e247SLoGin fn is_visible(&self, kobj: Arc<dyn KObject>, attr: &dyn Attribute) -> Option<ModeType>; 1186b4e7a29SLoGin } 1196b4e7a29SLoGin 1206b4e7a29SLoGin /// sysfs文件的属性 1216b4e7a29SLoGin pub trait Attribute: Debug + Send + Sync { 1226b4e7a29SLoGin fn name(&self) -> &str; 1236b4e7a29SLoGin fn mode(&self) -> ModeType; 124*06d5e247SLoGin 125*06d5e247SLoGin fn support(&self) -> SysFSOpsSupport; 126*06d5e247SLoGin 127*06d5e247SLoGin fn show(&self, _kobj: Arc<dyn KObject>, _buf: &mut [u8]) -> Result<usize, SystemError> { 128*06d5e247SLoGin return Err(SystemError::EOPNOTSUPP_OR_ENOTSUP); 129*06d5e247SLoGin } 130*06d5e247SLoGin 131*06d5e247SLoGin fn store(&self, _kobj: Arc<dyn KObject>, _buf: &[u8]) -> Result<usize, SystemError> { 132*06d5e247SLoGin return Err(SystemError::EOPNOTSUPP_OR_ENOTSUP); 133*06d5e247SLoGin } 134*06d5e247SLoGin } 135*06d5e247SLoGin 136*06d5e247SLoGin pub trait SysFSOps: Debug { 137*06d5e247SLoGin /// 获取当前文件的支持的操作 138*06d5e247SLoGin fn support(&self, attr: &dyn Attribute) -> SysFSOpsSupport { 139*06d5e247SLoGin return attr.support(); 140*06d5e247SLoGin } 141*06d5e247SLoGin 142*06d5e247SLoGin fn show( 143*06d5e247SLoGin &self, 144*06d5e247SLoGin kobj: Arc<dyn KObject>, 145*06d5e247SLoGin attr: &dyn Attribute, 146*06d5e247SLoGin buf: &mut [u8], 147*06d5e247SLoGin ) -> Result<usize, SystemError>; 148*06d5e247SLoGin 149*06d5e247SLoGin fn store( 150*06d5e247SLoGin &self, 151*06d5e247SLoGin kobj: Arc<dyn KObject>, 152*06d5e247SLoGin attr: &dyn Attribute, 153*06d5e247SLoGin buf: &[u8], 154*06d5e247SLoGin ) -> Result<usize, SystemError>; 155*06d5e247SLoGin } 156*06d5e247SLoGin 157*06d5e247SLoGin bitflags! { 158*06d5e247SLoGin pub struct SysFSOpsSupport: u8{ 159*06d5e247SLoGin const SHOW = 1 << 0; 160*06d5e247SLoGin const STORE = 1 << 1; 161*06d5e247SLoGin } 162*06d5e247SLoGin } 163*06d5e247SLoGin 164*06d5e247SLoGin #[derive(Debug)] 165*06d5e247SLoGin pub struct SysFS { 166*06d5e247SLoGin root_inode: Arc<KernFSInode>, 167*06d5e247SLoGin kernfs: Arc<KernFS>, 168*06d5e247SLoGin } 169*06d5e247SLoGin 170*06d5e247SLoGin impl SysFS { 171*06d5e247SLoGin pub fn new() -> Self { 172*06d5e247SLoGin let kernfs: Arc<KernFS> = KernFS::new(); 173*06d5e247SLoGin 174*06d5e247SLoGin let root_inode: Arc<KernFSInode> = kernfs.root_inode().downcast_arc().unwrap(); 175*06d5e247SLoGin 176*06d5e247SLoGin let sysfs = SysFS { root_inode, kernfs }; 177*06d5e247SLoGin 178*06d5e247SLoGin return sysfs; 179*06d5e247SLoGin } 180*06d5e247SLoGin 181*06d5e247SLoGin pub fn root_inode(&self) -> &Arc<KernFSInode> { 182*06d5e247SLoGin return &self.root_inode; 183*06d5e247SLoGin } 184*06d5e247SLoGin 185*06d5e247SLoGin pub fn fs(&self) -> &Arc<KernFS> { 186*06d5e247SLoGin return &self.kernfs; 187*06d5e247SLoGin } 188*06d5e247SLoGin 189*06d5e247SLoGin /// 警告:重复的sysfs entry 190*06d5e247SLoGin pub(self) fn warn_duplicate(&self, parent: &Arc<KernFSInode>, name: &str) { 191*06d5e247SLoGin let path = self.kernfs_path(parent); 192*06d5e247SLoGin kwarn!("duplicate sysfs entry: {path}/{name}"); 193*06d5e247SLoGin } 1946b4e7a29SLoGin } 195