From e3a577331f79ffb6a298a44338518411c2312ce0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Kr=C3=B6ning?= Date: Thu, 5 Feb 2026 16:39:31 +0100 Subject: [PATCH] f --- Cargo.lock | 6 ++++++ Cargo.toml | 4 +++- src/arch/x86_64/platform/multiboot/entry.s | 21 +-------------------- src/arch/x86_64/platform/multiboot/mod.rs | 15 +++++++++++++-- xtask/src/build.rs | 8 ++++---- 5 files changed, 27 insertions(+), 27 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e64e84ce..4378a9c7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -531,6 +531,7 @@ dependencies = [ "vm-fdt", "volatile 0.6.1", "x86_64", + "xen-hvm", ] [[package]] @@ -1954,6 +1955,11 @@ dependencies = [ "rustix", ] +[[package]] +name = "xen-hvm" +version = "0.0.0" +source = "git+https://github.com/hermit-os/xen.git?branch=xen-hvm#821741cf90d68137107707b3d6f92c8ced41f8e4" + [[package]] name = "xshell" version = "0.2.7" diff --git a/Cargo.toml b/Cargo.toml index 06d87166..24b1a192 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -33,6 +33,8 @@ sbi-rt = "0.0.3" [target.'cfg(target_arch = "x86_64")'.dependencies] linux-boot-params = { version = "0.17", optional = true } multiboot = { version = "0.8", optional = true } +# xen-hvm = { path = "../xen/xen-hvm" } +xen-hvm = { git = "https://github.com/hermit-os/xen.git", branch = "xen-hvm" } uart_16550 = "0.4" x86_64 = { version = "0.15", default-features = false, features = ["instructions"] } @@ -46,7 +48,7 @@ built = { version = "0.8", features = ["git2", "chrono"] } # FIXME: When target-specific features exist, remove the workaround features. # https://github.com/rust-lang/cargo/issues/1197 [features] -default = [] +default = ["multiboot"] elf = [] linux = [] multiboot = [] diff --git a/src/arch/x86_64/platform/multiboot/entry.s b/src/arch/x86_64/platform/multiboot/entry.s index 10320596..4b9d5b70 100644 --- a/src/arch/x86_64/platform/multiboot/entry.s +++ b/src/arch/x86_64/platform/multiboot/entry.s @@ -8,30 +8,11 @@ .extern loader_start # defined in linker script .extern loader_end -# We use a special name to map this section at the begin of our kernel -# => Multiboot expects its magic number at the beginning of the kernel. -.section .mboot, "a" - -# This part MUST be 4 byte aligned, so we solve that issue using '.align 4'. -.align 4 -mboot: - # Multiboot macros to make a few lines more readable later - .set MULTIBOOT_PAGE_ALIGN, (1 << 0) - .set MULTIBOOT_MEMORY_INFO, (1 << 1) - .set MULTIBOOT_HEADER_MAGIC, 0x1BADB002 - .set MULTIBOOT_HEADER_FLAGS, MULTIBOOT_PAGE_ALIGN | MULTIBOOT_MEMORY_INFO - .set MULTIBOOT_CHECKSUM, -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS) - - # This is the GRUB Multiboot header. A boot signature - .4byte MULTIBOOT_HEADER_MAGIC - .4byte MULTIBOOT_HEADER_FLAGS - .4byte MULTIBOOT_CHECKSUM - .4byte 0, 0, 0, 0, 0 # address fields - .section .text .align 4 .global _start _start: + mov edi, ebx cli # avoid any interrupt # Initialize stack pointer diff --git a/src/arch/x86_64/platform/multiboot/mod.rs b/src/arch/x86_64/platform/multiboot/mod.rs index 3b77e4dd..4bbd5a15 100644 --- a/src/arch/x86_64/platform/multiboot/mod.rs +++ b/src/arch/x86_64/platform/multiboot/mod.rs @@ -2,6 +2,7 @@ use alloc::borrow::ToOwned; use core::ptr::write_bytes; use core::sync::atomic::{AtomicPtr, Ordering}; use core::{mem, ptr, slice}; +use xen_hvm::start_info::StartInfo; use align_address::Align; use hermit_entry::boot_info::{ @@ -18,6 +19,12 @@ use crate::arch::x86_64::physicalmem::PhysAlloc; use crate::arch::x86_64::{KERNEL_STACK_SIZE, SERIAL_IO_PORT, paging}; use crate::fdt::Fdt; +unsafe extern "C" { + fn _start(start_info: &'static StartInfo) -> !; +} + +xen_hvm::phys32_entry!(_start); + unsafe extern "C" { static mut loader_end: u8; } @@ -38,9 +45,13 @@ mod entry { static MB_INFO: AtomicPtr = AtomicPtr::new(ptr::null_mut()); -unsafe extern "C" fn rust_start(mb_info: *mut MultibootInfo) -> ! { +unsafe extern "C" fn rust_start(start_info: &'static StartInfo) -> ! { crate::log::init(); - MB_INFO.store(mb_info, Ordering::Relaxed); + + paging::map::(0x2000, 0x2000, 1, PageTableFlags::empty()); + dbg!(start_info); + loop {} + unsafe { crate::os::loader_main(); } diff --git a/xtask/src/build.rs b/xtask/src/build.rs index dfe3b0ac..29e05089 100644 --- a/xtask/src/build.rs +++ b/xtask/src/build.rs @@ -40,10 +40,10 @@ impl Build { sh.create_dir(dist_object.as_ref().parent().unwrap())?; sh.copy_file(&build_object, &dist_object)?; - if self.artifact.target == Target::X86_64Multiboot { - eprintln!("Converting object to elf32-i386"); - dist_object.convert_to_elf32_i386()?; - } + // if self.artifact.target == Target::X86_64Multiboot { + // eprintln!("Converting object to elf32-i386"); + // dist_object.convert_to_elf32_i386()?; + // } eprintln!("Loader available at {}", dist_object.as_ref().display()); Ok(())