MCPcopy Create free account
hub / github.com/Dstack-TEE/dstack / measure_td_hob

Method measure_td_hob

dstack-mr/src/tdvf.rs:429–498  ·  view source on GitHub ↗
(&self, memory_size: u64)

Source from the content-addressed store, hash-verified

427 }
428
429 fn measure_td_hob(&self, memory_size: u64) -> Result<Vec<u8>> {
430 let mut memory_acceptor = MemoryAcceptor::new(0, memory_size);
431 let mut td_hob = Vec::new();
432
433 let mut td_hob_base_addr = 0x809000u64;
434 for s in &self.sections {
435 if let TDVF_SECTION_TD_HOB | TDVF_SECTION_TEMP_MEM = s.sec_type {
436 memory_acceptor.accept(s.memory_address, s.memory_address + s.memory_data_size);
437 }
438 if s.sec_type == TDVF_SECTION_TD_HOB {
439 td_hob_base_addr = s.memory_address;
440 }
441 }
442
443 td_hob.extend_from_slice(&[0x01, 0x00]); // HobType
444 td_hob.extend_from_slice(&56u16.to_le_bytes()); // HobLength
445 td_hob.extend_from_slice(&[0u8; 4]); // Reserved
446 td_hob.extend_from_slice(&9u32.to_le_bytes()); // Version
447 td_hob.extend_from_slice(&[0u8; 4]); // BootMode
448 td_hob.extend_from_slice(&[0u8; 8]); // EfiMemoryTop
449 td_hob.extend_from_slice(&[0u8; 8]); // EfiMemoryBottom
450 td_hob.extend_from_slice(&[0u8; 8]); // EfiFreeMemoryTop
451 td_hob.extend_from_slice(&[0u8; 8]); // EfiFreeMemoryBottom
452 td_hob.extend_from_slice(&[0u8; 8]); // EfiEndOfHobList (placeholder)
453
454 let mut add_memory_resource_hob = |resource_type: u8, start: u64, length: u64| {
455 td_hob.extend_from_slice(&[0x03, 0x00]); // HobType
456 td_hob.extend_from_slice(&48u16.to_le_bytes()); // HobLength
457 td_hob.extend_from_slice(&[0u8; 4]); // Reserved
458 td_hob.extend_from_slice(&[0u8; 16]); // Owner
459 td_hob.extend_from_slice(&resource_type.to_le_bytes());
460 td_hob.extend_from_slice(&[0u8; 3]); // Padding for resource type
461 td_hob.extend_from_slice(&7u32.to_le_bytes()); // ResourceAttribute
462 td_hob.extend_from_slice(&start.to_le_bytes());
463 td_hob.extend_from_slice(&length.to_le_bytes());
464 };
465
466 let (_, last_start, last_end) = memory_acceptor.ranges.pop().context("No ranges")?;
467
468 for (accepted, start, end) in memory_acceptor.ranges {
469 if end < start {
470 bail!("Invalid memory range: end < start");
471 }
472 let size = end - start;
473 if accepted {
474 add_memory_resource_hob(0x00, start, size);
475 } else {
476 add_memory_resource_hob(0x07, start, size);
477 }
478 }
479
480 if last_end < last_start {
481 bail!("Invalid last memory range: end < start");
482 }
483 if memory_size >= 0xB0000000 {
484 if last_start < 0x80000000u64 {
485 add_memory_resource_hob(0x07, last_start, 0x80000000u64 - last_start);
486 }

Callers 1

rtmr0_logMethod · 0.80

Calls 3

measure_sha384Function · 0.85
acceptMethod · 0.45
lenMethod · 0.45

Tested by

no test coverage detected