kernel: rework init

This commit is contained in:
Matheus
2025-08-14 20:25:43 -03:00
parent fb6cbe49d7
commit 607566531d
41 changed files with 268 additions and 164 deletions
+6 -1
View File
@@ -8,6 +8,7 @@
#include <arch/msr.h>
#include <kernel/timer.h>
#include <kernel/timekeeper.h>
#include <kernel/init.h>
#include <uacpi/tables.h>
#include <uacpi/acpi.h>
@@ -240,6 +241,8 @@ void arch_apic_timerinit() {
__assert(current_cpu()->timer);
}
INIT_ROUTINE_DEFINE(arch_timer, INIT_ROUTINE_FLAGS_NONE, arch_apic_timerinit, timekeeper_early);
void arch_apic_sendipi(uint8_t cpu, uint8_t vec, uint8_t dest, uint8_t mode, uint8_t level) {
writelapic(APIC_REG_ICR_HI, (uint32_t)cpu << 24);
writelapic(APIC_REG_ICR_LO, vec | (level << 8) | (mode << 11) | (dest << 18) | (1 << 14));
@@ -263,7 +266,7 @@ void arch_apic_init() {
// map LAPIC to virtual memory
void *paddr = (void *) rdmsr(MSR_IA32APICBASE);
void *paddr = (void *) rdmsr(MSR_IA32APICBASE);
lapic_address = vmm_map(NULL, PAGE_SIZE, VMM_FLAGS_PHYSICAL, ARCH_MMU_FLAGS_READ | ARCH_MMU_FLAGS_WRITE | ARCH_MMU_FLAGS_NOEXEC, paddr);
__assert(lapic_address);
@@ -289,3 +292,5 @@ void arch_apic_init() {
// FIXME limine does this already but just in case the PIC should be masked
}
INIT_ROUTINE_DEFINE(arch_irq, INIT_ROUTINE_FLAGS_NONE, arch_apic_init, acpi_early);
+22 -3
View File
@@ -4,6 +4,10 @@
#include <logging.h>
#include <arch/cpuid.h>
#include <kernel/topology.h>
#include <kernel/init.h>
#include <arch/idt.h>
#include <arch/gdt.h>
#include <kernel/dpc.h>
#define EFER_SYSCALLENABLE 1
@@ -145,9 +149,7 @@ static void get_topology(long *topology_ids, long *topology_types) {
}
}
void cpu_initstate() {
arch_apic_initap();
void arch_cpu_init() {
// syscall instruction
unsigned int eax = 0, ebx = 0, ecx = 0, edx = 0;
__get_cpuid(0x80000001, &eax, &ebx, &ecx, &edx);
@@ -224,3 +226,20 @@ void cpu_initstate() {
topology_insert(topology_nodes[i], i == 0 ? topology_get_root() : topology_nodes[i - 1], TOPOLOGY_MAKE_ID(topology_types[i], topology_ids[i]), current_cpu());
}
}
INIT_ROUTINE_DEFINE(cpu, INIT_ROUTINE_FLAGS_NONE, arch_cpu_init, acpi_early);
static void infinite_loop(void) {
asm volatile("cli");
for (;;) asm volatile("");
}
static void arch_early(void) {
arch_gdt_reload();
arch_idt_setup();
arch_idt_reload();
interrupt_register(0xfd, (void *)infinite_loop, NULL, IPL_IGNORE);
dpc_init();
}
INIT_ROUTINE_DEFINE(arch_early, INIT_ROUTINE_FLAGS_NONE, arch_early)
+9 -3
View File
@@ -2,6 +2,7 @@
#include <kernel/devfs.h>
#include <logging.h>
#include <kernel/usercopy.h>
#include <kernel/init.h>
void arch_e9_putc(char c) {
#ifdef X86_64_ENABLE_E9
@@ -9,6 +10,11 @@ void arch_e9_putc(char c) {
#endif
}
void arch_early_log(char c) {
arch_e9_putc(c);
}
void arch_e9_puts(char *c) {
#ifdef X86_64_ENABLE_E9
while (*c) {
@@ -35,10 +41,10 @@ static int devwrite(int minor, iovec_iterator_t *iovec_iterator, size_t count, u
static devops_t devops = {
.write = devwrite
};
#endif
void arch_e9_initdev() {
#ifdef X86_64_ENABLE_E9
__assert(devfs_register(&devops, "e9", V_TYPE_CHDEV, DEV_MAJOR_E9, 0, 0666, NULL) == 0);
#endif
}
INIT_ROUTINE_DEFINE(e9, INIT_ROUTINE_FLAGS_NONE, arch_e9_initdev, devfs);
#endif
+7
View File
@@ -32,6 +32,13 @@ SECTIONS
*(.timekeeper_sources);
timekeeper_sources_end = .;
} :rodata
. = ALIGN(8);
.init_routines : {
init_routines = .;
*(.init_routines);
init_routines_end = .;
} :rodata
. = ALIGN(4K);
_rodata_end = .;
-138
View File
@@ -1,138 +0,0 @@
#include <arch/e9.h>
#include <logging.h>
#include <arch/cpu.h>
#include <arch/gdt.h>
#include <arch/idt.h>
#include <kernel/acpi.h>
#include <kernel/term.h>
#include <kernel/pmm.h>
#include <arch/mmu.h>
#include <kernel/vmm.h>
#include <kernel/slab.h>
#include <kernel/alloc.h>
#include <arch/apic.h>
#include <arch/hpet.h>
#include <kernel/timekeeper.h>
#include <kernel/scheduler.h>
#include <kernel/vfs.h>
#include <kernel/tmpfs.h>
#include <kernel/initrd.h>
#include <kernel/devfs.h>
#include <kernel/pseudodevices.h>
#include <arch/ps2.h>
#include <kernel/keyboard.h>
#include <kernel/console.h>
#include <kernel/dpc.h>
#include <kernel/pipefs.h>
#include <kernel/fb.h>
#include <kernel/pci.h>
#include <kernel/nvme.h>
#include <kernel/block.h>
#include <kernel/ext2.h>
#include <kernel/cmdline.h>
#include <arch/smp.h>
#include <kernel/virtio.h>
#include <kernel/net.h>
#include <kernel/sock.h>
#include <kernel/mouse.h>
#include <kernel/tty.h>
#include <kernel/pty.h>
#include <kernel/vmmcache.h>
#include <kernel/defaultauth.h>
static cpu_t bsp_cpu;
void kernel_entry() {
cpu_set(&bsp_cpu);
logging_sethook(arch_e9_putc);
arch_gdt_reload();
arch_idt_setup();
arch_idt_reload();
dpc_init();
pmm_init();
term_init();
logging_sethook(term_putchar);
arch_mmu_init();
vmm_init();
alloc_init();
cmdline_parse();
acpi_early_init();
arch_apic_init();
timekeeper_early_init(0);
cpu_initstate();
arch_apic_timerinit();
sched_init();
timekeeper_init();
arch_smp_wakeup();
timekeeper_sync();
pci_init();
acpi_init();
vmmcache_init();
vfs_init();
tmpfs_init();
devfs_init();
pipefs_init();
sockfs_init();
ext2_init();
acpi_initdevice();
tty_init();
pty_init();
loopback_init();
arp_init();
ipv4_init();
tcp_init();
pseudodevices_init();
arch_e9_initdev();
keyboard_init();
arch_ps2_init();
fb_init();
nvme_init();
virtio_init();
console_init();
logging_sethook(console_putc);
char *root = cmdline_get("root");
char *rootfs = cmdline_get("rootfs");
printf("entry: mounting %s (%s) on /\n", root == NULL ? "none" : root, rootfs);
vnode_t *backing;
if (root) {
__assert(devfs_getbyname(root, &backing) == 0);
} else {
backing = NULL;
}
__assert(vfs_mount(backing, vfsroot, "/", rootfs, NULL) == 0);
if (backing) {
VOP_RELEASE(backing);
}
if (cmdline_get("initrd"))
initrd_unpack();
defaultauth_init();
proc_run_init();
sched_threadexit();
}
cpu_t *get_bsp(void) {
return &bsp_cpu;
}
+3
View File
@@ -7,6 +7,7 @@
#include <kernel/vmm.h>
#include <arch/cpu.h>
#include <arch/smp.h>
#include <kernel/init.h>
#define ADDRMASK (uint64_t)0x7ffffffffffff000
#define PTMASK (uint64_t)0b111111111000000000000
@@ -381,6 +382,8 @@ void arch_mmu_init() {
arch_mmu_apswitch();
}
INIT_ROUTINE_DEFINE(mmu, INIT_ROUTINE_FLAGS_NONE, arch_mmu_init, pmm);
void arch_mmu_apswitch() {
arch_mmu_switch(FROM_HHDM(template));
interrupt_register(13, gpfisr, NULL, IPL_IGNORE);
+3
View File
@@ -2,6 +2,7 @@
#include <logging.h>
#include <arch/ps2kbd.h>
#include <arch/ps2mouse.h>
#include <kernel/init.h>
static void ps2_disablescanning(int port) {
ps2_device_command(port, PS2_DEVICE_CMD_DISABLESCANNING);
@@ -275,3 +276,5 @@ void arch_ps2_init() {
ps2_write_command(PS2_CTLR_CMD_WRITECFG);
ps2_write_data(control);
}
INIT_ROUTINE_DEFINE(ps2, INIT_ROUTINE_FLAGS_NONE, arch_ps2_init, acpi, keyboard);
+8 -8
View File
@@ -7,6 +7,7 @@
#include <kernel/cmdline.h>
#include <arch/smp.h>
#include <kernel/alloc.h>
#include <kernel/init.h>
static volatile struct limine_smp_request smprequest = {
.id = LIMINE_SMP_REQUEST
@@ -21,8 +22,6 @@ static void cpuwakeuphalt(struct limine_smp_info *info) {
for (;;) CPU_HALT();
}
static time_t us_offset;
static void cpuwakeup(struct limine_smp_info *info) {
cpu_set((cpu_t *)info->extra_argument);
@@ -33,11 +32,13 @@ static void cpuwakeup(struct limine_smp_info *info) {
arch_mmu_apswitch();
vmm_apinit();
timekeeper_early_init(us_offset);
arch_apic_initap();
cpu_initstate();
timekeeper_early_init();
arch_cpu_init();
arch_apic_timerinit();
timekeeper_init();
__atomic_add_fetch(&arch_smp_cpusawake, 1, __ATOMIC_SEQ_CST);
@@ -55,7 +56,6 @@ void arch_smp_haltallothers() {
cpu_t **smp_cpus;
void arch_smp_wakeup() {
interrupt_register(0xfd, (void *)cpuwakeuphalt, NULL, IPL_IGNORE);
struct limine_smp_response *response = smprequest.response;
if (response == NULL) {
// TODO try to detect the other processors manually
@@ -77,8 +77,6 @@ void arch_smp_wakeup() {
void (*wakeupfn)(struct limine_smp_info *) = cmdline_get("nosmp") ? cpuwakeuphalt : cpuwakeup;
us_offset = timespec_us(timekeeper_timefromboot());
// make the other processors jump to cpuwakeup()
for (int i = 0; i < response->cpu_count; ++i) {
// skip the bootstrap processor
@@ -99,3 +97,5 @@ void arch_smp_wakeup() {
printf("smp: awoke other processors\n");
}
INIT_ROUTINE_DEFINE(smp, INIT_ROUTINE_FLAGS_NONE, arch_smp_wakeup, scheduler);