Something went wrong. Try again.
A custom OS written in Zig
Something went wrong. Try again.
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152use crate::{NORMAL_STACK_SIZE, acpi::parse as acpi_parse, apic::{init_bsp as apic_init_bsp, init_local_apic}, cpu_local_data::{get_local, init_ap as cpu_local_data_init_ap}, gdt::init as gdt_init, guarded_stack::{GuardedStack, StackId, StackType}, hlt_loop::hlt_loop, idt::init as idt_init, limine_requests::{MP_REQUEST, RSDP_REQUEST}, memory::init_ap as memory_init_ap, nmi_handler_states::init as nmi_init, run_program_0::run_program_0, spcr::init as spcr_init, fs::init as fs_init};use limine::mp::MpInfo;use polished_ps2 as ps2;
pub extern "sysv64" fn init_bsp() -> ! { nmi_init(); gdt_init(); idt_init();
let rsdp = RSDP_REQUEST.response().unwrap(); let acpi_tables = acpi_parse(rsdp); spcr_init(&acpi_tables); apic_init_bsp(&acpi_tables); init_local_apic(); ps2::ps2_init(); fs_init();
let mp_response = MP_REQUEST.response().unwrap();
for (i, cpu) in mp_response.cpus().iter().enumerate() { if cpu.lapic_id == mp_response.bsp_lapic_id { continue; }
cpu.bootstrap(entry_point_ap, i as u64); }
run_program_0(); hlt_loop()}
extern "sysv64" fn init_ap() -> ! { gdt_init(); idt_init(); init_local_apic(); hlt_loop()}
unsafe extern "C" fn entry_point_ap(cpu: &MpInfo) -> ! { unsafe { memory_init_ap() }; unsafe { cpu_local_data_init_ap(cpu) }; log::info!("Hello from AP");
GuardedStack::new( NORMAL_STACK_SIZE, StackId { _type: StackType::Normal, cpu_id: get_local().kernel_assigned_id } ) .switch(init_ap)}