Skip to content

Commit b522e52

Browse files
committed
Make set_xsave take slice
1 parent 8507c7a commit b522e52

File tree

5 files changed

+57
-25
lines changed

5 files changed

+57
-25
lines changed

src/hyperlight_host/src/hypervisor/hyperlight_vm.rs

Lines changed: 25 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1305,8 +1305,9 @@ mod tests {
13051305
/// Bytes 160-415: XMM0-XMM15 (16 regs × 16 bytes)
13061306
/// Bytes 416-511: Reserved
13071307
/// Bytes 512-575: XSAVE header (preserve XCOMP_BV at 520-527)
1308-
fn dirty_xsave(current_xsave: &[u8]) -> [u32; 1024] {
1309-
let mut xsave = [0u32; 1024];
1308+
#[allow(clippy::needless_range_loop)]
1309+
fn dirty_xsave(current_xsave: &[u8]) -> Vec<u32> {
1310+
let mut xsave = vec![0u32; current_xsave.len() / 4];
13101311

13111312
// FCW (bytes 0-1) + FSW (bytes 2-3) - pack into xsave[0]
13121313
// FCW = 0x0F7F (different from default 0x037F), FSW = 0x1234
@@ -1328,28 +1329,36 @@ mod tests {
13281329
}
13291330

13301331
// ST0-ST7/MM0-MM7 (bytes 32-159, indices 8-39)
1331-
for item in xsave.iter_mut().take(40).skip(8) {
1332-
*item = 0xCAFEBABE;
1332+
for i in 8..40 {
1333+
xsave[i] = 0xCAFEBABE;
13331334
}
13341335
// XMM0-XMM15 (bytes 160-415, indices 40-103)
1335-
for item in xsave.iter_mut().take(104).skip(40) {
1336-
*item = 0xDEADBEEF;
1336+
for i in 40..104 {
1337+
xsave[i] = 0xDEADBEEF;
1338+
}
1339+
1340+
// Reserved area (bytes 416-511, indices 104-127) - dirty it
1341+
for i in 104..128 {
1342+
xsave[i] = 0xABCDEF12;
13371343
}
13381344

13391345
// Preserve entire XSAVE header (bytes 512-575, indices 128-143) from current state
13401346
// This includes XSTATE_BV (512-519) and XCOMP_BV (520-527) which
13411347
// MSHV/WHP require to be set correctly for compacted format.
13421348
// Failure to do this will cause set_xsave to fail on MSHV.
1343-
if current_xsave.len() >= 576 {
1344-
#[allow(clippy::needless_range_loop)]
1345-
for i in 128..144 {
1346-
let byte_offset = i * 4;
1347-
xsave[i] = u32::from_le_bytes(
1348-
current_xsave[byte_offset..byte_offset + 4]
1349-
.try_into()
1350-
.unwrap(),
1351-
);
1352-
}
1349+
for i in 128..144 {
1350+
let byte_offset = i * 4;
1351+
xsave[i] = u32::from_le_bytes(
1352+
current_xsave[byte_offset..byte_offset + 4]
1353+
.try_into()
1354+
.unwrap(),
1355+
);
1356+
}
1357+
1358+
// Dirty extended state areas (bytes 576+, indices 144+)
1359+
// These include XSAVE areas for SSE, AVX, MPX, etc.
1360+
for i in 144..xsave.len() {
1361+
xsave[i] = 0x12345678;
13531362
}
13541363

13551364
xsave

src/hyperlight_host/src/hypervisor/hyperv_linux.rs

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -252,14 +252,26 @@ impl Hypervisor for MshvVm {
252252

253253
#[cfg(test)]
254254
#[cfg(feature = "init-paging")]
255-
fn set_xsave(&self, xsave: &[u32; 1024]) -> Result<()> {
256-
let mut buf = XSave::default();
255+
fn set_xsave(&self, xsave: &[u32]) -> Result<()> {
256+
const MSHV_XSAVE_SIZE: usize = 4096;
257+
if std::mem::size_of_val(xsave) != MSHV_XSAVE_SIZE {
258+
return Err(new_error!(
259+
"Provided xsave size {} does not match MSHV supported size {}",
260+
std::mem::size_of_val(xsave),
261+
MSHV_XSAVE_SIZE
262+
));
263+
}
264+
257265
// Safety: all valid u32 values are 4 valid u8 values
258266
let (prefix, bytes, suffix) = unsafe { xsave.align_to() };
259267
if !prefix.is_empty() || !suffix.is_empty() {
260268
return Err(new_error!("Invalid xsave buffer alignment"));
261269
}
262-
buf.buffer.copy_from_slice(bytes);
270+
let buf = XSave {
271+
buffer: bytes
272+
.try_into()
273+
.map_err(|_| new_error!("mshv xsave must be 4096 u8s"))?,
274+
};
263275
self.vcpu_fd.set_xsave(&buf)?;
264276
Ok(())
265277
}

src/hyperlight_host/src/hypervisor/hyperv_windows.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -556,7 +556,7 @@ impl Hypervisor for WhpVm {
556556

557557
#[cfg(test)]
558558
#[cfg(feature = "init-paging")]
559-
fn set_xsave(&self, xsave: &[u32; 1024]) -> Result<()> {
559+
fn set_xsave(&self, xsave: &[u8]) -> Result<()> {
560560
use crate::HyperlightError;
561561

562562
// Get the required buffer size by calling with NULL buffer.
@@ -581,7 +581,7 @@ impl Hypervisor for WhpVm {
581581
return Err(HyperlightError::WindowsAPIError(e));
582582
}
583583

584-
let provided_size = std::mem::size_of_val(xsave) as u32;
584+
let provided_size = xsave.len() as u32;
585585
if buffer_size_needed > provided_size {
586586
return Err(new_error!(
587587
"Xsave buffer too small: needed {} bytes, provided {} bytes",

src/hyperlight_host/src/hypervisor/kvm.rs

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -207,10 +207,21 @@ impl Hypervisor for KvmVm {
207207

208208
#[cfg(test)]
209209
#[cfg(feature = "init-paging")]
210-
fn set_xsave(&self, xsave: &[u32; 1024]) -> Result<()> {
210+
fn set_xsave(&self, xsave: &[u32]) -> Result<()> {
211+
const KVM_XSAVE_SIZE: usize = 4096;
212+
213+
if std::mem::size_of_val(xsave) != KVM_XSAVE_SIZE {
214+
return Err(new_error!(
215+
"Provided xsave size {} does not match KVM supported size {}",
216+
std::mem::size_of_val(xsave),
217+
KVM_XSAVE_SIZE
218+
));
219+
}
211220
let xsave = kvm_xsave {
212-
region: *xsave,
213-
..Default::default() // zeroed 4KB buffer with no FAM
221+
region: xsave
222+
.try_into()
223+
.map_err(|_| new_error!("kvm xsave must be 1024 u32s"))?,
224+
..Default::default()
214225
};
215226
// Safety: Safe because we only copy 4096 bytes
216227
// and have not enabled any dynamic xsave features

src/hyperlight_host/src/hypervisor/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ pub(crate) trait Hypervisor: Debug + Send {
134134
/// Set xsave - only used for tests
135135
#[cfg(test)]
136136
#[cfg(feature = "init-paging")]
137-
fn set_xsave(&self, xsave: &[u32; 1024]) -> Result<()>;
137+
fn set_xsave(&self, xsave: &[u32]) -> Result<()>;
138138

139139
/// Get the debug registers of the vCPU
140140
#[allow(dead_code)]

0 commit comments

Comments
 (0)