Skip to content

Commit 349a0b5

Browse files
committed
mshv-ioctls: update get_regs to use register page
Signed-off-by: Muminul Islam <[email protected]>
1 parent b695670 commit 349a0b5

File tree

2 files changed

+32
-46
lines changed

2 files changed

+32
-46
lines changed

mshv-bindings/src/x86_64/regs.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -787,6 +787,18 @@ macro_rules! set_gp_regs_field_ptr {
787787
};
788788
}
789789

790+
#[macro_export]
791+
macro_rules! get_gp_regs_field_ptr {
792+
($this: ident, $name: ident) => {
793+
(*$this)
794+
.__bindgen_anon_1
795+
.__bindgen_anon_1
796+
.__bindgen_anon_1
797+
.__bindgen_anon_1
798+
.$name
799+
};
800+
}
801+
790802
#[cfg(test)]
791803
mod tests {
792804
use super::*;

mshv-ioctls/src/ioctls/vcpu.rs

Lines changed: 20 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -199,59 +199,33 @@ impl VcpuFd {
199199
/// Returns the vCPU general purpose registers.
200200
#[cfg(not(target_arch = "aarch64"))]
201201
pub fn get_regs(&self) -> Result<StandardRegisters> {
202-
let reg_names = [
203-
hv_register_name_HV_X64_REGISTER_RAX,
204-
hv_register_name_HV_X64_REGISTER_RBX,
205-
hv_register_name_HV_X64_REGISTER_RCX,
206-
hv_register_name_HV_X64_REGISTER_RDX,
207-
hv_register_name_HV_X64_REGISTER_RSI,
208-
hv_register_name_HV_X64_REGISTER_RDI,
209-
hv_register_name_HV_X64_REGISTER_RSP,
210-
hv_register_name_HV_X64_REGISTER_RBP,
211-
hv_register_name_HV_X64_REGISTER_R8,
212-
hv_register_name_HV_X64_REGISTER_R9,
213-
hv_register_name_HV_X64_REGISTER_R10,
214-
hv_register_name_HV_X64_REGISTER_R11,
215-
hv_register_name_HV_X64_REGISTER_R12,
216-
hv_register_name_HV_X64_REGISTER_R13,
217-
hv_register_name_HV_X64_REGISTER_R14,
218-
hv_register_name_HV_X64_REGISTER_R15,
219-
hv_register_name_HV_X64_REGISTER_RIP,
220-
hv_register_name_HV_X64_REGISTER_RFLAGS,
221-
];
222-
let mut reg_assocs: Vec<hv_register_assoc> = reg_names
223-
.iter()
224-
.map(|name| hv_register_assoc {
225-
name: *name,
226-
..Default::default()
227-
})
228-
.collect();
229-
self.get_reg(&mut reg_assocs)?;
202+
let vp_reg_page = self.get_vp_reg_page();
230203
let mut ret_regs = StandardRegisters::default();
231204
// SAFETY: access union fields
232205
unsafe {
233-
ret_regs.rax = reg_assocs[0].value.reg64;
234-
ret_regs.rbx = reg_assocs[1].value.reg64;
235-
ret_regs.rcx = reg_assocs[2].value.reg64;
236-
ret_regs.rdx = reg_assocs[3].value.reg64;
237-
ret_regs.rsi = reg_assocs[4].value.reg64;
238-
ret_regs.rdi = reg_assocs[5].value.reg64;
239-
ret_regs.rsp = reg_assocs[6].value.reg64;
240-
ret_regs.rbp = reg_assocs[7].value.reg64;
241-
ret_regs.r8 = reg_assocs[8].value.reg64;
242-
ret_regs.r9 = reg_assocs[9].value.reg64;
243-
ret_regs.r10 = reg_assocs[10].value.reg64;
244-
ret_regs.r11 = reg_assocs[11].value.reg64;
245-
ret_regs.r12 = reg_assocs[12].value.reg64;
246-
ret_regs.r13 = reg_assocs[13].value.reg64;
247-
ret_regs.r14 = reg_assocs[14].value.reg64;
248-
ret_regs.r15 = reg_assocs[15].value.reg64;
249-
ret_regs.rip = reg_assocs[16].value.reg64;
250-
ret_regs.rflags = reg_assocs[17].value.reg64;
206+
ret_regs.rax = get_gp_regs_field_ptr!(vp_reg_page, rax);
207+
ret_regs.rbx = get_gp_regs_field_ptr!(vp_reg_page, rbx);
208+
ret_regs.rcx = get_gp_regs_field_ptr!(vp_reg_page, rcx);
209+
ret_regs.rdx = get_gp_regs_field_ptr!(vp_reg_page, rdx);
210+
ret_regs.rsi = get_gp_regs_field_ptr!(vp_reg_page, rsi);
211+
ret_regs.rdi = get_gp_regs_field_ptr!(vp_reg_page, rdi);
212+
ret_regs.rsp = get_gp_regs_field_ptr!(vp_reg_page, rsp);
213+
ret_regs.rbp = get_gp_regs_field_ptr!(vp_reg_page, rbp);
214+
ret_regs.r8 = get_gp_regs_field_ptr!(vp_reg_page, r8);
215+
ret_regs.r9 = get_gp_regs_field_ptr!(vp_reg_page, r9);
216+
ret_regs.r10 = get_gp_regs_field_ptr!(vp_reg_page, r10);
217+
ret_regs.r11 = get_gp_regs_field_ptr!(vp_reg_page, r11);
218+
ret_regs.r12 = get_gp_regs_field_ptr!(vp_reg_page, r12);
219+
ret_regs.r13 = get_gp_regs_field_ptr!(vp_reg_page, r13);
220+
ret_regs.r14 = get_gp_regs_field_ptr!(vp_reg_page, r14);
221+
ret_regs.r15 = get_gp_regs_field_ptr!(vp_reg_page, r15);
222+
ret_regs.rip = (*vp_reg_page).__bindgen_anon_1.__bindgen_anon_1.rip;
223+
ret_regs.rflags = (*vp_reg_page).__bindgen_anon_1.__bindgen_anon_1.rflags;
251224
}
252225

253226
Ok(ret_regs)
254227
}
228+
255229
/// Returns the vCPU special registers.
256230
#[cfg(not(target_arch = "aarch64"))]
257231
pub fn get_sregs(&self) -> Result<SpecialRegisters> {

0 commit comments

Comments
 (0)