From: Tulio A M Mendes Date: Sat, 7 Feb 2026 15:50:34 +0000 (-0300) Subject: refactor: rename arch_start to arch_early_setup X-Git-Url: https://projects.tadryanom.me/?a=commitdiff_plain;h=9ec38e06c71c3eb3fad0f768ab2a148e5d371d01;p=AdrOS.git refactor: rename arch_start to arch_early_setup --- diff --git a/README.md b/README.md index 018a03e..f7ab93e 100644 --- a/README.md +++ b/README.md @@ -62,7 +62,7 @@ QEMU debug helpers: ## TODO - **Multi-architecture kernel bring-up** - Implement VMM/interrupts/scheduler for ARM/RISC-V/MIPS - - Standardize arch entrypoint behavior (`arch_start`) across architectures + - Standardize arch entrypoint behavior (`arch_early_setup`) across architectures - **Userspace** - Process model (fork/exec/wait), per-process address spaces, and cleanup on `exit` - Syscall ABI expansion (read/open/close, file descriptors, etc.) diff --git a/include/arch/arch_early_setup.h b/include/arch/arch_early_setup.h new file mode 100644 index 0000000..17dfb77 --- /dev/null +++ b/include/arch/arch_early_setup.h @@ -0,0 +1,8 @@ + #ifndef ARCH_EARLY_SETUP_H + #define ARCH_EARLY_SETUP_H + + #include "arch/arch_boot_args.h" + + void arch_early_setup(const struct arch_boot_args* args); + + #endif diff --git a/include/arch/arch_start.h b/include/arch/arch_start.h deleted file mode 100644 index 10616da..0000000 --- a/include/arch/arch_start.h +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef ARCH_START_H -#define ARCH_START_H - -#include "arch/arch_boot_args.h" - -void arch_start(const struct arch_boot_args* args); - -#endif diff --git a/src/arch/arm/arch_early_setup.c b/src/arch/arm/arch_early_setup.c new file mode 100644 index 0000000..6db98ca --- /dev/null +++ b/src/arch/arm/arch_early_setup.c @@ -0,0 +1,26 @@ + #include "arch/arch_early_setup.h" +#include "kernel/boot_info.h" + +#include "uart_console.h" + +extern void kernel_main(const struct boot_info* bi); + + void arch_early_setup(const struct arch_boot_args* args) { + (void)args; + + uart_init(); + uart_print("\n[AdrOS] Booting...\n"); + + struct boot_info bi; + bi.arch_magic = 0; + bi.arch_boot_info = 0; + bi.initrd_start = 0; + bi.initrd_end = 0; + bi.cmdline = NULL; + + kernel_main(&bi); + + for(;;) { + __asm__ volatile("wfi"); + } +} diff --git a/src/arch/arm/arch_start.c b/src/arch/arm/arch_start.c deleted file mode 100644 index 3ecafa8..0000000 --- a/src/arch/arm/arch_start.c +++ /dev/null @@ -1,26 +0,0 @@ -#include "arch/arch_start.h" -#include "kernel/boot_info.h" - -#include "uart_console.h" - -extern void kernel_main(const struct boot_info* bi); - -void arch_start(const struct arch_boot_args* args) { - (void)args; - - uart_init(); - uart_print("\n[AdrOS] Booting...\n"); - - struct boot_info bi; - bi.arch_magic = 0; - bi.arch_boot_info = 0; - bi.initrd_start = 0; - bi.initrd_end = 0; - bi.cmdline = NULL; - - kernel_main(&bi); - - for(;;) { - __asm__ volatile("wfi"); - } -} diff --git a/src/arch/arm/boot.S b/src/arch/arm/boot.S index e09d8fb..e2f04da 100644 --- a/src/arch/arm/boot.S +++ b/src/arch/arm/boot.S @@ -17,9 +17,9 @@ _start: ldr x0, =stack_top mov sp, x0 - /* Build arch_boot_args (in .bss) and call arch_start(args) */ + /* Build arch_boot_args (in .bss) and call arch_early_setup(args) */ ldr x0, =arch_boot_args - bl arch_start + bl arch_early_setup /* Hang */ 1: wfi diff --git a/src/arch/mips/arch_early_setup.c b/src/arch/mips/arch_early_setup.c new file mode 100644 index 0000000..441a432 --- /dev/null +++ b/src/arch/mips/arch_early_setup.c @@ -0,0 +1,26 @@ + #include "arch/arch_early_setup.h" +#include "kernel/boot_info.h" + +#include "uart_console.h" + +extern void kernel_main(const struct boot_info* bi); + + void arch_early_setup(const struct arch_boot_args* args) { + (void)args; + + uart_init(); + uart_print("\n[AdrOS] Booting...\n"); + + struct boot_info bi; + bi.arch_magic = 0; + bi.arch_boot_info = 0; + bi.initrd_start = 0; + bi.initrd_end = 0; + bi.cmdline = NULL; + + kernel_main(&bi); + + for(;;) { + __asm__ volatile("nop"); + } +} diff --git a/src/arch/mips/arch_start.c b/src/arch/mips/arch_start.c deleted file mode 100644 index a938356..0000000 --- a/src/arch/mips/arch_start.c +++ /dev/null @@ -1,26 +0,0 @@ -#include "arch/arch_start.h" -#include "kernel/boot_info.h" - -#include "uart_console.h" - -extern void kernel_main(const struct boot_info* bi); - -void arch_start(const struct arch_boot_args* args) { - (void)args; - - uart_init(); - uart_print("\n[AdrOS] Booting...\n"); - - struct boot_info bi; - bi.arch_magic = 0; - bi.arch_boot_info = 0; - bi.initrd_start = 0; - bi.initrd_end = 0; - bi.cmdline = NULL; - - kernel_main(&bi); - - for(;;) { - __asm__ volatile("nop"); - } -} diff --git a/src/arch/mips/boot.S b/src/arch/mips/boot.S index 50addc7..45cbe4c 100644 --- a/src/arch/mips/boot.S +++ b/src/arch/mips/boot.S @@ -13,14 +13,14 @@ _start: la $sp, stack_top - /* Build arch_boot_args (in .bss) and call arch_start(args) */ + /* Build arch_boot_args (in .bss) and call arch_early_setup(args) */ la $a0, arch_boot_args sw $zero, 0($a0) sw $zero, 4($a0) sw $zero, 8($a0) sw $zero, 12($a0) - jal arch_start + jal arch_early_setup nop 1: diff --git a/src/arch/riscv/arch_early_setup.c b/src/arch/riscv/arch_early_setup.c new file mode 100644 index 0000000..6db98ca --- /dev/null +++ b/src/arch/riscv/arch_early_setup.c @@ -0,0 +1,26 @@ + #include "arch/arch_early_setup.h" +#include "kernel/boot_info.h" + +#include "uart_console.h" + +extern void kernel_main(const struct boot_info* bi); + + void arch_early_setup(const struct arch_boot_args* args) { + (void)args; + + uart_init(); + uart_print("\n[AdrOS] Booting...\n"); + + struct boot_info bi; + bi.arch_magic = 0; + bi.arch_boot_info = 0; + bi.initrd_start = 0; + bi.initrd_end = 0; + bi.cmdline = NULL; + + kernel_main(&bi); + + for(;;) { + __asm__ volatile("wfi"); + } +} diff --git a/src/arch/riscv/arch_start.c b/src/arch/riscv/arch_start.c deleted file mode 100644 index 3ecafa8..0000000 --- a/src/arch/riscv/arch_start.c +++ /dev/null @@ -1,26 +0,0 @@ -#include "arch/arch_start.h" -#include "kernel/boot_info.h" - -#include "uart_console.h" - -extern void kernel_main(const struct boot_info* bi); - -void arch_start(const struct arch_boot_args* args) { - (void)args; - - uart_init(); - uart_print("\n[AdrOS] Booting...\n"); - - struct boot_info bi; - bi.arch_magic = 0; - bi.arch_boot_info = 0; - bi.initrd_start = 0; - bi.initrd_end = 0; - bi.cmdline = NULL; - - kernel_main(&bi); - - for(;;) { - __asm__ volatile("wfi"); - } -} diff --git a/src/arch/riscv/boot.S b/src/arch/riscv/boot.S index 0ce1755..8f6bd24 100644 --- a/src/arch/riscv/boot.S +++ b/src/arch/riscv/boot.S @@ -15,9 +15,9 @@ _start: */ la sp, stack_top - /* Build arch_boot_args (in .bss) and call arch_start(args) */ + /* Build arch_boot_args (in .bss) and call arch_early_setup(args) */ la a0, arch_boot_args - call arch_start + call arch_early_setup /* Hang if return */ 1: wfi diff --git a/src/arch/x86/arch_early_setup.c b/src/arch/x86/arch_early_setup.c new file mode 100644 index 0000000..10eae7a --- /dev/null +++ b/src/arch/x86/arch_early_setup.c @@ -0,0 +1,81 @@ + #include "arch/arch_early_setup.h" + +#include "kernel/boot_info.h" + +#include "gdt.h" +#include "idt.h" +#include "uart_console.h" + +#include "multiboot2.h" + +extern void kernel_main(const struct boot_info* bi); + +static uint8_t multiboot_copy[65536]; +static uint32_t multiboot_copy_size; + + void arch_early_setup(const struct arch_boot_args* args) { + uart_init(); + uart_print("\n[AdrOS] Booting...\n"); + + uint32_t magic = (uint32_t)(args ? args->a0 : 0); + uintptr_t mbi_phys = (uintptr_t)(args ? args->a1 : 0); + + if (magic != 0x36d76289) { + uart_print("[ERR] Invalid Multiboot2 Magic!\n"); + } else { + uart_print("[OK] Multiboot2 Magic Confirmed.\n"); + } + + uart_print("[AdrOS] Initializing GDT/TSS...\n"); + gdt_init(); + + uart_print("[AdrOS] Initializing IDT...\n"); + idt_init(); + + struct boot_info bi; + bi.arch_magic = magic; + bi.arch_boot_info = 0; + bi.initrd_start = 0; + bi.initrd_end = 0; + bi.cmdline = NULL; + + if (mbi_phys) { + uint32_t total_size = *(volatile uint32_t*)mbi_phys; + if (total_size >= 8) { + multiboot_copy_size = total_size; + if (multiboot_copy_size > sizeof(multiboot_copy)) { + uart_print("[WARN] Multiboot2 info too large, truncating copy.\n"); + multiboot_copy_size = sizeof(multiboot_copy); + } + + for (uint32_t i = 0; i < multiboot_copy_size; i++) { + multiboot_copy[i] = *(volatile uint8_t*)(mbi_phys + i); + } + bi.arch_boot_info = (uintptr_t)multiboot_copy; + } + } + + if (bi.arch_boot_info) { + struct multiboot_tag* tag; + for (tag = (struct multiboot_tag*)((uint8_t*)bi.arch_boot_info + 8); + tag->type != MULTIBOOT_TAG_TYPE_END; + tag = (struct multiboot_tag*)((uint8_t*)tag + ((tag->size + 7) & ~7))) { + if (tag->type == MULTIBOOT_TAG_TYPE_MODULE) { + struct multiboot_tag_module* mod = (struct multiboot_tag_module*)tag; + bi.initrd_start = mod->mod_start; + bi.initrd_end = mod->mod_end; + break; + } + if (tag->type == MULTIBOOT_TAG_TYPE_CMDLINE) { + struct multiboot_tag_string* s = (struct multiboot_tag_string*)tag; + bi.cmdline = s->string; + } + } + } + + kernel_main(&bi); + + for(;;) { + __asm__ volatile("hlt"); + } +} diff --git a/src/arch/x86/arch_start.c b/src/arch/x86/arch_start.c deleted file mode 100644 index 5c745fd..0000000 --- a/src/arch/x86/arch_start.c +++ /dev/null @@ -1,81 +0,0 @@ -#include "arch/arch_start.h" - -#include "kernel/boot_info.h" - -#include "gdt.h" -#include "idt.h" -#include "uart_console.h" - -#include "multiboot2.h" - -extern void kernel_main(const struct boot_info* bi); - -static uint8_t multiboot_copy[65536]; -static uint32_t multiboot_copy_size; - -void arch_start(const struct arch_boot_args* args) { - uart_init(); - uart_print("\n[AdrOS] Booting...\n"); - - uint32_t magic = (uint32_t)(args ? args->a0 : 0); - uintptr_t mbi_phys = (uintptr_t)(args ? args->a1 : 0); - - if (magic != 0x36d76289) { - uart_print("[ERR] Invalid Multiboot2 Magic!\n"); - } else { - uart_print("[OK] Multiboot2 Magic Confirmed.\n"); - } - - uart_print("[AdrOS] Initializing GDT/TSS...\n"); - gdt_init(); - - uart_print("[AdrOS] Initializing IDT...\n"); - idt_init(); - - struct boot_info bi; - bi.arch_magic = magic; - bi.arch_boot_info = 0; - bi.initrd_start = 0; - bi.initrd_end = 0; - bi.cmdline = NULL; - - if (mbi_phys) { - uint32_t total_size = *(volatile uint32_t*)mbi_phys; - if (total_size >= 8) { - multiboot_copy_size = total_size; - if (multiboot_copy_size > sizeof(multiboot_copy)) { - uart_print("[WARN] Multiboot2 info too large, truncating copy.\n"); - multiboot_copy_size = sizeof(multiboot_copy); - } - - for (uint32_t i = 0; i < multiboot_copy_size; i++) { - multiboot_copy[i] = *(volatile uint8_t*)(mbi_phys + i); - } - bi.arch_boot_info = (uintptr_t)multiboot_copy; - } - } - - if (bi.arch_boot_info) { - struct multiboot_tag* tag; - for (tag = (struct multiboot_tag*)((uint8_t*)bi.arch_boot_info + 8); - tag->type != MULTIBOOT_TAG_TYPE_END; - tag = (struct multiboot_tag*)((uint8_t*)tag + ((tag->size + 7) & ~7))) { - if (tag->type == MULTIBOOT_TAG_TYPE_MODULE) { - struct multiboot_tag_module* mod = (struct multiboot_tag_module*)tag; - bi.initrd_start = mod->mod_start; - bi.initrd_end = mod->mod_end; - break; - } - if (tag->type == MULTIBOOT_TAG_TYPE_CMDLINE) { - struct multiboot_tag_string* s = (struct multiboot_tag_string*)tag; - bi.cmdline = s->string; - } - } - } - - kernel_main(&bi); - - for(;;) { - __asm__ volatile("hlt"); - } -} diff --git a/src/arch/x86/boot.S b/src/arch/x86/boot.S index f8aa345..f7db75a 100644 --- a/src/arch/x86/boot.S +++ b/src/arch/x86/boot.S @@ -62,7 +62,7 @@ _start: /* * Map 0-16MB using 4 page tables. - * With Multiboot2 info copied in arch_start and initrd mapped via VMM, + * With Multiboot2 info copied in arch_early_setup and initrd mapped via VMM, * we only need a small identity window for early bring-up. */ @@ -153,7 +153,7 @@ higher_half_start: pop %ebx /* EBX now has the Multiboot Info address */ pop %eax /* EAX now has the Magic Number */ - /* Build arch_boot_args (in .bss) and call arch_start(args) */ + /* Build arch_boot_args (in .bss) and call arch_early_setup(args) */ mov $arch_boot_args, %ecx mov %eax, 0(%ecx) /* args->a0 = multiboot magic */ mov %ebx, 4(%ecx) /* args->a1 = multiboot info phys */ @@ -161,7 +161,7 @@ higher_half_start: movl $0, 12(%ecx) /* args->a3 = 0 */ push %ecx - call arch_start + call arch_early_setup add $4, %esp /* Hang */