@@ -39,6 +39,10 @@ pub enum Error {
39
39
StartInfoPastRamEnd ,
40
40
/// Error writing hvm_start_info to guest memory.
41
41
StartInfoSetup ,
42
+ /// The starting address for the modules descriptions wasn't passed to the boot configurator.
43
+ ModulesAddressMissing ,
44
+ /// Error writing module descriptions to guest memory.
45
+ ModulesSetup ,
42
46
}
43
47
44
48
impl fmt:: Display for Error {
@@ -55,6 +59,8 @@ impl fmt::Display for Error {
55
59
"the hvm_start_info structure extends past the end of guest memory."
56
60
}
57
61
StartInfoSetup => "error writing hvm_start_info to guest memory." ,
62
+ ModulesAddressMissing => "the starting address for the modules descriptions wasn't passed to the boot configurator." ,
63
+ ModulesSetup => "error writing module descriptions to guest memory." ,
58
64
} ;
59
65
60
66
write ! ( f, "PVH Boot Configurator: {}" , desc)
@@ -164,6 +170,13 @@ impl BootConfigurator for PvhBootConfigurator {
164
170
. write_slice ( params. header . as_slice ( ) , params. header_start )
165
171
. map_err ( |_| Error :: StartInfoSetup ) ?;
166
172
173
+ if let Some ( modules) = params. modules . as_ref ( ) {
174
+ let modules_addr = params. modules_start . ok_or ( Error :: ModulesAddressMissing ) ?;
175
+ guest_memory
176
+ . write_slice ( modules. as_slice ( ) , modules_addr)
177
+ . map_err ( |_| Error :: ModulesSetup ) ?;
178
+ }
179
+
167
180
Ok ( ( ) )
168
181
}
169
182
}
@@ -182,7 +195,11 @@ mod tests {
182
195
GuestMemoryMmap :: from_ranges ( & [ ( GuestAddress ( 0x0 ) , ( MEM_SIZE as usize ) ) ] ) . unwrap ( )
183
196
}
184
197
185
- fn build_bootparams_common ( ) -> ( hvm_start_info , Vec < hvm_memmap_table_entry > ) {
198
+ fn build_bootparams_common ( ) -> (
199
+ hvm_start_info ,
200
+ Vec < hvm_memmap_table_entry > ,
201
+ Vec < hvm_modlist_entry > ,
202
+ ) {
186
203
let mut start_info = hvm_start_info:: default ( ) ;
187
204
let memmap_entry = hvm_memmap_table_entry {
188
205
addr : 0x7000 ,
@@ -191,21 +208,29 @@ mod tests {
191
208
reserved : 0 ,
192
209
} ;
193
210
211
+ let modlist_entry = hvm_modlist_entry {
212
+ paddr : 0x10000 ,
213
+ size : 0x100 ,
214
+ cmdline_paddr : 0 ,
215
+ reserved : 0 ,
216
+ } ;
217
+
194
218
start_info. magic = XEN_HVM_START_MAGIC_VALUE ;
195
219
start_info. version = 1 ;
196
220
start_info. nr_modules = 0 ;
197
221
start_info. memmap_entries = 0 ;
198
222
199
- ( start_info, vec ! [ memmap_entry] )
223
+ ( start_info, vec ! [ memmap_entry] , vec ! [ modlist_entry ] )
200
224
}
201
225
202
226
#[ test]
203
227
fn test_configure_pvh_boot ( ) {
204
- let ( mut start_info, memmap_entries) = build_bootparams_common ( ) ;
228
+ let ( mut start_info, memmap_entries, modlist_entries ) = build_bootparams_common ( ) ;
205
229
let guest_memory = create_guest_mem ( ) ;
206
230
207
231
let start_info_addr = GuestAddress ( 0x6000 ) ;
208
232
let memmap_addr = GuestAddress ( 0x7000 ) ;
233
+ let modlist_addr = GuestAddress ( 0x6040 ) ;
209
234
start_info. memmap_paddr = memmap_addr. raw_value ( ) ;
210
235
211
236
let mut boot_params = BootParams :: new :: < hvm_start_info > ( & start_info, start_info_addr) ;
@@ -245,6 +270,7 @@ mod tests {
245
270
) ;
246
271
247
272
boot_params. set_sections :: < hvm_memmap_table_entry > ( & memmap_entries, memmap_addr) ;
273
+ boot_params. set_modules :: < hvm_modlist_entry > ( & modlist_entries, modlist_addr) ;
248
274
assert ! ( PvhBootConfigurator :: write_bootparams:: <GuestMemoryMmap >(
249
275
& boot_params,
250
276
& guest_memory,
0 commit comments