#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define UACPI_MEMORY_BUFFER_MAX 4096 ALIGNED(16) static uint8_t uacpi_memory_buffer[UACPI_MEMORY_BUFFER_MAX]; /* * The kernel starts booting here. This is the entry point after Limine hands control. We set up all * the necessary platform-dependent subsystems/drivers and jump into the init app. */ void bootmain(void) { struct limine_mp_response* mp = limine_mp_request.response; if (LIMINE_BASE_REVISION_SUPPORTED(limine_base_revision) == false) spin(); struct cpu* bsp_cpu = cpu_make(mp->bsp_lapic_id, 0); gdt_init(bsp_cpu); intr_init(); syscall_init(); debug_init(); pmm_init(); mm_init(); sse_enable(); uacpi_setup_early_table_access((void*)uacpi_memory_buffer, sizeof(uacpi_memory_buffer)); ioapic_init(); hpet_init(); rtc_init(); proc_pid_alloc_init(); procgroup_pgid_alloc_init(); bsp_cpu->kproc = kproc_create(); lapic_init(1000); __asm__ volatile("sti"); devices_init(); vfs_init(); struct reschedule_ctx rctx; memset(&rctx, 0, sizeof(rctx)); struct device* sys0 = device_find("sys0"); vfs_create_volume(thiscpu->kproc, &rctx, "sys", FS_TARFS, sys0, false); struct device* temp0 = device_find("temp0"); vfs_create_volume(thiscpu->kproc, &rctx, "temp", FS_FAT16, temp0, true); irq_attach(&systick_irq, NULL, INTR_SYSTICK); irq_attach(&proc_irq_sched, NULL, INTR_CPU_REQUEST_SCHED); smp_init(); proc_init(); for (;;) ; }