diff --git a/include/main/boot-fdt.h b/include/main/boot-fdt.h new file mode 100644 index 0000000..2a33b44 --- /dev/null +++ b/include/main/boot-fdt.h @@ -0,0 +1,11 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Copyright (c) 2026, Igor Belwon + */ + +#ifndef BOOT_FDT_H_ +#define BOOT_FDT_H_ + +void patch_dtb(void* dt); + +#endif // BOOT_FDT_H_ diff --git a/include/main/boot.h b/include/main/boot.h new file mode 100644 index 0000000..a64126a --- /dev/null +++ b/include/main/boot.h @@ -0,0 +1,23 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Copyright (c) 2022, Ivaylo Ivanov + * Copyright (c) 2026, Igor Belwon + */ + +#ifndef BOOT_H_ +#define BOOT_H_ + +extern unsigned long kernel_size; +extern unsigned long ramdisk_size; + +#ifdef __aarch64__ +extern void load_kernel_and_jump(void* dtb, void* x1, void* x2, void* x3, + void* kernel); +#elif __arm__ +extern void load_kernel_and_jump(unsigned int r0, unsigned int r1, + void* dtb_addr, void* kernel_entry); +#endif + +void boot_kernel(void* dt, void* kernel, void* ramdisk); + +#endif // BOOT_H_ diff --git a/include/main.h b/include/main/main.h similarity index 64% rename from include/main.h rename to include/main/main.h index ab9979e..0a33bcc 100644 --- a/include/main.h +++ b/include/main/main.h @@ -3,14 +3,9 @@ * Copyright (c) 2022, Ivaylo Ivanov */ -#include - #ifndef MAIN_H_ /* Include guard */ #define MAIN_H_ -extern unsigned long kernel_size; -extern unsigned long ramdisk_size; - #define HANG() while(1) {} /* @@ -27,14 +22,6 @@ extern unsigned long ramdisk_size; } \ } while (0) -#ifdef __aarch64__ -extern void load_kernel_and_jump(void* dtb, void* x1, void* x2, void* x3, - void* kernel); -#elif __arm__ -extern void load_kernel_and_jump(unsigned int r0, unsigned int r1, - void* dtb_addr, void* kernel_entry); -#endif - extern void soc_init(void); #endif // MAIN_H_ diff --git a/main/Makefile b/main/Makefile index c4f4b11..cfc56cf 100644 --- a/main/Makefile +++ b/main/Makefile @@ -1 +1,2 @@ -obj-y := main.o +obj-y := boot.o main.o +obj-$(CONFIG_LIBFDT) += boot-fdt.o diff --git a/main/boot-fdt.c b/main/boot-fdt.c new file mode 100644 index 0000000..66b68e1 --- /dev/null +++ b/main/boot-fdt.c @@ -0,0 +1,20 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Copyright (c) 2026, Igor Belwon + */ + +#include +#include + +static char fdt_buf[CONFIG_FDT_BUF_SIZE]; + +void patch_dtb(void* dt) +{ + int ret; + + ret = ramdisk_handler_patch_dtb(dt, &fdt_buf, sizeof(fdt_buf)); + if (ret != 0) + printk(KERN_ERR, "failed to patch dtb\n"); + else + dt = &fdt_buf; +} diff --git a/main/boot.c b/main/boot.c new file mode 100644 index 0000000..8d20939 --- /dev/null +++ b/main/boot.c @@ -0,0 +1,27 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Copyright (c) 2022, Ivaylo Ivanov + * Copyright (c) 2026, Igor Belwon + */ + +#include +#include
+#include
+#include + +void boot_kernel(void* dt, void* kernel, void* ramdisk) +{ +#ifdef CONFIG_LIBFDT + patch_dtb(dt); +#endif + +#if !defined(CONFIG_RAMDISK_NO_COPY) && !defined(__arm__) + __optimized_memcpy((void*)CONFIG_RAMDISK_ENTRY, ramdisk, (unsigned long) &ramdisk_size); +#elif !defined(CONFIG_RAMDISK_NO_COPY) + memcpy((void*)CONFIG_RAMDISK_ENTRY, ramdisk, (unsigned long) &ramdisk_size); +#endif + memcpy((void*)CONFIG_PAYLOAD_ENTRY, kernel, (unsigned long) &kernel_size); + + printk(KERN_INFO, "Booting kernel...\n"); + load_kernel_and_jump(dt, 0, 0, 0, (void*)CONFIG_PAYLOAD_ENTRY); +} diff --git a/main/main.c b/main/main.c index a54442a..ba17b07 100644 --- a/main/main.c +++ b/main/main.c @@ -4,24 +4,14 @@ */ #include -#include -#include +#include
+#include
#include -#include extern struct board_data board_ops; -#ifdef CONFIG_LIBFDT -static char fdt_buf[CONFIG_FDT_BUF_SIZE]; -#endif - -void main(void* dt, void* kernel, void* ramdisk) +static void print_splash(void) { - int ret; - - INITCALL(board_ops.ops.early_init); - INITCALL(board_ops.ops.drivers_init); - printk(KERN_INFO, " .__.____ .___\n"); printk(KERN_INFO, " __ __ ____ |__| | _________ __| _/___________\n"); printk(KERN_INFO, "| | \\/ \\| | | / _ \\__ \\ / __ |/ __ \\_ __\\\n"); @@ -31,36 +21,20 @@ void main(void* dt, void* kernel, void* ramdisk) printk(KERN_INFO, "passed board initialization\n"); printk(KERN_INFO, "welcome to uniLoader %s on %s\n", VER_TAG, board_ops.name); +} + +void main(void* dt, void* kernel, void* ramdisk) +{ + INITCALL(board_ops.ops.early_init); + INITCALL(board_ops.ops.drivers_init); + + print_splash(); INITCALL(board_ops.ops.late_init); -#ifdef CONFIG_LIBFDT - ret = ramdisk_handler_patch_dtb(dt, &fdt_buf, sizeof(fdt_buf)); - if (ret == 0) - dt = &fdt_buf; - else - printk(KERN_ERR, "failed to patch dtb\n"); -#endif + boot_kernel(dt, kernel, ramdisk); - /* copy kernel to memory and boot */ - printk(KERN_INFO, "booting linux...\n"); -#ifdef __aarch64__ - memcpy((void*)CONFIG_PAYLOAD_ENTRY, kernel, (unsigned long) &kernel_size); -#ifndef CONFIG_RAMDISK_NO_COPY - __optimized_memcpy((void*)CONFIG_RAMDISK_ENTRY, ramdisk, (unsigned long) &ramdisk_size); -#endif - load_kernel_and_jump(dt, 0, 0, 0, (void*)CONFIG_PAYLOAD_ENTRY); -#elif __arm__ - memcpy((void*)CONFIG_PAYLOAD_ENTRY, kernel, (unsigned long) kernel_size); -#ifndef CONFIG_RAMDISK_NO_COPY - memcpy((void*)CONFIG_RAMDISK_ENTRY, ramdisk, (unsigned long) ramdisk_size); -#endif - load_kernel_and_jump(0, 0, dt, (void*)CONFIG_PAYLOAD_ENTRY); -#endif - - /* we shouldn't get there */ - /* TODO: make this a per-board reset */ + // todo: reset the board? printk(KERN_EMERG, "Something wrong happened, we shouldn't be here. Hanging....\n"); HANG(); - }