From b3558c2508f3adb32145f8311c7311cbd8e989d0 Mon Sep 17 00:00:00 2001 From: Arthur Beck Date: Fri, 24 Jan 2025 21:48:50 -0600 Subject: [PATCH] commit before bed, i'm making good progress --- .gitignore | 9 ++- kernel/build | 20 +++-- kernel/build.rs | 26 +++++++ kernel/config.aphro.example | 23 ++++++ kernel/functions | 6 +- kernel/grub/boot/aphrodite.kernel | Bin 15968 -> 16200 bytes kernel/grub/boot/grub/grub.cfg | 4 +- kernel/kernel.flat | Bin 15968 -> 16200 bytes kernel/src/include/arch/x86/interrupts.rs | 7 ++ kernel/src/include/arch/x86/output.rs | 85 ++++++++++++++++++++-- kernel/src/internal/arch/x86/entry.rs | 72 +++++++++++------- 11 files changed, 207 insertions(+), 45 deletions(-) create mode 100644 kernel/build.rs create mode 100644 kernel/config.aphro.example diff --git a/.gitignore b/.gitignore index 7adf114..1d1b46b 100644 --- a/.gitignore +++ b/.gitignore @@ -23,4 +23,11 @@ Cargo.lock # Generated grub files kernel/grub/ aphrodite-grub.iso -aphrodite.iso \ No newline at end of file +aphrodite.iso + +# Generated files +kernel.flat +config.aphro.tmp + +# Per-developer files +config.aphro \ No newline at end of file diff --git a/kernel/build b/kernel/build index 818018b..6efcc47 100755 --- a/kernel/build +++ b/kernel/build @@ -7,6 +7,10 @@ if [[ ! -d "$DIR" ]]; then DIR="$PWD"; fi get_version +cp config.aphro config.aphro.tmp + +export $(grep -Ev '^#' config.aphro.tmp | xargs) + cd ../kernel cargo build --target i686-unknown-none.json --release -Zbuild-std --bin entrypoint @@ -15,13 +19,17 @@ cargo build --target i686-unknown-none.json --release -Zbuild-std --bin entrypoi cp target/i686-unknown-none/release/entrypoint kernel.flat # copy it out -rm -rf grub +rm -rf grub aphrodite.iso aphrodite-grub.iso -cp -r ./grub_template ./grub +if [[ $CONFIG_BUILD_GRUB = "true" ]]; then + cp -r ./grub_template ./grub -cp kernel.flat ./grub/boot/aphrodite.kernel + cp kernel.flat ./grub/boot/aphrodite.kernel -sed -i "s@%{VERSION}@$VERSION@g" ./grub/boot/grub/grub.cfg + sed -i "s@%{VERSION}@$VERSION@g" ./grub/boot/grub/grub.cfg -grub-mkrescue -o aphrodite-grub.iso grub -cp aphrodite-grub.iso aphrodite.iso \ No newline at end of file + grub-mkrescue -o aphrodite-grub.iso grub + cp aphrodite-grub.iso aphrodite.iso +fi + +reset_version_vars \ No newline at end of file diff --git a/kernel/build.rs b/kernel/build.rs new file mode 100644 index 0000000..59a6e75 --- /dev/null +++ b/kernel/build.rs @@ -0,0 +1,26 @@ +fn main() { + let env = std::env::vars(); + + // Begin checks + println!(r#"cargo:rustc-check-cfg=cfg(CONFIG_DISABLE_MULTIBOOT2_SUPPORT, values("true", "false", none()))"#); + println!(r#"cargo:rustc-check-cfg=cfg(CONFIG_PREUSER_HALT_ON_PANIC, values("true", "false", none()))"#); + println!(r#"cargo:rustc-check-cfg=cfg(CONFIG_PREUSER_SPIN_ON_PANIC, values("true", "false", none()))"#); + + println!(r#"cargo:rustc-check-cfg=cfg(CONFIG_PREUSER_OUTPUT_DEBUG, values("true", "false", none()))"#); + println!(r#"cargo:rustc-check-cfg=cfg(CONFIG_PREUSER_OUTPUT_INFO, values("true", "false", none()))"#); + println!(r#"cargo:rustc-check-cfg=cfg(CONFIG_PREUSER_OUTPUT_WARN, values("true", "false", none()))"#); + println!(r#"cargo:rustc-check-cfg=cfg(CONFIG_PREUSER_OUTPUT_ERROR, values("true", "false", none()))"#); + println!(r#"cargo:rustc-check-cfg=cfg(CONFIG_PREUSER_OUTPUT_FATAL, values("true", "false", none()))"#); + // End checks + + // Configuration name used when a config is required but should always evaluate to true + println!(r#"cargo:rustc-check-cfg=cfg(NONE, values("false", none()))"#); + + for (var, val) in env { + if !var.starts_with("CONFIG_") { + continue + } + println!("cargo:rerun-if-env-changed={}", var); + println!("cargo:rustc-cfg={}=\"{}\"", var, val); + } +} \ No newline at end of file diff --git a/kernel/config.aphro.example b/kernel/config.aphro.example new file mode 100644 index 0000000..6a856b8 --- /dev/null +++ b/kernel/config.aphro.example @@ -0,0 +1,23 @@ +# config.aphro for aphrodite devel-83f6c5c-out-of-tree + +# Begin metadata + +# Set VERSION=generate to attempt to autogenerate a version based on git information +VERSION=generate +# SUFFIX is unset + +# End metadata + +# Begin configs +CONFIG_DISABLE_MULTIBOOT2_SUPPORT=false +CONFIG_PREUSER_HALT_ON_PANIC=false +CONFIG_PREUSER_SPIN_ON_PANIC=true + +CONFIG_PREUSER_OUTPUT_DEBUG=true +CONFIG_PREUSER_OUTPUT_INFO=true +CONFIG_PREUSER_OUTPUT_WARN=true +CONFIG_PREUSER_OUTPUT_ERROR=true +CONFIG_PREUSER_OUTPUT_FATAL=true + +CONFIG_BUILD_GRUB=true +# End configs \ No newline at end of file diff --git a/kernel/functions b/kernel/functions index e2d2f1a..f5fc796 100644 --- a/kernel/functions +++ b/kernel/functions @@ -1,10 +1,10 @@ function get_version() { local TEMP_SUFFIX + if [[ $VERSION = "generate" ]]; then + unset VERSION + fi if git diff-index HEAD -- 2>&1 > /dev/null then - echo -n - # N/A - else TEMP_SUFFIX="-out-of-tree" fi SUFFIX="$SUFFIX$TEMP_SUFFIX" diff --git a/kernel/grub/boot/aphrodite.kernel b/kernel/grub/boot/aphrodite.kernel index f2713ed3bdcf74f37ba306764d274994afb534ff..b8503b093060fe04424a1cad3057b59844569f56 100755 GIT binary patch literal 16200 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 bsc0QtI8uHW9JOhu?_7t!$3dN)h@tfV@QMcI delta 4940 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 diff --git a/kernel/grub/boot/grub/grub.cfg b/kernel/grub/boot/grub/grub.cfg index 99a2758..bd79404 100644 --- a/kernel/grub/boot/grub/grub.cfg +++ b/kernel/grub/boot/grub/grub.cfg @@ -1,8 +1,8 @@ set timeout=15 set default=0 -menuentry "Aphrodite" --class aphrodite --class kernel --class os $menuentry_id_option 'aphrodite-basic-devel-0b87ccb' { - echo 'Loading Aphrodite aphrodite-devel-0b87ccb ...' +menuentry "Aphrodite" --class aphrodite --class kernel --class os $menuentry_id_option 'aphrodite-basic-generate' { + echo 'Loading Aphrodite aphrodite-generate ...' multiboot2 /boot/aphrodite.kernel boot } \ No newline at end of file diff --git a/kernel/kernel.flat b/kernel/kernel.flat index f2713ed3bdcf74f37ba306764d274994afb534ff..b8503b093060fe04424a1cad3057b59844569f56 100755 GIT binary patch literal 16200 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 bsc0QtI8uHW9JOhu?_7t!$3dN)h@tfV@QMcI delta 4940 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 diff --git a/kernel/src/include/arch/x86/interrupts.rs b/kernel/src/include/arch/x86/interrupts.rs index 46c1c61..ab69402 100644 --- a/kernel/src/include/arch/x86/interrupts.rs +++ b/kernel/src/include/arch/x86/interrupts.rs @@ -15,6 +15,13 @@ pub fn interrupts_enabled() -> bool { (flags & (1 << 9)) == 0 } +/// Disables interrupts. +pub fn disable_interrupts() { + unsafe { + asm!("cli") + } +} + /// Disables interrupts and returns the value of them. pub fn pop_irq() -> u32 { let flags: u32; diff --git a/kernel/src/include/arch/x86/output.rs b/kernel/src/include/arch/x86/output.rs index 8ab15c5..4ccdddf 100644 --- a/kernel/src/include/arch/x86/output.rs +++ b/kernel/src/include/arch/x86/output.rs @@ -6,31 +6,102 @@ use super::ports; use paste::paste; macro_rules! message_funcs { - ($func_name:ident, $prefix:literal) => { + ($func_name:ident, $prefix:literal, $level:ident) => { paste! { /// Outputs a $func_name message &str to the debug serial port. pub fn [< s $func_name s >](s: &str) { + if cfg!($level = "false") { + return + } ports::outbs(super::DEBUG_PORT, $prefix.as_bytes()); ports::outbs(super::DEBUG_PORT, s.as_bytes()); } + /// Outputs a $func_name message &str and a newline to the debug serial port. + pub fn [< s $func_name sln >](s: &str) { + if cfg!($level = "false") { + return + } + ports::outbs(super::DEBUG_PORT, $prefix.as_bytes()); + ports::outbs(super::DEBUG_PORT, s.as_bytes()); + ports::outb(super::DEBUG_PORT, b'\n'); + } + /// Outputs a $func_name message &\[u8] to the debug serial port. pub fn [< s $func_name b >](s: &[u8]) { + if cfg!($level = "false") { + return + } ports::outbs(super::DEBUG_PORT, $prefix.as_bytes()); ports::outbs(super::DEBUG_PORT, s); } + /// Outputs a $func_name message &\[u8] and a newline to the debug serial port. + pub fn [< s $func_name bln >](s: &[u8]) { + if cfg!($level = "false") { + return + } + ports::outbs(super::DEBUG_PORT, $prefix.as_bytes()); + ports::outbs(super::DEBUG_PORT, s); + ports::outb(super::DEBUG_PORT, b'\n'); + } + /// Outputs a(n) $func_name message u8 to the debug serial port. pub fn [< s $func_name u >](s: u8) { + if cfg!($level = "false") { + return + } ports::outbs(super::DEBUG_PORT, $prefix.as_bytes()); ports::outb(super::DEBUG_PORT, s); } + + /////////////////////////////////////////////////////////////// + + /// Outputs a $func_name message &str to the debug serial port without a prefix. + pub fn [< s $func_name snp >](s: &str) { + if cfg!($level = "false") { + return + } + ports::outbs(super::DEBUG_PORT, s.as_bytes()); + } + /// Outputs a $func_name message &str and a newline to the debug serial port without a prefix. + pub fn [< s $func_name snpln >](s: &str) { + if cfg!($level = "false") { + return + } + ports::outbs(super::DEBUG_PORT, s.as_bytes()); + ports::outb(super::DEBUG_PORT, b'\n'); + } + + /// Outputs a $func_name message &\[u8] to the debug serial port without a prefix. + pub fn [< s $func_name bnp >](s: &[u8]) { + if cfg!($level = "false") { + return + } + ports::outbs(super::DEBUG_PORT, s); + } + /// Outputs a $func_name message &\[u8] and a newline to the debug serial port without a prefix. + pub fn [< s $func_name bnpln >](s: &[u8]) { + if cfg!($level = "false") { + return + } + ports::outbs(super::DEBUG_PORT, s); + ports::outb(super::DEBUG_PORT, b'\n'); + } + + /// Outputs a(n) $func_name message u8 to the debug serial port without a prefix. + pub fn [< s $func_name unp >](s: u8) { + if cfg!($level = "false") { + return + } + ports::outb(super::DEBUG_PORT, s); + } } } } -message_funcs!(debug, "[DEBUG] "); -message_funcs!(info, "[INFO] "); -message_funcs!(warning, "[WARN] "); -message_funcs!(error, "[ERROR] "); -message_funcs!(fatal, "[FATAL] "); -message_funcs!(output, ""); +message_funcs!(debug, "[DEBUG] ", CONFIG_PREUSER_OUTPUT_DEBUG); +message_funcs!(info, "[INFO] ", CONFIG_PREUSER_OUTPUT_INFO); +message_funcs!(warning, "[WARN] ", CONFIG_PREUSER_OUTPUT_WARN); +message_funcs!(error, "[ERROR] ", CONFIG_PREUSER_OUTPUT_ERROR); +message_funcs!(fatal, "[FATAL] ", CONFIG_PREUSER_OUTPUT_FATAL); +message_funcs!(output, "", NONE); diff --git a/kernel/src/internal/arch/x86/entry.rs b/kernel/src/internal/arch/x86/entry.rs index a04d06a..ad4b76b 100644 --- a/kernel/src/internal/arch/x86/entry.rs +++ b/kernel/src/internal/arch/x86/entry.rs @@ -2,12 +2,14 @@ #![no_std] #![no_main] #![warn(missing_docs)] +#![allow(unexpected_cfgs)] #![feature(ptr_metadata)] use core::{arch::asm, ffi::CStr, panic::PanicInfo}; use aphrodite::multiboot2::{BootInfo, CString, ColorInfo, FramebufferInfo, MemoryMap, PaletteColorDescriptor, RawMemoryMap, RootTag, Tag}; use aphrodite::arch::x86::output::*; +#[cfg(not(CONFIG_DISABLE_MULTIBOOT2_SUPPORT))] #[unsafe(link_section = ".multiboot2")] #[unsafe(no_mangle)] static MULTIBOOT2_HEADER: [u8; 29] = [ @@ -17,7 +19,7 @@ static MULTIBOOT2_HEADER: [u8; 29] = [ 0xe9, 0x55, 0x00, 0x00, 0x00 ]; -// The root tag, provided directly from the multiboot bootloader. +// The root tag, provided directly from the multiboot2 bootloader. static mut RT: *const RootTag = core::ptr::null(); // The boot info struct, created from all of the tags. static mut BI: BootInfo = BootInfo { @@ -40,30 +42,36 @@ static mut MAGIC: u32 = 0xFFFFFFFF; #[unsafe(no_mangle)] extern "C" fn _start() -> ! { unsafe { // Copy values provided by the bootloader out + + // Aphrodite bootloaders pass values in eax and ebx, however rust doesn't know that it can't overwrite those. + // we force using ebx and eax as the output of an empty assembly block to let it know. asm!( - "mov ebx, ebx", out("ebx") O, // Bootloader-specific data(ebx) - out("eax") MAGIC, // Magic number(eax) + "", out("ebx") O, // Bootloader-specific data(ebx) + out("eax") MAGIC, // Magic number(eax) options(nomem, nostack, preserves_flags, pure) ); } unsafe { match MAGIC { + #[cfg(not(CONFIG_DISABLE_MULTIBOOT2_SUPPORT))] 0x36D76289 => { // Multiboot2 RT = O as *const RootTag; // This is unsafe rust! We can do whatever we want! *manical laughter* - sdebugs("Total boot info length: "); - soutputb(&aphrodite::u32_as_u8_slice((*RT).total_len)); - soutputu(b'\n'); + sdebugs("Total boot info length is "); + sdebugbnp(&aphrodite::u32_as_u8_slice((*RT).total_len)); + sdebugunp(b'\n'); - sdebugs("Root tag address is: "); - soutputb(&aphrodite::usize_as_u8_slice(O as usize)); - soutputu(b'\n'); + sdebugs("Root tag address is "); + sdebugbnp(&aphrodite::usize_as_u8_slice(O as usize)); + sdebugunp(b'\n'); if (*RT).total_len<16 { // Size of root tag+size of terminating tag. Something's up. panic!("total length < 16") } - soutputu(b'\n'); + let end_addr = O as usize+(*RT).total_len as usize; + + sdebugunp(b'\n'); let mut ptr = O as usize; ptr += size_of::(); @@ -71,19 +79,14 @@ extern "C" fn _start() -> ! { let mut current_tag = core::ptr::read_volatile(ptr as *const Tag); loop { - sdebugs("Tag address is: "); - soutputb(&aphrodite::usize_as_u8_slice(ptr)); - soutputu(b'\n'); + sdebugs("Tag address is "); + sdebugbnpln(&aphrodite::usize_as_u8_slice(ptr)); - sdebugs("Tag type is: "); - soutputb(&aphrodite::u32_as_u8_slice(current_tag.tag_type)); - soutputu(b'\n'); + sdebugs("Tag type is "); + sdebugbnpln(&aphrodite::u32_as_u8_slice(current_tag.tag_type)); - sdebugs("Tag length is: "); - soutputb(&aphrodite::u32_as_u8_slice(current_tag.tag_len)); - soutputu(b'\n'); - - soutputu(b'\n'); + sdebugs("Tag length is "); + sdebugbnpln(&aphrodite::u32_as_u8_slice(current_tag.tag_len)); match current_tag.tag_type { 0 => { // Ending tag @@ -188,14 +191,16 @@ extern "C" fn _start() -> ! { BI.framebuffer_info = Some((*framebufferinfo).clone()); BI.color_info = Some(colorinfo); }, - 4294967295 => { // oh no, THIS bug happened - panic!("your code is fucked up") - }, _ => { // Unknown/unimplemented tag type, ignore - // TODO: Add info message + sinfos("Unknown tag type "); + sinfobnpln(&aphrodite::u32_as_u8_slice(current_tag.tag_type)); } } + sinfounp(b'\n'); ptr = ptr + current_tag.tag_len as usize; + if ptr>end_addr { + panic!("current tag length would put pointer out-of-bounds") + } current_tag = core::ptr::read_volatile(ptr as *const Tag); } }, @@ -210,13 +215,28 @@ extern "C" fn _start() -> ! { #[unsafe(link_section = ".panic")] #[panic_handler] -fn handle_panic(info: &PanicInfo) -> ! { +#[cfg(not(CONFIG_PREUSER_HALT_ON_PANIC = "false"))] +fn halt_on_panic(info: &PanicInfo) -> ! { let message = info.message().as_str().unwrap_or(""); if message != "" { sfatals(message); aphrodite::arch::x86::ports::outb(aphrodite::arch::x86::DEBUG_PORT, b'\n'); } + aphrodite::arch::x86::interrupts::disable_interrupts(); unsafe { asm!("hlt", options(noreturn)); } +} + +#[unsafe(link_section = ".panic")] +#[panic_handler] +#[cfg(all(CONFIG_PREUSER_SPIN_ON_PANIC = "true", CONFIG_PREUSER_HALT_ON_PANIC = "false"))] +fn spin_on_panic(info: &PanicInfo) -> ! { + let message = info.message().as_str().unwrap_or(""); + if message != "" { + sfatals(message); + aphrodite::arch::x86::ports::outb(aphrodite::arch::x86::DEBUG_PORT, b'\n'); + } + aphrodite::arch::x86::interrupts::disable_interrupts(); + loop {} } \ No newline at end of file