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