@@ -949,6 +949,46 @@ pub enum BinaryHeaderError {
949949 UnsupportedAArch64Register ( #[ from] registers:: UnsupportedRegister < HvArm64RegisterName > ) ,
950950}
951951
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+
952992impl IgvmDirectiveHeader {
953993 /// Get the binary variable header size of the given type.
954994 fn header_size ( & self ) -> usize {
0 commit comments