From ab26b4bf45e685ff7931f018d1629c6ed850c5b7 Mon Sep 17 00:00:00 2001 From: Masato Imai Date: Sun, 10 Aug 2025 13:39:01 +0000 Subject: [PATCH] cpuid exit --- nel_os_kernel/src/vmm/x86_64/common/linux.rs | 12 +++++++- nel_os_kernel/src/vmm/x86_64/intel/vcpu.rs | 30 +++++++++----------- 2 files changed, 25 insertions(+), 17 deletions(-) diff --git a/nel_os_kernel/src/vmm/x86_64/common/linux.rs b/nel_os_kernel/src/vmm/x86_64/common/linux.rs index 097a25a..28cc70d 100644 --- a/nel_os_kernel/src/vmm/x86_64/common/linux.rs +++ b/nel_os_kernel/src/vmm/x86_64/common/linux.rs @@ -1,14 +1,16 @@ use core::ptr::read_unaligned; -use crate::{vmm::VCpu, BZIMAGE_ADDR, BZIMAGE_SIZE}; +use crate::{info, vmm::VCpu, BZIMAGE_ADDR, BZIMAGE_SIZE}; pub fn load_kernel(vcpu: &mut dyn VCpu) -> Result<(), &'static str> { + info!("Loading kernel into guest memory"); let kernel_addr = BZIMAGE_ADDR.get().unwrap(); let kernel_size = BZIMAGE_SIZE.get().unwrap(); let kernel = unsafe { core::slice::from_raw_parts(*kernel_addr as *const u8, *kernel_size as usize) }; + info!("Creating boot parameters"); let guest_mem_size = vcpu.get_guest_memory_size(); let mut bp = BootParams::from_bytes(kernel)?; bp.e820_entries = 0; @@ -29,6 +31,7 @@ pub fn load_kernel(vcpu: &mut dyn VCpu) -> Result<(), &'static str> { E820Type::Ram, ); + info!("Creating command line"); let cmdline_max_size = if bp.hdr.cmdline_size < 256 { bp.hdr.cmdline_size } else { @@ -44,6 +47,7 @@ pub fn load_kernel(vcpu: &mut dyn VCpu) -> Result<(), &'static str> { vcpu.write_memory(cmdline_start + i as u64, byte)?; } + info!("Loading boot parameters into guest memory"); let bp_bytes = unsafe { core::slice::from_raw_parts( &bp as *const BootParams as *const u8, @@ -52,6 +56,7 @@ pub fn load_kernel(vcpu: &mut dyn VCpu) -> Result<(), &'static str> { }; load_image(vcpu, bp_bytes, LAYOUT_BOOTPARAM as usize)?; + info!("Loading kernel image into guest memory"); let code_offset = bp.hdr.get_protected_code_offset(); let code_size = kernel.len() - code_offset; load_image( @@ -64,6 +69,11 @@ pub fn load_kernel(vcpu: &mut dyn VCpu) -> Result<(), &'static str> { } fn load_image(vcpu: &mut dyn VCpu, image: &[u8], addr: usize) -> Result<(), &'static str> { + info!( + "Loading image at address {:#x}, size: {} bytes", + addr, + image.len() + ); for (i, &byte) in image.iter().enumerate() { let gpa = addr + i; vcpu.write_memory(gpa as u64, byte)?; diff --git a/nel_os_kernel/src/vmm/x86_64/intel/vcpu.rs b/nel_os_kernel/src/vmm/x86_64/intel/vcpu.rs index bbbf31b..6ac90b8 100644 --- a/nel_os_kernel/src/vmm/x86_64/intel/vcpu.rs +++ b/nel_os_kernel/src/vmm/x86_64/intel/vcpu.rs @@ -223,12 +223,12 @@ impl IntelVCpu { vmwrite(vmcs::guest::IDTR_BASE, 0)?; vmwrite(vmcs::guest::LDTR_BASE, 0xDEAD00)?; - vmwrite(vmcs::guest::CS_LIMIT, 0xffff)?; - vmwrite(vmcs::guest::SS_LIMIT, 0xffff)?; - vmwrite(vmcs::guest::DS_LIMIT, 0xffff)?; - vmwrite(vmcs::guest::ES_LIMIT, 0xffff)?; - vmwrite(vmcs::guest::FS_LIMIT, 0xffff)?; - vmwrite(vmcs::guest::GS_LIMIT, 0xffff)?; + vmwrite(vmcs::guest::CS_LIMIT, u32::MAX as u64)?; + vmwrite(vmcs::guest::SS_LIMIT, u32::MAX as u64)?; + vmwrite(vmcs::guest::DS_LIMIT, u32::MAX as u64)?; + vmwrite(vmcs::guest::ES_LIMIT, u32::MAX as u64)?; + vmwrite(vmcs::guest::FS_LIMIT, u32::MAX as u64)?; + vmwrite(vmcs::guest::GS_LIMIT, u32::MAX as u64)?; vmwrite(vmcs::guest::TR_LIMIT, 0)?; vmwrite(vmcs::guest::GDTR_LIMIT, 0)?; vmwrite(vmcs::guest::IDTR_LIMIT, 0)?; @@ -241,8 +241,8 @@ impl IntelVCpu { .with_desc_type(DescriptorType::Code) .with_dpl(0) .with_granularity(Granularity::KByte) - .with_long(true) - .with_db(false); + .with_long(false) + .with_db(true); let ds_right = SegmentRights::default() .with_rw(true) @@ -287,10 +287,7 @@ impl IntelVCpu { u32::from(ldtr_right) as u64, )?; - vmwrite( - vmcs::guest::CS_SELECTOR, - x86::segmentation::cs().bits() as u64, - )?; + vmwrite(vmcs::guest::CS_SELECTOR, 0)?; vmwrite(vmcs::guest::SS_SELECTOR, 0)?; vmwrite(vmcs::guest::DS_SELECTOR, 0)?; vmwrite(vmcs::guest::ES_SELECTOR, 0)?; @@ -301,12 +298,13 @@ impl IntelVCpu { vmwrite(vmcs::guest::FS_BASE, 0)?; vmwrite(vmcs::guest::GS_BASE, 0)?; - vmwrite(vmcs::guest::IA32_EFER_FULL, read_msr(x86::msr::IA32_EFER))?; + vmwrite(vmcs::guest::IA32_EFER_FULL, 0)?; + vmwrite(vmcs::guest::IA32_EFER_HIGH, 0)?; vmwrite(vmcs::guest::RFLAGS, 0x2)?; vmwrite(vmcs::guest::LINK_PTR_FULL, u64::MAX)?; - vmwrite(vmcs::guest::RIP, common::linux::LAYOUT_KERNEL_BASE as u64)?; - self.guest_registers.rsi = common::linux::LAYOUT_BOOTPARAM as u64; + vmwrite(vmcs::guest::RIP, common::linux::LAYOUT_KERNEL_BASE)?; + self.guest_registers.rsi = common::linux::LAYOUT_BOOTPARAM; //vmwrite(vmcs::control::CR0_READ_SHADOW, vmread(vmcs::guest::CR0)?)?; //vmwrite(vmcs::control::CR4_READ_SHADOW, vmread(vmcs::guest::CR4)?)?; @@ -608,7 +606,7 @@ impl VCpu for IntelVCpu { vmcs, ept, eptp, - guest_memory_size: 1024 * 1024 * 1024, // 1 GiB + guest_memory_size: 1024 * 1024 * 256, // 256 MiB }) }