continue, have some bug
This commit is contained in:
parent
e5d8a0ac9f
commit
820d4a9549
|
@ -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!()
|
||||
}
|
||||
|
||||
|
|
|
@ -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<KernelTaskRepr> = 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) => {
|
||||
|
|
|
@ -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<KernelTaskRepr> = Arc::from_raw(t[0] as *mut _);
|
||||
let task: Arc<KernelTaskRepr> = 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);
|
||||
|
|
|
@ -44,8 +44,7 @@ impl VirtIOAsyncBlock {
|
|||
return sector;
|
||||
}
|
||||
_other => {
|
||||
// panic!("virtio handle inerrupt error!");
|
||||
return 0;
|
||||
panic!("virtio handle inerrupt error!");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue