#![no_std] #![feature(linkage)] #![feature(panic_info_message)] #![feature(alloc_error_handler)] #![feature(core_intrinsics)] #[macro_use] pub mod console; mod lang_items; mod syscall; mod file; mod task; mod sync; mod io; extern crate alloc; #[macro_use] extern crate bitflags; use alloc::vec::Vec; use buddy_system_allocator::LockedHeap; use syscall::*; pub use file::*; pub use task::*; pub use sync::*; pub use io::*; const USER_HEAP_SIZE: usize = 32768; static mut HEAP_SPACE: [u8; USER_HEAP_SIZE] = [0; USER_HEAP_SIZE]; #[global_allocator] static HEAP: LockedHeap = LockedHeap::empty(); #[alloc_error_handler] pub fn handle_alloc_error(layout: core::alloc::Layout) -> ! { panic!("Heap allocation error, layout = {:?}", layout); } #[no_mangle] #[link_section = ".text.entry"] pub extern "C" fn _start(argc: usize, argv: usize) -> ! { unsafe { HEAP.lock() .init(HEAP_SPACE.as_ptr() as usize, USER_HEAP_SIZE); } let mut v: Vec<&'static str> = Vec::new(); for i in 0..argc { let str_start = unsafe { ((argv + i * core::mem::size_of::()) as *const usize).read_volatile() }; let len = (0usize..) .find(|i| unsafe { ((str_start + *i) as *const u8).read_volatile() == 0 }) .unwrap(); v.push( core::str::from_utf8(unsafe { core::slice::from_raw_parts(str_start as *const u8, len) }) .unwrap(), ); } exit(main(argc, v.as_slice())); } #[linkage = "weak"] #[no_mangle] fn main(_argc: usize, _argv: &[&str]) -> i32 { panic!("Cannot find main!"); } #[macro_export] macro_rules! vstore { ($var_ref: expr, $value: expr) => { unsafe { core::intrinsics::volatile_store($var_ref as *const _ as _, $value) } }; } #[macro_export] macro_rules! vload { ($var_ref: expr) => { unsafe { core::intrinsics::volatile_load($var_ref as *const _ as _) } }; } #[macro_export] macro_rules! memory_fence { () => { core::sync::atomic::fence(core::sync::atomic::Ordering::SeqCst) }; }