diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000000000000000000000000000000000000..b3a59ea4064092fdeeabc18ebb745ac8b04ee837 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,7 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "hyperion" +version = "0.1.0" diff --git a/Cargo.toml b/Cargo.toml index 099d9f7ad6e4dc9bf909a66f4bcfd0f922652afc..0a1f4f7407f8b0a4d674907700d7474d54e7ddc4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,12 +8,4 @@ edition = "2021" [lib] crate-type = ["staticlib"] -[profile.release] -debug = 1 - [dependencies] - - -[build-dependencies] -#cc = "1.0.78" -nasm-rs = "0.2.4" diff --git a/Makefile b/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..0482834accd3b966deb274ec770bffc2c516b9ad --- /dev/null +++ b/Makefile @@ -0,0 +1,84 @@ +## +# Hyperion +# +# @file +# @version 0.1 + +ARCH ?= x86_64 +PROFILE ?= debug +#PROFILE ?= release + +NASM ?= nasm +LD ?= ld.lld +OBJCOPY ?= llvm-objcopy +CARGO ?= cargo +#CARGO ?= cargo-clif + +TARGET_DIR ?= target +HYPER_DIR := ${TARGET_DIR}/hyperion/${ARCH} +ARCH_DIR := src/arch/${ARCH} + +# hyperion kernel lib +RUST_T_x86_64 := x86_64-unknown-none +CARGO_DIR := ${TARGET_DIR}/${RUST_T_${ARCH}}/${PROFILE} +RUST_F_debug := +RUST_F_release:= --release +CARGO_FLAGS ?= +CARGO_FLAGS += ${RUST_F_${PROFILE}} +CARGO_FLAGS += --target=${RUST_T_${ARCH}} +KERNEL_LIB := ${CARGO_DIR}/libhyperion.a +KERNEL_SRC := $(filter-out %: ,$(file < ${CARGO_DIR}/libhyperion.d)) +${KERNEL_LIB} : ${KERNEL_SRC} Makefile Cargo.toml Cargo.lock + @echo "\n\033[32m--[[ building Hyperion lib ]]--\033[0m" + ${CARGO} build ${CARGO_FLAGS} + +# hyperion boot code +BOOT_SRC := ${ARCH_DIR}/start.asm +BOOT_OBJ := ${HYPER_DIR}/start.o +NASM_F_x86_64 := elf64 +NASM_F_x86 := elf32 +NASM_FLAGS ?= +NASM_FLAGS += ${BOOT_SRC} +NASM_FLAGS += -o ${BOOT_OBJ} +NASM_FLAGS += -f ${NASM_F_${ARCH}} +${BOOT_OBJ} : ${BOOT_SRC} Makefile + @echo "\n\033[32m--[[ building Hyperion boot ]]--\033[0m" + mkdir -p ${HYPER_DIR} + ${NASM} ${NASM_FLAGS} + +# hyperion kernel elf +LD_SCRIPT := ${ARCH_DIR}/link.ld +KERNEL_ELF := ${HYPER_DIR}/hyperion +KERNEL_DEPS := ${BOOT_OBJ} ${KERNEL_LIB} +LD_M_x86_64 := elf_x86_64 +LD_M_x86 := elf_i386 +LD_FLAGS ?= +LD_FLAGS += ${KERNEL_DEPS} +LD_FLAGS += -o ${KERNEL_ELF} +LD_FLAGS += --gc-sections +LD_FLAGS += -T ${LD_SCRIPT} +LD_FLAGS += -m ${LD_M_${ARCH}} +${KERNEL_ELF} : ${KERNEL_DEPS} ${LD_SCRIPT} Makefile + @echo "\n\033[32m--[[ building Hyperion kernel ]]--\033[0m" + mkdir -p ${HYPER_DIR} + ${LD} ${LD_FLAGS} +# evil hack to satisfy qemu and grub: +# the entry format has to be x86 not x86_64 + ${OBJCOPY} -O elf32-i386 ${KERNEL_ELF} + +# build alias +build : ${KERNEL_ELF} + +# qemu alias +QEMU_x86_64 ?= qemu-system-x86_64 +QEMU_x86 ?= qemu-system-x86 +QEMU_FLAGS ?= +QEMU_FLAGS += -enable-kvm +QEMU_FLAGS += -d cpu_reset,guest_errors +QEMU_FLAGS += -kernel ${KERNEL_ELF} +qemu : ${KERNEL_ELF} + ${QEMU_${ARCH}} ${QEMU_FLAGS} + +.PHONY : build qemu + +# end diff --git a/kernel/src/cfg.rs b/kernel/src/cfg.rs deleted file mode 100644 index 9c0f20e1d330059b5ff06f5e10457e89c93058d6..0000000000000000000000000000000000000000 --- a/kernel/src/cfg.rs +++ /dev/null @@ -1,7 +0,0 @@ -const CONFIG: bootloader_api::BootloaderConfig = { - let mut config = bootloader_api::BootloaderConfig::new_default(); - config.kernel_stack_size = 4096 * 4; // 16KiB - config -}; - -bootloader_api::entry_point!(super::kernel_main, config = &CONFIG); diff --git a/src/arch/x86_64/link.ld b/src/arch/x86_64/link.ld new file mode 100644 index 0000000000000000000000000000000000000000..eb5ae92337ff526991988521a56ef5b15407d977 --- /dev/null +++ b/src/arch/x86_64/link.ld @@ -0,0 +1,14 @@ +ENTRY(start) + +SECTIONS { + . = 1M; + + .boot_text : ALIGN(4k) { + KEEP(*(.multiboot1)) + *(.boot) + } + + .text : ALIGN(4k) { + *(.text) + } +} diff --git a/src/arch/x86_64/start.asm b/src/arch/x86_64/start.asm new file mode 100644 index 0000000000000000000000000000000000000000..c5ef80103f930633ba73799a8e83e938bcd5c0ef --- /dev/null +++ b/src/arch/x86_64/start.asm @@ -0,0 +1,33 @@ + ;; ---------- + ;; Multiboot2 + ;; ---------- + + section .multiboot2 + +header_start: + dd 0xE85250D6 ;; multiboot2 magic + dd 0 ;; arch: 32 bit (protected mode) + dd header_end - header_start ;; header length + dd 0x100000000 - (0xE85250D6 + header_end - header_start) ;; checksum + + dd 0 ;; end tag + dd 8 +header_end: + + ;; ---------- + ;; Multiboot1 + ;; ---------- + + section .multiboot1 + dd 0x1BADB002 ;; multiboot1 magic + dd 3 ;; flags + dd 0x100000000 - (0x1BADB002 + 3) ;; checksum + + section .boot + global start + bits 32 + +start: + cli + cld + hlt diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000000000000000000000000000000000000..1c26aad36a307c9123bab5c7443f91041fd278d2 --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,11 @@ +#![no_std] +#![no_main] + +#[panic_handler] +fn panic_handler(_: &core::panic::PanicInfo) -> ! { + loop {} +} + +#[no_mangle] +#[link_section = ".boot"] +pub extern "C" fn _start() {}