From 2420e3f52b62580af9cdd661fb441733e437daf9 Mon Sep 17 00:00:00 2001 From: czjstmax Date: Mon, 23 Feb 2026 23:18:48 +0100 Subject: lots of changes. restructured repository. switched to limine. Signed-off-by: czjstmax --- .gitignore | 2 +- .old/Makefile | 17 ++ .old/boot.asm | 134 ++++++++++ .old/boot_s2.asm | 23 ++ Makefile | 72 ++++-- README.md | 4 + build/boot.bin | Bin 512 -> 0 bytes build/boot_s2.o | Bin 528 -> 0 bytes build/mkernel.o | Bin 1536 -> 0 bytes build/mullos.img | Bin 820 -> 0 bytes build/s2.bin | Bin 308 -> 0 bytes build/s2.elf | Bin 5300 -> 0 bytes limine.conf | 6 + linker.ld | 23 ++ src/boot.asm | 134 ---------- src/boot_s2.asm | 23 -- src/kernel/api/io.h | 10 + src/kernel/headers/limine.h | 587 ++++++++++++++++++++++++++++++++++++++++++++ src/kernel/io.c | 15 ++ src/kernel/main.c | 42 ++++ src/krn/api/io.h | 18 -- src/krn/mkern.c | 13 - src/linker.ld | 8 - 23 files changed, 919 insertions(+), 212 deletions(-) create mode 100644 .old/Makefile create mode 100644 .old/boot.asm create mode 100644 .old/boot_s2.asm delete mode 100644 build/boot.bin delete mode 100644 build/boot_s2.o delete mode 100644 build/mkernel.o delete mode 100644 build/mullos.img delete mode 100755 build/s2.bin delete mode 100755 build/s2.elf create mode 100644 limine.conf create mode 100644 linker.ld delete mode 100644 src/boot.asm delete mode 100644 src/boot_s2.asm create mode 100644 src/kernel/api/io.h create mode 100644 src/kernel/headers/limine.h create mode 100644 src/kernel/io.c create mode 100644 src/kernel/main.c delete mode 100644 src/krn/api/io.h delete mode 100644 src/krn/mkern.c delete mode 100644 src/linker.ld diff --git a/.gitignore b/.gitignore index 258cd57..c1b228c 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1 @@ -todo +todo/ diff --git a/.old/Makefile b/.old/Makefile new file mode 100644 index 0000000..9e63e3f --- /dev/null +++ b/.old/Makefile @@ -0,0 +1,17 @@ +all: + # assemble bootloader + nasm -f bin src/boot.asm -o build/boot.bin + nasm -f elf32 src/boot_s2.asm -o build/boot_s2.o + # compile kernel + gcc -m32 -ffreestanding -nostdlib -c src/krn/mkern.c -o build/mkernel.o + # link + ld -m elf_i386 -T src/linker.ld -nostdlib -o build/s2.elf build/boot_s2.o build/mkernel.o + objcopy -O binary build/s2.elf build/s2.bin + # make .img + cat build/boot.bin build/s2.bin > build/mullos.img + # qemu test + qemu-system-x86_64 -drive format=raw,file=build/mullos.img + +clean: + rm -vf build/* + diff --git a/.old/boot.asm b/.old/boot.asm new file mode 100644 index 0000000..011c00f --- /dev/null +++ b/.old/boot.asm @@ -0,0 +1,134 @@ +; boot.asm - stage 1 + +[bits 16] +[org 0x7C00] + +start: + xor ax, ax + mov ds, ax + mov es, ax + mov ss, ax + + ; clear screen by big scrollup + mov ah, 0x06 ; scrollup function + mov al, 0 ; al contains the n of lines to scroll (0 is clearall) + mov bh, 0x07 ; 'attribute byte' 0x07 is white on black + mov cx, 0x0000 ; upper-left corner + mov dx, 0x184F ; bottom-right corner + + int 0x10 ; call + ; set cursor position back to default + mov ah, 0x02 ; set cur pos function + ; position parameters: + mov bh, 0x00 ; page number (0) + mov dh, 0x00 ; row + mov dl, 0x00 ; col + + int 0x10 ; call + + mov si, msg1 ; print msg1 + call print_string + + mov ah, 0x02 ; set cur pos function + ; position parameters: + mov bh, 0x00 ; page number (0) + mov dh, 0x01 ; row + mov dl, 0x00 ; col + + int 0x10 ; call + + mov si, msg2 ; print msg2 + call print_string + + mov ah, 0x02 ; set cur pos function + ; position parameters: + mov bh, 0x00 ; page number (0) + mov dh, 0x02 ; row + mov dl, 0x00 ; col + + int 0x10 ; call + + mov si, msg3 + call print_string + + mov ah, 0x02 ; set cur pos function + ; position parameters: + mov bh, 0x00 ; page number (0) + mov dh, 0x03 ; row + mov dl, 0x00 ; col + + int 0x10 ; call + +load_stage2: + mov ax, 0x0000 + mov es, ax + mov bx, 0x1000 + ; load stage2 from disk - first sector at 0x1000 + mov bx, 0x1000 ; load address + mov dh, 0 + mov ch, 0 + mov cl, 2 ; sector 2 + mov al, 20 ; sectors to read + mov ah, 0x02 + + int 0x13 + jc halt + + ; GDT for protected mode +gdt_start: + dq 0 + dq 0x00CF9A000000FFFF ; code + dq 0x00CF92000000FFFF ; data + gdt_end: + +gdt_descriptor: + dw gdt_end - gdt_start -1 + dd gdt_start + + ; enable protected mode cleanly and transfer to 32-bit stub + cli + lgdt [gdt_descriptor] + + mov eax, cr0 + or eax, 1 + mov cr0, eax + + ; far jump reloads CS with selector 0x08 and enters protected mode + jmp 0x08:pm_entry + + ; 32-bit entry point + [bits 32] +pm_entry: + ; reload data segment registers with data selector (0x10) + mov ax, 0x10 + mov ds, ax + mov es, ax + mov fs, ax + mov gs, ax + mov ss, ax + + mov esp, 0x90000 ; setup stack + + mov eax, 0x1000 ; jump to linear address 0x1000 (which wloud be where s2.bin was loaded) + jmp eax + +halt: + hlt + jmp halt + +print_string: + lodsb + cmp al, 0 + je .done + mov ah, 0x0E + int 0x10 + jmp print_string +.done: + ret + +msg1 db `mull_bootloader hath bespoken unto thee:\n`, 0 +msg2 db `\"behold, \'O user! mull_kernel doth now commence its solemn journey!\"\n`, 0 +msg3 db `trying to kernel kernel :3`, 0 + +times 510-($-$$) db 0 +dw 0xAA55 diff --git a/.old/boot_s2.asm b/.old/boot_s2.asm new file mode 100644 index 0000000..b974827 --- /dev/null +++ b/.old/boot_s2.asm @@ -0,0 +1,23 @@ +; boot_stage2.asm - stage2 +[bits 32] + +global _start +extern kmain + +section .text + +_start: + ; reload segments + mov ax, 0x10 + mov ds, ax + mov es, ax + mov ss, ax + mov fs, ax + mov gs, ax + mov esp, 0x90000 ; stack + + mov dword [0xB8000], 0x07410741 + call kmain + + hlt + diff --git a/Makefile b/Makefile index 9e63e3f..b016f4f 100644 --- a/Makefile +++ b/Makefile @@ -1,17 +1,59 @@ -all: - # assemble bootloader - nasm -f bin src/boot.asm -o build/boot.bin - nasm -f elf32 src/boot_s2.asm -o build/boot_s2.o - # compile kernel - gcc -m32 -ffreestanding -nostdlib -c src/krn/mkern.c -o build/mkernel.o - # link - ld -m elf_i386 -T src/linker.ld -nostdlib -o build/s2.elf build/boot_s2.o build/mkernel.o - objcopy -O binary build/s2.elf build/s2.bin - # make .img - cat build/boot.bin build/s2.bin > build/mullos.img - # qemu test - qemu-system-x86_64 -drive format=raw,file=build/mullos.img +CC = gcc +LD = ld -clean: - rm -vf build/* +CFLAGS = -std=gnu11 -ffreestanding -O2 -Wall -Wextra -m64 \ + -nostdlib -nostartfiles -I src/kernel/headers +LDFLAGS = -T linker.ld -nostdlib -static + +SRC_DIR = src/kernel +BUILD_DIR = build +ISO_DIR = $(BUILD_DIR)/iso +BOOT_DIR = $(ISO_DIR)/boot +LIMINE_DIR = /usr/share/limine + +SOURCES = $(wildcard $(SRC_DIR)/*.c) +OBJECTS = $(patsubst $(SRC_DIR)/%.c,$(BUILD_DIR)/%.o,$(SOURCES)) + +KERNEL = $(BUILD_DIR)/kernel.elf +ISO_IMAGE = $(BUILD_DIR)/mullos.iso + +all: $(KERNEL) + +$(BUILD_DIR): + mkdir -p $(BUILD_DIR) + +$(BUILD_DIR)/%.o: $(SRC_DIR)/%.c | $(BUILD_DIR) + $(CC) $(CFLAGS) -c $< -o $@ + +$(KERNEL): $(OBJECTS) + $(LD) $(OBJECTS) $(LDFLAGS) -o $(KERNEL) +iso: $(KERNEL) + rm -vrf $(ISO_DIR) + mkdir -p $(BOOT_DIR) + + cp $(KERNEL) $(BOOT_DIR)/kernel.elf + cp limine.conf $(ISO_DIR)/limine.conf + + # copy limine boot files + cp $(LIMINE_DIR)/limine-bios.sys $(ISO_DIR)/ + cp $(LIMINE_DIR)/limine-bios-cd.bin $(ISO_DIR)/ + cp $(LIMINE_DIR)/limine-uefi-cd.bin $(ISO_DIR)/ + + xorriso -as mkisofs \ + -b limine-bios-cd.bin \ + -no-emul-boot \ + -boot-load-size 4 \ + -boot-info-table \ + --efi-boot limine-uefi-cd.bin \ + -efi-boot-part --efi-boot-image \ + --protective-msdos-label \ + $(ISO_DIR) -o $(ISO_IMAGE) + + limine bios-install $(ISO_IMAGE) + +run: iso + qemu-system-x86_64 -cdrom $(ISO_IMAGE) + +clean: + rm -vrf $(BUILD_DIR) diff --git a/README.md b/README.md index dd0f3e4..2d92016 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,10 @@ the name is based off the german word for trash. haha. --- +#### things +müllos uses the [limine bootloader](https://github.com/limine-bootloader/limine) because the [müll_bootloader](https://github.com/jstmaxlol/mullos/tree/master/.old/) sucked. + +--- #### objectives diff --git a/build/boot.bin b/build/boot.bin deleted file mode 100644 index 30c4d1f..0000000 Binary files a/build/boot.bin and /dev/null differ diff --git a/build/boot_s2.o b/build/boot_s2.o deleted file mode 100644 index b1aee93..0000000 Binary files a/build/boot_s2.o and /dev/null differ diff --git a/build/mkernel.o b/build/mkernel.o deleted file mode 100644 index 709e657..0000000 Binary files a/build/mkernel.o and /dev/null differ diff --git a/build/mullos.img b/build/mullos.img deleted file mode 100644 index 9e707e1..0000000 Binary files a/build/mullos.img and /dev/null differ diff --git a/build/s2.bin b/build/s2.bin deleted file mode 100755 index 020ebf3..0000000 Binary files a/build/s2.bin and /dev/null differ diff --git a/build/s2.elf b/build/s2.elf deleted file mode 100755 index 3bd6f0d..0000000 Binary files a/build/s2.elf and /dev/null differ diff --git a/limine.conf b/limine.conf new file mode 100644 index 0000000..9cd51e0 --- /dev/null +++ b/limine.conf @@ -0,0 +1,6 @@ +TIMEOUT=0 +DEFAULT_ENTRY=mullos + +:mullos + PROTOCOL=limine + KERNEL_PATH=boot:///kernel.elf diff --git a/linker.ld b/linker.ld new file mode 100644 index 0000000..7b6a5b4 --- /dev/null +++ b/linker.ld @@ -0,0 +1,23 @@ +ENTRY(_start) + +SECTIONS +{ + . = 0xffffffff80000000; + + .text : { + *(.text*) + } + + .rodata : { + *(.rodata*) + } + + .data : { + *(.data*) + } + + .bss : { + *(COMMON) + *(.bss*) + } +} diff --git a/src/boot.asm b/src/boot.asm deleted file mode 100644 index 011c00f..0000000 --- a/src/boot.asm +++ /dev/null @@ -1,134 +0,0 @@ -; boot.asm - stage 1 - -[bits 16] -[org 0x7C00] - -start: - xor ax, ax - mov ds, ax - mov es, ax - mov ss, ax - - ; clear screen by big scrollup - mov ah, 0x06 ; scrollup function - mov al, 0 ; al contains the n of lines to scroll (0 is clearall) - mov bh, 0x07 ; 'attribute byte' 0x07 is white on black - mov cx, 0x0000 ; upper-left corner - mov dx, 0x184F ; bottom-right corner - - int 0x10 ; call - ; set cursor position back to default - mov ah, 0x02 ; set cur pos function - ; position parameters: - mov bh, 0x00 ; page number (0) - mov dh, 0x00 ; row - mov dl, 0x00 ; col - - int 0x10 ; call - - mov si, msg1 ; print msg1 - call print_string - - mov ah, 0x02 ; set cur pos function - ; position parameters: - mov bh, 0x00 ; page number (0) - mov dh, 0x01 ; row - mov dl, 0x00 ; col - - int 0x10 ; call - - mov si, msg2 ; print msg2 - call print_string - - mov ah, 0x02 ; set cur pos function - ; position parameters: - mov bh, 0x00 ; page number (0) - mov dh, 0x02 ; row - mov dl, 0x00 ; col - - int 0x10 ; call - - mov si, msg3 - call print_string - - mov ah, 0x02 ; set cur pos function - ; position parameters: - mov bh, 0x00 ; page number (0) - mov dh, 0x03 ; row - mov dl, 0x00 ; col - - int 0x10 ; call - -load_stage2: - mov ax, 0x0000 - mov es, ax - mov bx, 0x1000 - ; load stage2 from disk - first sector at 0x1000 - mov bx, 0x1000 ; load address - mov dh, 0 - mov ch, 0 - mov cl, 2 ; sector 2 - mov al, 20 ; sectors to read - mov ah, 0x02 - - int 0x13 - jc halt - - ; GDT for protected mode -gdt_start: - dq 0 - dq 0x00CF9A000000FFFF ; code - dq 0x00CF92000000FFFF ; data - gdt_end: - -gdt_descriptor: - dw gdt_end - gdt_start -1 - dd gdt_start - - ; enable protected mode cleanly and transfer to 32-bit stub - cli - lgdt [gdt_descriptor] - - mov eax, cr0 - or eax, 1 - mov cr0, eax - - ; far jump reloads CS with selector 0x08 and enters protected mode - jmp 0x08:pm_entry - - ; 32-bit entry point - [bits 32] -pm_entry: - ; reload data segment registers with data selector (0x10) - mov ax, 0x10 - mov ds, ax - mov es, ax - mov fs, ax - mov gs, ax - mov ss, ax - - mov esp, 0x90000 ; setup stack - - mov eax, 0x1000 ; jump to linear address 0x1000 (which wloud be where s2.bin was loaded) - jmp eax - -halt: - hlt - jmp halt - -print_string: - lodsb - cmp al, 0 - je .done - mov ah, 0x0E - int 0x10 - jmp print_string -.done: - ret - -msg1 db `mull_bootloader hath bespoken unto thee:\n`, 0 -msg2 db `\"behold, \'O user! mull_kernel doth now commence its solemn journey!\"\n`, 0 -msg3 db `trying to kernel kernel :3`, 0 - -times 510-($-$$) db 0 -dw 0xAA55 diff --git a/src/boot_s2.asm b/src/boot_s2.asm deleted file mode 100644 index b974827..0000000 --- a/src/boot_s2.asm +++ /dev/null @@ -1,23 +0,0 @@ -; boot_stage2.asm - stage2 -[bits 32] - -global _start -extern kmain - -section .text - -_start: - ; reload segments - mov ax, 0x10 - mov ds, ax - mov es, ax - mov ss, ax - mov fs, ax - mov gs, ax - mov esp, 0x90000 ; stack - - mov dword [0xB8000], 0x07410741 - call kmain - - hlt - diff --git a/src/kernel/api/io.h b/src/kernel/api/io.h new file mode 100644 index 0000000..7a9fc38 --- /dev/null +++ b/src/kernel/api/io.h @@ -0,0 +1,10 @@ +#define MÜLL_IO_H + +/* + * Minimal API for kernel I/O basics + */ + +// includes +#include + +void RealPrint(const char* str); diff --git a/src/kernel/headers/limine.h b/src/kernel/headers/limine.h new file mode 100644 index 0000000..e48dff1 --- /dev/null +++ b/src/kernel/headers/limine.h @@ -0,0 +1,587 @@ +/* SPDX-License-Identifier: 0BSD */ + +/* Copyright (C) 2022-2026 Mintsuki and contributors. + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef LIMINE_H +#define LIMINE_H 1 + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Misc */ + +#ifdef LIMINE_NO_POINTERS +# define LIMINE_PTR(TYPE) uint64_t +#else +# define LIMINE_PTR(TYPE) TYPE +#endif + +#define LIMINE_REQUESTS_START_MARKER { 0xf6b8f4b39de7d1ae, 0xfab91a6940fcb9cf, \ + 0x785c6ed015d3e316, 0x181e920a7852b9d9 } +#define LIMINE_REQUESTS_END_MARKER { 0xadc0e0531bb10d03, 0x9572709f31764c62 } + +#define LIMINE_BASE_REVISION(N) { 0xf9562b2d5c95a6c8, 0x6a7b384944536bdc, (N) } + +#define LIMINE_BASE_REVISION_SUPPORTED(VAR) ((VAR)[2] == 0) + +#define LIMINE_LOADED_BASE_REVISION_VALID(VAR) ((VAR)[1] != 0x6a7b384944536bdc) +#define LIMINE_LOADED_BASE_REVISION(VAR) ((VAR)[1]) + +#define LIMINE_COMMON_MAGIC 0xc7b1dd30df4c8b88, 0x0a82e883a194f07b + +struct limine_uuid { + uint32_t a; + uint16_t b; + uint16_t c; + uint8_t d[8]; +}; + +#define LIMINE_MEDIA_TYPE_GENERIC 0 +#define LIMINE_MEDIA_TYPE_OPTICAL 1 +#define LIMINE_MEDIA_TYPE_TFTP 2 + +struct limine_file { + uint64_t revision; + LIMINE_PTR(void *) address; + uint64_t size; + LIMINE_PTR(char *) path; + LIMINE_PTR(char *) string; + uint32_t media_type; + uint32_t unused; + uint32_t tftp_ip; + uint32_t tftp_port; + uint32_t partition_index; + uint32_t mbr_disk_id; + struct limine_uuid gpt_disk_uuid; + struct limine_uuid gpt_part_uuid; + struct limine_uuid part_uuid; +}; + +/* Boot info */ + +#define LIMINE_BOOTLOADER_INFO_REQUEST_ID { LIMINE_COMMON_MAGIC, 0xf55038d8e2a1202f, 0x279426fcf5f59740 } + +struct limine_bootloader_info_response { + uint64_t revision; + LIMINE_PTR(char *) name; + LIMINE_PTR(char *) version; +}; + +struct limine_bootloader_info_request { + uint64_t id[4]; + uint64_t revision; + LIMINE_PTR(struct limine_bootloader_info_response *) response; +}; + +/* Executable command line */ + +#define LIMINE_EXECUTABLE_CMDLINE_REQUEST_ID { LIMINE_COMMON_MAGIC, 0x4b161536e598651e, 0xb390ad4a2f1f303a } + +struct limine_executable_cmdline_response { + uint64_t revision; + LIMINE_PTR(char *) cmdline; +}; + +struct limine_executable_cmdline_request { + uint64_t id[4]; + uint64_t revision; + LIMINE_PTR(struct limine_executable_cmdline_response *) response; +}; + +/* Firmware type */ + +#define LIMINE_FIRMWARE_TYPE_REQUEST_ID { LIMINE_COMMON_MAGIC, 0x8c2f75d90bef28a8, 0x7045a4688eac00c3 } + +#define LIMINE_FIRMWARE_TYPE_X86BIOS 0 +#define LIMINE_FIRMWARE_TYPE_EFI32 1 +#define LIMINE_FIRMWARE_TYPE_EFI64 2 +#define LIMINE_FIRMWARE_TYPE_SBI 3 + +struct limine_firmware_type_response { + uint64_t revision; + uint64_t firmware_type; +}; + +struct limine_firmware_type_request { + uint64_t id[4]; + uint64_t revision; + LIMINE_PTR(struct limine_firmware_type_response *) response; +}; + +/* Stack size */ + +#define LIMINE_STACK_SIZE_REQUEST_ID { LIMINE_COMMON_MAGIC, 0x224ef0460a8e8926, 0xe1cb0fc25f46ea3d } + +struct limine_stack_size_response { + uint64_t revision; +}; + +struct limine_stack_size_request { + uint64_t id[4]; + uint64_t revision; + LIMINE_PTR(struct limine_stack_size_response *) response; + uint64_t stack_size; +}; + +/* HHDM */ + +#define LIMINE_HHDM_REQUEST_ID { LIMINE_COMMON_MAGIC, 0x48dcf1cb8ad2b852, 0x63984e959a98244b } + +struct limine_hhdm_response { + uint64_t revision; + uint64_t offset; +}; + +struct limine_hhdm_request { + uint64_t id[4]; + uint64_t revision; + LIMINE_PTR(struct limine_hhdm_response *) response; +}; + +/* Framebuffer */ + +#define LIMINE_FRAMEBUFFER_REQUEST_ID { LIMINE_COMMON_MAGIC, 0x9d5827dcd881dd75, 0xa3148604f6fab11b } + +#define LIMINE_FRAMEBUFFER_RGB 1 + +struct limine_video_mode { + uint64_t pitch; + uint64_t width; + uint64_t height; + uint16_t bpp; + uint8_t memory_model; + uint8_t red_mask_size; + uint8_t red_mask_shift; + uint8_t green_mask_size; + uint8_t green_mask_shift; + uint8_t blue_mask_size; + uint8_t blue_mask_shift; +}; + +struct limine_framebuffer { + LIMINE_PTR(void *) address; + uint64_t width; + uint64_t height; + uint64_t pitch; + uint16_t bpp; + uint8_t memory_model; + uint8_t red_mask_size; + uint8_t red_mask_shift; + uint8_t green_mask_size; + uint8_t green_mask_shift; + uint8_t blue_mask_size; + uint8_t blue_mask_shift; + uint8_t unused[7]; + uint64_t edid_size; + LIMINE_PTR(void *) edid; + /* Response revision 1 */ + uint64_t mode_count; + LIMINE_PTR(struct limine_video_mode **) modes; +}; + +struct limine_framebuffer_response { + uint64_t revision; + uint64_t framebuffer_count; + LIMINE_PTR(struct limine_framebuffer **) framebuffers; +}; + +struct limine_framebuffer_request { + uint64_t id[4]; + uint64_t revision; + LIMINE_PTR(struct limine_framebuffer_response *) response; +}; + +/* Paging mode */ + +#define LIMINE_PAGING_MODE_REQUEST_ID { LIMINE_COMMON_MAGIC, 0x95c1a0edab0944cb, 0xa4e5cb3842f7488a } + +#define LIMINE_PAGING_MODE_X86_64_4LVL 0 +#define LIMINE_PAGING_MODE_X86_64_5LVL 1 +#define LIMINE_PAGING_MODE_X86_64_MIN LIMINE_PAGING_MODE_X86_64_4LVL +#define LIMINE_PAGING_MODE_X86_64_DEFAULT LIMINE_PAGING_MODE_X86_64_4LVL + +#define LIMINE_PAGING_MODE_AARCH64_4LVL 0 +#define LIMINE_PAGING_MODE_AARCH64_5LVL 1 +#define LIMINE_PAGING_MODE_AARCH64_MIN LIMINE_PAGING_MODE_AARCH64_4LVL +#define LIMINE_PAGING_MODE_AARCH64_DEFAULT LIMINE_PAGING_MODE_AARCH64_4LVL + +#define LIMINE_PAGING_MODE_RISCV_SV39 0 +#define LIMINE_PAGING_MODE_RISCV_SV48 1 +#define LIMINE_PAGING_MODE_RISCV_SV57 2 +#define LIMINE_PAGING_MODE_RISCV_MIN LIMINE_PAGING_MODE_RISCV_SV39 +#define LIMINE_PAGING_MODE_RISCV_DEFAULT LIMINE_PAGING_MODE_RISCV_SV48 + +#define LIMINE_PAGING_MODE_LOONGARCH_4LVL 0 +#define LIMINE_PAGING_MODE_LOONGARCH_MIN LIMINE_PAGING_MODE_LOONGARCH_4LVL +#define LIMINE_PAGING_MODE_LOONGARCH_DEFAULT LIMINE_PAGING_MODE_LOONGARCH_4LVL + +struct limine_paging_mode_response { + uint64_t revision; + uint64_t mode; +}; + +struct limine_paging_mode_request { + uint64_t id[4]; + uint64_t revision; + LIMINE_PTR(struct limine_paging_mode_response *) response; + uint64_t mode; + uint64_t max_mode; + uint64_t min_mode; +}; + +/* MP */ + +#define LIMINE_MP_REQUEST_ID { LIMINE_COMMON_MAGIC, 0x95a67b819a1b857e, 0xa0b61b723b6a73e0 } + +struct limine_mp_info; + +typedef void (*limine_goto_address)(struct limine_mp_info *); + +#if defined (__x86_64__) || defined (__i386__) + +#define LIMINE_MP_RESPONSE_X86_64_X2APIC (1 << 0) + +struct limine_mp_info { + uint32_t processor_id; + uint32_t lapic_id; + uint64_t reserved; + LIMINE_PTR(limine_goto_address) goto_address; + uint64_t extra_argument; +}; + +struct limine_mp_response { + uint64_t revision; + uint32_t flags; + uint32_t bsp_lapic_id; + uint64_t cpu_count; + LIMINE_PTR(struct limine_mp_info **) cpus; +}; + +#elif defined (__aarch64__) + +struct limine_mp_info { + uint32_t processor_id; + uint32_t reserved1; + uint64_t mpidr; + uint64_t reserved; + LIMINE_PTR(limine_goto_address) goto_address; + uint64_t extra_argument; +}; + +struct limine_mp_response { + uint64_t revision; + uint64_t flags; + uint64_t bsp_mpidr; + uint64_t cpu_count; + LIMINE_PTR(struct limine_mp_info **) cpus; +}; + +#elif defined (__riscv) && (__riscv_xlen == 64) + +struct limine_mp_info { + uint64_t processor_id; + uint64_t hartid; + uint64_t reserved; + LIMINE_PTR(limine_goto_address) goto_address; + uint64_t extra_argument; +}; + +struct limine_mp_response { + uint64_t revision; + uint64_t flags; + uint64_t bsp_hartid; + uint64_t cpu_count; + LIMINE_PTR(struct limine_mp_info **) cpus; +}; + +#elif defined (__loongarch__) && (__loongarch_grlen == 64) + +struct limine_mp_info { + uint64_t reserved; +}; + +struct limine_mp_response { + uint64_t cpu_count; + LIMINE_PTR(struct limine_mp_info **) cpus; +}; + +#else +#error Unknown architecture +#endif + +#define LIMINE_MP_REQUEST_X86_64_X2APIC (1 << 0) + +struct limine_mp_request { + uint64_t id[4]; + uint64_t revision; + LIMINE_PTR(struct limine_mp_response *) response; + uint64_t flags; +}; + +/* Memory map */ + +#define LIMINE_MEMMAP_REQUEST_ID { LIMINE_COMMON_MAGIC, 0x67cf3d9d378a806f, 0xe304acdfc50c3c62 } + +#define LIMINE_MEMMAP_USABLE 0 +#define LIMINE_MEMMAP_RESERVED 1 +#define LIMINE_MEMMAP_ACPI_RECLAIMABLE 2 +#define LIMINE_MEMMAP_ACPI_NVS 3 +#define LIMINE_MEMMAP_BAD_MEMORY 4 +#define LIMINE_MEMMAP_BOOTLOADER_RECLAIMABLE 5 +#define LIMINE_MEMMAP_EXECUTABLE_AND_MODULES 6 +#define LIMINE_MEMMAP_FRAMEBUFFER 7 +#define LIMINE_MEMMAP_RESERVED_MAPPED 8 + +struct limine_memmap_entry { + uint64_t base; + uint64_t length; + uint64_t type; +}; + +struct limine_memmap_response { + uint64_t revision; + uint64_t entry_count; + LIMINE_PTR(struct limine_memmap_entry **) entries; +}; + +struct limine_memmap_request { + uint64_t id[4]; + uint64_t revision; + LIMINE_PTR(struct limine_memmap_response *) response; +}; + +/* Entry point */ + +#define LIMINE_ENTRY_POINT_REQUEST_ID { LIMINE_COMMON_MAGIC, 0x13d86c035a1cd3e1, 0x2b0caa89d8f3026a } + +typedef void (*limine_entry_point)(void); + +struct limine_entry_point_response { + uint64_t revision; +}; + +struct limine_entry_point_request { + uint64_t id[4]; + uint64_t revision; + LIMINE_PTR(struct limine_entry_point_response *) response; + LIMINE_PTR(limine_entry_point) entry; +}; + +/* Executable File */ + +#define LIMINE_EXECUTABLE_FILE_REQUEST_ID { LIMINE_COMMON_MAGIC, 0xad97e90e83f1ed67, 0x31eb5d1c5ff23b69 } + +struct limine_executable_file_response { + uint64_t revision; + LIMINE_PTR(struct limine_file *) executable_file; +}; + +struct limine_executable_file_request { + uint64_t id[4]; + uint64_t revision; + LIMINE_PTR(struct limine_executable_file_response *) response; +}; + +/* Module */ + +#define LIMINE_MODULE_REQUEST_ID { LIMINE_COMMON_MAGIC, 0x3e7e279702be32af, 0xca1c4f3bd1280cee } + +#define LIMINE_INTERNAL_MODULE_REQUIRED (1 << 0) +#define LIMINE_INTERNAL_MODULE_COMPRESSED (1 << 1) + +struct limine_internal_module { + LIMINE_PTR(const char *) path; + LIMINE_PTR(const char *) string; + uint64_t flags; +}; + +struct limine_module_response { + uint64_t revision; + uint64_t module_count; + LIMINE_PTR(struct limine_file **) modules; +}; + +struct limine_module_request { + uint64_t id[4]; + uint64_t revision; + LIMINE_PTR(struct limine_module_response *) response; + + /* Request revision 1 */ + uint64_t internal_module_count; + LIMINE_PTR(struct limine_internal_module **) internal_modules; +}; + +/* RSDP */ + +#define LIMINE_RSDP_REQUEST_ID { LIMINE_COMMON_MAGIC, 0xc5e77b6b397e7b43, 0x27637845accdcf3c } + +struct limine_rsdp_response { + uint64_t revision; + LIMINE_PTR(void *) address; +}; + +struct limine_rsdp_request { + uint64_t id[4]; + uint64_t revision; + LIMINE_PTR(struct limine_rsdp_response *) response; +}; + +/* SMBIOS */ + +#define LIMINE_SMBIOS_REQUEST_ID { LIMINE_COMMON_MAGIC, 0x9e9046f11e095391, 0xaa4a520fefbde5ee } + +struct limine_smbios_response { + uint64_t revision; + LIMINE_PTR(void *) entry_32; + LIMINE_PTR(void *) entry_64; +}; + +struct limine_smbios_request { + uint64_t id[4]; + uint64_t revision; + LIMINE_PTR(struct limine_smbios_response *) response; +}; + +/* EFI system table */ + +#define LIMINE_EFI_SYSTEM_TABLE_REQUEST_ID { LIMINE_COMMON_MAGIC, 0x5ceba5163eaaf6d6, 0x0a6981610cf65fcc } + +struct limine_efi_system_table_response { + uint64_t revision; + LIMINE_PTR(void *) address; +}; + +struct limine_efi_system_table_request { + uint64_t id[4]; + uint64_t revision; + LIMINE_PTR(struct limine_efi_system_table_response *) response; +}; + +/* EFI memory map */ + +#define LIMINE_EFI_MEMMAP_REQUEST_ID { LIMINE_COMMON_MAGIC, 0x7df62a431d6872d5, 0xa4fcdfb3e57306c8 } + +struct limine_efi_memmap_response { + uint64_t revision; + LIMINE_PTR(void *) memmap; + uint64_t memmap_size; + uint64_t desc_size; + uint64_t desc_version; +}; + +struct limine_efi_memmap_request { + uint64_t id[4]; + uint64_t revision; + LIMINE_PTR(struct limine_efi_memmap_response *) response; +}; + +/* Date at boot */ + +#define LIMINE_DATE_AT_BOOT_REQUEST_ID { LIMINE_COMMON_MAGIC, 0x502746e184c088aa, 0xfbc5ec83e6327893 } + +struct limine_date_at_boot_response { + uint64_t revision; + int64_t timestamp; +}; + +struct limine_date_at_boot_request { + uint64_t id[4]; + uint64_t revision; + LIMINE_PTR(struct limine_date_at_boot_response *) response; +}; + +/* Executable address */ + +#define LIMINE_EXECUTABLE_ADDRESS_REQUEST_ID { LIMINE_COMMON_MAGIC, 0x71ba76863cc55f63, 0xb2644a48c516a487 } + +struct limine_executable_address_response { + uint64_t revision; + uint64_t physical_base; + uint64_t virtual_base; +}; + +struct limine_executable_address_request { + uint64_t id[4]; + uint64_t revision; + LIMINE_PTR(struct limine_executable_address_response *) response; +}; + +/* Device Tree Blob */ + +#define LIMINE_DTB_REQUEST_ID { LIMINE_COMMON_MAGIC, 0xb40ddb48fb54bac7, 0x545081493f81ffb7 } + +struct limine_dtb_response { + uint64_t revision; + LIMINE_PTR(void *) dtb_ptr; +}; + +struct limine_dtb_request { + uint64_t id[4]; + uint64_t revision; + LIMINE_PTR(struct limine_dtb_response *) response; +}; + +/* RISC-V Boot Hart ID */ + +#define LIMINE_RISCV_BSP_HARTID_REQUEST_ID { LIMINE_COMMON_MAGIC, 0x1369359f025525f9, 0x2ff2a56178391bb6 } + +struct limine_riscv_bsp_hartid_response { + uint64_t revision; + uint64_t bsp_hartid; +}; + +struct limine_riscv_bsp_hartid_request { + uint64_t id[4]; + uint64_t revision; + LIMINE_PTR(struct limine_riscv_bsp_hartid_response *) response; +}; + +/* Bootloader Performance */ + +#define LIMINE_BOOTLOADER_PERFORMANCE_REQUEST_ID { LIMINE_COMMON_MAGIC, 0x6b50ad9bf36d13ad, 0xdc4c7e88fc759e17 } + +struct limine_bootloader_performance_response { + uint64_t revision; + uint64_t reset_usec; + uint64_t init_usec; + uint64_t exec_usec; +}; + +struct limine_bootloader_performance_request { + uint64_t id[4]; + uint64_t revision; + LIMINE_PTR(struct limine_bootloader_performance_response *) response; +}; + +#define LIMINE_X86_64_KEEP_IOMMU_REQUEST_ID { LIMINE_COMMON_MAGIC, 0x8ebaabe51f490179, 0x2aa86a59ffb4ab0f } + +struct limine_x86_64_keep_iommu_response { + uint64_t revision; +}; + +struct limine_x86_64_keep_iommu_request { + uint64_t id[4]; + uint64_t revision; + LIMINE_PTR(struct limine_x86_64_keep_iommu_response *) response; +}; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/kernel/io.c b/src/kernel/io.c new file mode 100644 index 0000000..10fcac1 --- /dev/null +++ b/src/kernel/io.c @@ -0,0 +1,15 @@ +#include "api/io.h" + +/* + * Minimal API for kernel I/O basics + */ + +volatile uint16_t* VGA = (volatile uint16_t*)0xB8000; +uint16_t cursor = 0; + +void RealPrint(const char* str) { + while(*str) { + VGA[cursor++] = (uint8_t)(*str) | 0x0700; // white on black + str++; + } +} diff --git a/src/kernel/main.c b/src/kernel/main.c new file mode 100644 index 0000000..7584827 --- /dev/null +++ b/src/kernel/main.c @@ -0,0 +1,42 @@ +#ifndef MÜLL_KERN +#define MÜLL_KERN + +/* + * müll_kernel + */ + +// C includes +#include + +// external includes +#include "limine.h" + +// API includes +#include "api/io.h" + +__attribute__((used, section(".limine_requests"))) +static volatile LIMINE_BASE_REVISION(2); + +static volatile struct limine_framebuffer_request fb_request = { + .id = LIMINE_FRAMEBUFFER_REQUEST, + .revision = 0 +}; + +void kmain(void) __attribute__((noreturn)); +void _start(void) { + if (!fb_request.response) { + for (;;) __asm__("hlt"); + } + + struct limine_framebuffer *fb = + fb_request.response->framebuffers[0]; + + uint32_t *pix = fb->address; + pix[0] = 0x00FFFFFF; // white pixel + + //return kernel_main(); + for (;;) __asm__("hlt"); +} + +#endif + diff --git a/src/krn/api/io.h b/src/krn/api/io.h deleted file mode 100644 index fd92722..0000000 --- a/src/krn/api/io.h +++ /dev/null @@ -1,18 +0,0 @@ -#define MÜLL_IO_H - -/* - * Minimal API for kernel I/O basics - */ - -// includes -#include - -volatile uint16_t* VGA = (volatile uint16_t*)0xB8000; -uint16_t cursor = 0; - -void RealPrint(const char* str) { - while(*str) { - VGA[cursor++] = (uint8_t)(*str) | 0x0700; // white on black - str++; - } -} \ No newline at end of file diff --git a/src/krn/mkern.c b/src/krn/mkern.c deleted file mode 100644 index 04497e0..0000000 --- a/src/krn/mkern.c +++ /dev/null @@ -1,13 +0,0 @@ -#define MÜLL_KERN - -/* - * müll_kernel - */ - -#include "api/io.h" - -void kmain(void) __attribute__((noreturn)); -void kmain(void) { - RealPrint("the kernel says hii!"); - while (1); -} diff --git a/src/linker.ld b/src/linker.ld deleted file mode 100644 index b6a4871..0000000 --- a/src/linker.ld +++ /dev/null @@ -1,8 +0,0 @@ -ENTRY(_start) - -SECTIONS { - . = 0x1000; - .text : { *(.text) } - .data : { *(.data) } - .bss : { *(.bss) } -} -- cgit v1.3.1