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;
31pub mod syscalls;
32extern crate alloc;
33use crate::proc::sched::*;
34use arch::x86_64::interrupt;
35use arch::x86_64::interrupt::pic_8259;
36use arch::x86_64::interrupt::pic_8259::PicDeviceInt;
37use defs::*;
38use kthread::KThread;
39use machine::multiboot;
40use proc::task::Task;
41
42#[no_mangle]
43pub unsafe extern "C" fn _entry() -> ! {
44 io::set_attr(0x1f);
46 io::reset_screen();
47 assert!(multiboot::check(), "bad multiboot info from grub!");
49 arch::x86_64::gdt::init();
51 interrupt::init();
56 mm::init();
58 mm::drop_init_mapping();
60 proc::init();
62 let _interval = interrupt::pit::PIT::set_interval(20000);
64 pic_8259::allow(PicDeviceInt::KEYBOARD);
65 pic_8259::allow(PicDeviceInt::TIMER);
66 create_tasks();
69 interrupt::interrupt_enable();
70 Scheduler::kickoff();
71 panic!("should not reach");
72}
73
74fn create_tasks() {
75 let mut sched = GLOBAL_SCHEDULER.lock();
76 sched.insert_task(Task::create_task(1, kthread::Idle::get_entry()));
77 sched.insert_task(Task::create_task(3, kthread::Kshell::get_entry()));
79 }