1#![allow(dead_code)]
2#![allow(non_snake_case)]
4#![no_std]
5#![no_main]
6#![feature(sync_unsafe_cell)]
7#![allow(clippy::fn_to_numeric_cast)]
8#![allow(clippy::missing_safety_doc)]
9#![allow(clippy::upper_case_acronyms)]
10#![allow(clippy::new_without_default)]
16#![allow(clippy::needless_return)]
17#![allow(clippy::needless_range_loop)]
18#![allow(clippy::mut_from_ref)]
21pub mod arch;
22pub mod defs;
23#[macro_use]
24pub mod io;
25pub mod black_magic;
26pub mod fs;
27pub mod kthread;
28pub mod machine;
29pub mod mm;
30pub mod proc;
31extern crate alloc;
32use crate::proc::sched::*;
33use arch::x86_64::interrupt;
34use arch::x86_64::interrupt::pic_8259;
35use arch::x86_64::interrupt::pic_8259::PicDeviceInt;
36use defs::*;
37use kthread::KThread;
38use machine::multiboot;
39use proc::task::Task;
40
41#[no_mangle]
42pub unsafe extern "C" fn _entry() -> ! {
43 io::set_attr(0x1f);
45 io::reset_screen();
46 assert!(multiboot::check(), "bad multiboot info from grub!");
48 arch::x86_64::gdt::init();
50 interrupt::init();
55 mm::init();
57 mm::drop_init_mapping();
59 proc::init();
61 let _interval = interrupt::pit::PIT::set_interval(20000);
63 pic_8259::allow(PicDeviceInt::KEYBOARD);
64 pic_8259::allow(PicDeviceInt::TIMER);
65 create_tasks();
68 interrupt::interrupt_enable();
69 Scheduler::kickoff();
70 panic!("should not reach");
71}
72
73fn create_tasks() {
74 let mut sched = GLOBAL_SCHEDULER.lock();
75 sched.insert_task(Task::create_task(1, kthread::Idle::get_entry()));
76 sched.insert_task(Task::create_task(2, kthread::Meeseeks::get_entry()));
77 sched.insert_task(Task::create_task(3, kthread::Kshell::get_entry()));
78 sched.insert_task(Task::create_task(4, kthread::Lazy::get_entry()));
79}