#![feature(asm)] #![feature(unique)] #![feature(const_fn)] #![feature(lang_items)] #![feature(const_unique_new)] #![feature(alloc)] #![feature(allocator_api)] #![feature(global_allocator)] #![no_std] #[macro_use] extern crate log; #[macro_use] extern crate once; #[macro_use] extern crate alloc; extern crate rlibc; extern crate spin; extern crate volatile; #[macro_use] extern crate bitflags; extern crate multiboot2; extern crate linked_list_allocator; extern crate x86_64 as x86; // sparkle-* libs #[macro_use] pub mod macros; mod alloca; mod misc; mod logger; mod arch; use arch::x86_64; use arch::x86_64::device::vga_console; use arch::x86_64::memory; use arch::x86_64::memory::FrameAllocator; use arch::x86_64::interrupts; use alloca::Allocator; use alloc::boxed::Box; /// Our globally-visible allocator. Plugs into whatever allocator we set up in [`alloca`]. // /// [`alloca`]: alloca/index.html #[global_allocator] static GLOBAL_ALLOC: Allocator = Allocator; /// Kernel main function. Called by the bootstrapping assembly stub. #[no_mangle] pub extern fn kernel_main(multiboot_info_pointer: usize) { vga_console::WRITER.lock().clear_screen(); println!("--- Sparkle v{} booting! ---", ::misc::VERSION); logger::init().expect("Logger failed to launch!"); let boot_info = unsafe {multiboot2::load(multiboot_info_pointer)}; memory::init(boot_info); info!("* memory::init(): success! *"); info!("kheap: smoke test (boxing): {:?}", Box::new("hello world")); loop {} } /// Related to stack landing pads. Don't care, do nothing. #[lang = "eh_personality"] #[no_mangle] pub extern fn eh_personality() {} /// Dumps panics to the console. #[lang = "panic_fmt"] #[no_mangle] pub extern fn panic_fmt(fmt: core::fmt::Arguments, file: &'static str, line: u32) -> ! { vga_console::WRITER.lock().set_style(vga_console::CharStyle::new(vga_console::Color::Black, vga_console::Color::Red)); println!(); println!("!!! PANIC in {} on line {} !!!", file, line); println!(" {}", fmt); unsafe{loop{x86::instructions::halt();}}; } /// Stack unwinding. Don't care, just halt. #[allow(non_snake_case)] #[no_mangle] pub extern "C" fn _Unwind_Resume() -> ! { unsafe{loop{x86::instructions::halt();}}; }