1*dfe53cf0SGnoCiYeH use alloc::{string::ToString, sync::Arc}; 2*dfe53cf0SGnoCiYeH use system_error::SystemError; 3*dfe53cf0SGnoCiYeH 4*dfe53cf0SGnoCiYeH use crate::{ 5*dfe53cf0SGnoCiYeH driver::tty::{ 6*dfe53cf0SGnoCiYeH termios::Termios, 7*dfe53cf0SGnoCiYeH tty_core::{TtyCore, TtyCoreData, TtyFlag, TtyIoctlCmd, TtyPacketStatus}, 8*dfe53cf0SGnoCiYeH tty_device::TtyFilePrivateData, 9*dfe53cf0SGnoCiYeH tty_driver::{TtyDriver, TtyDriverPrivateData, TtyDriverSubType, TtyOperation}, 10*dfe53cf0SGnoCiYeH }, 11*dfe53cf0SGnoCiYeH filesystem::{ 12*dfe53cf0SGnoCiYeH devpts::DevPtsFs, 13*dfe53cf0SGnoCiYeH vfs::{ 14*dfe53cf0SGnoCiYeH file::FileMode, syscall::ModeType, FilePrivateData, FileType, MountFS, ROOT_INODE, 15*dfe53cf0SGnoCiYeH VFS_MAX_FOLLOW_SYMLINK_TIMES, 16*dfe53cf0SGnoCiYeH }, 17*dfe53cf0SGnoCiYeH }, 18*dfe53cf0SGnoCiYeH libs::spinlock::SpinLockGuard, 19*dfe53cf0SGnoCiYeH mm::VirtAddr, 20*dfe53cf0SGnoCiYeH net::event_poll::EPollEventType, 21*dfe53cf0SGnoCiYeH syscall::user_access::UserBufferWriter, 22*dfe53cf0SGnoCiYeH }; 23*dfe53cf0SGnoCiYeH 24*dfe53cf0SGnoCiYeH use super::{ptm_driver, pts_driver, PtyCommon}; 25*dfe53cf0SGnoCiYeH 26*dfe53cf0SGnoCiYeH pub const NR_UNIX98_PTY_MAX: u32 = 128; 27*dfe53cf0SGnoCiYeH 28*dfe53cf0SGnoCiYeH #[derive(Debug)] 29*dfe53cf0SGnoCiYeH pub struct Unix98PtyDriverInner; 30*dfe53cf0SGnoCiYeH 31*dfe53cf0SGnoCiYeH impl Unix98PtyDriverInner { 32*dfe53cf0SGnoCiYeH pub fn new() -> Self { 33*dfe53cf0SGnoCiYeH Self 34*dfe53cf0SGnoCiYeH } 35*dfe53cf0SGnoCiYeH } 36*dfe53cf0SGnoCiYeH 37*dfe53cf0SGnoCiYeH impl TtyOperation for Unix98PtyDriverInner { 38*dfe53cf0SGnoCiYeH fn install(&self, driver: Arc<TtyDriver>, tty: Arc<TtyCore>) -> Result<(), SystemError> { 39*dfe53cf0SGnoCiYeH PtyCommon::pty_common_install(driver, tty, false) 40*dfe53cf0SGnoCiYeH } 41*dfe53cf0SGnoCiYeH 42*dfe53cf0SGnoCiYeH fn open(&self, tty: &TtyCoreData) -> Result<(), SystemError> { 43*dfe53cf0SGnoCiYeH PtyCommon::pty_common_open(tty) 44*dfe53cf0SGnoCiYeH } 45*dfe53cf0SGnoCiYeH 46*dfe53cf0SGnoCiYeH fn write(&self, tty: &TtyCoreData, buf: &[u8], nr: usize) -> Result<usize, SystemError> { 47*dfe53cf0SGnoCiYeH let to = tty.checked_link()?; 48*dfe53cf0SGnoCiYeH 49*dfe53cf0SGnoCiYeH if nr == 0 || tty.flow_irqsave().stopped { 50*dfe53cf0SGnoCiYeH return Ok(0); 51*dfe53cf0SGnoCiYeH } 52*dfe53cf0SGnoCiYeH 53*dfe53cf0SGnoCiYeH to.core().port().unwrap().receive_buf(buf, &[], nr) 54*dfe53cf0SGnoCiYeH } 55*dfe53cf0SGnoCiYeH 56*dfe53cf0SGnoCiYeH fn write_room(&self, tty: &TtyCoreData) -> usize { 57*dfe53cf0SGnoCiYeH // TODO 暂时 58*dfe53cf0SGnoCiYeH if tty.flow_irqsave().stopped { 59*dfe53cf0SGnoCiYeH return 0; 60*dfe53cf0SGnoCiYeH } 61*dfe53cf0SGnoCiYeH 62*dfe53cf0SGnoCiYeH 8192 63*dfe53cf0SGnoCiYeH } 64*dfe53cf0SGnoCiYeH 65*dfe53cf0SGnoCiYeH fn flush_buffer(&self, tty: &TtyCoreData) -> Result<(), SystemError> { 66*dfe53cf0SGnoCiYeH let to = tty.checked_link()?; 67*dfe53cf0SGnoCiYeH 68*dfe53cf0SGnoCiYeH let mut ctrl = to.core().contorl_info_irqsave(); 69*dfe53cf0SGnoCiYeH ctrl.pktstatus.insert(TtyPacketStatus::TIOCPKT_FLUSHWRITE); 70*dfe53cf0SGnoCiYeH 71*dfe53cf0SGnoCiYeH to.core().read_wq().wakeup_all(); 72*dfe53cf0SGnoCiYeH 73*dfe53cf0SGnoCiYeH Ok(()) 74*dfe53cf0SGnoCiYeH } 75*dfe53cf0SGnoCiYeH 76*dfe53cf0SGnoCiYeH fn ioctl(&self, tty: Arc<TtyCore>, cmd: u32, arg: usize) -> Result<(), SystemError> { 77*dfe53cf0SGnoCiYeH let core = tty.core(); 78*dfe53cf0SGnoCiYeH if core.driver().tty_driver_sub_type() != TtyDriverSubType::PtyMaster { 79*dfe53cf0SGnoCiYeH return Err(SystemError::ENOSYS); 80*dfe53cf0SGnoCiYeH } 81*dfe53cf0SGnoCiYeH 82*dfe53cf0SGnoCiYeH match cmd { 83*dfe53cf0SGnoCiYeH TtyIoctlCmd::TIOCSPTLCK => { 84*dfe53cf0SGnoCiYeH return PtyCommon::pty_set_lock(core, VirtAddr::new(arg)); 85*dfe53cf0SGnoCiYeH } 86*dfe53cf0SGnoCiYeH TtyIoctlCmd::TIOCGPTLCK => { 87*dfe53cf0SGnoCiYeH return PtyCommon::pty_get_lock(core, VirtAddr::new(arg)); 88*dfe53cf0SGnoCiYeH } 89*dfe53cf0SGnoCiYeH TtyIoctlCmd::TIOCPKT => { 90*dfe53cf0SGnoCiYeH return PtyCommon::pty_set_packet_mode(core, VirtAddr::new(arg)); 91*dfe53cf0SGnoCiYeH } 92*dfe53cf0SGnoCiYeH TtyIoctlCmd::TIOCGPKT => { 93*dfe53cf0SGnoCiYeH return PtyCommon::pty_get_packet_mode(core, VirtAddr::new(arg)); 94*dfe53cf0SGnoCiYeH } 95*dfe53cf0SGnoCiYeH TtyIoctlCmd::TIOCGPTN => { 96*dfe53cf0SGnoCiYeH let mut user_writer = 97*dfe53cf0SGnoCiYeH UserBufferWriter::new(arg as *mut u32, core::mem::size_of::<u32>(), true)?; 98*dfe53cf0SGnoCiYeH 99*dfe53cf0SGnoCiYeH return user_writer.copy_one_to_user(&(core.index() as u32), 0); 100*dfe53cf0SGnoCiYeH } 101*dfe53cf0SGnoCiYeH _ => { 102*dfe53cf0SGnoCiYeH return Err(SystemError::ENOIOCTLCMD); 103*dfe53cf0SGnoCiYeH } 104*dfe53cf0SGnoCiYeH } 105*dfe53cf0SGnoCiYeH } 106*dfe53cf0SGnoCiYeH 107*dfe53cf0SGnoCiYeH fn set_termios(&self, tty: Arc<TtyCore>, _old_termios: Termios) -> Result<(), SystemError> { 108*dfe53cf0SGnoCiYeH let core = tty.core(); 109*dfe53cf0SGnoCiYeH if core.driver().tty_driver_sub_type() != TtyDriverSubType::PtySlave { 110*dfe53cf0SGnoCiYeH return Err(SystemError::ENOSYS); 111*dfe53cf0SGnoCiYeH } 112*dfe53cf0SGnoCiYeH todo!() 113*dfe53cf0SGnoCiYeH } 114*dfe53cf0SGnoCiYeH 115*dfe53cf0SGnoCiYeH fn start(&self, core: &TtyCoreData) -> Result<(), SystemError> { 116*dfe53cf0SGnoCiYeH if core.driver().tty_driver_sub_type() != TtyDriverSubType::PtySlave { 117*dfe53cf0SGnoCiYeH return Err(SystemError::ENOSYS); 118*dfe53cf0SGnoCiYeH } 119*dfe53cf0SGnoCiYeH 120*dfe53cf0SGnoCiYeH let link = core.checked_link()?; 121*dfe53cf0SGnoCiYeH 122*dfe53cf0SGnoCiYeH let mut ctrl = core.contorl_info_irqsave(); 123*dfe53cf0SGnoCiYeH ctrl.pktstatus.remove(TtyPacketStatus::TIOCPKT_STOP); 124*dfe53cf0SGnoCiYeH ctrl.pktstatus.insert(TtyPacketStatus::TIOCPKT_START); 125*dfe53cf0SGnoCiYeH 126*dfe53cf0SGnoCiYeH link.core() 127*dfe53cf0SGnoCiYeH .read_wq() 128*dfe53cf0SGnoCiYeH .wakeup_any(EPollEventType::EPOLLIN.bits() as u64); 129*dfe53cf0SGnoCiYeH 130*dfe53cf0SGnoCiYeH Ok(()) 131*dfe53cf0SGnoCiYeH } 132*dfe53cf0SGnoCiYeH 133*dfe53cf0SGnoCiYeH fn stop(&self, core: &TtyCoreData) -> Result<(), SystemError> { 134*dfe53cf0SGnoCiYeH if core.driver().tty_driver_sub_type() != TtyDriverSubType::PtySlave { 135*dfe53cf0SGnoCiYeH return Err(SystemError::ENOSYS); 136*dfe53cf0SGnoCiYeH } 137*dfe53cf0SGnoCiYeH 138*dfe53cf0SGnoCiYeH let link = core.checked_link()?; 139*dfe53cf0SGnoCiYeH 140*dfe53cf0SGnoCiYeH let mut ctrl = core.contorl_info_irqsave(); 141*dfe53cf0SGnoCiYeH ctrl.pktstatus.remove(TtyPacketStatus::TIOCPKT_START); 142*dfe53cf0SGnoCiYeH ctrl.pktstatus.insert(TtyPacketStatus::TIOCPKT_STOP); 143*dfe53cf0SGnoCiYeH 144*dfe53cf0SGnoCiYeH link.core() 145*dfe53cf0SGnoCiYeH .read_wq() 146*dfe53cf0SGnoCiYeH .wakeup_any(EPollEventType::EPOLLIN.bits() as u64); 147*dfe53cf0SGnoCiYeH 148*dfe53cf0SGnoCiYeH Ok(()) 149*dfe53cf0SGnoCiYeH } 150*dfe53cf0SGnoCiYeH 151*dfe53cf0SGnoCiYeH fn flush_chars(&self, _tty: &TtyCoreData) { 152*dfe53cf0SGnoCiYeH // 不做处理 153*dfe53cf0SGnoCiYeH } 154*dfe53cf0SGnoCiYeH 155*dfe53cf0SGnoCiYeH fn lookup( 156*dfe53cf0SGnoCiYeH &self, 157*dfe53cf0SGnoCiYeH index: usize, 158*dfe53cf0SGnoCiYeH priv_data: TtyDriverPrivateData, 159*dfe53cf0SGnoCiYeH ) -> Result<Arc<TtyCore>, SystemError> { 160*dfe53cf0SGnoCiYeH if let TtyDriverPrivateData::Pty(false) = priv_data { 161*dfe53cf0SGnoCiYeH return pts_driver() 162*dfe53cf0SGnoCiYeH .ttys() 163*dfe53cf0SGnoCiYeH .get(&index) 164*dfe53cf0SGnoCiYeH .cloned() 165*dfe53cf0SGnoCiYeH .ok_or(SystemError::ENODEV); 166*dfe53cf0SGnoCiYeH } 167*dfe53cf0SGnoCiYeH 168*dfe53cf0SGnoCiYeH return Err(SystemError::ENOSYS); 169*dfe53cf0SGnoCiYeH } 170*dfe53cf0SGnoCiYeH 171*dfe53cf0SGnoCiYeH fn close(&self, tty: Arc<TtyCore>) -> Result<(), SystemError> { 172*dfe53cf0SGnoCiYeH let driver = tty.core().driver(); 173*dfe53cf0SGnoCiYeH 174*dfe53cf0SGnoCiYeH driver.ttys().remove(&tty.core().index()); 175*dfe53cf0SGnoCiYeH if tty.core().driver().tty_driver_sub_type() == TtyDriverSubType::PtySlave { 176*dfe53cf0SGnoCiYeH let pts_root_inode = 177*dfe53cf0SGnoCiYeH ROOT_INODE().lookup_follow_symlink("/dev/pts", VFS_MAX_FOLLOW_SYMLINK_TIMES)?; 178*dfe53cf0SGnoCiYeH let _ = pts_root_inode.unlink(&tty.core().index().to_string()); 179*dfe53cf0SGnoCiYeH } 180*dfe53cf0SGnoCiYeH 181*dfe53cf0SGnoCiYeH Ok(()) 182*dfe53cf0SGnoCiYeH } 183*dfe53cf0SGnoCiYeH } 184*dfe53cf0SGnoCiYeH 185*dfe53cf0SGnoCiYeH pub fn ptmx_open( 186*dfe53cf0SGnoCiYeH mut data: SpinLockGuard<FilePrivateData>, 187*dfe53cf0SGnoCiYeH mode: &FileMode, 188*dfe53cf0SGnoCiYeH ) -> Result<(), SystemError> { 189*dfe53cf0SGnoCiYeH let pts_root_inode = 190*dfe53cf0SGnoCiYeH ROOT_INODE().lookup_follow_symlink("/dev/pts", VFS_MAX_FOLLOW_SYMLINK_TIMES)?; 191*dfe53cf0SGnoCiYeH 192*dfe53cf0SGnoCiYeH let fs = pts_root_inode 193*dfe53cf0SGnoCiYeH .fs() 194*dfe53cf0SGnoCiYeH .as_any_ref() 195*dfe53cf0SGnoCiYeH .downcast_ref::<MountFS>() 196*dfe53cf0SGnoCiYeH .unwrap() 197*dfe53cf0SGnoCiYeH .inner_filesystem(); 198*dfe53cf0SGnoCiYeH let fsinfo = fs.as_any_ref().downcast_ref::<DevPtsFs>().unwrap(); 199*dfe53cf0SGnoCiYeH 200*dfe53cf0SGnoCiYeH let index = fsinfo.alloc_index()?; 201*dfe53cf0SGnoCiYeH 202*dfe53cf0SGnoCiYeH let tty = TtyDriver::init_tty_device(ptm_driver(), index)?; 203*dfe53cf0SGnoCiYeH 204*dfe53cf0SGnoCiYeH // 设置privdata 205*dfe53cf0SGnoCiYeH *data = FilePrivateData::Tty(TtyFilePrivateData { 206*dfe53cf0SGnoCiYeH tty: tty.clone(), 207*dfe53cf0SGnoCiYeH mode: *mode, 208*dfe53cf0SGnoCiYeH }); 209*dfe53cf0SGnoCiYeH 210*dfe53cf0SGnoCiYeH let core = tty.core(); 211*dfe53cf0SGnoCiYeH core.flags_write().insert(TtyFlag::PTY_LOCK); 212*dfe53cf0SGnoCiYeH 213*dfe53cf0SGnoCiYeH let _ = pts_root_inode.create( 214*dfe53cf0SGnoCiYeH &index.to_string(), 215*dfe53cf0SGnoCiYeH FileType::CharDevice, 216*dfe53cf0SGnoCiYeH ModeType::from_bits_truncate(0x666), 217*dfe53cf0SGnoCiYeH )?; 218*dfe53cf0SGnoCiYeH 219*dfe53cf0SGnoCiYeH ptm_driver().driver_funcs().open(core)?; 220*dfe53cf0SGnoCiYeH 221*dfe53cf0SGnoCiYeH Ok(()) 222*dfe53cf0SGnoCiYeH } 223