MCPcopy Index your code
hub / github.com/FrameworkComputer/framework-system / parse_me_fvi_version

Function parse_me_fvi_version

framework_lib/src/csme.rs:542–603  ·  view source on GitHub ↗

Parse ME version from FVI table Returns the highest major version found from components 1, 2, or 3 (ME version is typically higher than reference code versions)

(raw: &RawStructure, valid_handles: &[u16])

Source from the content-addressed store, hash-verified

540/// Returns the highest major version found from components 1, 2, or 3
541/// (ME version is typically higher than reference code versions)
542fn parse_me_fvi_version(raw: &RawStructure, valid_handles: &[u16]) -> Option<MeFviVersion> {
543 if raw.info != InfoType::Oem(SMBIOS_TYPE_ME_FVI) {
544 return None;
545 }
546
547 let handle = raw.handle;
548 let length = raw.length as usize;
549
550 let is_valid_handle = if valid_handles.is_empty() {
551 handle == SMBIOS_DD_HANDLE_ME || handle == SMBIOS_DD_HANDLE_ME2
552 } else {
553 valid_handles.contains(&handle)
554 };
555
556 if !is_valid_handle {
557 return None;
558 }
559
560 let count = raw.get::<u8>(4).ok()?;
561 if count == 0 {
562 return None;
563 }
564
565 let record_size = 7;
566 let records_offset = 5;
567
568 let mut best_version: Option<MeFviVersion> = None;
569
570 for i in 0..count {
571 let offset = records_offset + (i as usize * record_size);
572 if offset + record_size > length {
573 break;
574 }
575
576 let component_name = raw.get::<u8>(offset).ok()?;
577
578 // Check components 1, 2, and 3 - ME version location varies by system
579 if component_name == 1 || component_name == 2 || component_name == 3 {
580 let major = raw.get::<u8>(offset + 2).ok()?;
581 let minor = raw.get::<u8>(offset + 3).ok()?;
582 let patch = raw.get::<u8>(offset + 4).ok()?;
583 let build = raw.get::<u16>(offset + 5).ok()?;
584
585 // Skip invalid versions (all 0xFF)
586 if major == 0xFF && minor == 0xFF && patch == 0xFF {
587 continue;
588 }
589
590 // Keep the highest major version (ME version is typically higher than reference code)
591 if best_version.is_none() || major > best_version.as_ref().unwrap().major {
592 best_version = Some(MeFviVersion {
593 major,
594 minor,
595 patch,
596 build,
597 });
598 }
599 }

Callers 1

me_version_from_smbiosFunction · 0.85

Calls

no outgoing calls

Tested by

no test coverage detected