continue, have some bug

This commit is contained in:
SKTT1Ryze 2021-05-22 22:04:35 +08:00
parent e5d8a0ac9f
commit 820d4a9549
5 changed files with 12 additions and 4 deletions

View File

@ -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!()
}

View File

@ -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) => {

View File

@ -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);

View File

@ -44,8 +44,7 @@ impl VirtIOAsyncBlock {
return sector;
}
_other => {
// panic!("virtio handle inerrupt error!");
return 0;
panic!("virtio handle inerrupt error!");
}
}
}

View File

@ -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);