xref: /DragonOS/kernel/src/filesystem/sysfs/mod.rs (revision 1074eb34e784aa2adfc5b9e0d89fa4b7e6ea03ef)
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