diff --git a/Cargo.toml b/Cargo.toml index bcfbb3a4f3e805b6efbb3b5ae3812e3a0c4116da..62b9fc88ddbe8525c3536ee11e3f5e6e7b26cbbb 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -28,14 +28,11 @@ cmake = "0.1" [dependencies] vm-fdt = { git = "https://github.com/OhmR/vm-fdt" } -#nostd_async = "0.6.0" -#woke = "0.0.2" fdt = { path = "libfdt-binding" } log = { version = "0.4", features = [ "max_level_trace", "release_max_level_info", ] } -#volatile = "0.4.4" spin = { version = "0.9.4", features = ["use_ticket_mutex"] } cortex-a = "7.4.0" buddy_system_allocator = "0.8.0" diff --git a/src/device/virtio/blk.rs b/src/device/virtio/blk.rs index 5a5dd1034cca6fb19cf1ce10faa2c862ff6ced81..664aceb9b5cf88170e7211e61ba17a0b5dedfc2f 100644 --- a/src/device/virtio/blk.rs +++ b/src/device/virtio/blk.rs @@ -401,7 +401,7 @@ pub fn generate_blk_req(req: VirtioBlkReq, vq: Virtq, dev: VirtioMmio, cache: us iov_list: Arc::new(req_node.iov.clone()), }), vm.id(), - async_blk_io_req, + async_blk_io_req(), ); add_async_task(task, false); } else { @@ -455,7 +455,7 @@ pub fn generate_blk_req(req: VirtioBlkReq, vq: Virtq, dev: VirtioMmio, cache: us iov_list: Arc::new(req_node.iov.clone()), }), vm.id(), - async_blk_io_req, + async_blk_io_req(), ); add_async_task(task, false); } else { @@ -478,7 +478,7 @@ pub fn generate_blk_req(req: VirtioBlkReq, vq: Virtq, dev: VirtioMmio, cache: us dev: dev.clone(), }), vm.id(), - async_blk_id_req, + async_blk_id_req(), ); task.set_state(AsyncTaskState::Finish); add_async_task(task, false); @@ -512,7 +512,7 @@ pub fn virtio_mediated_blk_notify_handler(vq: Virtq, blk: VirtioMmio, vm: Vm) -> blk: blk, }), vm.id(), - async_ipi_req, + async_ipi_req(), ); add_async_task(task, true); true diff --git a/src/driver/aarch64/uart.rs b/src/driver/aarch64/uart.rs index 81adab2720f6417b9459ea12b7bf0bfd708d808b..8e4ff457cf1d8fc2a0db6b3ec7fa569f4e9f4e64 100644 --- a/src/driver/aarch64/uart.rs +++ b/src/driver/aarch64/uart.rs @@ -14,10 +14,6 @@ use crate::board::{Platform, PlatOperation}; pub fn putc(byte: u8) { const UART_BASE: usize = Platform::HYPERVISOR_UART_BASE + 0x8_0000_0000; - #[cfg(feature = "qemu")] - unsafe { - ptr::write_volatile(UART_BASE as *mut u8, byte); - } // ns16550 #[cfg(feature = "tx2")] unsafe { @@ -28,7 +24,7 @@ pub fn putc(byte: u8) { ptr::write_volatile(UART_BASE as *mut u8, byte); } // pl011 - #[cfg(feature = "pi4")] + #[cfg(any(feature = "pi4", feature = "qemu"))] unsafe { if byte == '\n' as u8 { putc('\r' as u8); diff --git a/src/kernel/async_task.rs b/src/kernel/async_task.rs index 789f4f42c8d3c1f2cd1ae7cced8021cc21cb46fc..f372143c15e6a8a82d5cf630f3a3baa9f16c7ccb 100644 --- a/src/kernel/async_task.rs +++ b/src/kernel/async_task.rs @@ -8,9 +8,14 @@ // MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. // See the Mulan PSL v2 for more details. -// use alloc::boxed::Box; +use core::future::Future; +use core::pin::Pin; +use core::task::Context; + +use alloc::boxed::Box; use alloc::collections::{BTreeMap, LinkedList}; use alloc::sync::Arc; +use alloc::task::Wake; use alloc::vec::Vec; use spin::mutex::Mutex; @@ -21,12 +26,6 @@ use crate::device::{ use crate::kernel::{active_vm_id, ipi_send_msg, IpiInnerMsg, IpiMediatedMsg, IpiType, vm}; use crate::lib::{memcpy_safe, sleep, trace}; -// use core::future::Future; -// use core::pin::Pin; -// use core::task::Context; - -// use woke::{waker_ref, Woke}; - pub static TASK_IPI_COUNT: Mutex = Mutex::new(0); pub static TASK_COUNT: Mutex = Mutex::new(0); @@ -209,8 +208,7 @@ pub struct AsyncTask { pub task_data: AsyncTaskData, pub src_vmid: usize, pub state: Arc>, - // pub task: Arc + 'static + Send + Sync>>>>, - pub task: fn(), + pub task: Arc + 'static + Send + Sync>>>>, } impl TaskOwner for AsyncTask { @@ -219,23 +217,23 @@ impl TaskOwner for AsyncTask { } } -// impl Woke for AsyncTask { -// fn wake(self: Arc) { -// todo!() -// } - -// fn wake_by_ref(_arc_self: &Arc) { -// todo!() -// } -// } +impl Wake for AsyncTask { + fn wake(self: Arc) { + todo!() + } +} impl AsyncTask { - pub fn new(task_data: AsyncTaskData, src_vmid: usize, future: fn()) -> AsyncTask { + pub fn new( + task_data: AsyncTaskData, + src_vmid: usize, + future: impl Future + 'static + Send + Sync, + ) -> AsyncTask { AsyncTask { task_data, src_vmid, state: Arc::new(Mutex::new(AsyncTaskState::Pending)), - task: future, + task: Arc::new(Mutex::new(Box::pin(future))), } } @@ -253,11 +251,9 @@ impl AsyncTask { } } drop(state); - // let wake: Arc = unsafe { Arc::from_raw(self as *mut _) }; - // let waker = waker_ref(&wake); - // let mut context = Context::from_waker(&*waker); - // self.task.lock().as_mut().poll(&mut context); - (self.task)(); + let waker = Arc::new(self.clone()).into(); + let mut context = Context::from_waker(&waker); + let _ = self.task.lock().as_mut().poll(&mut context); return false; } @@ -268,7 +264,7 @@ impl AsyncTask { } // async req function -pub fn async_ipi_req() { +pub async fn async_ipi_req() { let ipi_list = ASYNC_IPI_TASK_LIST.lock(); if ipi_list.is_empty() { panic!("ipi_list should not be empty"); @@ -289,10 +285,10 @@ pub fn async_ipi_req() { } } -pub fn async_blk_id_req() {} +pub async fn async_blk_id_req() {} // inject an interrupt to service VM -pub fn async_blk_io_req() { +pub async fn async_blk_io_req() { let io_list = ASYNC_IO_TASK_LIST.lock(); if io_list.is_empty() { panic!("io_list should not be empty"); diff --git a/src/kernel/live_update.rs b/src/kernel/live_update.rs index 790290b238652322d6a9b4efe626a94988a8163a..46973ca992eb4fec876c7092133cb0f69e480228 100644 --- a/src/kernel/live_update.rs +++ b/src/kernel/live_update.rs @@ -8,7 +8,7 @@ // MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. // See the Mulan PSL v2 for more details. -// use alloc::boxed::Box; +use alloc::boxed::Box; use alloc::collections::{BTreeMap, BTreeSet, LinkedList}; use alloc::string::String; use alloc::sync::Arc; @@ -436,8 +436,7 @@ pub fn async_task_update( task_data, src_vmid: vm_id, state: Arc::new(Mutex::new(*ipi_task.state.lock())), - // task: Arc::new(Mutex::new(Box::pin(async_ipi_req()))), - task: async_ipi_req, + task: Arc::new(Mutex::new(Box::pin(async_ipi_req()))), }) } // for io_task in src_async_io_task_list.lock().iter() { @@ -485,8 +484,7 @@ pub fn async_task_update( task_data, src_vmid: vm_id, state: Arc::new(Mutex::new(*io_task.state.lock())), - // task: Arc::new(Mutex::new(Box::pin(async_blk_io_req()))), - task: async_blk_io_req, + task: Arc::new(Mutex::new(Box::pin(async_blk_io_req()))), }); } for (key, used_info) in src_async_used_info_list.lock().iter() {