diff --git a/crate/bbl/src/sbi.rs b/crate/bbl/src/sbi.rs index 3942fc2..0357642 100644 --- a/crate/bbl/src/sbi.rs +++ b/crate/bbl/src/sbi.rs @@ -21,8 +21,9 @@ pub fn console_getchar() -> usize { sbi_call(SBI_CONSOLE_GETCHAR, 0, 0, 0) } -pub fn shutdown() { +pub fn shutdown() -> ! { sbi_call(SBI_SHUTDOWN, 0, 0, 0); + unreachable!() } pub fn set_timer(stime_value: u64) { diff --git a/kernel/Cargo.lock b/kernel/Cargo.lock index 765dda6..6994a2c 100644 --- a/kernel/Cargo.lock +++ b/kernel/Cargo.lock @@ -282,12 +282,12 @@ dependencies = [ [[package]] name = "rcore-fs" version = "0.1.0" -source = "git+https://github.com/wangrunji0408/rcore-fs?branch=sefs#af02ecfb3fb0da641ebe07c37af094c42dd60c2e" +source = "git+https://github.com/wangrunji0408/rcore-fs?branch=sefs#0eba40886d36311b28d42ff2a27a0f4292e2ad9f" [[package]] name = "rcore-fs-sfs" version = "0.1.0" -source = "git+https://github.com/wangrunji0408/rcore-fs?branch=sefs#af02ecfb3fb0da641ebe07c37af094c42dd60c2e" +source = "git+https://github.com/wangrunji0408/rcore-fs?branch=sefs#0eba40886d36311b28d42ff2a27a0f4292e2ad9f" dependencies = [ "bitvec 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", diff --git a/kernel/src/arch/aarch64/cpu.rs b/kernel/src/arch/aarch64/cpu.rs index bf495bc..58d10f9 100644 --- a/kernel/src/arch/aarch64/cpu.rs +++ b/kernel/src/arch/aarch64/cpu.rs @@ -6,3 +6,7 @@ pub fn id() -> usize { // TODO: cpu id 0 } + +pub fn exit_in_qemu(error_code: u8) -> ! { + unimplemented!() +} diff --git a/kernel/src/arch/aarch64/interrupt/context.rs b/kernel/src/arch/aarch64/interrupt/context.rs index ab24ecf..0328214 100644 --- a/kernel/src/arch/aarch64/interrupt/context.rs +++ b/kernel/src/arch/aarch64/interrupt/context.rs @@ -166,6 +166,18 @@ impl Context { }, }.push_at(kstack_top, ttbr) } + pub unsafe fn new_clone(tf: &TrapFrame, ustack_top: usize, kstack_top: usize, ttbr: usize, tls: usize) -> Self { + InitStack { + context: ContextData::new(), + tf: { + let mut tf = tf.clone(); + tf.sp = ustack_top; + tf.tpidr = tls; + tf.x0 = 0; + tf + }, + }.push_at(kstack_top, ttbr) + } /// Called at a new user context /// To get the init TrapFrame in sys_exec pub unsafe fn get_init_tf(&self) -> TrapFrame { diff --git a/kernel/src/arch/aarch64/mod.rs b/kernel/src/arch/aarch64/mod.rs index ecfc34d..84ede32 100644 --- a/kernel/src/arch/aarch64/mod.rs +++ b/kernel/src/arch/aarch64/mod.rs @@ -7,6 +7,7 @@ pub mod interrupt; pub mod consts; pub mod cpu; pub mod driver; +pub mod timer; #[cfg(feature = "board_raspi3")] #[path = "board/raspi3/mod.rs"] diff --git a/kernel/src/arch/aarch64/paging.rs b/kernel/src/arch/aarch64/paging.rs index 04e5b36..1d6c1e3 100644 --- a/kernel/src/arch/aarch64/paging.rs +++ b/kernel/src/arch/aarch64/paging.rs @@ -50,13 +50,13 @@ impl PageTable for ActivePageTable { fn map(&mut self, addr: usize, target: usize) -> &mut Entry { let flags = EF::default(); let attr = MairNormal::attr_value(); - self.0.map_to(Page::of_addr(addr), Frame::of_addr(target), flags, attr, &mut FrameAllocatorForAarch64) + self.0.map_to(Page::of_addr(addr as u64), Frame::of_addr(target as u64), flags, attr, &mut FrameAllocatorForAarch64) .unwrap().flush(); self.get_entry(addr).expect("fail to get entry") } fn unmap(&mut self, addr: usize) { - let (_frame, flush) = self.0.unmap(Page::of_addr(addr)).unwrap(); + let (_frame, flush) = self.0.unmap(Page::of_addr(addr as u64)).unwrap(); flush.flush(); } @@ -191,7 +191,7 @@ impl InactivePageTable for InactivePageTable0 { fn new_bare() -> Self { let target = alloc_frame().expect("failed to allocate frame"); - let frame = Frame::of_addr(target); + let frame = Frame::of_addr(target as u64); active_table().with_temporary_map(target, |_, table: &mut Aarch64PageTable| { table.zero(); // set up recursive mapping for the table @@ -274,7 +274,7 @@ struct FrameAllocatorForAarch64; impl FrameAllocator for FrameAllocatorForAarch64 { fn alloc(&mut self) -> Option { - alloc_frame().map(|addr| Frame::of_addr(addr)) + alloc_frame().map(|addr| Frame::of_addr(addr as u64)) } } diff --git a/kernel/src/arch/aarch64/timer.rs b/kernel/src/arch/aarch64/timer.rs new file mode 100644 index 0000000..ac8a51d --- /dev/null +++ b/kernel/src/arch/aarch64/timer.rs @@ -0,0 +1,3 @@ +pub fn read_epoch() -> u64 { + 0 +} \ No newline at end of file diff --git a/kernel/src/arch/riscv32/context.rs b/kernel/src/arch/riscv32/context.rs index e0a7162..18499fe 100644 --- a/kernel/src/arch/riscv32/context.rs +++ b/kernel/src/arch/riscv32/context.rs @@ -284,6 +284,20 @@ impl Context { }, }.push_at(kstack_top) } + + pub unsafe fn new_clone(tf: &TrapFrame, ustack_top: usize, kstack_top: usize, cr3: usize, tls: usize) -> Self { + InitStack { + context: ContextData::new(cr3), + tf: { + let mut tf = tf.clone(); + tf.x[2] = ustack_top; // sp + tf.x[4] = tls; // tp + tf.x[10] = 0; // a0 + tf + }, + }.push_at(kstack_top) + } + /// Called at a new user context /// To get the init TrapFrame in sys_exec pub unsafe fn get_init_tf(&self) -> TrapFrame { diff --git a/kernel/src/arch/riscv32/cpu.rs b/kernel/src/arch/riscv32/cpu.rs index 0a33080..5b17f54 100644 --- a/kernel/src/arch/riscv32/cpu.rs +++ b/kernel/src/arch/riscv32/cpu.rs @@ -35,3 +35,7 @@ pub unsafe fn start_others(hart_mask: usize) { pub fn halt() { unsafe { riscv::asm::wfi() } } + +pub fn exit_in_qemu(error_code: u8) -> ! { + bbl::sbi::shutdown() +} diff --git a/kernel/src/arch/riscv32/interrupt.rs b/kernel/src/arch/riscv32/interrupt.rs index c90bb61..bd6f4cf 100644 --- a/kernel/src/arch/riscv32/interrupt.rs +++ b/kernel/src/arch/riscv32/interrupt.rs @@ -138,8 +138,7 @@ fn try_process_serial() -> bool { } fn try_process_drivers() -> bool { - let mut drivers = DRIVERS.lock(); - for driver in drivers.iter_mut() { + for driver in DRIVERS.read().iter() { if driver.try_handle_interrupt() == true { return true } diff --git a/kernel/src/arch/riscv32/timer.rs b/kernel/src/arch/riscv32/timer.rs index 5b39cb9..d1de02a 100644 --- a/kernel/src/arch/riscv32/timer.rs +++ b/kernel/src/arch/riscv32/timer.rs @@ -27,6 +27,11 @@ pub fn get_cycle() -> u64 { } } +pub fn read_epoch() -> u64 { + // TODO: support RTC + 0 +} + /* * @brief: * enable supervisor timer interrupt and set next timer interrupt diff --git a/kernel/src/arch/x86_64/consts.rs b/kernel/src/arch/x86_64/consts.rs index b7cff18..453a955 100644 --- a/kernel/src/arch/x86_64/consts.rs +++ b/kernel/src/arch/x86_64/consts.rs @@ -95,5 +95,3 @@ pub const USER_TMP_TLS_PML4: usize = (USER_TMP_TLS_OFFSET & PML4_MASK) / PML4_SI /// Offset for usage in other temporary pages pub const USER_TMP_MISC_OFFSET: usize = USER_TMP_TLS_OFFSET + PML4_SIZE; pub const USER_TMP_MISC_PML4: usize = (USER_TMP_MISC_OFFSET & PML4_MASK) / PML4_SIZE; - -pub const USEC_PER_TICK: usize = 10000; \ No newline at end of file diff --git a/kernel/src/arch/x86_64/mod.rs b/kernel/src/arch/x86_64/mod.rs index bc6f697..a882190 100644 --- a/kernel/src/arch/x86_64/mod.rs +++ b/kernel/src/arch/x86_64/mod.rs @@ -11,6 +11,7 @@ pub mod idt; pub mod memory; pub mod io; pub mod consts; +pub mod timer; static AP_CAN_INIT: AtomicBool = ATOMIC_BOOL_INIT; diff --git a/kernel/src/arch/x86_64/timer.rs b/kernel/src/arch/x86_64/timer.rs new file mode 100644 index 0000000..3eac8cc --- /dev/null +++ b/kernel/src/arch/x86_64/timer.rs @@ -0,0 +1,3 @@ +pub fn read_epoch() -> u64 { + super::driver::rtc_cmos::read_epoch() +} \ No newline at end of file diff --git a/kernel/src/consts.rs b/kernel/src/consts.rs index 0f43fea..fe6b679 100644 --- a/kernel/src/consts.rs +++ b/kernel/src/consts.rs @@ -4,3 +4,5 @@ pub use crate::arch::consts::*; pub const MAX_CPU_NUM: usize = 8; pub const MAX_PROCESS_NUM: usize = 128; + +pub const USEC_PER_TICK: usize = 10000; diff --git a/kernel/src/drivers/block/virtio_blk.rs b/kernel/src/drivers/block/virtio_blk.rs index 7bb6e82..73ee020 100644 --- a/kernel/src/drivers/block/virtio_blk.rs +++ b/kernel/src/drivers/block/virtio_blk.rs @@ -17,7 +17,7 @@ use rcore_fs::dev::BlockDevice; use crate::memory::active_table; use crate::sync::SpinNoIrqLock as Mutex; -use super::super::{DeviceType, Driver, DRIVERS}; +use super::super::{DeviceType, Driver, DRIVERS, BLK_DRIVERS}; use super::super::bus::virtio_mmio::*; pub struct VirtIOBlk { @@ -176,5 +176,7 @@ pub fn virtio_blk_init(node: &Node) { header.status.write(VirtIODeviceStatus::DRIVER_OK.bits()); - DRIVERS.write().push(Arc::new(driver)); + let driver = Arc::new(driver); + DRIVERS.write().push(driver.clone()); + BLK_DRIVERS.write().push(driver); } \ No newline at end of file diff --git a/kernel/src/drivers/mod.rs b/kernel/src/drivers/mod.rs index 3afcd07..ccfa9eb 100644 --- a/kernel/src/drivers/mod.rs +++ b/kernel/src/drivers/mod.rs @@ -7,6 +7,7 @@ use smoltcp::socket::SocketSet; use spin::RwLock; use crate::sync::{Condvar, MutexGuard, SpinNoIrq}; +use self::block::virtio_blk::VirtIOBlkDriver; mod device_tree; pub mod bus; @@ -15,6 +16,7 @@ pub mod block; mod gpu; mod input; +#[derive(Debug, Eq, PartialEq)] pub enum DeviceType { Net, Gpu, @@ -52,11 +54,8 @@ pub trait NetDriver : Driver { lazy_static! { // NOTE: RwLock only write when initializing drivers pub static ref DRIVERS: RwLock>> = RwLock::new(Vec::new()); -} - -lazy_static! { - // NOTE: RwLock only write when initializing drivers pub static ref NET_DRIVERS: RwLock>> = RwLock::new(Vec::new()); + pub static ref BLK_DRIVERS: RwLock>> = RwLock::new(Vec::new()); } lazy_static!{ diff --git a/kernel/src/fs/mod.rs b/kernel/src/fs/mod.rs index 44b5b91..54a44fd 100644 --- a/kernel/src/fs/mod.rs +++ b/kernel/src/fs/mod.rs @@ -1,6 +1,4 @@ use alloc::{boxed::Box, collections::VecDeque, string::String, sync::Arc, vec::Vec}; -use core::any::Any; -use core::ops::Deref; use rcore_fs::vfs::*; use rcore_fs_sfs::SimpleFileSystem; @@ -25,15 +23,13 @@ lazy_static! { let device = { #[cfg(any(target_arch = "riscv32", target_arch = "riscv64"))] { - Box::new(crate::drivers::DRIVERS.lock().iter() - .map(|device| device.deref().as_any().downcast_ref::()) - .find(|maybe_blk| maybe_blk.is_some()) - .expect("VirtIOBlk not found") - .unwrap().clone()) + crate::drivers::BLK_DRIVERS.read().iter() + .next().expect("VirtIOBlk not found") + .clone() } #[cfg(target_arch = "x86_64")] { - Box::new(ide::IDE::new(1)) + Arc::new(ide::IDE::new(1)) } }; #[cfg(feature = "link_user")] @@ -42,7 +38,7 @@ lazy_static! { fn _user_img_start(); fn _user_img_end(); } - Box::new(unsafe { device::MemBuf::new(_user_img_start, _user_img_end) }) + Arc::new(unsafe { device::MemBuf::new(_user_img_start, _user_img_end) }) }; let sfs = SimpleFileSystem::open(device).expect("failed to open SFS"); diff --git a/kernel/src/syscall/time.rs b/kernel/src/syscall/time.rs index 75272a2..c0be6d1 100644 --- a/kernel/src/syscall/time.rs +++ b/kernel/src/syscall/time.rs @@ -1,14 +1,13 @@ //! Syscalls for time use super::*; -use crate::arch::consts::USEC_PER_TICK; -use crate::arch::driver::rtc_cmos; +use crate::consts::USEC_PER_TICK; use core::time::Duration; use lazy_static::lazy_static; /// should be initialized together lazy_static! { - pub static ref EPOCH_BASE: u64 = rtc_cmos::read_epoch(); + pub static ref EPOCH_BASE: u64 = crate::arch::timer::read_epoch(); pub static ref TICK_BASE: u64 = unsafe { crate::trap::TICK as u64 }; } diff --git a/user b/user index 5b6efc5..7db2bd1 160000 --- a/user +++ b/user @@ -1 +1 @@ -Subproject commit 5b6efc54fbecf5f08517be0e03c434484f7efe90 +Subproject commit 7db2bd11e523f6c176d8aa278a57e5412bc448fa