xref: /DragonOS/kernel/src/filesystem/sysfs/mod.rs (revision 7eda31b2f07c6ef41dc0d2bd13051f0fce5e5976)
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     syscall::SystemError,
15dd9f1fc1STingHuang };
1606d5e247SLoGin use alloc::sync::Arc;
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) => {
72*7eda31b2SLoGin                 let len = file.callback_read(buf, offset)?;
73*7eda31b2SLoGin 
7406d5e247SLoGin                 return Ok(len);
7506d5e247SLoGin             }
7606d5e247SLoGin             _ => {
7706d5e247SLoGin                 return Err(SystemError::EOPNOTSUPP_OR_ENOTSUP);
7806d5e247SLoGin             }
7906d5e247SLoGin         }
8006d5e247SLoGin     }
8106d5e247SLoGin 
8206d5e247SLoGin     #[inline(always)]
83*7eda31b2SLoGin     pub fn callback_write(&self, buf: &[u8], offset: usize) -> Result<usize, SystemError> {
8406d5e247SLoGin         match self {
8506d5e247SLoGin             SysFSKernPrivateData::File(file) => {
86*7eda31b2SLoGin                 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())
110*7eda31b2SLoGin     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 
129*7eda31b2SLoGin pub trait BinAttribute: Attribute {
130*7eda31b2SLoGin     fn support_battr(&self) -> SysFSOpsSupport;
131*7eda31b2SLoGin 
132*7eda31b2SLoGin     fn write(
133*7eda31b2SLoGin         &self,
134*7eda31b2SLoGin         _kobj: Arc<dyn KObject>,
135*7eda31b2SLoGin         _buf: &[u8],
136*7eda31b2SLoGin         _offset: usize,
137*7eda31b2SLoGin     ) -> Result<usize, SystemError> {
138*7eda31b2SLoGin         return Err(SystemError::EOPNOTSUPP_OR_ENOTSUP);
139*7eda31b2SLoGin     }
140*7eda31b2SLoGin 
141*7eda31b2SLoGin     fn read(
142*7eda31b2SLoGin         &self,
143*7eda31b2SLoGin         _kobj: Arc<dyn KObject>,
144*7eda31b2SLoGin         _buf: &mut [u8],
145*7eda31b2SLoGin         _offset: usize,
146*7eda31b2SLoGin     ) -> Result<usize, SystemError> {
147*7eda31b2SLoGin         return Err(SystemError::EOPNOTSUPP_OR_ENOTSUP);
148*7eda31b2SLoGin     }
149*7eda31b2SLoGin 
150*7eda31b2SLoGin     fn size(&self) -> usize;
151*7eda31b2SLoGin }
152*7eda31b2SLoGin 
15306d5e247SLoGin pub trait SysFSOps: Debug {
15406d5e247SLoGin     /// 获取当前文件的支持的操作
15506d5e247SLoGin     fn support(&self, attr: &dyn Attribute) -> SysFSOpsSupport {
15606d5e247SLoGin         return attr.support();
15706d5e247SLoGin     }
15806d5e247SLoGin 
159*7eda31b2SLoGin     fn support_battr(&self, attr: &Arc<dyn BinAttribute>) -> SysFSOpsSupport {
160*7eda31b2SLoGin         return attr.support();
161*7eda31b2SLoGin     }
162*7eda31b2SLoGin 
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{
180*7eda31b2SLoGin         // === for attribute ===
18106d5e247SLoGin         const SHOW = 1 << 0;
18206d5e247SLoGin         const STORE = 1 << 1;
183*7eda31b2SLoGin         // === for bin attribute ===
184*7eda31b2SLoGin         const READ = 1 << 2;
185*7eda31b2SLoGin         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