mirror of
https://github.com/Mathewnd/Astral.git
synced 2026-11-01 15:08:21 +00:00
kernel: rework init
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 = .;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user