From 9225d2d773eb1d19fee3b5cf69b5d25bcaa4ac97 Mon Sep 17 00:00:00 2001 From: able Date: Mon, 17 Jul 2023 09:36:39 -0500 Subject: [PATCH] ARM: checkpoint from micro-tau --- kernel/lds/aarch64-qemu.ld | 7 ++- kernel/src/arch/aarch64/mod.rs | 39 ++++++------ repbuild/Cargo.toml | 6 +- repbuild/limine.cfg | 4 +- repbuild/src/main.rs | 109 ++++++++++----------------------- 5 files changed, 62 insertions(+), 103 deletions(-) diff --git a/kernel/lds/aarch64-qemu.ld b/kernel/lds/aarch64-qemu.ld index e3a62a2..9aa4702 100644 --- a/kernel/lds/aarch64-qemu.ld +++ b/kernel/lds/aarch64-qemu.ld @@ -1,7 +1,8 @@ -ENTRY(_start) +ENTRY(_kernel_start) + SECTIONS { - . = 0x40080000; + . = 0xffffffff80000000; .text.boot : { *(.text.boot) } .text : { *(.text) } .data : { *(.data) } @@ -11,4 +12,4 @@ SECTIONS . = ALIGN(8); . = . + 0x4000; LD_STACK_PTR = .; -} \ No newline at end of file +} diff --git a/kernel/src/arch/aarch64/mod.rs b/kernel/src/arch/aarch64/mod.rs index e14e6a4..ca0d88c 100644 --- a/kernel/src/arch/aarch64/mod.rs +++ b/kernel/src/arch/aarch64/mod.rs @@ -1,29 +1,32 @@ -//! -// #[allow(deprecated)] -// use limine::{TerminalRequest, TerminalResponse}; +use {core::arch::asm, limine::FramebufferRequest}; + +pub const PAGE_SIZE: usize = 4096; #[no_mangle] -#[allow(deprecated)] unsafe extern "C" fn _kernel_start() -> ! { - use limine::{Framebuffer, FramebufferRequest, NonNullPtr}; static FB_REQ: FramebufferRequest = FramebufferRequest::new(0); - let fb1: &NonNullPtr = &FB_REQ.get_response().get().unwrap().framebuffers()[0]; - unsafe { - fb1.address.as_ptr().expect("REASON").write_volatile(0x00); + let fb1 = &FB_REQ.get_response().get().unwrap().framebuffers()[0]; + + for i in 0..100_usize { + let offset = i * fb1.pitch as usize + i * 4; + unsafe { + *(fb1.address.as_ptr().unwrap().offset(offset as isize) as *mut u32) = 0xFFFFFFFF; + } } - loop {} + spin_loop(); +} + +pub fn spin_loop() -> ! { + loop { + unsafe { asm!("wfi") } + } +} + +pub fn hardware_random_u64() -> u64 { + 0 } pub fn log(_args: core::fmt::Arguments<'_>) -> core::fmt::Result { panic!() } - -pub fn spin_loop() -> ! { - loop {} -} -pub fn hardware_random_u64() -> u64 { - 0 -} - -pub const PAGE_SIZE: usize = 10; diff --git a/repbuild/Cargo.toml b/repbuild/Cargo.toml index b242b0b..592ec4b 100644 --- a/repbuild/Cargo.toml +++ b/repbuild/Cargo.toml @@ -4,14 +4,14 @@ version = "0.2.0" edition = "2021" [dependencies] -cpio_reader = "0.1" +cpio_reader = "0.1" # remove me derive_more = "0.99" env_logger = "0.10" error-stack = "0.2" fatfs = "0.3" log = "0.4" -rpm = "0.11" -zstd = "0.12" +rpm = "0.11" # remove me +zstd = "0.12" # remove me [dependencies.reqwest] version = "0.11" diff --git a/repbuild/limine.cfg b/repbuild/limine.cfg index 9af3aa5..bb56ffa 100644 --- a/repbuild/limine.cfg +++ b/repbuild/limine.cfg @@ -1,4 +1,4 @@ -${ABLEOS_KERNEL}=boot:///{$ARCH}/kernel +${ABLEOS_KERNEL}=boot:///kernel # TODO: Make a boot background image for ableOS DEFAULT_ENTRY=1 @@ -22,4 +22,4 @@ TERM_BACKDROP=008080 MODULE_CMDLINE="diskid=123456789" MODULE_PATH=boot:///ecall.hb - MODULE_CMDLINE="" \ No newline at end of file + MODULE_CMDLINE="" diff --git a/repbuild/src/main.rs b/repbuild/src/main.rs index 13fc84a..0fbe912 100644 --- a/repbuild/src/main.rs +++ b/repbuild/src/main.rs @@ -1,6 +1,6 @@ use { - derive_more::{Deref, DerefMut, Display}, - error_stack::{bail, ensure, report, Context, IntoReport, Result, ResultExt}, + derive_more::Display, + error_stack::{bail, report, Context, IntoReport, Result, ResultExt}, fatfs::{FileSystem, FormatVolumeOptions, FsOptions, ReadWriteSeek}, std::{ fmt::Display, @@ -31,12 +31,12 @@ fn main() -> Result<(), Error> { for arg in args { if arg == "-r" || arg == "--release" { release = true; - } - if arg == "rv64" || arg == "riscv64" || arg == "riscv64-virt" { + } else if arg == "rv64" || arg == "riscv64" || arg == "riscv64-virt" { target = Target::Riscv64Virt; - } - if arg == "aarch" || arg == "arm64" { + } else if arg == "aarch" || arg == "arm64" { target = Target::Aarch64; + } else { + return Err(report!(Error::InvalidSubCom)); } } @@ -48,12 +48,12 @@ fn main() -> Result<(), Error> { for arg in args { if arg == "-r" || arg == "--release" { release = true; - } - if arg == "rv64" || arg == "riscv64" || arg == "riscv64-virt" { + } else if arg == "rv64" || arg == "riscv64" || arg == "riscv64-virt" { target = Target::Riscv64Virt; - } - if arg == "arm64" || arg == "aarch64" { + } else if arg == "aarch" || arg == "arm64" { target = Target::Aarch64; + } else { + return Err(report!(Error::InvalidSubCom)); } } @@ -168,8 +168,8 @@ fn build(release: bool, target: Target) -> Result<(), Error> { _ => (), } - if target != Target::X86_64 { - return Ok(()); + if target != Target::Aarch64 { + todo!() } (|| -> std::io::Result<_> { @@ -216,8 +216,7 @@ fn run(release: bool, target: Target) -> Result<(), Error> { #[cfg(target_os = "linux")] { - - //com.args(["-enable-kvm", "-cpu", "host"]); + // com.args(["-enable-kvm", "-cpu", "host"]); } } @@ -237,19 +236,16 @@ fn run(release: bool, target: Target) -> Result<(), Error> { } if target == Target::Aarch64 { + #[rustfmt::skip] com.args([ - "-bios", - "AAVMF_CODE.fd", - "-M", - "virt", - "-device", - "ramfb", - "-m", // - "128M", - // - "-drive", - "file=target/disk.img,format=raw", - // "-serial", "stdio", + "-M", "virt", + "-cpu", "cortex-a72", + "-device", "ramfb", + "-device", "qemu-xhci", + "-device", "usb-kbd", + "-m", "2G", + "-bios", "target/AARCH64_OVMF.fd", + "-drive", "file=target/disk.img,format=raw", ]); } @@ -264,14 +260,15 @@ fn run(release: bool, target: Target) -> Result<(), Error> { } fn fetch_ovmf() -> Result<(), OvmfFetchError> { - const OVMF_RPM_URL: &str = "https://kojipkgs.fedoraproject.org/packages/edk2/20230524/3.fc38/noarch/edk2-ovmf-20230524-3.fc38.noarch.rpm"; + const OVMF_AARCH64_URL: &str = + "https://retrage.github.io/edk2-nightly/bin/RELEASEAARCH64_QEMU_EFI.fd"; - let mut file = match std::fs::metadata("target/OVMF_CODE.fd") { + let mut file = match std::fs::metadata("target/AARCH64_OVMF.fd") { Err(e) if e.kind() == std::io::ErrorKind::NotFound => std::fs::OpenOptions::new() .create(true) .write(true) .read(true) - .open("target/OVMF_CODE.fd") + .open("target/AARCH64_OVMF.fd") .into_report() .change_context(OvmfFetchError::Io)?, Ok(_) => return Ok(()), @@ -279,64 +276,22 @@ fn fetch_ovmf() -> Result<(), OvmfFetchError> { }; log::info!("No OVMF found, downloading…"); - let rpm = rpm::RPMPackage::parse( - &mut std::convert::identity::>((|| { - reqwest::blocking::get(OVMF_RPM_URL)?.bytes() - })()) + + let bytes = std::convert::identity((|| reqwest::blocking::get(OVMF_AARCH64_URL)?.bytes())()) .into_report() - .change_context(OvmfFetchError::Fetch)? - .as_ref(), - ) - .map_err(RpmError) - .into_report() - .change_context(OvmfFetchError::RpmParse)?; + .change_context(OvmfFetchError::Fetch)?; - ensure!( - rpm.metadata - .get_payload_compressor() - .map_err(RpmError) - .into_report() - .change_context(OvmfFetchError::RpmParse)? - == rpm::CompressionType::Zstd, - OvmfFetchError::UnsupportedCompression, - ); - - file.write_all( - cpio_reader::iter_files( - &zstd::decode_all(std::io::Cursor::new(rpm.content)) - .into_report() - .change_context(OvmfFetchError::Zstd)?, - ) - .find(|file| file.name() == "./usr/share/edk2/ovmf/OVMF_CODE.fd") - .ok_or_else(|| report!(OvmfFetchError::NoFileFound))? - .file(), - ) - .into_report() - .change_context(OvmfFetchError::Io)?; + file.write_all(&bytes) + .into_report() + .change_context(OvmfFetchError::Io)?; Ok(()) } -#[derive(Debug, Display, Deref, DerefMut)] -struct RpmError(rpm::RPMError); -impl Context for RpmError {} - -// Ehhh?? I am pretty sure they just forgot :ferrisClueless: -unsafe impl Sync for RpmError {} -unsafe impl Send for RpmError {} - #[derive(Debug, Display)] enum OvmfFetchError { #[display(fmt = "Failed to fetch OVMF package")] Fetch, - #[display(fmt = "RPM parse error")] - RpmParse, - #[display(fmt = "Unsupported compression (ZSTD is the only supported one)")] - UnsupportedCompression, - #[display(fmt = "Decompression error")] - Zstd, - #[display(fmt = "Requested file not found in package")] - NoFileFound, #[display(fmt = "IO Error")] Io, }