1#![no_std]
2#![cfg_attr(not(test), no_main)]
3
4use self::config::Config;
5use self::context::{ContextSetup, current_procmgr};
6use self::imgact::Ps4Abi;
7use self::malloc::KernelHeap;
8use self::proc::{Fork, Proc, ProcAbi, ProcMgr, Thread};
9use self::sched::sleep;
10use self::uma::Uma;
11use self::vm::Vm;
12use alloc::sync::Arc;
13use core::mem::zeroed;
14use humansize::{DECIMAL, SizeFormatter};
15use krt::info;
16
17#[cfg_attr(target_arch = "aarch64", path = "aarch64.rs")]
18#[cfg_attr(target_arch = "x86_64", path = "x86_64.rs")]
19mod arch;
20mod config;
21mod context;
22mod event;
23mod imgact;
24mod imgfmt;
25mod lock;
26mod malloc;
27mod proc;
28mod sched;
29mod signal;
30mod subsystem;
31mod trap;
32mod uma;
33mod vm;
34
35extern crate alloc;
36
37#[cfg_attr(target_os = "none", unsafe(no_mangle))]
41fn main(config: &'static ::config::Config) -> ! {
42 info!("Starting Obliteration Kernel.");
44
45 let config = Config::new(config);
48 let arch = unsafe { self::arch::setup_main_cpu() };
49
50 let proc0 = Proc::new_bare(Arc::new(Proc0Abi));
52
53 let proc0 = Arc::new(proc0);
55 let thread0 = Thread::new_bare(proc0);
56
57 let thread0 = Arc::new(thread0);
59
60 unsafe { self::context::run_with_context(config, arch, 0, thread0, setup, run) };
61}
62
63fn setup() -> ContextSetup {
64 let procs = ProcMgr::new();
69 let uma = init_vm(); ContextSetup { uma, pmgr: procs }
72}
73
74fn run() -> ! {
75 info!("Activating stage 2 heap.");
77
78 unsafe { KERNEL_HEAP.activate_stage2() };
79
80 create_init(); swapper(); }
84
85fn init_vm() -> Arc<Uma> {
92 let vm = Vm::new().unwrap();
94
95 info!(
96 concat!(
97 "Initial memory size: {} ({})\n",
98 "Boot area : {:#x}"
99 ),
100 vm.initial_memory_size(),
101 SizeFormatter::new(vm.initial_memory_size(), DECIMAL),
102 vm.boot_area()
103 );
104
105 Uma::new(vm)
107}
108
109fn create_init() {
116 let pmgr = current_procmgr().unwrap();
117 let abi = Arc::new(Ps4Abi);
118 let flags = Fork::CopyFd | Fork::CreateProcess;
119
120 pmgr.fork(abi, flags).unwrap();
121
122 todo!()
123}
124
125fn swapper() -> ! {
127 let procs = current_procmgr().unwrap();
129
130 loop {
131 let procs = procs.list();
133
134 if procs.len() == 0 {
135 sleep();
138 continue;
139 }
140
141 todo!();
142 }
143}
144
145struct Proc0Abi;
149
150impl ProcAbi for Proc0Abi {
151 fn syscall_handler(&self) {
153 unimplemented!()
154 }
155}
156
157#[allow(dead_code)]
160#[cfg_attr(target_os = "none", global_allocator)]
161static KERNEL_HEAP: KernelHeap = unsafe { KernelHeap::new(&raw mut PRIMITIVE_HEAP) };
162static mut PRIMITIVE_HEAP: [u8; 1024 * 1024] = unsafe { zeroed() };