cpuid exit
This commit is contained in:
@ -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)?;
|
||||||
|
@ -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
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user