cpuid exit

This commit is contained in:
Masato Imai
2025-08-10 13:39:01 +00:00
parent 46e5da346d
commit ab26b4bf45
2 changed files with 25 additions and 17 deletions

View File

@ -1,14 +1,16 @@
use core::ptr::read_unaligned; 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> { 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_addr = BZIMAGE_ADDR.get().unwrap();
let kernel_size = BZIMAGE_SIZE.get().unwrap(); let kernel_size = BZIMAGE_SIZE.get().unwrap();
let kernel = let kernel =
unsafe { core::slice::from_raw_parts(*kernel_addr as *const u8, *kernel_size as usize) }; 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 guest_mem_size = vcpu.get_guest_memory_size();
let mut bp = BootParams::from_bytes(kernel)?; let mut bp = BootParams::from_bytes(kernel)?;
bp.e820_entries = 0; bp.e820_entries = 0;
@ -29,6 +31,7 @@ pub fn load_kernel(vcpu: &mut dyn VCpu) -> Result<(), &'static str> {
E820Type::Ram, E820Type::Ram,
); );
info!("Creating command line");
let cmdline_max_size = if bp.hdr.cmdline_size < 256 { let cmdline_max_size = if bp.hdr.cmdline_size < 256 {
bp.hdr.cmdline_size bp.hdr.cmdline_size
} else { } 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)?; vcpu.write_memory(cmdline_start + i as u64, byte)?;
} }
info!("Loading boot parameters into guest memory");
let bp_bytes = unsafe { let bp_bytes = unsafe {
core::slice::from_raw_parts( core::slice::from_raw_parts(
&bp as *const BootParams as *const u8, &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)?; 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_offset = bp.hdr.get_protected_code_offset();
let code_size = kernel.len() - code_offset; let code_size = kernel.len() - code_offset;
load_image( 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> { 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() { for (i, &byte) in image.iter().enumerate() {
let gpa = addr + i; let gpa = addr + i;
vcpu.write_memory(gpa as u64, byte)?; vcpu.write_memory(gpa as u64, byte)?;

View File

@ -223,12 +223,12 @@ impl IntelVCpu {
vmwrite(vmcs::guest::IDTR_BASE, 0)?; vmwrite(vmcs::guest::IDTR_BASE, 0)?;
vmwrite(vmcs::guest::LDTR_BASE, 0xDEAD00)?; vmwrite(vmcs::guest::LDTR_BASE, 0xDEAD00)?;
vmwrite(vmcs::guest::CS_LIMIT, 0xffff)?; vmwrite(vmcs::guest::CS_LIMIT, u32::MAX as u64)?;
vmwrite(vmcs::guest::SS_LIMIT, 0xffff)?; vmwrite(vmcs::guest::SS_LIMIT, u32::MAX as u64)?;
vmwrite(vmcs::guest::DS_LIMIT, 0xffff)?; vmwrite(vmcs::guest::DS_LIMIT, u32::MAX as u64)?;
vmwrite(vmcs::guest::ES_LIMIT, 0xffff)?; vmwrite(vmcs::guest::ES_LIMIT, u32::MAX as u64)?;
vmwrite(vmcs::guest::FS_LIMIT, 0xffff)?; vmwrite(vmcs::guest::FS_LIMIT, u32::MAX as u64)?;
vmwrite(vmcs::guest::GS_LIMIT, 0xffff)?; vmwrite(vmcs::guest::GS_LIMIT, u32::MAX as u64)?;
vmwrite(vmcs::guest::TR_LIMIT, 0)?; vmwrite(vmcs::guest::TR_LIMIT, 0)?;
vmwrite(vmcs::guest::GDTR_LIMIT, 0)?; vmwrite(vmcs::guest::GDTR_LIMIT, 0)?;
vmwrite(vmcs::guest::IDTR_LIMIT, 0)?; vmwrite(vmcs::guest::IDTR_LIMIT, 0)?;
@ -241,8 +241,8 @@ impl IntelVCpu {
.with_desc_type(DescriptorType::Code) .with_desc_type(DescriptorType::Code)
.with_dpl(0) .with_dpl(0)
.with_granularity(Granularity::KByte) .with_granularity(Granularity::KByte)
.with_long(true) .with_long(false)
.with_db(false); .with_db(true);
let ds_right = SegmentRights::default() let ds_right = SegmentRights::default()
.with_rw(true) .with_rw(true)
@ -287,10 +287,7 @@ impl IntelVCpu {
u32::from(ldtr_right) as u64, u32::from(ldtr_right) as u64,
)?; )?;
vmwrite( vmwrite(vmcs::guest::CS_SELECTOR, 0)?;
vmcs::guest::CS_SELECTOR,
x86::segmentation::cs().bits() as u64,
)?;
vmwrite(vmcs::guest::SS_SELECTOR, 0)?; vmwrite(vmcs::guest::SS_SELECTOR, 0)?;
vmwrite(vmcs::guest::DS_SELECTOR, 0)?; vmwrite(vmcs::guest::DS_SELECTOR, 0)?;
vmwrite(vmcs::guest::ES_SELECTOR, 0)?; vmwrite(vmcs::guest::ES_SELECTOR, 0)?;
@ -301,12 +298,13 @@ impl IntelVCpu {
vmwrite(vmcs::guest::FS_BASE, 0)?; vmwrite(vmcs::guest::FS_BASE, 0)?;
vmwrite(vmcs::guest::GS_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::RFLAGS, 0x2)?;
vmwrite(vmcs::guest::LINK_PTR_FULL, u64::MAX)?; vmwrite(vmcs::guest::LINK_PTR_FULL, u64::MAX)?;
vmwrite(vmcs::guest::RIP, common::linux::LAYOUT_KERNEL_BASE as u64)?; vmwrite(vmcs::guest::RIP, common::linux::LAYOUT_KERNEL_BASE)?;
self.guest_registers.rsi = common::linux::LAYOUT_BOOTPARAM as u64; self.guest_registers.rsi = common::linux::LAYOUT_BOOTPARAM;
//vmwrite(vmcs::control::CR0_READ_SHADOW, vmread(vmcs::guest::CR0)?)?; //vmwrite(vmcs::control::CR0_READ_SHADOW, vmread(vmcs::guest::CR0)?)?;
//vmwrite(vmcs::control::CR4_READ_SHADOW, vmread(vmcs::guest::CR4)?)?; //vmwrite(vmcs::control::CR4_READ_SHADOW, vmread(vmcs::guest::CR4)?)?;
@ -608,7 +606,7 @@ impl VCpu for IntelVCpu {
vmcs, vmcs,
ept, ept,
eptp, eptp,
guest_memory_size: 1024 * 1024 * 1024, // 1 GiB guest_memory_size: 1024 * 1024 * 256, // 256 MiB
}) })
} }