Skip to content

Commit 20eb470

Browse files
committed
Set values on other platforms
Signed-off-by: James Sturtevant <[email protected]>
1 parent d4603f6 commit 20eb470

File tree

3 files changed

+48
-2
lines changed

3 files changed

+48
-2
lines changed

src/hyperlight_host/src/hypervisor/gdb/hyperv_debug.rs

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -238,7 +238,7 @@ impl GuestDebug for HypervDebug {
238238

239239
fn write_regs(&self, vcpu_fd: &Self::Vcpu, regs: &X86_64Regs) -> Result<()> {
240240
log::debug!("Write registers");
241-
let regs = WHvGeneralRegisters {
241+
let gprs = WHvGeneralRegisters {
242242
rax: regs.rax,
243243
rbx: regs.rbx,
244244
rcx: regs.rcx,
@@ -261,7 +261,37 @@ impl GuestDebug for HypervDebug {
261261
};
262262

263263
vcpu_fd
264-
.set_general_purpose_registers(&regs)
264+
.set_general_purpose_registers(&gprs)
265+
.map_err(|e| new_error!("Could not write guest registers: {:?}", e))?;
266+
267+
// Load existing FPU state, replace XMM and MXCSR, and write it back.
268+
let mut fpu = match vcpu_fd.get_fpu() {
269+
Ok(f) => f,
270+
Err(e) => {
271+
return Err(new_error!("Could not write guest registers: {:?}", e));
272+
}
273+
};
274+
275+
fpu.xmm0 = regs.xmm[0];
276+
fpu.xmm1 = regs.xmm[1];
277+
fpu.xmm2 = regs.xmm[2];
278+
fpu.xmm3 = regs.xmm[3];
279+
fpu.xmm4 = regs.xmm[4];
280+
fpu.xmm5 = regs.xmm[5];
281+
fpu.xmm6 = regs.xmm[6];
282+
fpu.xmm7 = regs.xmm[7];
283+
fpu.xmm8 = regs.xmm[8];
284+
fpu.xmm9 = regs.xmm[9];
285+
fpu.xmm10 = regs.xmm[10];
286+
fpu.xmm11 = regs.xmm[11];
287+
fpu.xmm12 = regs.xmm[12];
288+
fpu.xmm13 = regs.xmm[13];
289+
fpu.xmm14 = regs.xmm[14];
290+
fpu.xmm15 = regs.xmm[15];
291+
fpu.mxcsr = regs.mxcsr;
292+
293+
vcpu_fd
294+
.set_fpu(&fpu)
265295
.map_err(|e| new_error!("Could not write guest registers: {:?}", e))
266296
}
267297
}

src/hyperlight_host/src/hypervisor/gdb/kvm_debug.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,7 @@ impl GuestDebug for KvmDebug {
207207
}
208208

209209
// Read MXCSR from XSAVE (MXCSR is at byte offset 24 -> u32 index 6)
210+
// 11.5.10 Mode-Specific XSAVE/XRSTOR State Management
210211
match vcpu_fd.get_xsave() {
211212
Ok(xsave) => {
212213
regs.mxcsr = xsave.region[6];

src/hyperlight_host/src/hypervisor/gdb/mshv_debug.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -274,6 +274,21 @@ impl GuestDebug for MshvDebug {
274274

275275
vcpu_fd
276276
.set_regs(&new_regs)
277+
.map_err(|e| new_error!("Could not write guest registers: {:?}", e))?;
278+
279+
// Load existing FPU state, replace XMM and MXCSR, and write it back.
280+
let mut fpu = match vcpu_fd.get_fpu() {
281+
Ok(f) => f,
282+
Err(e) => {
283+
return Err(new_error!("Could not write guest registers: {:?}", e));
284+
}
285+
};
286+
287+
fpu.xmm = regs.xmm.map(u128::to_le_bytes);
288+
fpu.mxcsr = regs.mxcsr;
289+
290+
vcpu_fd
291+
.set_fpu(&fpu)
277292
.map_err(|e| new_error!("Could not write guest registers: {:?}", e))
278293
}
279294
}

0 commit comments

Comments
 (0)