@@ -20,7 +20,6 @@ use hv_defs::HvX64RegisterName;
20
20
use hv_defs:: Vtl ;
21
21
use igvm_defs:: * ;
22
22
use page_table:: PageTableRelocationBuilder ;
23
- use parsing:: FromBytesExt ;
24
23
use range_map_vec:: RangeMap ;
25
24
use registers:: AArch64Register ;
26
25
use registers:: X86Register ;
@@ -32,16 +31,17 @@ use std::fmt;
32
31
use std:: mem:: size_of;
33
32
use std:: mem:: size_of_val;
34
33
use thiserror:: Error ;
35
- use zerocopy:: AsBytes ;
36
34
use zerocopy:: FromBytes ;
37
- use zerocopy:: FromZeroes ;
35
+ use zerocopy:: FromZeros ;
36
+ use zerocopy:: Immutable ;
37
+ use zerocopy:: IntoBytes ;
38
+ use zerocopy:: KnownLayout ;
38
39
39
40
#[ cfg( feature = "igvm-c" ) ]
40
41
pub mod c_api;
41
42
42
43
pub mod hv_defs;
43
44
pub mod page_table;
44
- mod parsing;
45
45
pub mod registers;
46
46
pub mod snp_defs;
47
47
@@ -88,9 +88,11 @@ fn align_8(x: usize) -> usize {
88
88
/// passed in slice with the remaining bytes left.
89
89
///
90
90
/// On failure, returns [`BinaryHeaderError::InvalidVariableHeaderSize`].
91
- fn read_header < T : FromBytesExt > ( bytes : & mut & [ u8 ] ) -> Result < T , BinaryHeaderError > {
92
- T :: read_from_prefix_split ( bytes)
93
- . ok_or ( BinaryHeaderError :: InvalidVariableHeaderSize )
91
+ fn read_header < T : FromBytes + Immutable + KnownLayout > (
92
+ bytes : & mut & [ u8 ] ,
93
+ ) -> Result < T , BinaryHeaderError > {
94
+ T :: read_from_prefix ( bytes)
95
+ . map_err ( |_| BinaryHeaderError :: InvalidVariableHeaderSize ) // todo: zerocopy: map_err
94
96
. map ( |( header, remaining) | {
95
97
* bytes = remaining;
96
98
header
@@ -99,7 +101,7 @@ fn read_header<T: FromBytesExt>(bytes: &mut &[u8]) -> Result<T, BinaryHeaderErro
99
101
100
102
/// Helper function to append a given binary header to a variable header
101
103
/// section.
102
- fn append_header < T : AsBytes > (
104
+ fn append_header < T : IntoBytes + Immutable + KnownLayout > (
103
105
header : & T ,
104
106
header_type : IgvmVariableHeaderType ,
105
107
variable_headers : & mut Vec < u8 > ,
@@ -1785,22 +1787,20 @@ impl IgvmDirectiveHeader {
1785
1787
// First read the VbsVpContextHeader at file offset
1786
1788
let start = ( header. file_offset - file_data_start) as usize ;
1787
1789
let ( VbsVpContextHeader { register_count } , remaining_data) =
1788
- VbsVpContextHeader :: read_from_prefix_split ( & file_data[ start..] )
1789
- . ok_or ( BinaryHeaderError :: InvalidDataSize ) ?;
1790
+ VbsVpContextHeader :: read_from_prefix ( & file_data[ start..] )
1791
+ . map_err ( |_| BinaryHeaderError :: InvalidDataSize ) ?; // todo: zerocopy: map_err
1790
1792
1791
1793
let mut registers: Vec < VbsVpContextRegister > = Vec :: new ( ) ;
1792
1794
let mut vp_vtl: Option < u8 > = None ;
1793
1795
let mut remaining_data = remaining_data;
1794
1796
1795
1797
for _ in 0 ..register_count {
1796
- let reg = match VbsVpContextRegister :: read_from_prefix_split (
1797
- remaining_data,
1798
- ) {
1799
- Some ( ( reg, slice) ) => {
1798
+ let reg = match VbsVpContextRegister :: read_from_prefix ( remaining_data) {
1799
+ Ok ( ( reg, slice) ) => {
1800
1800
remaining_data = slice;
1801
1801
reg
1802
1802
}
1803
- None => return Err ( BinaryHeaderError :: InvalidDataSize ) ,
1803
+ Err ( _ ) => return Err ( BinaryHeaderError :: InvalidDataSize ) , // todo: zerocopy: map_err
1804
1804
} ;
1805
1805
1806
1806
registers. push ( reg) ;
@@ -1861,9 +1861,10 @@ impl IgvmDirectiveHeader {
1861
1861
. ok_or ( BinaryHeaderError :: InvalidDataSize ) ?;
1862
1862
1863
1863
// Copy the VMSA bytes into the VMSA, and validate the remaining bytes are 0.
1864
- let mut vmsa = SevVmsa :: new_box_zeroed ( ) ;
1864
+ // todo: zerocopy: as of 0.8, can recover from allocation failure
1865
+ let mut vmsa = SevVmsa :: new_box_zeroed ( ) . unwrap ( ) ;
1865
1866
let ( vmsa_slice, remaining) = data. split_at ( size_of :: < SevVmsa > ( ) ) ;
1866
- vmsa. as_bytes_mut ( ) . copy_from_slice ( vmsa_slice) ;
1867
+ vmsa. as_mut_bytes ( ) . copy_from_slice ( vmsa_slice) ;
1867
1868
if remaining. iter ( ) . any ( |b| * b != 0 ) {
1868
1869
return Err ( BinaryHeaderError :: InvalidVmsa ) ;
1869
1870
}
@@ -1889,10 +1890,11 @@ impl IgvmDirectiveHeader {
1889
1890
1890
1891
// Copy the context bytes into the context structure,
1891
1892
// and validate the remaining bytes are 0.
1892
- let mut context = IgvmNativeVpContextX64 :: new_box_zeroed ( ) ;
1893
+ // todo: zerocopy: as of 0.8, can recover from allocation failure
1894
+ let mut context = IgvmNativeVpContextX64 :: new_box_zeroed ( ) . unwrap ( ) ;
1893
1895
let ( context_slice, remaining) =
1894
1896
data. split_at ( size_of :: < IgvmNativeVpContextX64 > ( ) ) ;
1895
- context. as_bytes_mut ( ) . copy_from_slice ( context_slice) ;
1897
+ context. as_mut_bytes ( ) . copy_from_slice ( context_slice) ;
1896
1898
if remaining. iter ( ) . any ( |b| * b != 0 ) {
1897
1899
return Err ( BinaryHeaderError :: InvalidContext ) ;
1898
1900
}
@@ -2814,7 +2816,9 @@ impl IgvmFile {
2814
2816
2815
2817
// Read the IGVM fixed header
2816
2818
let mut fixed_header = FixedHeader :: V1 (
2817
- IGVM_FIXED_HEADER :: read_from_prefix ( file) . ok_or ( Error :: InvalidFixedHeader ) ?,
2819
+ IGVM_FIXED_HEADER :: read_from_prefix ( file)
2820
+ . map_err ( |_| Error :: InvalidFixedHeader ) ?
2821
+ . 0 , // todo: zerocopy: map_err
2818
2822
) ;
2819
2823
2820
2824
if fixed_header. magic ( ) != IGVM_MAGIC_VALUE {
@@ -2825,7 +2829,8 @@ impl IgvmFile {
2825
2829
IGVM_FORMAT_VERSION_1 => IgvmRevision :: V1 ,
2826
2830
IGVM_FORMAT_VERSION_2 => {
2827
2831
let v2 = IGVM_FIXED_HEADER_V2 :: read_from_prefix ( file)
2828
- . ok_or ( Error :: InvalidFixedHeader ) ?;
2832
+ . map_err ( |_| Error :: InvalidFixedHeader ) ?
2833
+ . 0 ; // todo: zerocopy: map_err
2829
2834
2830
2835
let arch = match v2. architecture {
2831
2836
IgvmArchitecture :: X64 => Arch :: X64 ,
@@ -2903,7 +2908,10 @@ impl IgvmFile {
2903
2908
2904
2909
while !variable_headers. is_empty ( ) {
2905
2910
// Peek the next fixed variable header to determine what kind of header to parse
2906
- match IGVM_VHS_VARIABLE_HEADER :: read_from_prefix ( variable_headers) {
2911
+ match IGVM_VHS_VARIABLE_HEADER :: read_from_prefix ( variable_headers)
2912
+ . ok ( )
2913
+ . map ( |h| h. 0 )
2914
+ {
2907
2915
Some ( header) if IGVM_VHT_RANGE_PLATFORM . contains ( & header. typ . 0 ) => {
2908
2916
if parsing_stage != VariableHeaderParsingStage :: Platform {
2909
2917
// Only legal to parse platform headers before other types
@@ -3990,7 +3998,7 @@ mod tests {
3990
3998
3991
3999
/// Test a variable header matches the supplied args. Also tests that the header deserialized returns the original
3992
4000
/// header.
3993
- fn test_variable_header < T : FromBytesExt > (
4001
+ fn test_variable_header < T : IntoBytes + Immutable + KnownLayout > (
3994
4002
revision : IgvmRevision ,
3995
4003
header : IgvmDirectiveHeader ,
3996
4004
file_data_offset : u32 ,
@@ -4009,7 +4017,8 @@ mod tests {
4009
4017
let file_data = file_data. take ( ) ;
4010
4018
4011
4019
let common_header = IGVM_VHS_VARIABLE_HEADER :: read_from_prefix ( & binary_header[ ..] )
4012
- . expect ( "variable header must be present" ) ;
4020
+ . expect ( "variable header must be present" )
4021
+ . 0 ;
4013
4022
4014
4023
assert_eq ! ( common_header. typ, header_type) ;
4015
4024
assert_eq ! (
@@ -4116,7 +4125,7 @@ mod tests {
4116
4125
} ;
4117
4126
let expected_header = IGVM_VHS_PAGE_DATA {
4118
4127
gpa,
4119
- ..FromZeroes :: new_zeroed ( )
4128
+ ..FromZeros :: new_zeroed ( )
4120
4129
} ;
4121
4130
test_variable_header (
4122
4131
IgvmRevision :: V1 ,
@@ -4140,7 +4149,7 @@ mod tests {
4140
4149
let expected_header = IGVM_VHS_PAGE_DATA {
4141
4150
gpa,
4142
4151
file_offset : file_data_offset,
4143
- ..FromZeroes :: new_zeroed ( )
4152
+ ..FromZeros :: new_zeroed ( )
4144
4153
} ;
4145
4154
data. resize ( PAGE_SIZE_4K as usize , 0 ) ;
4146
4155
let expected_file_data = Some ( data) ;
@@ -4166,7 +4175,7 @@ mod tests {
4166
4175
let expected_header = IGVM_VHS_PAGE_DATA {
4167
4176
gpa,
4168
4177
file_offset : file_data_offset,
4169
- ..FromZeroes :: new_zeroed ( )
4178
+ ..FromZeros :: new_zeroed ( )
4170
4179
} ;
4171
4180
let expected_file_data = Some ( data) ;
4172
4181
test_variable_header (
@@ -4224,7 +4233,7 @@ mod tests {
4224
4233
4225
4234
let read_raw_header = |data : & [ u8 ] | {
4226
4235
let ( _, data) = data. split_at ( size_of :: < IGVM_VHS_VARIABLE_HEADER > ( ) ) ;
4227
- IGVM_VHS_PAGE_DATA :: read_from_prefix ( data) . unwrap ( )
4236
+ IGVM_VHS_PAGE_DATA :: read_from_prefix ( data) . unwrap ( ) . 0
4228
4237
} ;
4229
4238
4230
4239
let first = read_raw_header ( & first) ;
@@ -4465,7 +4474,7 @@ mod tests {
4465
4474
number_of_bytes,
4466
4475
compatibility_mask,
4467
4476
flags,
4468
- ..FromZeroes :: new_zeroed ( )
4477
+ ..FromZeros :: new_zeroed ( )
4469
4478
} ;
4470
4479
4471
4480
let header = IgvmDirectiveHeader :: RequiredMemory {
@@ -4493,7 +4502,7 @@ mod tests {
4493
4502
number_of_bytes,
4494
4503
compatibility_mask,
4495
4504
flags,
4496
- ..FromZeroes :: new_zeroed ( )
4505
+ ..FromZeros :: new_zeroed ( )
4497
4506
} ;
4498
4507
4499
4508
let header = IgvmDirectiveHeader :: RequiredMemory {
0 commit comments