From 426fa865f0cf499617113a905d9f0dd6d77d7419 Mon Sep 17 00:00:00 2001 From: Jozef Nagy Date: Mon, 25 Nov 2024 17:48:07 +0100 Subject: [PATCH] Switched to Makefile, use Limine for now --- .DS_Store | Bin 0 -> 6148 bytes .gitignore | 3 + .gitmodules | 4 ++ CMakeLists.txt | 31 ---------- Makefile | 71 ++++++++++++++++++++++ base/boot/limine/limine.conf | 6 ++ boot/.DS_Store | Bin 0 -> 6148 bytes boot/CMakeLists.txt | 14 ----- boot/Makefile | 10 +++ boot/limine | 1 + boot/platform/generic-pc/CMakeLists.txt | 44 -------------- boot/platform/generic-pc/stage1.asm | 59 ------------------ boot/platform/generic-pc/stage1/utils.inc | 35 ----------- boot/platform/generic-pc/stage2/entry.asm | 6 -- boot/platform/generic-pc/stage2/linker.ld | 25 -------- boot/platform/uefi/CMakeLists.txt | 55 ----------------- boot/platform/uefi/main.c | 5 -- cmake/bootloader.toolchain | 20 ------ cmake/flags.cmake | 18 ------ cmake/osdev.toolchain | 20 ------ kernel/Makefile | 62 +++++++++++++++++++ kernel/arch/amd64/flags.mk | 12 ++++ kernel/arch/amd64/linker.ld | 49 +++++++++++++++ kernel/entryp.c | 7 +++ make/config.mk | 36 +++++++++++ make/target.mk | 5 ++ make/vm.mk | 10 +++ utils/download-ovmf.sh | 27 ++++++++ utils/generate-iso.sh | 27 ++++++++ 29 files changed, 330 insertions(+), 332 deletions(-) create mode 100644 .DS_Store create mode 100644 .gitmodules delete mode 100644 CMakeLists.txt create mode 100644 Makefile create mode 100644 base/boot/limine/limine.conf create mode 100644 boot/.DS_Store delete mode 100644 boot/CMakeLists.txt create mode 100644 boot/Makefile create mode 160000 boot/limine delete mode 100644 boot/platform/generic-pc/CMakeLists.txt delete mode 100644 boot/platform/generic-pc/stage1.asm delete mode 100644 boot/platform/generic-pc/stage1/utils.inc delete mode 100644 boot/platform/generic-pc/stage2/entry.asm delete mode 100644 boot/platform/generic-pc/stage2/linker.ld delete mode 100644 boot/platform/uefi/CMakeLists.txt delete mode 100644 boot/platform/uefi/main.c delete mode 100644 cmake/bootloader.toolchain delete mode 100644 cmake/flags.cmake delete mode 100644 cmake/osdev.toolchain create mode 100644 kernel/Makefile create mode 100644 kernel/arch/amd64/flags.mk create mode 100644 kernel/arch/amd64/linker.ld create mode 100644 kernel/entryp.c create mode 100644 make/config.mk create mode 100644 make/target.mk create mode 100644 make/vm.mk create mode 100755 utils/download-ovmf.sh create mode 100755 utils/generate-iso.sh diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..529648886f6b8b375687729f74eace18d1601f97 GIT binary patch literal 6148 zcmeHK%}T>S5Z<*>HxwZUg&r5Y7L2us#Y>3w1&ruHr6#0cFlI}el0zxvtS{t~_&m<+ zZi~g7MRX?2ezWtFY(B_thB3y&d3wy4#~2f!h#ZXuL3d+l%O-O`P>&_mY?9Vp^7rjit$tzWa$`E?r*aqRaL0wMLN^9kqHRbbw^%jvFQ7QuI%^DmR-3R^n9>S zPM1qp92_2(&hygYlEho zaoc=w`{Y&g!u8YP{!*ti9vGyN7$62V8EBcQhv)w#d@_wq{$>fyhyh~Yk1@cVVKfZk zrR>@I?e*}im7tHHD418H0Rr~MPXJ7CAL;0ziA%I0FR)k}#Jiwhmjlv|fF^_nV&DfD F_yn$~MOOd- literal 0 HcmV?d00001 diff --git a/.gitignore b/.gitignore index 880dd26..1a433e3 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,9 @@ # Build directories build/ +release/ +ovmf/ +sysroot/ # Emacs \#*\# diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..0ff80d8 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,4 @@ +[submodule "boot/limine"] + path = boot/limine + url = https://github.com/limine-bootloader/limine + branch = v8.x-binary diff --git a/CMakeLists.txt b/CMakeLists.txt deleted file mode 100644 index 30c7d5a..0000000 --- a/CMakeLists.txt +++ /dev/null @@ -1,31 +0,0 @@ -cmake_minimum_required(VERSION 3.30) - -# Check if all important variables have been set -# -# Default values: -# - ARCH: amd64 -# - PLATFORM: generic-pc -# -if (NOT DEFINED ARCH) - message(STATUS "Target architecture not set, choosing 'amd64' as default") - set(ARCH amd64) -endif() - -if (NOT DEFINED PLATFORM) - message(STATUS "Target platform not set, choosing 'generic-pc' as default") - set(PLATFORM generic-pc) -endif() - -# TODO: Check if arch/platform combo is valid - -include(cmake/flags.cmake) - -set(CMAKE_VERBOSE_MAKEFILE TRUE) - -set(CMAKE_TOOLCHAIN_FILE "${CMAKE_SOURCE_DIR}/cmake/osdev.toolchain") - -project(osdev) - -enable_language(C ASM-ATT) - -add_subdirectory(boot) diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..d0258fd --- /dev/null +++ b/Makefile @@ -0,0 +1,71 @@ +MAKEFLAGS += -rR -s + +## +# Build settings +# +ROOT_DIR := $(realpath $(shell dirname $(firstword $(MAKEFILE_LIST)))) +include make/config.mk + +## +# VM settings +# +include make/vm.mk + +## +# Rules +# + +.PHONY: all +all: kernel boot + +.PHONY: boot +boot: + @$(MAKE) -C boot + +.PHONY: kernel +kernel: + @$(MAKE) -C kernel + +.PHONY: sysroot +sysroot: boot kernel + @mkdir -p $(SYSROOT_DIR) + @$(MAKE) -C boot install + @$(MAKE) -C kernel install + @cp -r base/* $(SYSROOT_DIR) + +.PHONY: run +run: release-cd + @$(QEMU) $(QEMUFLAGS) -cdrom $(RELEASE_ISO) + +.PHONY: run-uefi +run-uefi: ovmf release-cd + @$(QEMU) $(QEMUFLAGS) -cdrom $(RELEASE_ISO) -bios $(OVMF_DIR)/ovmf_$(ARCH).fd + +.PHONY: release-full +release-full: release-cd release-hdd + +.PHONY: release-cd +release-cd: $(RELEASE_ISO) + +.PHONY: release-hdd +release-hdd: $(RELEASE_HDD) + +$(RELEASE_ISO): sysroot + @mkdir -p $(RELEASE_DIR) + @./utils/generate-iso.sh $(SYSROOT_DIR) $@ + +$(RELEASE_HDD): sysroot + @mkdir -p $(RELEASE_DIR) + $(error HDD generation is not implemented yet.) + +ovmf: + @./utils/download-ovmf.sh $(OVMF_DIR) + +.PHONY: clean +clean: + @rm -rf $(SYSROOT_DIR) $(BUILD_DIR) + +.PHONY: distclean +distclean: clean + @rm -rf $(OVMF_DIR) $(RELEASE_DIR) + @$(MAKE) -C boot/limine clean diff --git a/base/boot/limine/limine.conf b/base/boot/limine/limine.conf new file mode 100644 index 0000000..b173408 --- /dev/null +++ b/base/boot/limine/limine.conf @@ -0,0 +1,6 @@ +timeout: 0 +silent: yes + +/OSDev +protocol: limine +kernel_path: boot():/System/krnl \ No newline at end of file diff --git a/boot/.DS_Store b/boot/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..238ae20cba28dedd6f6b271035c9ad9afccc310d GIT binary patch literal 6148 zcmeHK&1%~~5T3P_ctr^K&_IrYUITTTrfJAUILQmdr9HI8l_G_RDq3U7_+Sh=r!Uke z>GSlP-F0wqb8Jb<49tGB^Rv=^GP@okQo~vHny61i8p_xSG5kR|&blET@7V$>UL&2? zle9D`=07*G#qksw;BOaDLQ}e;oAvLPPRgQg27_O!(+#$^ds^!q{dII>=A$NQX7w%LMU_u&L6PN1`SPi#GBY2VS(VkccH{y&48w7Mf3Y}x zKRAfq9vv?aqQ%J@wh!Mem!aN!`Rep?{Jp%b%$*}q;rC``*W(I)z_{N}R$rAV-j9Pl zDyYIHOPWze`Fcpx1nz_yx+ViAZdXBmNPzqtfnwds3yKH>!hkUFd>Qa(sNQ+LTaY&w z284mX!~mZU5tK3Z*gCXF2L{^$00X$Kz~)|pYa)-a$JQYt5amjNu2lIJL%DMJBcB(0 zY#q9CQoi|6{>jRBD9Sz^>qj=7RP0bjVL%vo$UxUk`+WajJl_95ERvZpAPoFh45;9I zbUwtE{N1{-IlgNn=r /out: ") - -project(boot) - -# TODO: Find a better way to get sources -set(SOURCE_FILES "${CMAKE_SOURCE_DIR}/boot/platform/uefi/main.c") - -add_executable(boot ${SOURCE_FILES}) -set_target_properties(boot PROPERTIES OUTPUT_NAME ${UEFI_EXECUTABLE} SUFFIX .EFI) - -include_directories(${CMAKE_SOURCE_DIR}/include ${CMAKE_SOURCE_DIR}/include/arch/${ARCH} ${CMAKE_SOURCE_DIR}/include/uefi) diff --git a/boot/platform/uefi/main.c b/boot/platform/uefi/main.c deleted file mode 100644 index faf24eb..0000000 --- a/boot/platform/uefi/main.c +++ /dev/null @@ -1,5 +0,0 @@ -int efi_main() -{ - while (1); - return 0; -} diff --git a/cmake/bootloader.toolchain b/cmake/bootloader.toolchain deleted file mode 100644 index 664cabe..0000000 --- a/cmake/bootloader.toolchain +++ /dev/null @@ -1,20 +0,0 @@ - -set(CMAKE_SYSTEM_NAME Generic) - -set(CMAKE_C_COMPILER_WORKS TRUE) -set(CMAKE_CXX_COMPILER_WORKS TRUE) -set(CMAKE_ASM_COMPILER_WORKS TRUE) - -set(CMAKE_C_COMPILER clang) -set(CMAKE_CXX_COMPILER clang) -set(CMAKE_ASM_COMPILER clang) - -set(CMAKE_C_STANDARD_LIBRARIES "" CACHE INTERNAL "") - -set(CMAKE_EXE_LINKER_FLAGS "" CACHE INTERNAL "") -set(CMAKE_STATIC_LINKER_FLAGS "" CACHE INTERNAL "") -set(CMAKE_MODULE_LINKER_FLAGS "" CACHE INTERNAL "") -set(CMAKE_SHARED_LINKER_FLAGS "" CACHE INTERNAL "") - -set(CMAKE_C_EXTENSIONS OFF) -set(CMAKE_C_STANDARD 11) diff --git a/cmake/flags.cmake b/cmake/flags.cmake deleted file mode 100644 index cddab7d..0000000 --- a/cmake/flags.cmake +++ /dev/null @@ -1,18 +0,0 @@ -function(add_compile_flags flags) - set(CMAKE_C_COMPILER_FLAGS "${CMAKE_C_COMPILER_FLAGS} ${flags}" PARENT_SCOPE) - set(CMAKE_CXX_COMPILER_FLAGS "${CMAKE_CXX_COMPILER_FLAGS} ${flags}" PARENT_SCOPE) - set(CMAKE_ASM-ATT_FLAGS "${CMAKE_ASM-ATT_FLAGS} ${flags}" PARENT_SCOPE) -endfunction() - -function(add_assembler_flags flags) - set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} ${flags}" PARENT_SCOPE) -endfunction() - -function(add_link_flags flags) - set(LINK_FLAGS "${LINK_FLAGS} ${flags}" PARENT_SCOPE) -endfunction() - -function(set_compile_target target) - set(CMAKE_C_COMPILER_TARGET ${target} PARENT_SCOPE) - set(CMAKE_CXX_COMPILER_TARGET ${target} PARENT_SCOPE) -endfunction() diff --git a/cmake/osdev.toolchain b/cmake/osdev.toolchain deleted file mode 100644 index dff5aa3..0000000 --- a/cmake/osdev.toolchain +++ /dev/null @@ -1,20 +0,0 @@ -set(CMAKE_SYSTEM_NAME Generic) -set(CMAKE_CROSSCOMPILING TRUE) - -set(CMAKE_C_COMPILER_WORKS TRUE) -set(CMAKE_CXX_COMPILER_WORKS TRUE) -set(CMAKE_ASM_COMPILER_WORKS TRUE) - -set(CMAKE_C_COMPILER clang) -set(CMAKE_CXX_COMPILER clang) -set(CMAKE_ASM-ATT_COMPILER clang) - -set(CMAKE_C_STANDARD_LIBRARIES "" CACHE INTERNAL "") - -set(CMAKE_EXE_LINKER_FLAGS "" CACHE INTERNAL "") -set(CMAKE_STATIC_LINKER_FLAGS "" CACHE INTERNAL "") -set(CMAKE_MODULE_LINKER_FLAGS "" CACHE INTERNAL "") -set(CMAKE_SHARED_LINKER_FLAGS "" CACHE INTERNAL "") - -set(CMAKE_C_EXTENSIONS OFF) -set(CMAKE_C_STANDARD 11) diff --git a/kernel/Makefile b/kernel/Makefile new file mode 100644 index 0000000..5901f14 --- /dev/null +++ b/kernel/Makefile @@ -0,0 +1,62 @@ +## +# Compilation options +# +KERN_CC := $(subst amd64,x86_64,$(ARCH))-elf-gcc +KERN_AS := $(subst amd64,x86_64,$(ARCH))-elf-gcc +KERN_LD := $(subst amd64,x86_64,$(ARCH))-elf-ld + +KERN_CFLAGS := -Wall \ + -Wextra \ + -std=c99 \ + -nostdinc \ + -ffreestanding \ + -fno-stack-protector \ + -fno-stack-check \ + -fno-lto \ + -fno-pic \ + -ffunction-sections \ + -fdata-sections + +KERN_ASFLAGS := -Wall \ + -Wextra + +KERN_LDFLAGS := -T arch/$(ARCH)/linker.ld + +KERN_CPPFLAGS := -Iinclude \ + -MMD \ + -MP + +include arch/$(ARCH)/flags.mk + +## +# Source files +# +KERN_CFILES := $(shell find . -name '*.c' -not -path 'arch') $(shell find arch/$(ARCH) -name '*.c') +KERN_ASFILES := $(shell find arch/$(ARCH) -name '*.s') + +KERN_OBJ := $(KERN_CFILES:%.c=$(BUILD_DIR)/%.c.o) $(KERN_ASFILES:%.S=$(BUILD_DIR)/%.S.o) + +KERNEL_FILE := $(BUILD_DIR)/krnl + +.PHONY: all +all: $(KERNEL_FILE) + +$(KERNEL_FILE): $(KERN_OBJ) + @mkdir -p "$(@D)" + @printf " LD $(notdir $@)\n" + @$(KERN_LD) $(KERN_LDFLAGS) $(KERN_OBJ) -o $@ + +$(BUILD_DIR)/%.c.o: %.c + mkdir -p "$(@D)" + @printf " CC $<\n" + $(KERN_CC) $(KERN_CFLAGS) $(KERN_CPPFLAGS) -c $< -o $@ + +$(BUILD_DIR)/%.S.o: %.S + @mkdir -p "$(@D)" + @printf " CC $<\n" + @$(KERN_AS) $(KERN_ASFLAGS) $(KERN_CPPFLAGS) -c $< -o $@ + +.PHONY: install +install: $(KERNEL_FILE) + @mkdir -p $(SYSROOT_DIR)/System + @install -m 644 $(KERNEL_FILE) $(SYSROOT_DIR)/System/ diff --git a/kernel/arch/amd64/flags.mk b/kernel/arch/amd64/flags.mk new file mode 100644 index 0000000..4b5d7bd --- /dev/null +++ b/kernel/arch/amd64/flags.mk @@ -0,0 +1,12 @@ +KERNEL_CFLAGS += -m64 \ + -march=x86-64 \ + -mno-80387 \ + -mno-mmx \ + -mno-sse \ + -mno-sse2 \ + -mno-red-zone \ + -mcmodel=kernel + +KERNEL_ASFLAGS += + +KERNEL_LDFLAGS += -m elf_x86_64 diff --git a/kernel/arch/amd64/linker.ld b/kernel/arch/amd64/linker.ld new file mode 100644 index 0000000..8bc407d --- /dev/null +++ b/kernel/arch/amd64/linker.ld @@ -0,0 +1,49 @@ +OUTPUT_FORMAT(elf64-x86-64) +ENTRY(_start) + +PHDRS +{ + limine_requests PT_LOAD; + text PT_LOAD; + rodata PT_LOAD; + data PT_LOAD; +} + +SECTIONS +{ + . = 0xffffffff80000000; + + .limine_requests : { + KEEP(*(.limine_requests_start)) + KEEP(*(.limine_requests)) + KEEP(*(.limine_requests_end)) + } :limine_requests + + . = ALIGN(CONSTANT(MAXPAGESIZE)); + + .text : { + *(.text .text.*) + } + + . = ALIGN(CONSTANT(MAXPAGESIZE)); + + .rodata : { + *(.rodata .rodata.*) + } :rodata + + . = ALIGN(CONSTANT(MAXPAGESIZE)); + + .data : { + *(.data .data.*) + } :data + + .bss : { + *(.bss .bss.*) + *(COMMON) + } + + /DISCARD/ : { + *(.eh_frame*) + *(.note .note.*) + } +} diff --git a/kernel/entryp.c b/kernel/entryp.c new file mode 100644 index 0000000..bfe9919 --- /dev/null +++ b/kernel/entryp.c @@ -0,0 +1,7 @@ +void _start() +{ + // placeholder + for (;;) { + __asm__ volatile("cli;hlt"); + } +} diff --git a/make/config.mk b/make/config.mk new file mode 100644 index 0000000..5858656 --- /dev/null +++ b/make/config.mk @@ -0,0 +1,36 @@ +# Target architecture +ARCH ?= amd64 + +# OS Version +VERSION := 0.0.1 + +# Object files +BUILD_DIR ?= $(ROOT_DIR)/build + +# OVMF Images +OVMF_DIR ?= $(ROOT_DIR)/ovmf + +# System files +SYSROOT_DIR ?= $(ROOT_DIR)/sysroot + +# Release files (.iso, .img, .vmdk, ...) +RELEASE_DIR ?= $(ROOT_DIR)/release + +# Release images +RELEASE_IMAGE_NAME ?= osdev-v$(VERSION)_$(ARCH) +RELEASE_ISO := $(RELEASE_DIR)/$(RELEASE_IMAGE_NAME).iso +RELEASE_HDD := $(RELEASE_DIR)/$(RELEASE_IMAGE_NAME).img + +## +# Export variables +# + +export ARCH + +export BUILD_DIR +export OVMF_DIR +export SYSROOT_DIR +export RELEASE_DIR + +export RELEASE_ISO +export RELEASE_HDD diff --git a/make/target.mk b/make/target.mk new file mode 100644 index 0000000..2332329 --- /dev/null +++ b/make/target.mk @@ -0,0 +1,5 @@ +aarch64_valid_targets := uefi rpi apl-scl +arm32_valid_targets := uefi rpi + +amd64_valid_targets := generic-pc +i686_valid_targets := generic-pc diff --git a/make/vm.mk b/make/vm.mk new file mode 100644 index 0000000..f948990 --- /dev/null +++ b/make/vm.mk @@ -0,0 +1,10 @@ +QEMU := qemu-system-$(subst amd64,x86_64,$(ARCH)) + +QEMUFLAGS ?= -m 256M + +## +# Export variables +# +export QEMU +export QEMUFLAGS + diff --git a/utils/download-ovmf.sh b/utils/download-ovmf.sh new file mode 100755 index 0000000..7e84032 --- /dev/null +++ b/utils/download-ovmf.sh @@ -0,0 +1,27 @@ +#!/usr/bin/env bash + +download() { + curl -s -o "${download_dir}/$2" -O "$1" + printf "[*] Downloaded $2\n" +} + +download_dir=$1 + +# Check if we have provided a download directory +if [ -z "${download_dir}" ]; then + printf "[!] Download directory not supplied!\n" + printf "Usage: $0 \n" + exit 1 +fi + +# Check if curl is available +if [ ! -x "$(command -v curl)" ]; then + printf "[!] cURL was not found! Please install it or make sure the executable is in PATH.\n" + exit 1 +fi + +# Silently create the download directory if it doesn't exist yet +mkdir -p ${download_dir} + +printf "[ ] Downloading OVMF images...\n" +download https://retrage.github.io/edk2-nightly/bin/RELEASEX64_OVMF.fd ovmf_amd64.fd diff --git a/utils/generate-iso.sh b/utils/generate-iso.sh new file mode 100755 index 0000000..a2a503e --- /dev/null +++ b/utils/generate-iso.sh @@ -0,0 +1,27 @@ +#!/usr/bin/env bash + +sysroot_dir=$1 +output_file=$2 + +# Check for empty input +if [ -z "${1}" ]; then + printf "[!] No arguments specified!\n" + printf "Usage: $0 \n" + exit 1 +fi + +if [ -z "${2}" ]; then + printf "[!] No output filename specified!\n" + printf "Usage: $0 \n" + exit 1 +fi + +# Check if xorriso is available +if [ ! -x "$(command -v xorriso)" ]; then + printf "[!] xorriso was not found! Please install it or make sure the executable is in PATH.\n" + exit 1 +fi + +xorriso -as mkisofs -R -r -J -b boot/limine/limine-bios-cd.bin -no-emul-boot -boot-load-size 4 -boot-info-table -hfsplus -apm-block-size 2048 --efi-boot boot/limine/limine-uefi-cd.bin -efi-boot-part --efi-boot-image --protective-msdos-label "${sysroot_dir}" -o "${output_file}" &>/dev/null +echo "[*] Generated $(basename ${output_file}).\n" +