(&self, memory_size: u64)
| 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 | } |
no test coverage detected