Kernel can now succesfully boot

This commit is contained in:
Arthur Beck 2025-01-25 09:14:42 -06:00
parent b3558c2508
commit 461136c643
11 changed files with 132 additions and 37 deletions

View file

@ -1,16 +1,29 @@
#!/bin/bash
(
set -e
DIR="${BASH_SOURCE%/*}"
if [[ ! -d "$DIR" ]]; then DIR="$PWD"; fi
. "$DIR/functions"
get_version
rm config.aphro.tmp
cp config.aphro config.aphro.tmp
export $(grep -Ev '^#' config.aphro.tmp | xargs)
get_version
if [[ "$CFG_VERSION" != "$VERSION" ]]; then
echo -n "[WARN] Configuration version \"$CFG_VERSION\" is different then actual version \"$VERSION\""
if [[ "$CONT_WITH_DIFFERENT_VERSION" != "true" ]]; then
echo "; not continuing"
exit 1
fi
echo
fi
cd ../kernel
cargo build --target i686-unknown-none.json --release -Zbuild-std --bin entrypoint
@ -33,3 +46,4 @@ if [[ $CONFIG_BUILD_GRUB = "true" ]]; then
fi
reset_version_vars
)

View file

@ -3,9 +3,15 @@ fn main() {
// 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_EXIT_LOOP_ON_INVALID_LENGTH, values("true", "false", none()))"#);
println!(r#"cargo:rustc-check-cfg=cfg(CONFIG_PREUSER_PANIC_ON_INVALID_LENGTH, values("true", "false", none()))"#);
println!(r#"cargo:rustc-check-cfg=cfg(CONFIG_PREUSER_WARN_ON_INVALID_LENGTH, values("true", "false", none()))"#);
println!(r#"cargo:rustc-check-cfg=cfg(CONFIG_PREUSER_ERROR_ON_INVALID_LENGTH, 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()))"#);

View file

@ -1,4 +1,9 @@
#!/bin/bash
./build
./emulate
set -e
DIR="${BASH_SOURCE%/*}"
if [[ ! -d "$DIR" ]]; then DIR="$PWD"; fi
. $DIR/build
. $DIR/emulate

View file

@ -1,4 +1,6 @@
# config.aphro for aphrodite devel-83f6c5c-out-of-tree
# config.aphro for aphrodite devel-b3558c2-out-of-tree
CFG_VERSION=devel-b3558c2-out-of-tree
CONT_WITH_DIFFERENT_VERSION=false
# Begin metadata
@ -10,14 +12,23 @@ VERSION=generate
# Begin configs
CONFIG_DISABLE_MULTIBOOT2_SUPPORT=false
CONFIG_PREUSER_HALT_ON_PANIC=false
CONFIG_PREUSER_SPIN_ON_PANIC=true
# Panic behavior. When debugging, generally halt on panic is more useful.
CONFIG_PREUSER_HALT_ON_PANIC=true
CONFIG_PREUSER_SPIN_ON_PANIC=false
CONFIG_PREUSER_EXIT_LOOP_ON_INVALID_LENGTH=false
CONFIG_PREUSER_PANIC_ON_INVALID_LENGTH=true
CONFIG_PREUSER_WARN_ON_INVALID_LENGTH=true
CONFIG_PREUSER_ERROR_ON_INVALID_LENGTH=true
# Whether to output various levels of messages.
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
# Whether to build an iso with GRUB. Used in ./build.
CONFIG_BUILD_GRUB=true
# End configs

View file

@ -1,4 +1,6 @@
#!/bin/bash
set -e
cd ../emulation
bochs -q

View file

@ -1,8 +1,5 @@
function get_version() {
local TEMP_SUFFIX
if [[ $VERSION = "generate" ]]; then
unset VERSION
fi
if git diff-index HEAD -- 2>&1 > /dev/null
then
TEMP_SUFFIX="-out-of-tree"
@ -10,6 +7,9 @@ function get_version() {
SUFFIX="$SUFFIX$TEMP_SUFFIX"
VERSION="${VERSION:-devel-$(git rev-parse --short HEAD)$SUFFIX}"
if [[ "$VERSION" == "generate" ]]; then
VERSION="devel-$(git rev-parse --short HEAD)$SUFFIX"
fi
}
function reset_version_vars() {

Binary file not shown.

View file

@ -1,8 +1,8 @@
set timeout=15
set default=0
menuentry "Aphrodite" --class aphrodite --class kernel --class os $menuentry_id_option 'aphrodite-basic-generate' {
echo 'Loading Aphrodite aphrodite-generate ...'
menuentry "Aphrodite" --class aphrodite --class kernel --class os $menuentry_id_option 'aphrodite-basic-devel-b3558c2-out-of-tree' {
echo 'Loading Aphrodite aphrodite-devel-b3558c2-out-of-tree ...'
multiboot2 /boot/aphrodite.kernel
boot
}

Binary file not shown.

View file

@ -39,6 +39,23 @@ pub fn u32_as_u8_slice(mut value: u32) -> [u8; 10] {
buf
}
/// Converts an u8 to an [u8; 3].
pub fn u8_as_u8_slice(mut value: u8) -> [u8; 3] {
let mut buf = [0u8; 3];
let mut i = 2;
if value == 0 {
buf[0] = b'0';
}
while value > 0 {
let digit = value%10;
let char = b'0' + digit as u8;
buf[i] = char;
value = value / 10;
i -= 1;
}
buf
}
/// Converts an usize(32 or 64 bit) to an [u8; 10].
pub fn usize_as_u8_slice(mut value: usize) -> [u8; 20] {
let mut buf = [0u8; 20];

View file

@ -3,7 +3,9 @@
#![no_main]
#![warn(missing_docs)]
#![allow(unexpected_cfgs)]
#![allow(static_mut_refs)]
#![feature(ptr_metadata)]
#![feature(cfg_match)]
use core::{arch::asm, ffi::CStr, panic::PanicInfo};
use aphrodite::multiboot2::{BootInfo, CString, ColorInfo, FramebufferInfo, MemoryMap, PaletteColorDescriptor, RawMemoryMap, RootTag, Tag};
@ -159,8 +161,8 @@ extern "C" fn _start() -> ! {
// ...before the BootInfo's bootloader_name is set.
},
8 => { // Framebuffer info
if current_tag.tag_len < 40 { // Unexpected size, something is probably up
panic!("size of framebuffer info tag < 40");
if current_tag.tag_len < 31 { // Unexpected size, something is probably up
panic!("size of framebuffer info tag < 31");
}
let framebufferinfo: *const FramebufferInfo = ptr as *const FramebufferInfo;
let colorinfo: ColorInfo;
@ -192,15 +194,32 @@ extern "C" fn _start() -> ! {
BI.color_info = Some(colorinfo);
},
_ => { // Unknown/unimplemented tag type, ignore
sinfos("Unknown tag type ");
sinfobnpln(&aphrodite::u32_as_u8_slice(current_tag.tag_type));
swarnings("Unknown tag type ");
swarningbnpln(&aphrodite::u32_as_u8_slice(current_tag.tag_type));
}
}
sinfounp(b'\n');
ptr = ptr + current_tag.tag_len as usize;
ptr = (ptr + current_tag.tag_len as usize + 7) & !7;
if ptr>end_addr {
cfg_match! {
cfg(all(CONFIG_PREUSER_ERROR_ON_INVALID_LENGTH = "true", CONFIG_PREUSER_PANIC_ON_INVALID_LENGTH = "false")) => {
serrorsln("Current tag length would put pointer out-of-bounds; CONFIG_PREUSER_ERROR_ON_INVALID_LENGTH is set, continuing");
}
cfg(all(CONFIG_PREUSER_WARN_ON_INVALID_LENGTH = "true", CONFIG_PREUSER_PANIC_ON_INVALID_LENGTH = "false")) => {
swarningsln("Current tag length would put pointer out-of-bounds; CONFIG_PREUSER_WARN_ON_INVALID_LENGTH is set, continuing");
}
}
cfg_match! {
cfg(not(CONFIG_PREUSER_PANIC_ON_INVALID_LENGTH = "false")) => {
panic!("current tag length would put pointer out-of-bounds")
}
cfg(CONFIG_PREUSER_EXIT_LOOP_ON_INVALID_LENGTH = "true") => {
sinfos("Exiting loop as current tag length would put pointer out-of-bounds ");
sinfosnpln("and CONFIG_PREUSER_EXIT_LOOP_ON_INVALID_LENGTH is set");
break;
}
}
}
current_tag = core::ptr::read_volatile(ptr as *const Tag);
}
},
@ -209,8 +228,29 @@ extern "C" fn _start() -> ! {
}
}
}
sdebugsln("Bootloader information has been successfully loaded");
soutputu(b'\n');
unsafe {
if BI.framebuffer_info.clone().is_some() {
let framebuffer_info = BI.framebuffer_info.clone().unwrap();
sdebugs("Framebuffer width: ");
sdebugbnpln(&aphrodite::u32_as_u8_slice(framebuffer_info.width));
sdebugs("Framebuffer height: ");
sdebugbnpln(&aphrodite::u32_as_u8_slice(framebuffer_info.height));
sdebugs("Framebuffer pitch: ");
sdebugbnpln(&aphrodite::u32_as_u8_slice(framebuffer_info.pitch));
sdebugs("Framebuffer address: ");
sdebugbnpln(&aphrodite::usize_as_u8_slice(framebuffer_info.address as usize));
sdebugs("Framebuffer bpp: ");
sdebugbnpln(&aphrodite::u8_as_u8_slice(framebuffer_info.bpp));
sdebugs("Framebuffer type: ");
sdebugbnpln(&aphrodite::u8_as_u8_slice(framebuffer_info.fb_type));
sdebugs("Framebuffer length: ");
sdebugbnpln(&aphrodite::usize_as_u8_slice(framebuffer_info.len));
}
}
panic!("kernel exited");
panic!("kernel unexpectedly exited");
}
#[unsafe(link_section = ".panic")]