diff --git a/src/lib.rs b/src/lib.rs index b6f7dc17..a8723ef0 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -14,3 +14,5 @@ mod stdio; mod fd_manager; pub mod signal; +#[cfg(target_arch = "aarch64")] +pub mod tty; diff --git a/src/signal.rs b/src/signal.rs index a8fffadf..be125377 100644 --- a/src/signal.rs +++ b/src/signal.rs @@ -342,6 +342,25 @@ pub fn signal_return() -> isize { } } +// not fully implemented, Starry doesn't support pgid , send to all threads now +pub fn send_signal_to_pg(signum: isize) -> AxResult<()> { + let pid2pc = PID2PC.lock(); + for (_, process) in pid2pc.iter().rev() { + let mut signal_modules = process.signal_modules.lock(); + + for (now_id, signal_module) in signal_modules.iter_mut() { + signal_module.signal_set.try_add_signal(signum as usize); + let tid2task = TID2TASK.lock(); + let main_task = Arc::clone(tid2task.get(&now_id).unwrap()); + // 如果这个时候对应的线程是处于休眠状态的,则唤醒之,进入信号处理阶段 + if main_task.is_blocked() { + axtask::wakeup_task(main_task); + } + } + } + Ok(()) +} + /// 发送信号到指定的进程 /// /// 默认发送到该进程下的主线程 diff --git a/src/tty.rs b/src/tty.rs new file mode 100644 index 00000000..7f747d46 --- /dev/null +++ b/src/tty.rs @@ -0,0 +1,25 @@ +use axhal::console::UART; +use axsignal::signal_no::SignalNo; +use crate::signal::send_signal_to_pg; + +pub fn init_uart_irq() { + axlog::error!("[init_uart_irq] uart_irq_num: {}", axhal::platform::irq::UART_IRQ_NUM); + axhal::irq::register_handler(axhal::platform::irq::UART_IRQ_NUM, uart_irq_handler); + axhal::irq::set_enable(axhal::platform::irq::UART_IRQ_NUM, true); +} + +/// UART IRQ Handler +pub fn uart_irq_handler() { + let mut inner = UART.inner.lock(); + let is_receive_interrupt = inner.is_receive_interrupt(); + if is_receive_interrupt { + inner.ack_interrupts(); + while let Some(c) = inner.getchar() { + UART.buffer.lock().push(c); + // crtl + c + if c == 3 { + send_signal_to_pg(SignalNo::SIGINT as isize); + } + } + } +} \ No newline at end of file