mirror of
https://github.com/mii443/nel_os.git
synced 2025-08-22 16:15:38 +00:00
CPUID VMExit
This commit is contained in:
@ -1,7 +1,5 @@
|
|||||||
use core::ptr::read_unaligned;
|
use core::ptr::read_unaligned;
|
||||||
|
|
||||||
use crate::info;
|
|
||||||
|
|
||||||
pub const BZIMAGE: &'static [u8] = include_bytes!("../../bzImage");
|
pub const BZIMAGE: &'static [u8] = include_bytes!("../../bzImage");
|
||||||
|
|
||||||
pub const LAYOUT_BOOTPARAM: u64 = 0x0001_0000;
|
pub const LAYOUT_BOOTPARAM: u64 = 0x0001_0000;
|
||||||
@ -80,7 +78,6 @@ impl BootParams {
|
|||||||
|
|
||||||
pub fn from_bytes(bytes: &[u8]) -> Result<Self, &'static str> {
|
pub fn from_bytes(bytes: &[u8]) -> Result<Self, &'static str> {
|
||||||
let hdr = SetupHeader::from_bytes(bytes)?;
|
let hdr = SetupHeader::from_bytes(bytes)?;
|
||||||
info!("hdr: {:?}", hdr);
|
|
||||||
let mut bp = BootParams::new();
|
let mut bp = BootParams::new();
|
||||||
bp.hdr = hdr;
|
bp.hdr = hdr;
|
||||||
Ok(bp)
|
Ok(bp)
|
||||||
|
@ -8,11 +8,9 @@ use x86::{
|
|||||||
};
|
};
|
||||||
use x86_64::VirtAddr;
|
use x86_64::VirtAddr;
|
||||||
|
|
||||||
use core::sync::atomic::Ordering;
|
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
info,
|
info,
|
||||||
memory::{self, BootInfoFrameAllocator},
|
memory::BootInfoFrameAllocator,
|
||||||
vmm::vmcs::{
|
vmm::vmcs::{
|
||||||
DescriptorType, EntryControls, Granularity, PrimaryExitControls,
|
DescriptorType, EntryControls, Granularity, PrimaryExitControls,
|
||||||
PrimaryProcessorBasedVmExecutionControls, SecondaryProcessorBasedVmExecutionControls,
|
PrimaryProcessorBasedVmExecutionControls, SecondaryProcessorBasedVmExecutionControls,
|
||||||
@ -118,7 +116,6 @@ impl VCpu {
|
|||||||
core::mem::size_of::<BootParams>(),
|
core::mem::size_of::<BootParams>(),
|
||||||
)
|
)
|
||||||
};
|
};
|
||||||
info!("BootParams: {:?}", bp);
|
|
||||||
self.load_image(bp_bytes, linux::LAYOUT_BOOTPARAM as usize);
|
self.load_image(bp_bytes, linux::LAYOUT_BOOTPARAM as usize);
|
||||||
|
|
||||||
let code_offset = bp.hdr.get_protected_code_offset();
|
let code_offset = bp.hdr.get_protected_code_offset();
|
||||||
@ -142,7 +139,6 @@ impl VCpu {
|
|||||||
for x in 1..=1024 {
|
for x in 1..=1024 {
|
||||||
let mut gpa = 0;
|
let mut gpa = 0;
|
||||||
let start = 100 * 1024 * (x - 1);
|
let start = 100 * 1024 * (x - 1);
|
||||||
let end = 100 * 1024 * x;
|
|
||||||
|
|
||||||
let mut random_data = [0u8; 100 * 1024];
|
let mut random_data = [0u8; 100 * 1024];
|
||||||
let mut rng = rand::rngs::SmallRng::from_seed([0u8; 16]);
|
let mut rng = rand::rngs::SmallRng::from_seed([0u8; 16]);
|
||||||
@ -159,10 +155,6 @@ impl VCpu {
|
|||||||
}
|
}
|
||||||
gpa += 1;
|
gpa += 1;
|
||||||
}
|
}
|
||||||
info!(
|
|
||||||
"Guest memory test passed for range {:#x} - {:#x}",
|
|
||||||
start, end
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
let start = 100 * 1024 * 0;
|
let start = 100 * 1024 * 0;
|
||||||
@ -190,16 +182,6 @@ impl VCpu {
|
|||||||
self.test_guest_memory();
|
self.test_guest_memory();
|
||||||
|
|
||||||
self.load_kernel(linux::BZIMAGE);
|
self.load_kernel(linux::BZIMAGE);
|
||||||
unsafe {
|
|
||||||
let phys_mem_offset = memory::PHYSICAL_MEMORY_OFFSET.load(Ordering::Relaxed);
|
|
||||||
let hpa = self
|
|
||||||
.ept
|
|
||||||
.get_phys_addr(linux::LAYOUT_BOOTPARAM as u64)
|
|
||||||
.unwrap()
|
|
||||||
+ phys_mem_offset;
|
|
||||||
let bp = &*(hpa as *const BootParams);
|
|
||||||
info!("{:?}", *bp);
|
|
||||||
}
|
|
||||||
|
|
||||||
let eptp = EPTP::new(&self.ept.root_table);
|
let eptp = EPTP::new(&self.ept.root_table);
|
||||||
unsafe { vmwrite(vmcs::control::EPTP_FULL, eptp.0).unwrap() };
|
unsafe { vmwrite(vmcs::control::EPTP_FULL, eptp.0).unwrap() };
|
||||||
@ -380,12 +362,12 @@ impl VCpu {
|
|||||||
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)?;
|
||||||
|
Reference in New Issue
Block a user