Skip to content

Commit 8aa5da4

Browse files
committed
Merge branch 'equation' into invalid_ept
2 parents 298eaa3 + 3034c6c commit 8aa5da4

File tree

2 files changed

+39
-2
lines changed

2 files changed

+39
-2
lines changed

src/page_table.rs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,31 @@ impl<PTE: GenericPTE, H: PagingHandler, EPT: EPTTranslator> GuestPageTable64<PTE
125125
let off = size.align_offset(vaddr.into());
126126
Ok((entry.paddr().add(off).into(), entry.flags(), size))
127127
}
128+
129+
/// Queries the result of the mapping starts with `vaddr`.
130+
///
131+
/// Returns the physical address of the target frame, mapping flags,
132+
/// the page size, and the raw page table entry bits.
133+
///
134+
/// Returns [`Err(PagingError::NotMapped)`](PagingError::NotMapped) if the
135+
/// mapping is not present.
136+
pub fn query_raw(
137+
&self,
138+
vaddr: GuestVirtAddr,
139+
) -> PagingResult<(GuestPhysAddr, MappingFlags, PageSize, usize)> {
140+
let (entry, size) = self.get_entry(vaddr)?;
141+
if entry.is_unused() {
142+
error!("GuestPT64 query {:?} Entry is unused", vaddr);
143+
return Err(PagingError::NotMapped);
144+
}
145+
let off = size.align_offset(vaddr.into());
146+
Ok((
147+
entry.paddr().add(off).into(),
148+
entry.flags(),
149+
size,
150+
entry.bits(),
151+
))
152+
}
128153
}
129154

130155
// private implements

src/vmx/vcpu.rs

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -855,19 +855,31 @@ impl<H: AxVCpuHal> VmxVcpu<H> {
855855
vaddr + seg_base
856856
}
857857

858+
/// Query guest page table to get mapping info.
858859
pub fn guest_page_table_query(
859860
&self,
860861
gva: GuestVirtAddr,
861862
) -> PagingResult<(GuestPhysAddr, MappingFlags, PageSize)> {
862863
let addr = self.gva_to_linear_addr(gva);
864+
let guest_ptw_info = self.get_pagetable_walk_info();
865+
let guest_page_table: GuestPageTable64<X64PTE, H::PagingHandler, H::EPTTranslator> =
866+
GuestPageTable64::construct(&guest_ptw_info);
863867

864-
// debug!("guest_page_table_query: gva {:?} linear {:?}", gva, addr);
868+
guest_page_table.query(addr)
869+
}
865870

871+
/// Query guest page table to get mapping info,
872+
/// alone with raw page table entry value.
873+
pub fn guest_page_table_query_raw(
874+
&self,
875+
gva: GuestVirtAddr,
876+
) -> PagingResult<(GuestPhysAddr, MappingFlags, PageSize, usize)> {
877+
let addr = self.gva_to_linear_addr(gva);
866878
let guest_ptw_info = self.get_pagetable_walk_info();
867879
let guest_page_table: GuestPageTable64<X64PTE, H::PagingHandler, H::EPTTranslator> =
868880
GuestPageTable64::construct(&guest_ptw_info);
869881

870-
guest_page_table.query(addr)
882+
guest_page_table.query_raw(addr)
871883
}
872884
}
873885

0 commit comments

Comments
 (0)