Skip to content
This repository was archived by the owner on Mar 24, 2025. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,3 +14,5 @@ mod stdio;
mod fd_manager;

pub mod signal;
#[cfg(target_arch = "aarch64")]
pub mod tty;
19 changes: 19 additions & 0 deletions src/signal.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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(())
}

/// 发送信号到指定的进程
///
/// 默认发送到该进程下的主线程
Expand Down
25 changes: 25 additions & 0 deletions src/tty.rs
Original file line number Diff line number Diff line change
@@ -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);
}
}
}
}