fix: format code

This commit is contained in:
jackfiled 2024-07-19 11:41:17 +08:00
parent 8cf6fdc9bf
commit 47ba1d271a
20 changed files with 88 additions and 83 deletions

View File

@ -3,6 +3,7 @@ use core::arch::asm;
use lazy_static::lazy_static; use lazy_static::lazy_static;
use crate::log_information; use crate::log_information;
use crate::sbi::shutdown;
use crate::sync::single_cell::SingleCell; use crate::sync::single_cell::SingleCell;
use crate::trap::context::TrapContext; use crate::trap::context::TrapContext;
@ -26,14 +27,13 @@ lazy_static! {
let num_app_ptr = _num_app as usize as *const usize; let num_app_ptr = _num_app as usize as *const usize;
let num_app = num_app_ptr.read_volatile(); let num_app = num_app_ptr.read_volatile();
let mut start_addresses: [usize; MAX_APP_NUMBER + 1] = [0; MAX_APP_NUMBER + 1]; let mut start_addresses: [usize; MAX_APP_NUMBER + 1] = [0; MAX_APP_NUMBER + 1];
let start_addresses_raw: &[usize] = core::slice::from_raw_parts( let start_addresses_raw: &[usize] =
num_app_ptr.add(1), num_app + 1 core::slice::from_raw_parts(num_app_ptr.add(1), num_app + 1);
);
start_addresses[..=num_app].copy_from_slice(start_addresses_raw); start_addresses[..=num_app].copy_from_slice(start_addresses_raw);
AppManager { AppManager {
app_count: num_app, app_count: num_app,
current: 0, current: 0,
start_addresses start_addresses,
} }
}) })
}; };
@ -44,10 +44,12 @@ impl AppManager {
log_information!("[kernel] Application count is {}.", self.app_count); log_information!("[kernel] Application count is {}.", self.app_count);
for i in 0..self.app_count { for i in 0..self.app_count {
log_information!("[kernel] Application_{} ({:#x} -> {:#x})", log_information!(
"[kernel] Application_{} ({:#x} -> {:#x})",
i, i,
self.start_addresses[i], self.start_addresses[i],
self.start_addresses[i + 1]); self.start_addresses[i + 1]
);
} }
} }
@ -66,19 +68,14 @@ impl AppManager {
log_information!("[kernel] Loading application_{}...", app_id); log_information!("[kernel] Loading application_{}...", app_id);
core::slice::from_raw_parts_mut( core::slice::from_raw_parts_mut(APP_BASE_ADDRESS as *mut u8, APP_SIZE_LIMIT).fill(0);
APP_BASE_ADDRESS as *mut u8,
APP_SIZE_LIMIT
).fill(0);
let app_source = core::slice::from_raw_parts( let app_source = core::slice::from_raw_parts(
self.start_addresses[app_id] as *const u8, self.start_addresses[app_id] as *const u8,
self.start_addresses[app_id + 1] - self.start_addresses[app_id] self.start_addresses[app_id + 1] - self.start_addresses[app_id],
);
let app_destination = core::slice::from_raw_parts_mut(
APP_BASE_ADDRESS as *mut u8,
app_source.len()
); );
let app_destination =
core::slice::from_raw_parts_mut(APP_BASE_ADDRESS as *mut u8, app_source.len());
app_destination.copy_from_slice(app_source); app_destination.copy_from_slice(app_source);
// 保证指令缓存的更新 // 保证指令缓存的更新
@ -92,7 +89,7 @@ const KERNEL_STACK_SIZE: usize = 4096 * 2;
#[repr(align(4096))] #[repr(align(4096))]
struct UserStack { struct UserStack {
data: [u8; USER_STACK_SIZE] data: [u8; USER_STACK_SIZE],
} }
impl UserStack { impl UserStack {
@ -103,7 +100,7 @@ impl UserStack {
#[repr(align(4096))] #[repr(align(4096))]
struct KernelStack { struct KernelStack {
data: [u8; KERNEL_STACK_SIZE] data: [u8; KERNEL_STACK_SIZE],
} }
impl KernelStack { impl KernelStack {
@ -120,8 +117,12 @@ impl KernelStack {
} }
} }
static KERNEL_STACK: KernelStack = KernelStack { data: [0; KERNEL_STACK_SIZE]}; static KERNEL_STACK: KernelStack = KernelStack {
static USER_STACK: UserStack = UserStack { data: [0; USER_STACK_SIZE]}; data: [0; KERNEL_STACK_SIZE],
};
static USER_STACK: UserStack = UserStack {
data: [0; USER_STACK_SIZE],
};
pub fn print_app_information() { pub fn print_app_information() {
let app_manager = APP_MANAGER.exclusive_borrow(); let app_manager = APP_MANAGER.exclusive_borrow();
@ -131,6 +132,11 @@ pub fn print_app_information() {
pub fn run_next_application() -> ! { pub fn run_next_application() -> ! {
let mut app_manager = APP_MANAGER.exclusive_borrow(); let mut app_manager = APP_MANAGER.exclusive_borrow();
let current_app = app_manager.get_current_app(); let current_app = app_manager.get_current_app();
if current_app >= app_manager.app_count {
log_information!("Run out of applications, the os will stop!");
shutdown(true);
}
unsafe { unsafe {
app_manager.load_app(current_app); app_manager.load_app(current_app);
} }
@ -147,12 +153,10 @@ pub fn run_next_application() -> ! {
unsafe { unsafe {
let context_address = KERNEL_STACK.push_context(TrapContext::init_application_context( let context_address = KERNEL_STACK.push_context(TrapContext::init_application_context(
APP_BASE_ADDRESS, APP_BASE_ADDRESS,
USER_STACK.get_sp() USER_STACK.get_sp(),
)) as *const _ as usize; )) as *const _ as usize;
__restore(context_address); __restore(context_address);
unreachable!() unreachable!()
} }
} }

View File

@ -1,6 +1,6 @@
use crate::sbi::console_print;
use core::fmt; use core::fmt;
use core::fmt::Write; use core::fmt::Write;
use crate::sbi::console_print;
struct Stdout; struct Stdout;

View File

@ -1,21 +1,20 @@
#![no_std] #![no_std]
#![no_main] #![no_main]
use core::arch::global_asm;
use crate::utils::clear_bss; use crate::utils::clear_bss;
use core::arch::global_asm;
mod utils;
mod sbi;
mod console;
mod batch; mod batch;
mod console;
mod sbi;
mod sync; mod sync;
mod trap;
mod syscall; mod syscall;
mod trap;
mod utils;
global_asm!(include_str!("entry.asm")); global_asm!(include_str!("entry.asm"));
global_asm!(include_str!("link_app.asm")); global_asm!(include_str!("link_app.asm"));
#[no_mangle] #[no_mangle]
fn rust_main() -> ! { fn rust_main() -> ! {
clear_bss(); clear_bss();
@ -24,4 +23,3 @@ fn rust_main() -> ! {
batch::print_app_information(); batch::print_app_information();
batch::run_next_application(); batch::run_next_application();
} }

View File

@ -4,7 +4,7 @@ pub fn console_print(c: usize) {
} }
pub fn shutdown(failure: bool) -> ! { pub fn shutdown(failure: bool) -> ! {
use sbi_rt::{system_reset, Shutdown, NoReason, SystemFailure}; use sbi_rt::{system_reset, NoReason, Shutdown, SystemFailure};
if failure { if failure {
system_reset(Shutdown, SystemFailure); system_reset(Shutdown, SystemFailure);

View File

@ -2,17 +2,15 @@ use core::cell::{RefCell, RefMut};
/// 只能在单核场景下保持安全的屑RefCell /// 只能在单核场景下保持安全的屑RefCell
pub struct SingleCell<T> { pub struct SingleCell<T> {
inner: RefCell<T> inner: RefCell<T>,
} }
unsafe impl<T> Sync for SingleCell<T> { unsafe impl<T> Sync for SingleCell<T> {}
}
impl<T> SingleCell<T> { impl<T> SingleCell<T> {
pub unsafe fn new(value: T) -> SingleCell<T> { pub unsafe fn new(value: T) -> SingleCell<T> {
SingleCell { SingleCell {
inner: RefCell::new(value) inner: RefCell::new(value),
} }
} }

View File

@ -38,8 +38,6 @@ __alltraps:
mv a0, sp mv a0, sp
call trap_handler call trap_handler
__restore: __restore:
# case1: start running app by __restore # case1: start running app by __restore
# case2: back to U after handling trap # case2: back to U after handling trap

View File

@ -1,20 +1,22 @@
use core::arch::global_asm;
use riscv::register::{
mtvec::TrapMode,
scause::{self, Exception, Trap},
stval, stvec
};
use crate::batch::run_next_application; use crate::batch::run_next_application;
use crate::println; use crate::println;
use crate::syscall::syscall; use crate::syscall::syscall;
use crate::trap::context::TrapContext; use crate::trap::context::TrapContext;
use core::arch::global_asm;
use riscv::register::{
mtvec::TrapMode,
scause::{self, Exception, Trap},
stval, stvec,
};
pub mod context; pub mod context;
global_asm!(include_str!("trap.asm")); global_asm!(include_str!("trap.asm"));
pub fn init() { pub fn init() {
extern "C" { fn __alltraps(); } extern "C" {
fn __alltraps();
}
unsafe { unsafe {
stvec::write(__alltraps as usize, TrapMode::Direct); stvec::write(__alltraps as usize, TrapMode::Direct);
} }
@ -29,17 +31,21 @@ pub fn trap_handler(context: &mut TrapContext) -> &mut TrapContext {
Trap::Exception(Exception::UserEnvCall) => { Trap::Exception(Exception::UserEnvCall) => {
context.sepc += 4; context.sepc += 4;
context.x[10] = syscall(context.x[17], [context.x[10], context.x[11], context.x[12]]); context.x[10] = syscall(context.x[17], [context.x[10], context.x[11], context.x[12]]);
}, }
Trap::Exception(Exception::StoreFault) | Trap::Exception(Exception::StorePageFault) => { Trap::Exception(Exception::StoreFault) | Trap::Exception(Exception::StorePageFault) => {
println!("[kernel] PageFault in application, kernel will kill it."); println!("[kernel] PageFault in application, kernel will kill it.");
run_next_application(); run_next_application();
}, }
Trap::Exception(Exception::IllegalInstruction) => { Trap::Exception(Exception::IllegalInstruction) => {
println!("[kernel] Illegal instruction in application, kernel will kill it."); println!("[kernel] Illegal instruction in application, kernel will kill it.");
run_next_application(); run_next_application();
}, }
_ => { _ => {
panic!("[Kernel] Unsupported trap: {:?}, stval = {:#x}!", scause.cause(), stval); panic!(
"[Kernel] Unsupported trap: {:?}, stval = {:#x}!",
scause.cause(),
stval
);
} }
} }

View File

@ -4,7 +4,7 @@ use riscv::register::sstatus::{self, Sstatus, SPP};
pub struct TrapContext { pub struct TrapContext {
pub x: [usize; 32], pub x: [usize; 32],
pub s_status: Sstatus, pub s_status: Sstatus,
pub sepc: usize pub sepc: usize,
} }
impl TrapContext { impl TrapContext {
@ -14,7 +14,7 @@ impl TrapContext {
let mut context = Self { let mut context = Self {
x: [0; 32], x: [0; 32],
s_status: sstatus, s_status: sstatus,
sepc: entry sepc: entry,
}; };
context.set_sp(sp); context.set_sp(sp);
@ -26,4 +26,3 @@ impl TrapContext {
self.x[2] = sp; self.x[2] = sp;
} }
} }

View File

@ -1,17 +1,19 @@
use core::panic::PanicInfo; use core::panic::PanicInfo;
use crate::println;
use crate::log_error;
use crate::sbi::shutdown; use crate::sbi::shutdown;
#[panic_handler] #[panic_handler]
fn panic(info: &PanicInfo) -> ! { fn panic(info: &PanicInfo) -> ! {
if let Some(location) = info.location() { if let Some(location) = info.location() {
println!("Panicked at {}:{} {}.", log_error!(
"Panicked at {}:{} {}.",
location.file(), location.file(),
location.line(), location.line(),
info.message() info.message()
); );
} else { } else {
println!("Panicked: {}.", info.message()); log_error!("Panicked: {}.", info.message());
} }
shutdown(true) shutdown(true)
@ -24,8 +26,6 @@ pub fn clear_bss() {
} }
for m in sbss as usize..ebss as usize { for m in sbss as usize..ebss as usize {
unsafe { unsafe { (m as *mut u8).write_volatile(0) }
(m as *mut u8).write_volatile(0)
}
} }
} }

View File

@ -1,5 +1,5 @@
use core::fmt::Write;
use crate::syscall::sys_write; use crate::syscall::sys_write;
use core::fmt::Write;
struct Stdout; struct Stdout;

View File

@ -3,8 +3,8 @@
use crate::syscall::{sys_exit, sys_write}; use crate::syscall::{sys_exit, sys_write};
mod utils;
mod syscall; mod syscall;
mod utils;
#[macro_use] #[macro_use]
pub mod console; pub mod console;
@ -28,4 +28,3 @@ pub fn write(fd: usize, buf: &[u8]) -> isize {
pub fn exit(exit_code: i32) -> isize { pub fn exit(exit_code: i32) -> isize {
sys_exit(exit_code) sys_exit(exit_code)
} }

View File

@ -4,7 +4,7 @@ const SYSCALL_WRITE: usize = 64;
const SYSCALL_EXIT: usize = 93; const SYSCALL_EXIT: usize = 93;
fn syscall(id: usize, args: [usize; 3]) -> isize { fn syscall(id: usize, args: [usize; 3]) -> isize {
let mut result : isize; let mut result: isize;
unsafe { unsafe {
asm!( asm!(

View File

@ -1,5 +1,5 @@
use core::panic::PanicInfo;
use crate::println; use crate::println;
use core::panic::PanicInfo;
pub fn clear_bss() { pub fn clear_bss() {
extern "C" { extern "C" {
@ -9,9 +9,7 @@ pub fn clear_bss() {
} }
for i in start_bss as usize..end_bss as usize { for i in start_bss as usize..end_bss as usize {
unsafe { unsafe { (i as *mut u8).write_volatile(0) }
(i as *mut u8).write_volatile(0)
}
} }
} }
@ -20,7 +18,12 @@ fn panic_handler(info: &PanicInfo) -> ! {
let message = info.message(); let message = info.message();
if let Some(location) = info.location() { if let Some(location) = info.location() {
println!("Panicked at {}:{} {}", location.file(), location.line(), message); println!(
"Panicked at {}:{} {}",
location.file(),
location.line(),
message
);
} else { } else {
println!("Panicked: {}", message); println!("Panicked: {}", message);
} }