#![allow(dead_code)]
#![allow(non_snake_case)]
#![no_std]
#![no_main]
#![feature(sync_unsafe_cell)]
#![allow(clippy::fn_to_numeric_cast)]
#![allow(clippy::missing_safety_doc)]
#![allow(clippy::upper_case_acronyms)]
#![allow(clippy::new_without_default)]
#![allow(clippy::needless_return)]
#![allow(clippy::needless_range_loop)]
#![allow(clippy::mut_from_ref)]
pub mod arch;
pub mod defs;
#[macro_use]
pub mod io;
pub mod black_magic;
pub mod fs;
pub mod kthread;
pub mod machine;
pub mod mm;
pub mod proc;
extern crate alloc;
use crate::proc::sched::*;
use arch::x86_64::interrupt;
use arch::x86_64::interrupt::pic_8259;
use arch::x86_64::interrupt::pic_8259::PicDeviceInt;
use defs::*;
use kthread::KThread;
use machine::multiboot;
use proc::task::Task;
#[no_mangle]
pub unsafe extern "C" fn _entry() -> ! {
io::set_attr(0x1f);
io::reset_screen();
assert!(multiboot::check(), "bad multiboot info from grub!");
arch::x86_64::gdt::init();
interrupt::init();
mm::init();
mm::drop_init_mapping();
proc::init();
let _interval = interrupt::pit::PIT::set_interval(20000);
pic_8259::allow(PicDeviceInt::KEYBOARD);
pic_8259::allow(PicDeviceInt::TIMER);
create_tasks();
interrupt::interrupt_enable();
Scheduler::kickoff();
panic!("should not reach");
}
fn create_tasks() {
let mut sched = GLOBAL_SCHEDULER.lock();
sched.insert_task(Task::create_task(1, kthread::Idle::get_entry()));
sched.insert_task(Task::create_task(2, kthread::Meeseeks::get_entry()));
sched.insert_task(Task::create_task(3, kthread::Kshell::get_entry()));
sched.insert_task(Task::create_task(4, kthread::Lazy::get_entry()));
}