From 82f5cdbe21a993dc5b3f73ad3f268d9dae41dfb7 Mon Sep 17 00:00:00 2001 From: koniifer Date: Sat, 12 Oct 2024 15:02:55 +0100 Subject: [PATCH] add --noaccel flag to disable vm acceleration, update repbuild help --- repbuild/src/main.rs | 71 +++++++++++++++++++++----------------- sysdata/system_config.toml | 12 +++---- 2 files changed, 45 insertions(+), 38 deletions(-) diff --git a/repbuild/src/main.rs b/repbuild/src/main.rs index 79891a0..4420c29 100644 --- a/repbuild/src/main.rs +++ b/repbuild/src/main.rs @@ -7,7 +7,6 @@ use { dev::Package, error_stack::{bail, report, Context, Report, Result, ResultExt}, fatfs::{FileSystem, FormatVolumeOptions, FsOptions, ReadWriteSeek}, - raw_cpuid::HypervisorInfo, std::{ // fmt::Display, fs::{self, File}, @@ -50,6 +49,7 @@ fn main() -> Result<(), Error> { let mut release = false; let mut debuginfo = false; let mut target = Target::X86_64; + let mut do_accel = true; for arg in args { if arg == "-r" || arg == "--release" { release = true; @@ -59,13 +59,15 @@ fn main() -> Result<(), Error> { target = Target::Riscv64Virt; } else if arg == "arm64" || arg == "aarch64" || arg == "aarch64-virt" { target = Target::Aarch64; + } else if arg == "--noaccel" { + do_accel = false; } else { return Err(report!(Error::InvalidSubCom)); } } build(release, target, debuginfo)?; - run(release, target) + run(release, target, do_accel) } Some("help" | "h") => { println!(concat!( @@ -75,8 +77,10 @@ fn main() -> Result<(), Error> { " help (h): Print this message\n", " run (r): Build and run AbleOS in QEMU\n\n", "Options for build and run:\n", - " -r: build in release mode", - " [target]: sets target" + " -r / --release: build in release mode\n", + " -d / --debuginfo: build with debug info\n", + " --noaccel: run without acceleration (e.g, no kvm)\n", + "[ rv64 / riscv64 / riscv64-virt / aarch64 / arm64 / aarch64-virt ]: sets target" ),); Ok(()) } @@ -335,7 +339,7 @@ fn build(release: bool, target: Target, debuginfo: bool) -> Result<(), Error> { .change_context(Error::Io) } -fn run(release: bool, target: Target) -> Result<(), Error> { +fn run(release: bool, target: Target, do_accel: bool) -> Result<(), Error> { let target_str = match target { Target::X86_64 => "qemu-system-x86_64", Target::Riscv64Virt => "qemu-system-riscv64", @@ -343,35 +347,38 @@ fn run(release: bool, target: Target) -> Result<(), Error> { }; let (mut com, mut com2) = (Command::new(target_str), Command::new(target_str)); let ovmf_path = fetch_ovmf(target); + let accel = if do_accel { + let supported = String::from_utf8( + com2.args(["--accel", "help"]) + .stdout(Stdio::piped()) + .stderr(Stdio::piped()) + .spawn() + .unwrap() + .wait_with_output() + .unwrap() + .stdout, + ) + .unwrap(); - let supported = String::from_utf8( - com2.args(["--accel", "help"]) - .stdout(Stdio::piped()) - .stderr(Stdio::piped()) - .spawn() - .unwrap() - .wait_with_output() - .unwrap() - .stdout, - ) - .unwrap(); + let cpuid = raw_cpuid::CpuId::new(); + let vmx = cpuid.get_feature_info().unwrap().has_vmx(); + let svm = cpuid.get_svm_info().is_some(); - let cpuid = raw_cpuid::CpuId::new(); - let vmx = cpuid.get_feature_info().unwrap().has_vmx(); - let svm = cpuid.get_svm_info().is_some(); - - let accel = if supported.contains("kvm") && (vmx | svm) { - "accel=kvm" - } else if cpuid - .get_processor_brand_string() - .filter(|a| a.as_str() == "GenuineIntel") - .is_some() - && supported.contains("hax") - && vmx - { - "accel=hax" - } else if supported.contains("whpx") { - "accel=whpx" + if supported.contains("kvm") && (vmx || svm) { + "accel=kvm" + } else if cpuid + .get_processor_brand_string() + .filter(|a| a.as_str() == "GenuineIntel") + .is_some() + && supported.contains("hax") + && vmx + { + "accel=hax" + } else if supported.contains("whpx") { + "accel=whpx" + } else { + "accel=tcg" + } } else { "accel=tcg" }; diff --git a/sysdata/system_config.toml b/sysdata/system_config.toml index 27e44b8..76c2ccc 100644 --- a/sysdata/system_config.toml +++ b/sysdata/system_config.toml @@ -26,8 +26,8 @@ resolution = "1024x768x24" # [boot.limine.ableos.modules.diskio_driver] # path = "boot:///diskio_driver.hbf" -[boot.limine.ableos.modules.render_example] -path = "boot:///render_example.hbf" +# [boot.limine.ableos.modules.render_example] +# path = "boot:///render_example.hbf" # [boot.limine.ableos.modules.serial_driver_test] # path = "boot:///serial_driver_test.hbf" @@ -44,8 +44,8 @@ path = "boot:///render_example.hbf" # [boot.limine.ableos.modules.svga_driver] # path = "boot:///svga_driver.hbf" -# [boot.limine.ableos.modules.ps2_driver] -# path = "boot:///ps2_driver.hbf" +[boot.limine.ableos.modules.ps2_driver] +path = "boot:///ps2_driver.hbf" # [boot.limine.ableos.modules.filesystem_fat32] # path = "boot:///filesystem_fat32.hbf" @@ -53,5 +53,5 @@ path = "boot:///render_example.hbf" # [boot.limine.ableos.modules.pumpkin_print] # path = "boot:///pumpkin_print.hbf" -# [boot.limine.ableos.modules.tetris] -# path = "boot:///tetris.hbf" +[boot.limine.ableos.modules.tetris] +path = "boot:///tetris.hbf"