1*ae5ede03SLoGin use core::ops::{Deref, DerefMut}; 2b087521eSChiichen 3*ae5ede03SLoGin use super::device::{mkdev, DeviceNumber, KObject}; 4*ae5ede03SLoGin use crate::libs::spinlock::{SpinLock, SpinLockGuard}; 50663027bSTingHuang use alloc::{collections::BTreeMap, sync::Arc, vec::Vec}; 60663027bSTingHuang 70663027bSTingHuang const KOBJMAP_HASH_SIZE: usize = 255; 8*ae5ede03SLoGin pub(crate) const DEV_MAJOR_HASH_SIZE: usize = 255; 9*ae5ede03SLoGin pub(crate) const DEV_MAJOR_MAX: usize = 512; 10*ae5ede03SLoGin pub(crate) const MINOR_BITS: usize = 20; 11*ae5ede03SLoGin pub(crate) const MINOR_MASK: usize = 1 << MINOR_BITS - 1; 12b087521eSChiichen /* Marks the bottom of the first segment of free char majors */ 13*ae5ede03SLoGin pub(crate) const DEV_MAJOR_DYN_END: usize = 234; 14b087521eSChiichen /* Marks the top and bottom of the second segment of free char majors */ 15*ae5ede03SLoGin pub(crate) const DEV_MAJOR_DYN_EXT_START: usize = 511; 16*ae5ede03SLoGin pub(crate) const DEV_MAJOR_DYN_EXT_END: usize = 384; 170663027bSTingHuang 180663027bSTingHuang /// @brief: 字符设备与块设备管理结构体 190663027bSTingHuang #[derive(Debug, Clone)] 200663027bSTingHuang struct Probe(Arc<dyn KObject>); 210663027bSTingHuang 220663027bSTingHuang impl Probe { 230663027bSTingHuang /// @brief: 新建probe实例 240663027bSTingHuang /// @parameter: data: probe实例 250663027bSTingHuang /// @return: probe实例 260663027bSTingHuang pub fn new(data: Arc<dyn KObject>) -> Self { 270663027bSTingHuang Self(data) 280663027bSTingHuang } 290663027bSTingHuang } 300663027bSTingHuang 310663027bSTingHuang /// @brief: 字符设备和块设备管理实例(锁) 320663027bSTingHuang #[derive(Debug)] 330663027bSTingHuang pub struct LockedKObjMap(SpinLock<KObjMap>); 340663027bSTingHuang 350663027bSTingHuang impl Default for LockedKObjMap { 360663027bSTingHuang fn default() -> Self { 370663027bSTingHuang Self(SpinLock::new(KObjMap::default())) 380663027bSTingHuang } 390663027bSTingHuang } 400663027bSTingHuang 410663027bSTingHuang /// @brief: 字符设备和块设备管理实例 420663027bSTingHuang #[derive(Debug, Clone)] 430663027bSTingHuang struct KObjMap(Vec<BTreeMap<DeviceNumber, Probe>>); 440663027bSTingHuang 450663027bSTingHuang impl Default for KObjMap { 460663027bSTingHuang fn default() -> Self { 470663027bSTingHuang Self(vec![BTreeMap::new(); KOBJMAP_HASH_SIZE]) 480663027bSTingHuang } 490663027bSTingHuang } 500663027bSTingHuang 510663027bSTingHuang /// @brief: obj设备注册 520663027bSTingHuang /// @parameter: domain: 管理实例 530663027bSTingHuang /// dev_t: 设备号 540663027bSTingHuang /// range: 次设备号范围 550663027bSTingHuang /// data: 设备实例 560663027bSTingHuang /// @return: none 570663027bSTingHuang pub fn kobj_map( 580663027bSTingHuang domain: Arc<LockedKObjMap>, 590663027bSTingHuang dev_t: DeviceNumber, 600663027bSTingHuang range: usize, 610663027bSTingHuang data: Arc<dyn KObject>, 620663027bSTingHuang ) { 630663027bSTingHuang if let Some(map) = domain.0.lock().0.get_mut(dev_t.major() % 255) { 640663027bSTingHuang for i in 0..range { 650663027bSTingHuang map.insert( 660663027bSTingHuang mkdev(dev_t.major(), dev_t.minor() + i), 670663027bSTingHuang Probe::new(data.clone()), 680663027bSTingHuang ); 690663027bSTingHuang } 700663027bSTingHuang } 710663027bSTingHuang } 720663027bSTingHuang 730663027bSTingHuang /// @brief: obj设备注销 740663027bSTingHuang /// @parameter: domain: 管理实例 750663027bSTingHuang /// dev_t: 设备号 760663027bSTingHuang /// range: 次设备号范围 770663027bSTingHuang /// @return: none 780663027bSTingHuang pub fn kobj_unmap(domain: Arc<LockedKObjMap>, dev_t: DeviceNumber, range: usize) { 790663027bSTingHuang if let Some(map) = domain.0.lock().0.get_mut(dev_t.major() % 255) { 800663027bSTingHuang for i in 0..range { 810663027bSTingHuang let rm_dev_t = &DeviceNumber::new(Into::<usize>::into(dev_t) + i); 820663027bSTingHuang match map.get(rm_dev_t) { 830663027bSTingHuang Some(_) => { 840663027bSTingHuang map.remove(rm_dev_t); 850663027bSTingHuang } 860663027bSTingHuang None => {} 870663027bSTingHuang } 880663027bSTingHuang } 890663027bSTingHuang } 900663027bSTingHuang } 910663027bSTingHuang 920663027bSTingHuang /// @brief: 设备查找 930663027bSTingHuang /// @parameter: domain: 管理实例 940663027bSTingHuang /// dev_t: 设备号 950663027bSTingHuang /// @return: 查找成功,返回设备实例,否则返回None 960663027bSTingHuang #[allow(dead_code)] 970663027bSTingHuang pub fn kobj_lookup(domain: Arc<LockedKObjMap>, dev_t: DeviceNumber) -> Option<Arc<dyn KObject>> { 980663027bSTingHuang if let Some(map) = domain.0.lock().0.get(dev_t.major() % 255) { 990663027bSTingHuang match map.get(&dev_t) { 1000663027bSTingHuang Some(value) => { 1010663027bSTingHuang return Some(value.0.clone()); 1020663027bSTingHuang } 1030663027bSTingHuang None => { 1040663027bSTingHuang return None; 1050663027bSTingHuang } 1060663027bSTingHuang } 1070663027bSTingHuang } 1080663027bSTingHuang return None; 1090663027bSTingHuang } 110b087521eSChiichen 111b087521eSChiichen // 管理字符设备号的map(加锁) 112b087521eSChiichen pub struct LockedDevsMap(SpinLock<DevsMap>); 113b087521eSChiichen 114b087521eSChiichen impl Default for LockedDevsMap { 115b087521eSChiichen fn default() -> Self { 116b087521eSChiichen LockedDevsMap(SpinLock::new(DevsMap::default())) 117b087521eSChiichen } 118b087521eSChiichen } 119b087521eSChiichen 120*ae5ede03SLoGin impl LockedDevsMap { 121*ae5ede03SLoGin #[inline(always)] 122*ae5ede03SLoGin pub fn lock(&self) -> SpinLockGuard<DevsMap> { 123*ae5ede03SLoGin self.0.lock() 124*ae5ede03SLoGin } 125*ae5ede03SLoGin } 126*ae5ede03SLoGin 127b087521eSChiichen // 管理字符设备号的map 128b087521eSChiichen #[derive(Debug)] 129*ae5ede03SLoGin pub struct DevsMap(Vec<Vec<DeviceStruct>>); 130b087521eSChiichen 131b087521eSChiichen impl Default for DevsMap { 132b087521eSChiichen fn default() -> Self { 133b087521eSChiichen DevsMap(vec![Vec::new(); DEV_MAJOR_HASH_SIZE]) 134b087521eSChiichen } 135b087521eSChiichen } 136b087521eSChiichen 137*ae5ede03SLoGin impl Deref for DevsMap { 138*ae5ede03SLoGin type Target = Vec<Vec<DeviceStruct>>; 139*ae5ede03SLoGin 140*ae5ede03SLoGin fn deref(&self) -> &Self::Target { 141*ae5ede03SLoGin &self.0 142*ae5ede03SLoGin } 143*ae5ede03SLoGin } 144*ae5ede03SLoGin 145*ae5ede03SLoGin impl DerefMut for DevsMap { 146*ae5ede03SLoGin fn deref_mut(&mut self) -> &mut Self::Target { 147*ae5ede03SLoGin &mut self.0 148*ae5ede03SLoGin } 149*ae5ede03SLoGin } 150*ae5ede03SLoGin 151b087521eSChiichen // 字符设备在系统中的实例,devfs通过该结构与实际字符设备进行联系 152b087521eSChiichen #[allow(dead_code)] 153b087521eSChiichen #[derive(Debug, Clone)] 154b087521eSChiichen pub struct DeviceStruct { 155b087521eSChiichen dev_t: DeviceNumber, //起始设备号 156b087521eSChiichen minorct: usize, // 次设备号数量 157b087521eSChiichen name: &'static str, //字符设备名 158b087521eSChiichen } 159b087521eSChiichen 160b087521eSChiichen impl DeviceStruct { 161b087521eSChiichen /// @brief: 创建实例 162b087521eSChiichen /// @parameter: dev_t: 设备号 163b087521eSChiichen /// minorct: 次设备号数量 164b087521eSChiichen /// name: 字符设备名 165b087521eSChiichen /// char: 字符设备实例 166b087521eSChiichen /// @return: 实例 167b087521eSChiichen /// 168b087521eSChiichen #[allow(dead_code)] 169b087521eSChiichen pub fn new(dev_t: DeviceNumber, minorct: usize, name: &'static str) -> Self { 170b087521eSChiichen Self { 171b087521eSChiichen dev_t, 172b087521eSChiichen minorct, 173b087521eSChiichen name, 174b087521eSChiichen } 175b087521eSChiichen } 176b087521eSChiichen 177b087521eSChiichen /// @brief: 获取起始次设备号 178b087521eSChiichen /// @parameter: None 179b087521eSChiichen /// @return: 起始设备号 180b087521eSChiichen /// 181b087521eSChiichen #[allow(dead_code)] 182b087521eSChiichen pub fn device_number(&self) -> DeviceNumber { 183b087521eSChiichen self.dev_t 184b087521eSChiichen } 185b087521eSChiichen 186b087521eSChiichen /// @brief: 获取起始次设备号 187b087521eSChiichen /// @parameter: None 188b087521eSChiichen /// @return: 起始设备号 189b087521eSChiichen /// 190b087521eSChiichen #[allow(dead_code)] 191b087521eSChiichen pub fn base_minor(&self) -> usize { 192b087521eSChiichen self.dev_t.minor() 193b087521eSChiichen } 194b087521eSChiichen 195b087521eSChiichen /// @brief: 获取次设备号数量 196b087521eSChiichen /// @parameter: None 197b087521eSChiichen /// @return: 次设备号数量 198b087521eSChiichen #[allow(dead_code)] 199b087521eSChiichen pub fn minorct(&self) -> usize { 200b087521eSChiichen self.minorct 201b087521eSChiichen } 202b087521eSChiichen } 203