From 0cf622d38806c9465aed729c36554b9e7475fd22 Mon Sep 17 00:00:00 2001 From: Masato Imai Date: Mon, 4 Aug 2025 08:15:38 +0000 Subject: [PATCH] error --- nel_os_kernel/src/main.rs | 2 +- nel_os_kernel/src/vmm/mod.rs | 11 ++++++---- nel_os_kernel/src/vmm/x86_64/amd/mod.rs | 19 +++++++++-------- nel_os_kernel/src/vmm/x86_64/intel/mod.rs | 23 ++++++++++++--------- nel_os_kernel/src/vmm/x86_64/intel/vmxon.rs | 16 ++++++++++++++ 5 files changed, 47 insertions(+), 24 deletions(-) create mode 100644 nel_os_kernel/src/vmm/x86_64/intel/vmxon.rs diff --git a/nel_os_kernel/src/main.rs b/nel_os_kernel/src/main.rs index 8c60712..968295a 100644 --- a/nel_os_kernel/src/main.rs +++ b/nel_os_kernel/src/main.rs @@ -157,7 +157,7 @@ pub extern "sysv64" fn main(boot_info: &nel_os_common::BootInfo) { info!("Interrupts enabled"); - let mut vcpu = vmm::get_vcpu(); + let mut vcpu = vmm::get_vcpu().unwrap(); vcpu.run(); hlt_loop(); diff --git a/nel_os_kernel/src/vmm/mod.rs b/nel_os_kernel/src/vmm/mod.rs index 16cbcd2..964fb44 100644 --- a/nel_os_kernel/src/vmm/mod.rs +++ b/nel_os_kernel/src/vmm/mod.rs @@ -8,18 +8,21 @@ use crate::{ pub mod x86_64; pub trait VCpu { + fn new() -> Result + where + Self: Sized; fn is_supported() -> bool where Self: Sized; fn run(&mut self); } -pub fn get_vcpu() -> Box { +pub fn get_vcpu() -> Result, &'static str> { if platform::is_amd() && AMDVCpu::is_supported() { - Box::new(AMDVCpu::new()) + Ok(Box::new(AMDVCpu::new()?)) } else if platform::is_intel() && IntelVCpu::is_supported() { - Box::new(IntelVCpu::new()) + Ok(Box::new(IntelVCpu::new()?)) } else { - panic!("Unsupported CPU architecture"); + Err("Unsupported CPU architecture") } } diff --git a/nel_os_kernel/src/vmm/x86_64/amd/mod.rs b/nel_os_kernel/src/vmm/x86_64/amd/mod.rs index 49c5ffb..ef9d03a 100644 --- a/nel_os_kernel/src/vmm/x86_64/amd/mod.rs +++ b/nel_os_kernel/src/vmm/x86_64/amd/mod.rs @@ -7,19 +7,20 @@ use crate::{ pub struct AMDVCpu; -impl AMDVCpu { - pub fn new() -> Self { +impl VCpu for AMDVCpu { + fn run(&mut self) { + info!("VCpu on AMD"); + } + + fn new() -> Result + where + Self: Sized, + { let mut efer = common::read_msr(0xc000_0080); efer |= 1 << 12; common::write_msr(0xc000_0080, efer); - AMDVCpu - } -} - -impl VCpu for AMDVCpu { - fn run(&mut self) { - info!("VCpu on AMD"); + Ok(AMDVCpu) } fn is_supported() -> bool diff --git a/nel_os_kernel/src/vmm/x86_64/intel/mod.rs b/nel_os_kernel/src/vmm/x86_64/intel/mod.rs index bac57b5..aae0493 100644 --- a/nel_os_kernel/src/vmm/x86_64/intel/mod.rs +++ b/nel_os_kernel/src/vmm/x86_64/intel/mod.rs @@ -1,3 +1,5 @@ +mod vmxon; + use raw_cpuid::cpuid; use crate::{ @@ -7,8 +9,15 @@ use crate::{ pub struct IntelVCpu; -impl IntelVCpu { - pub fn new() -> Self { +impl VCpu for IntelVCpu { + fn run(&mut self) { + info!("VCpu on Intel"); + } + + fn new() -> Result + where + Self: Sized, + { let mut msr = common::read_msr(0x3a); if msr & (1 << 2) == 0 { msr |= 1 << 2; @@ -18,16 +27,10 @@ impl IntelVCpu { let msr = common::read_msr(0x3a); if msr & (1 << 2) == 0 { - panic!("VMX is not enabled in the BIOS"); + return Err("VMX is not enabled in the BIOS"); } - IntelVCpu - } -} - -impl VCpu for IntelVCpu { - fn run(&mut self) { - info!("VCpu on Intel"); + Ok(IntelVCpu) } fn is_supported() -> bool diff --git a/nel_os_kernel/src/vmm/x86_64/intel/vmxon.rs b/nel_os_kernel/src/vmm/x86_64/intel/vmxon.rs new file mode 100644 index 0000000..0feaee9 --- /dev/null +++ b/nel_os_kernel/src/vmm/x86_64/intel/vmxon.rs @@ -0,0 +1,16 @@ +use x86_64::structures::paging::{FrameAllocator, PhysFrame, Size4KiB}; + +#[repr(C, align(4096))] +pub struct Vmxon { + frame: PhysFrame, +} + +impl Vmxon { + pub fn new(frame_allocator: &mut impl FrameAllocator) -> Result { + let frame = frame_allocator + .allocate_frame() + .ok_or("Failed to allocate frame for VMXON")?; + + Ok(Vmxon { frame }) + } +}