From e1ef78259792268659e8e3a16548d78697763acf Mon Sep 17 00:00:00 2001 From: Muminul Islam Date: Fri, 16 Aug 2024 14:40:35 -0700 Subject: [PATCH] mshv-bindings: add a macro for setting filed in GHCB page Signed-off-by: Muminul Islam --- mshv-bindings/src/x86_64/snp.rs | 36 +++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/mshv-bindings/src/x86_64/snp.rs b/mshv-bindings/src/x86_64/snp.rs index 142152e..8f6c3e0 100644 --- a/mshv-bindings/src/x86_64/snp.rs +++ b/mshv-bindings/src/x86_64/snp.rs @@ -1147,3 +1147,39 @@ impl Default for svm_ghcb_base { } } } + +macro_rules! set_svm_field_u64_ptr { + ($this: ident, $name: ident, $value: expr) => { + unsafe { + (*$this).$name = $value; + } + let qword_offset = std::mem::offset_of!(svm_ghcb_base, $name) / 8; + let arr_idx = qword_offset / 64; + let bit_index = qword_offset % 64; + let mut bitmap = unsafe { (*$this).valid_bitmap }; + bitmap[arr_idx] = bitmap[arr_idx] | (1 << bit_index); + unsafe { (*$this).valid_bitmap = bitmap }; + }; +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_svm_macro() { + let mut st: svm_ghcb_base = svm_ghcb_base::default(); + println!("{}", std::mem::size_of::()); + let pptr: *mut svm_ghcb_base = &mut st; + set_svm_field_u64_ptr!(pptr, cpl, 100); + let mut val = st.cpl as u64; + let mut bitmap = st.valid_bitmap; + assert!(100 == val); + assert!((33554432 == bitmap[0])); + set_svm_field_u64_ptr!(pptr, xfem, 0x100); + val = st.xfem; + assert!(0x100 == val); + bitmap = st.valid_bitmap; + assert!(0x2000000000000000 == bitmap[1]); + } +}