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 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)?;

View File

@ -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
})
}