6
6
use crate :: HardwareIsolatedMemoryProtector ;
7
7
use crate :: MemoryAcceptor ;
8
8
use crate :: mapping:: GuestMemoryMapping ;
9
- use crate :: mapping:: GuestValidMemory ;
9
+ use crate :: mapping:: GuestPartitionMemoryBuilder ;
10
10
use anyhow:: Context ;
11
11
use futures:: future:: try_join_all;
12
12
use guestmem:: GuestMemory ;
@@ -210,18 +210,19 @@ pub async fn init(params: &Init<'_>) -> anyhow::Result<MemoryMappings> {
210
210
// kernel-registered RAM.
211
211
212
212
tracing:: debug!( "Building valid encrypted memory view" ) ;
213
- let valid_encrypted_memory = Arc :: new ( {
214
- let _span = tracing:: info_span!( "create encrypted memory bitmap " ) . entered ( ) ;
215
- GuestValidMemory :: new ( params. mem_layout , true ) ?
216
- } ) ;
213
+ let encrypted_memory_builder = {
214
+ let _span = tracing:: info_span!( "create encrypted memory view " ) . entered ( ) ;
215
+ GuestPartitionMemoryBuilder :: new ( params. mem_layout , Some ( true ) ) ?
216
+ } ;
217
217
218
218
tracing:: debug!( "Building VTL0 memory map" ) ;
219
219
let vtl0_mapping = Arc :: new ( {
220
220
let _span = tracing:: info_span!( "map_vtl0_memory" ) . entered ( ) ;
221
- GuestMemoryMapping :: builder ( 0 )
222
- . dma_base_address ( None ) // prohibit direct DMA attempts until TDISP is supported
223
- . use_partition_valid_memory ( Some ( valid_encrypted_memory. clone ( ) ) )
224
- . build ( & gpa_fd, params. mem_layout )
221
+ encrypted_memory_builder
222
+ . build_guest_memory_mapping (
223
+ & gpa_fd,
224
+ GuestMemoryMapping :: builder ( 0 ) . dma_base_address ( None ) ,
225
+ )
225
226
. context ( "failed to map vtl0 memory" ) ?
226
227
} ) ;
227
228
@@ -291,27 +292,34 @@ pub async fn init(params: &Init<'_>) -> anyhow::Result<MemoryMappings> {
291
292
292
293
tracing:: debug!( "Building shared memory map" ) ;
293
294
294
- let valid_shared_memory = Arc :: new ( {
295
- let _span = tracing:: info_span!( "create shared memory bitmap" ) . entered ( ) ;
296
- GuestValidMemory :: new ( params. complete_memory_layout , false ) ?
297
- } ) ;
295
+ let shared_memory_builder = {
296
+ let _span = tracing:: info_span!( "create shared memory view" ) . entered ( ) ;
297
+ GuestPartitionMemoryBuilder :: new ( params. complete_memory_layout , Some ( false ) ) ?
298
+ } ;
299
+
300
+ let valid_shared_memory = shared_memory_builder. partition_valid_memory ( ) ;
298
301
299
302
// Update the shared mapping bitmap for pages used by the shared
300
303
// visibility pool to be marked as shared, since by default pages are
301
304
// marked as no-access in the bitmap.
302
305
tracing:: debug!( "Updating shared mapping bitmaps" ) ;
303
306
for range in params. shared_pool {
304
- valid_shared_memory. update_valid ( range. range , true ) ;
307
+ valid_shared_memory
308
+ . as_ref ( )
309
+ . unwrap ( )
310
+ . update_valid ( range. range , true ) ;
305
311
}
306
312
307
313
let shared_mapping = Arc :: new ( {
308
314
let _span = tracing:: info_span!( "map_shared_memory" ) . entered ( ) ;
309
- GuestMemoryMapping :: builder ( shared_offset)
310
- . shared ( true )
311
- . use_partition_valid_memory ( Some ( valid_shared_memory. clone ( ) ) )
312
- . ignore_registration_failure ( params. boot_init . is_none ( ) )
313
- . dma_base_address ( Some ( dma_base_address) )
314
- . build ( & gpa_fd, params. complete_memory_layout )
315
+ shared_memory_builder
316
+ . build_guest_memory_mapping (
317
+ & gpa_fd,
318
+ GuestMemoryMapping :: builder ( shared_offset)
319
+ . shared ( true )
320
+ . ignore_registration_failure ( params. boot_init . is_none ( ) )
321
+ . dma_base_address ( Some ( dma_base_address) ) ,
322
+ )
315
323
. context ( "failed to map shared memory" ) ?
316
324
} ) ;
317
325
@@ -365,8 +373,11 @@ pub async fn init(params: &Init<'_>) -> anyhow::Result<MemoryMappings> {
365
373
let private_vtl0_memory = GuestMemory :: new ( "trusted" , vtl0_mapping. clone ( ) ) ;
366
374
367
375
let protector = Arc :: new ( HardwareIsolatedMemoryProtector :: new (
368
- valid_encrypted_memory. clone ( ) ,
369
- valid_shared_memory. clone ( ) ,
376
+ encrypted_memory_builder
377
+ . partition_valid_memory ( )
378
+ . unwrap ( )
379
+ . clone ( ) ,
380
+ valid_shared_memory. unwrap ( ) . clone ( ) ,
370
381
vtl0_mapping. clone ( ) ,
371
382
params. mem_layout . clone ( ) ,
372
383
acceptor. as_ref ( ) . unwrap ( ) . clone ( ) ,
@@ -385,16 +396,22 @@ pub async fn init(params: &Init<'_>) -> anyhow::Result<MemoryMappings> {
385
396
} ) ,
386
397
}
387
398
} else {
399
+ let partition_memory_builder = GuestPartitionMemoryBuilder :: new ( params. mem_layout , None ) ?;
400
+
388
401
tracing:: debug!( "Creating VTL0 guest memory" ) ;
389
402
let vtl0_mapping = {
390
403
let _span = tracing:: info_span!( "map_vtl0_memory" ) . entered ( ) ;
391
404
let base_address = params. vtl0_alias_map_bit . unwrap_or ( 0 ) ;
405
+
392
406
Arc :: new (
393
- GuestMemoryMapping :: builder ( base_address)
394
- . for_kernel_access ( true )
395
- . dma_base_address ( Some ( base_address) )
396
- . ignore_registration_failure ( params. boot_init . is_none ( ) )
397
- . build ( & gpa_fd, params. mem_layout )
407
+ partition_memory_builder
408
+ . build_guest_memory_mapping (
409
+ & gpa_fd,
410
+ GuestMemoryMapping :: builder ( base_address)
411
+ . for_kernel_access ( true )
412
+ . dma_base_address ( Some ( base_address) )
413
+ . ignore_registration_failure ( params. boot_init . is_none ( ) ) ,
414
+ )
398
415
. context ( "failed to map vtl0 memory" ) ?,
399
416
)
400
417
} ;
@@ -424,13 +441,17 @@ pub async fn init(params: &Init<'_>) -> anyhow::Result<MemoryMappings> {
424
441
tracing:: debug!( "Creating VTL 1 memory map" ) ;
425
442
426
443
let _span = tracing:: info_span!( "map_vtl1_memory" ) . entered ( ) ;
427
- let vtl1_mapping = GuestMemoryMapping :: builder ( 0 )
428
- . for_kernel_access ( true )
429
- . dma_base_address ( Some ( 0 ) )
430
- . ignore_registration_failure ( params. boot_init . is_none ( ) )
431
- . build ( & gpa_fd, params. mem_layout )
432
- . context ( "failed to map vtl1 memory" ) ?;
433
- Some ( Arc :: new ( vtl1_mapping) )
444
+ Some ( Arc :: new (
445
+ partition_memory_builder
446
+ . build_guest_memory_mapping (
447
+ & gpa_fd,
448
+ GuestMemoryMapping :: builder ( 0 )
449
+ . for_kernel_access ( true )
450
+ . dma_base_address ( Some ( 0 ) )
451
+ . ignore_registration_failure ( params. boot_init . is_none ( ) ) ,
452
+ )
453
+ . context ( "failed to map vtl1 memory" ) ?,
454
+ ) )
434
455
}
435
456
} else {
436
457
None
0 commit comments