diff --git a/shared-scheduler/src/main.rs b/shared-scheduler/src/main.rs index 5b5cebb..4ebd576 100644 --- a/shared-scheduler/src/main.rs +++ b/shared-scheduler/src/main.rs @@ -41,6 +41,7 @@ pub fn panic_handler(panic_info: &core::panic::PanicInfo) -> ! { } else { syscall::sys_panic(None, 0, 0, err); } + // println!("[shared scheduler] panic: {:?}", panic_info); unreachable!() } diff --git a/tornado-kernel/src/task/executor.rs b/tornado-kernel/src/task/executor.rs index 10e22ea..d115e68 100644 --- a/tornado-kernel/src/task/executor.rs +++ b/tornado-kernel/src/task/executor.rs @@ -14,11 +14,15 @@ pub fn run_until_idle( set_task_state: impl Fn(usize, TaskState), ) { loop { + unsafe { riscv::register::sie::clear_sext(); } let task = peek_task(); + unsafe { riscv::register::sie::set_sext(); } println!(">>> kernel executor: next task = {:x?}", task); match task { TaskResult::Task(task_repr) => { // 在相同的(内核)地址空间里面 + unsafe { riscv::register::sie::clear_sext(); } set_task_state(task_repr, TaskState::Sleeping); + unsafe { riscv::register::sie::set_sext(); } let task: Arc = unsafe { Arc::from_raw(task_repr as *mut _) }; let waker = waker_ref(&task); let mut context = Context::from_waker(&*waker); @@ -26,7 +30,9 @@ pub fn run_until_idle( if let Poll::Pending = ret { mem::forget(task); // 不要释放task的内存,它将继续保存在内存中被使用 } else { // 否则,释放task的内存 + unsafe { riscv::register::sie::clear_sext(); } delete_task(task_repr); + unsafe { riscv::register::sie::set_sext(); } } // 隐含一个drop(task) }, TaskResult::ShouldYield(next_asid) => { diff --git a/tornado-kernel/src/trap/handler.rs b/tornado-kernel/src/trap/handler.rs index 54e6cde..ea298bc 100644 --- a/tornado-kernel/src/trap/handler.rs +++ b/tornado-kernel/src/trap/handler.rs @@ -253,15 +253,16 @@ pub unsafe extern "C" fn rust_supervisor_external(trap_frame: &mut TrapFrame) -> // virtio 外部中断 println!("virtio external interrupt! irq: {}", irq); // 获得数据传输完成的块号,后面需要通过这个去唤醒相应的任务 - let intr_ret = crate::virtio::BLOCK_DEVICE.handle_interrupt(); + // let intr_ret = crate::virtio::BLOCK_DEVICE.handle_interrupt(); let t = crate::VIRTIO_TASK.lock(); - let task: Arc = Arc::from_raw(t[0] as *mut _); + let task: Arc = Arc::from_raw(t[0] as *mut _); crate::task::KernelTaskRepr::do_wake(&task); core::mem::forget(task); // 释放锁 drop(t); // 通知 PLIC 外部中断已经处理完 crate::plic::plic_complete(irq); + crate::virtio::BLOCK_DEVICE.0.ack_interrupt(); trap_frame } else { panic!("unknown S mode external interrupt! irq: {}", irq); diff --git a/tornado-kernel/src/virtio/async_blk.rs b/tornado-kernel/src/virtio/async_blk.rs index 0490407..2efabef 100644 --- a/tornado-kernel/src/virtio/async_blk.rs +++ b/tornado-kernel/src/virtio/async_blk.rs @@ -44,8 +44,7 @@ impl VirtIOAsyncBlock { return sector; } _other => { - // panic!("virtio handle inerrupt error!"); - return 0; + panic!("virtio handle inerrupt error!"); } } } diff --git a/tornado-kernel/src/virtio/mod.rs b/tornado-kernel/src/virtio/mod.rs index 2d91804..240361c 100644 --- a/tornado-kernel/src/virtio/mod.rs +++ b/tornado-kernel/src/virtio/mod.rs @@ -35,6 +35,7 @@ pub extern "C" fn virtio_dma_alloc(pages: usize) -> PhysicalAddress { PhysicalPageNumber::from(ppn_base).start_address() } +// todo: 这里有 bug #[no_mangle] pub extern "C" fn virtio_dma_dealloc(pa: PhysicalAddress, pages: usize) -> i32 { let ppn = PhysicalPageNumber::floor(pa);