@@ -949,6 +949,46 @@ pub enum BinaryHeaderError {
949
949
UnsupportedAArch64Register ( #[ from] registers:: UnsupportedRegister < HvArm64RegisterName > ) ,
950
950
}
951
951
952
+ #[ inline( never) ]
953
+ fn write_snp_vp_context_header (
954
+ header : & IgvmDirectiveHeader ,
955
+ variable_headers : & mut Vec < u8 > ,
956
+ file_data : & mut FileDataSerializer ,
957
+ ) -> Result < ( ) , BinaryHeaderError > {
958
+ let IgvmDirectiveHeader :: SnpVpContext { gpa, compatibility_mask, vp_index, vmsa } = header
959
+ else {
960
+ panic ! ( "Not vp context" )
961
+ } ;
962
+ // GPA must be 4k aligned.
963
+ assert_eq ! ( gpa % PAGE_SIZE_4K , 0 ) ;
964
+
965
+ // Pad file data to 4K.
966
+ let align_up_iter =
967
+ std:: iter:: repeat ( & 0u8 ) . take ( PAGE_SIZE_4K as usize - vmsa. as_bytes ( ) . len ( ) ) ;
968
+ let data: Vec < u8 > = vmsa. as_bytes ( ) . iter ( ) . chain ( align_up_iter) . copied ( ) . collect ( ) ;
969
+ let file_offset = file_data. write_file_data ( & data) ;
970
+
971
+ let info = IGVM_VHS_VP_CONTEXT {
972
+ gpa : u64_le:: new ( * gpa) ,
973
+ compatibility_mask : * compatibility_mask,
974
+ file_offset,
975
+ vp_index : * vp_index,
976
+ reserved : 0 ,
977
+ } ;
978
+
979
+ append_header ( & info, IgvmVariableHeaderType :: IGVM_VHT_VP_CONTEXT , variable_headers) ;
980
+
981
+ Ok ( ( ) )
982
+ }
983
+
984
+ #[ test]
985
+ fn test_write_snp_vp_context_header ( ) {
986
+ let header = IgvmDirectiveHeader :: SnpVpContext { gpa : 0x4000 , compatibility_mask : 0x1 , vp_index : 4 , vmsa : SevVmsa :: new_box_zeroed ( ) . unwrap ( ) } ;
987
+ let mut variable_headers = vec ! [ ] ;
988
+ let mut file_data = FileDataSerializer :: new ( 10000 ) ;
989
+ write_snp_vp_context_header ( & header, & mut variable_headers, & mut file_data) ;
990
+ }
991
+
952
992
impl IgvmDirectiveHeader {
953
993
/// Get the binary variable header size of the given type.
954
994
fn header_size ( & self ) -> usize {
0 commit comments