From f6a54c398de062eb0e83d40c8d34d09ca70ef6e9 Mon Sep 17 00:00:00 2001 From: Jiajie Chen Date: Sat, 11 May 2019 23:10:19 +0800 Subject: [PATCH] [WIP] rv32 can enter userland now --- kernel/src/arch/riscv32/consts.rs | 2 +- kernel/src/arch/x86_64/driver/vga.rs | 6 +++--- kernel/src/arch/x86_64/gdt.rs | 7 ++----- kernel/src/arch/x86_64/interrupt/mod.rs | 2 +- kernel/src/arch/x86_64/ipi.rs | 1 - kernel/src/arch/x86_64/mod.rs | 7 +++++-- kernel/src/arch/x86_64/paging.rs | 5 +---- kernel/src/drivers/provider.rs | 2 +- kernel/src/memory.rs | 2 +- kernel/src/process/structs.rs | 2 +- 10 files changed, 16 insertions(+), 20 deletions(-) diff --git a/kernel/src/arch/riscv32/consts.rs b/kernel/src/arch/riscv32/consts.rs index 095ed26..b8e02d6 100644 --- a/kernel/src/arch/riscv32/consts.rs +++ b/kernel/src/arch/riscv32/consts.rs @@ -19,7 +19,7 @@ pub const MEMORY_END: usize = 0x8060_0000; pub const MEMORY_END: usize = 0x8800_0000; // FIXME: rv64 `sh` and `ls` will crash if stack top > 0x80000000 ??? -pub const USER_STACK_OFFSET: usize = 0x80000000 - USER_STACK_SIZE; +pub const USER_STACK_OFFSET: usize = 0x40000000 - USER_STACK_SIZE; pub const USER_STACK_SIZE: usize = 0x10000; pub const MAX_DTB_SIZE: usize = 0x2000; diff --git a/kernel/src/arch/x86_64/driver/vga.rs b/kernel/src/arch/x86_64/driver/vga.rs index 5a49f82..8a8a009 100644 --- a/kernel/src/arch/x86_64/driver/vga.rs +++ b/kernel/src/arch/x86_64/driver/vga.rs @@ -99,9 +99,9 @@ impl VgaBuffer { } lazy_static! { - pub static ref VGA_WRITER: Mutex = Mutex::new( - VgaWriter::new(unsafe{ &mut *((phys_to_virt(0xb8000)) as *mut VgaBuffer) }) - ); + pub static ref VGA_WRITER: Mutex = Mutex::new(VgaWriter::new(unsafe { + &mut *((phys_to_virt(0xb8000)) as *mut VgaBuffer) + })); } pub struct VgaWriter { diff --git a/kernel/src/arch/x86_64/gdt.rs b/kernel/src/arch/x86_64/gdt.rs index ffa3056..e24ef98 100644 --- a/kernel/src/arch/x86_64/gdt.rs +++ b/kernel/src/arch/x86_64/gdt.rs @@ -48,10 +48,7 @@ impl Cpu { } pub fn iter() -> impl Iterator { - unsafe { - CPUS.iter() - .filter_map(|x| x.as_ref()) - } + unsafe { CPUS.iter().filter_map(|x| x.as_ref()) } } pub fn id(&self) -> usize { self.id @@ -114,7 +111,7 @@ const KCODE: Descriptor = Descriptor::UserSegment(0x0020980000000000); // EXECUT const UCODE: Descriptor = Descriptor::UserSegment(0x0020F80000000000); // EXECUTABLE | USER_SEGMENT | USER_MODE | PRESENT | LONG_MODE const KDATA: Descriptor = Descriptor::UserSegment(0x0000920000000000); // DATA_WRITABLE | USER_SEGMENT | PRESENT const UDATA: Descriptor = Descriptor::UserSegment(0x0000F20000000000); // DATA_WRITABLE | USER_SEGMENT | USER_MODE | PRESENT -// Copied from xv6 + // Copied from xv6 const UCODE32: Descriptor = Descriptor::UserSegment(0x00cffa00_0000ffff); // EXECUTABLE | USER_SEGMENT | USER_MODE | PRESENT const UDATA32: Descriptor = Descriptor::UserSegment(0x00cff200_0000ffff); // EXECUTABLE | USER_SEGMENT | USER_MODE | PRESENT diff --git a/kernel/src/arch/x86_64/interrupt/mod.rs b/kernel/src/arch/x86_64/interrupt/mod.rs index ca4da35..c162b99 100644 --- a/kernel/src/arch/x86_64/interrupt/mod.rs +++ b/kernel/src/arch/x86_64/interrupt/mod.rs @@ -6,8 +6,8 @@ mod trapframe; pub use self::handler::*; pub use self::trapframe::*; use crate::consts::KERNEL_OFFSET; -use apic::*; use crate::memory::phys_to_virt; +use apic::*; #[inline(always)] pub unsafe fn enable() { diff --git a/kernel/src/arch/x86_64/ipi.rs b/kernel/src/arch/x86_64/ipi.rs index b520b4f..730cf14 100644 --- a/kernel/src/arch/x86_64/ipi.rs +++ b/kernel/src/arch/x86_64/ipi.rs @@ -1,6 +1,5 @@ /// Interface for inter-processor interrupt. /// This module wraps inter-processor interrupt into a broadcast-calling style. - use crate::consts::KERNEL_OFFSET; use alloc::boxed::{Box, FnBox}; use alloc::sync::Arc; diff --git a/kernel/src/arch/x86_64/mod.rs b/kernel/src/arch/x86_64/mod.rs index fa201f1..b6b77fb 100644 --- a/kernel/src/arch/x86_64/mod.rs +++ b/kernel/src/arch/x86_64/mod.rs @@ -9,12 +9,12 @@ pub mod gdt; pub mod idt; pub mod interrupt; pub mod io; +pub mod ipi; pub mod memory; pub mod paging; pub mod rand; pub mod syscall; pub mod timer; -pub mod ipi; static AP_CAN_INIT: AtomicBool = AtomicBool::new(false); @@ -34,7 +34,10 @@ pub extern "C" fn _start(boot_info: &'static BootInfo) -> ! { // First init log mod, so that we can print log info. crate::logging::init(); info!("{:#x?}", boot_info); - assert_eq!(boot_info.physical_memory_offset as usize, consts::PHYSICAL_MEMORY_OFFSET); + assert_eq!( + boot_info.physical_memory_offset as usize, + consts::PHYSICAL_MEMORY_OFFSET + ); // Init trap handling. idt::init(); diff --git a/kernel/src/arch/x86_64/paging.rs b/kernel/src/arch/x86_64/paging.rs index 804b7f4..af9f283 100644 --- a/kernel/src/arch/x86_64/paging.rs +++ b/kernel/src/arch/x86_64/paging.rs @@ -286,8 +286,5 @@ fn flush_tlb_all(vaddr: usize) { if !super::AP_CAN_INIT.load(Ordering::Relaxed) { return; } - super::ipi::invoke_on_allcpu( - move || tlb::flush(VirtAddr::new(vaddr as u64)), - false, - ); + super::ipi::invoke_on_allcpu(move || tlb::flush(VirtAddr::new(vaddr as u64)), false); } diff --git a/kernel/src/drivers/provider.rs b/kernel/src/drivers/provider.rs index 88006cc..c72bf2a 100644 --- a/kernel/src/drivers/provider.rs +++ b/kernel/src/drivers/provider.rs @@ -1,9 +1,9 @@ use alloc::alloc::{alloc_zeroed, dealloc, Layout}; +pub use crate::arch::paging::PageTableImpl; use isomorphic_drivers::provider; use rcore_memory::paging::PageTable; use rcore_memory::PAGE_SIZE; -pub use crate::arch::paging::PageTableImpl; pub struct Provider; diff --git a/kernel/src/memory.rs b/kernel/src/memory.rs index 6288b4a..88293fc 100644 --- a/kernel/src/memory.rs +++ b/kernel/src/memory.rs @@ -16,7 +16,7 @@ use super::HEAP_ALLOCATOR; pub use crate::arch::paging::*; use crate::consts::{KERNEL_OFFSET, MEMORY_OFFSET, PHYSICAL_MEMORY_OFFSET}; use crate::process::current_thread; -use crate::sync::{SpinNoIrqLock, MutexGuard, SpinNoIrq}; +use crate::sync::{MutexGuard, SpinNoIrq, SpinNoIrqLock}; use alloc::boxed::Box; use bitmap_allocator::BitAlloc; use buddy_system_allocator::Heap; diff --git a/kernel/src/process/structs.rs b/kernel/src/process/structs.rs index 8bce028..0ed4ce8 100644 --- a/kernel/src/process/structs.rs +++ b/kernel/src/process/structs.rs @@ -20,9 +20,9 @@ use crate::memory::{ use crate::sync::{Condvar, SpinNoIrqLock as Mutex}; use super::abi::{self, ProcInitInfo}; +use crate::processor; use core::mem::uninitialized; use rcore_fs::vfs::INode; -use crate::processor; pub struct Thread { context: Context,