Skip to content

Commit 535a84d

Browse files
committed
mshv-ioctls: add a new API to get standard registers
This API uses VP register page to populate the registers. Signed-off-by: Muminul Islam <[email protected]>
1 parent c54f9bd commit 535a84d

File tree

2 files changed

+54
-0
lines changed

2 files changed

+54
-0
lines changed

Diff for: mshv-bindings/src/x86_64/regs.rs

+12
Original file line numberDiff line numberDiff line change
@@ -775,6 +775,18 @@ macro_rules! set_gp_regs_field_ptr {
775775
};
776776
}
777777

778+
#[macro_export]
779+
macro_rules! get_gp_regs_field_ptr {
780+
($this: ident, $name: ident) => {
781+
(*$this)
782+
.__bindgen_anon_1
783+
.__bindgen_anon_1
784+
.__bindgen_anon_1
785+
.__bindgen_anon_1
786+
.$name
787+
};
788+
}
789+
778790
#[cfg(test)]
779791
mod tests {
780792
use super::*;

Diff for: mshv-ioctls/src/ioctls/vcpu.rs

+42
Original file line numberDiff line numberDiff line change
@@ -379,6 +379,16 @@ impl VcpuFd {
379379
/// Returns the vCPU general purpose registers.
380380
#[cfg(target_arch = "x86_64")]
381381
pub fn get_regs(&self) -> Result<StandardRegisters> {
382+
if self.vp_page.is_some() {
383+
self.get_standard_regs_vp_page()
384+
} else {
385+
self.get_standard_regs_ioctl()
386+
}
387+
}
388+
389+
/// Returns the vCPU general purpose registers using IOCTL
390+
#[cfg(not(target_arch = "aarch64"))]
391+
fn get_standard_regs_ioctl(&self) -> Result<StandardRegisters> {
382392
let reg_names = [
383393
hv_register_name_HV_X64_REGISTER_RAX,
384394
hv_register_name_HV_X64_REGISTER_RBX,
@@ -499,6 +509,37 @@ impl VcpuFd {
499509
}
500510
Ok(ret_regs)
501511
}
512+
513+
/// Returns the vCPU general purpose registers using VP register page
514+
#[cfg(not(target_arch = "aarch64"))]
515+
pub fn get_standard_regs_vp_page(&self) -> Result<StandardRegisters> {
516+
let vp_reg_page = self.get_vp_reg_page().unwrap().0;
517+
let mut ret_regs = StandardRegisters::default();
518+
// SAFETY: access union fields
519+
unsafe {
520+
ret_regs.rax = get_gp_regs_field_ptr!(vp_reg_page, rax);
521+
ret_regs.rbx = get_gp_regs_field_ptr!(vp_reg_page, rbx);
522+
ret_regs.rcx = get_gp_regs_field_ptr!(vp_reg_page, rcx);
523+
ret_regs.rdx = get_gp_regs_field_ptr!(vp_reg_page, rdx);
524+
ret_regs.rsi = get_gp_regs_field_ptr!(vp_reg_page, rsi);
525+
ret_regs.rdi = get_gp_regs_field_ptr!(vp_reg_page, rdi);
526+
ret_regs.rsp = get_gp_regs_field_ptr!(vp_reg_page, rsp);
527+
ret_regs.rbp = get_gp_regs_field_ptr!(vp_reg_page, rbp);
528+
ret_regs.r8 = get_gp_regs_field_ptr!(vp_reg_page, r8);
529+
ret_regs.r9 = get_gp_regs_field_ptr!(vp_reg_page, r9);
530+
ret_regs.r10 = get_gp_regs_field_ptr!(vp_reg_page, r10);
531+
ret_regs.r11 = get_gp_regs_field_ptr!(vp_reg_page, r11);
532+
ret_regs.r12 = get_gp_regs_field_ptr!(vp_reg_page, r12);
533+
ret_regs.r13 = get_gp_regs_field_ptr!(vp_reg_page, r13);
534+
ret_regs.r14 = get_gp_regs_field_ptr!(vp_reg_page, r14);
535+
ret_regs.r15 = get_gp_regs_field_ptr!(vp_reg_page, r15);
536+
ret_regs.rip = (*vp_reg_page).__bindgen_anon_1.__bindgen_anon_1.rip;
537+
ret_regs.rflags = (*vp_reg_page).__bindgen_anon_1.__bindgen_anon_1.rflags;
538+
}
539+
540+
Ok(ret_regs)
541+
}
542+
502543
/// Returns the vCPU special registers.
503544
#[cfg(not(target_arch = "aarch64"))]
504545
pub fn get_sregs(&self) -> Result<SpecialRegisters> {
@@ -570,6 +611,7 @@ impl VcpuFd {
570611

571612
Ok(ret_regs)
572613
}
614+
573615
/// Sets the vCPU special registers
574616
#[cfg(not(target_arch = "aarch64"))]
575617
pub fn set_sregs(&self, sregs: &SpecialRegisters) -> Result<()> {

0 commit comments

Comments
 (0)