#![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();}};
|
|
}
|