mod.rs 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286
  1. use core::sync::atomic::{AtomicU32, Ordering};
  2. use alloc::{
  3. collections::BTreeMap,
  4. string::{String, ToString},
  5. sync::{Arc, Weak},
  6. vec::Vec,
  7. };
  8. use ida::IdAllocator;
  9. use log::info;
  10. use system_error::SystemError;
  11. use unified_init::macros::unified_init;
  12. use crate::{
  13. driver::{
  14. base::device::{
  15. device_number::{DeviceNumber, Major},
  16. IdTable,
  17. },
  18. tty::{
  19. pty::unix98pty::NR_UNIX98_PTY_MAX,
  20. tty_device::{PtyType, TtyDevice, TtyType},
  21. },
  22. },
  23. filesystem::vfs::{syscall::ModeType, vcore::do_mount_mkdir, FileType},
  24. init::initcall::INITCALL_FS,
  25. libs::spinlock::{SpinLock, SpinLockGuard},
  26. time::PosixTimeSpec,
  27. };
  28. use super::vfs::{
  29. vcore::generate_inode_id, FilePrivateData, FileSystem, FsInfo, IndexNode, Metadata,
  30. };
  31. const DEV_PTYFS_MAX_NAMELEN: usize = 16;
  32. #[allow(dead_code)]
  33. const PTY_NR_LIMIT: usize = 4096;
  34. #[derive(Debug)]
  35. pub struct DevPtsFs {
  36. /// 根节点
  37. root_inode: Arc<LockedDevPtsFSInode>,
  38. pts_ida: SpinLock<IdAllocator>,
  39. pts_count: AtomicU32,
  40. }
  41. impl DevPtsFs {
  42. pub fn new() -> Arc<Self> {
  43. let root_inode = Arc::new(LockedDevPtsFSInode::new());
  44. let ret = Arc::new(Self {
  45. root_inode,
  46. pts_ida: SpinLock::new(IdAllocator::new(0, NR_UNIX98_PTY_MAX as usize).unwrap()),
  47. pts_count: AtomicU32::new(0),
  48. });
  49. ret.root_inode.set_fs(Arc::downgrade(&ret));
  50. ret
  51. }
  52. pub fn alloc_index(&self) -> Result<usize, SystemError> {
  53. self.pts_ida.lock().alloc().ok_or(SystemError::ENOSPC)
  54. }
  55. }
  56. impl FileSystem for DevPtsFs {
  57. fn root_inode(&self) -> Arc<dyn IndexNode> {
  58. self.root_inode.clone()
  59. }
  60. fn info(&self) -> super::vfs::FsInfo {
  61. return FsInfo {
  62. blk_dev_id: 0,
  63. max_name_len: DEV_PTYFS_MAX_NAMELEN,
  64. };
  65. }
  66. fn as_any_ref(&self) -> &dyn core::any::Any {
  67. self
  68. }
  69. fn name(&self) -> &str {
  70. "devpts"
  71. }
  72. fn super_block(&self) -> super::vfs::SuperBlock {
  73. todo!()
  74. }
  75. }
  76. #[derive(Debug)]
  77. pub struct LockedDevPtsFSInode {
  78. inner: SpinLock<PtsDevInode>,
  79. }
  80. impl LockedDevPtsFSInode {
  81. pub fn new() -> Self {
  82. Self {
  83. inner: SpinLock::new(PtsDevInode {
  84. fs: Weak::new(),
  85. children: Some(BTreeMap::new()),
  86. metadata: Metadata {
  87. dev_id: 0,
  88. inode_id: generate_inode_id(),
  89. size: 0,
  90. blk_size: 0,
  91. blocks: 0,
  92. atime: PosixTimeSpec::default(),
  93. mtime: PosixTimeSpec::default(),
  94. ctime: PosixTimeSpec::default(),
  95. btime: PosixTimeSpec::default(),
  96. file_type: FileType::Dir,
  97. mode: ModeType::from_bits_truncate(0o777),
  98. nlinks: 1,
  99. uid: 0,
  100. gid: 0,
  101. raw_dev: DeviceNumber::default(),
  102. },
  103. }),
  104. }
  105. }
  106. pub fn set_fs(&self, fs: Weak<DevPtsFs>) {
  107. self.inner.lock().fs = fs;
  108. }
  109. }
  110. #[derive(Debug)]
  111. pub struct PtsDevInode {
  112. fs: Weak<DevPtsFs>,
  113. children: Option<BTreeMap<String, Arc<TtyDevice>>>,
  114. metadata: Metadata,
  115. }
  116. impl PtsDevInode {
  117. pub fn children_unchecked(&self) -> &BTreeMap<String, Arc<TtyDevice>> {
  118. self.children.as_ref().unwrap()
  119. }
  120. pub fn children_unchecked_mut(&mut self) -> &mut BTreeMap<String, Arc<TtyDevice>> {
  121. self.children.as_mut().unwrap()
  122. }
  123. }
  124. impl IndexNode for LockedDevPtsFSInode {
  125. fn open(
  126. &self,
  127. _data: SpinLockGuard<FilePrivateData>,
  128. _mode: &super::vfs::file::FileMode,
  129. ) -> Result<(), SystemError> {
  130. Ok(())
  131. }
  132. fn metadata(&self) -> Result<super::vfs::Metadata, SystemError> {
  133. let inode = self.inner.lock();
  134. let metadata = inode.metadata.clone();
  135. return Ok(metadata);
  136. }
  137. fn close(&self, _data: SpinLockGuard<FilePrivateData>) -> Result<(), SystemError> {
  138. // TODO: 回收
  139. Ok(())
  140. }
  141. fn read_at(
  142. &self,
  143. _offset: usize,
  144. _len: usize,
  145. _buf: &mut [u8],
  146. _data: SpinLockGuard<FilePrivateData>,
  147. ) -> Result<usize, system_error::SystemError> {
  148. todo!()
  149. }
  150. fn write_at(
  151. &self,
  152. _offset: usize,
  153. _len: usize,
  154. _buf: &[u8],
  155. _data: SpinLockGuard<FilePrivateData>,
  156. ) -> Result<usize, system_error::SystemError> {
  157. todo!()
  158. }
  159. fn fs(&self) -> alloc::sync::Arc<dyn super::vfs::FileSystem> {
  160. self.inner.lock().fs.upgrade().unwrap()
  161. }
  162. fn as_any_ref(&self) -> &dyn core::any::Any {
  163. todo!()
  164. }
  165. fn list(&self) -> Result<alloc::vec::Vec<alloc::string::String>, system_error::SystemError> {
  166. let info = self.metadata()?;
  167. if info.file_type != FileType::Dir {
  168. return Err(SystemError::ENOTDIR);
  169. }
  170. let mut keys: Vec<String> = Vec::new();
  171. keys.push(String::from("."));
  172. keys.push(String::from(".."));
  173. keys.append(
  174. &mut self
  175. .inner
  176. .lock()
  177. .children_unchecked()
  178. .keys()
  179. .cloned()
  180. .collect(),
  181. );
  182. return Ok(keys);
  183. }
  184. fn create_with_data(
  185. &self,
  186. name: &str,
  187. file_type: FileType,
  188. _mode: super::vfs::syscall::ModeType,
  189. _data: usize,
  190. ) -> Result<Arc<dyn IndexNode>, SystemError> {
  191. if file_type != FileType::CharDevice {
  192. return Err(SystemError::ENOSYS);
  193. }
  194. let mut guard = self.inner.lock();
  195. if guard.children_unchecked_mut().contains_key(name) {
  196. return Err(SystemError::EEXIST);
  197. }
  198. let fs = guard.fs.upgrade().unwrap();
  199. let result = TtyDevice::new(
  200. name.to_string(),
  201. IdTable::new(name.to_string(), None),
  202. TtyType::Pty(PtyType::Pts),
  203. );
  204. let mut metadata = result.metadata()?;
  205. metadata.mode.insert(ModeType::S_IFCHR);
  206. metadata.raw_dev =
  207. DeviceNumber::new(Major::UNIX98_PTY_SLAVE_MAJOR, name.parse::<u32>().unwrap());
  208. result.set_metadata(&metadata)?;
  209. guard
  210. .children_unchecked_mut()
  211. .insert(name.to_string(), result.clone());
  212. fs.pts_count.fetch_add(1, Ordering::SeqCst);
  213. Ok(result)
  214. }
  215. fn find(&self, name: &str) -> Result<Arc<dyn IndexNode>, SystemError> {
  216. let guard = self.inner.lock();
  217. if let Some(dev) = guard.children_unchecked().get(name) {
  218. Ok(dev.clone() as Arc<dyn IndexNode>)
  219. } else {
  220. Err(SystemError::ENOENT)
  221. }
  222. }
  223. fn unlink(&self, name: &str) -> Result<(), SystemError> {
  224. let mut guard = self.inner.lock();
  225. guard.children_unchecked_mut().remove(name);
  226. Ok(())
  227. }
  228. }
  229. #[unified_init(INITCALL_FS)]
  230. #[inline(never)]
  231. pub fn devpts_init() -> Result<(), SystemError> {
  232. // 创建 devptsfs 实例
  233. let ptsfs: Arc<DevPtsFs> = DevPtsFs::new();
  234. do_mount_mkdir(ptsfs, "/dev/pts").expect("Failed to mount DevPtsFS");
  235. info!("DevPtsFs mounted.");
  236. Ok(())
  237. }