Skip to content

Commit 16164ee

Browse files
committed
[feat] add exit_qualification api
1 parent 082d2e6 commit 16164ee

File tree

3 files changed

+22
-26
lines changed

3 files changed

+22
-26
lines changed

src/page_table.rs

+3
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@ impl<PTE: GenericPTE, H: PagingHandler, EPT: EPTTranslator> GuestPageTable64<PTE
119119
) -> PagingResult<(GuestPhysAddr, MappingFlags, PageSize)> {
120120
let (entry, size) = self.get_entry(vaddr)?;
121121
if entry.is_unused() {
122+
error!("GuestPT64 query {:?} Entry is unused", vaddr);
122123
return Err(PagingError::NotMapped);
123124
}
124125
let off = size.align_offset(vaddr.into());
@@ -142,8 +143,10 @@ impl<PTE: GenericPTE, H: PagingHandler, EPT: EPTTranslator> GuestPageTable64<PTE
142143

143144
fn next_table<'a>(&self, entry: &PTE) -> PagingResult<&'a [PTE]> {
144145
if !entry.is_present() {
146+
error!("GuestPT64 next_table {:?} Entry is not present", entry);
145147
Err(PagingError::NotMapped)
146148
} else if entry.is_huge() {
149+
error!("GuestPT64 next_table {:?} Entry is huge", entry);
147150
Err(PagingError::MappedToHugePage)
148151
} else {
149152
self.table_of(entry.paddr().into())

src/vmx/vcpu.rs

+15-26
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,14 @@ use alloc::collections::VecDeque;
22
use alloc::vec::Vec;
33
use core::fmt::{Debug, Formatter, Result};
44
use core::{arch::naked_asm, mem::size_of};
5-
use x86_64::VirtAddr;
65

76
use bit_field::BitField;
87
use raw_cpuid::CpuId;
98
use x86::bits64::vmx;
109
use x86::controlregs::Xcr0;
1110
use x86::dtables::{self, DescriptorTablePointer};
1211
use x86::segmentation::SegmentSelector;
12+
use x86_64::VirtAddr;
1313
use x86_64::registers::control::{Cr0, Cr0Flags, Cr3, Cr4, Cr4Flags, EferFlags};
1414

1515
use page_table_entry::x86_64::X64PTE;
@@ -27,7 +27,8 @@ use super::read_vmcs_revision_id;
2727
use super::structs::{EptpList, IOBitmap, MsrBitmap, VmxRegion};
2828
use super::vmcs::{
2929
self, VmcsControl32, VmcsControl64, VmcsControlNW, VmcsGuest16, VmcsGuest32, VmcsGuest64,
30-
VmcsGuestNW, VmcsHost16, VmcsHost32, VmcsHost64, VmcsHostNW, interrupt_exit_info,
30+
VmcsGuestNW, VmcsHost16, VmcsHost32, VmcsHost64, VmcsHostNW, exit_qualification,
31+
interrupt_exit_info,
3132
};
3233
use crate::LinuxContext;
3334
use crate::page_table::GuestPageTable64;
@@ -363,7 +364,7 @@ impl<H: AxVCpuHal> VmxVcpu<H> {
363364

364365
pub fn decode_instruction(&self, rip: GuestVirtAddr, instr_len: usize) -> AxResult {
365366
use alloc::string::String;
366-
use iced_x86::{Decoder, DecoderOptions, Formatter, IntelFormatter, MasmFormatter};
367+
use iced_x86::{Decoder, DecoderOptions, Formatter, IntelFormatter};
367368

368369
let bytes = self.read_guest_memory(rip, instr_len)?;
369370
let mut decoder = Decoder::with_ip(
@@ -373,21 +374,11 @@ impl<H: AxVCpuHal> VmxVcpu<H> {
373374
DecoderOptions::NONE,
374375
);
375376
let instr = decoder.decode();
376-
377-
debug!("Decoded instruction: {:#x?}", instr);
378-
379377
let mut output = String::new();
380378
let mut formattor = IntelFormatter::new();
381379
formattor.format(&instr, &mut output);
382380

383-
debug!("Decoded instruction Intel formatter: {}", output);
384-
385-
let mut output = String::new();
386-
let mut formattor = MasmFormatter::new();
387-
formattor.format(&instr, &mut output);
388-
389-
debug!("Decoded instruction MasmFormatter: {}", output);
390-
381+
debug!("Decoded instruction @Intel formatter: {}", output);
391382
Ok(())
392383
}
393384
}
@@ -546,11 +537,6 @@ impl<H: AxVCpuHal> VmxVcpu<H> {
546537
}};
547538
}
548539

549-
debug!(
550-
"setup_vmcs_guest_from_ctx: CS access rights: {:?}",
551-
linux.cs.access_rights
552-
);
553-
554540
set_guest_segment!(linux.es, ES);
555541
set_guest_segment!(linux.cs, CS);
556542
set_guest_segment!(linux.ss, SS);
@@ -1356,7 +1342,7 @@ impl<H: AxVCpuHal> AxArchVCpu for VmxVcpu<H> {
13561342
}
13571343

13581344
fn load_context(&self, config: &mut Self::HostContext) -> AxResult {
1359-
info!("Loading context {:#x?}", self);
1345+
// info!("Loading context {:#x?}", self);
13601346

13611347
self.load_vmcs_guest(config)?;
13621348
Ok(())
@@ -1393,7 +1379,10 @@ impl<H: AxVCpuHal> AxArchVCpu for VmxVcpu<H> {
13931379
}
13941380
};
13951381

1382+
let exit_qualification = exit_qualification()?;
1383+
13961384
warn!("VMX entry failure: {:#x?}", exit_info);
1385+
warn!("Exit qualification: {:#x?}", exit_qualification);
13971386
warn!("VCpu {:#x?}", self);
13981387

13991388
AxVCpuExitReason::FailEntry {
@@ -1461,13 +1450,8 @@ impl<H: AxVCpuHal> AxArchVCpu for VmxVcpu<H> {
14611450
}
14621451
}
14631452
}
1464-
VmxExitReason::EPT_VIOLATION | VmxExitReason::TRIPLE_FAULT => {
1453+
VmxExitReason::EPT_VIOLATION => {
14651454
let ept_info = self.nested_page_fault_info()?;
1466-
1467-
warn!("VMX EPT-Exit: {:#x?} of {:#x?}", ept_info, exit_info);
1468-
1469-
warn!("Vcpu {:#x?}", self);
1470-
14711455
self.decode_instruction(
14721456
GuestVirtAddr::from_usize(exit_info.guest_rip),
14731457
exit_info.exit_instruction_length as _,
@@ -1478,6 +1462,11 @@ impl<H: AxVCpuHal> AxArchVCpu for VmxVcpu<H> {
14781462
access_flags: ept_info.access_flags,
14791463
}
14801464
}
1465+
VmxExitReason::TRIPLE_FAULT => {
1466+
error!("VMX triple fault: {:#x?}", exit_info);
1467+
error!("VCpu {:#x?}", self);
1468+
AxVCpuExitReason::Halt
1469+
}
14811470
_ => {
14821471
warn!("VMX unsupported VM-Exit: {:#x?}", exit_info);
14831472
warn!("VCpu {:#x?}", self);

src/vmx/vmcs.rs

+4
Original file line numberDiff line numberDiff line change
@@ -776,3 +776,7 @@ pub fn cr_access_info() -> AxResult<CrAccessInfo> {
776776
lmsw_source_data: qualification.get_bits(16..32) as u8,
777777
})
778778
}
779+
780+
pub fn exit_qualification() -> AxResult<usize> {
781+
VmcsReadOnlyNW::EXIT_QUALIFICATION.read()
782+
}

0 commit comments

Comments
 (0)