SMBIOS_STRUCTURE_POINTER GetSmbiosTableFromType ( IN SMBIOS_TABLE_ENTRY_POINT *Smbios, IN UINT8 Type, IN UINTN Index ) { SMBIOS_STRUCTURE_POINTER SmbiosTable; UINTN SmbiosTypeIndex; SmbiosTypeIndex = 0; SmbiosTable.Raw = (UINT8 *)(UINTN)Smbios->TableAddress; if (SmbiosTable.Raw == NULL) { return SmbiosTable; } while ((SmbiosTypeIndex != Index) || (SmbiosTable.Hdr->Type != Type)) { if (SmbiosTable.Hdr->Type == 127) { SmbiosTable.Raw = NULL; return SmbiosTable; } if (SmbiosTable.Hdr->Type == Type) { SmbiosTypeIndex ++; } SmbiosTable.Raw = (UINT8 *)(SmbiosTable.Raw + SmbiosTableLength (SmbiosTable)); } return SmbiosTable; }
/** Install all structures from the given SMBIOS structures block @param Smbios SMBIOS protocol @param TableAddress SMBIOS tables starting address **/ EFI_STATUS InstallAllStructures ( IN EFI_SMBIOS_PROTOCOL *Smbios, IN UINT8 *TableAddress ) { EFI_STATUS Status; SMBIOS_STRUCTURE_POINTER SmbiosTable; EFI_SMBIOS_HANDLE SmbiosHandle; BOOLEAN NeedSmbiosType0; SmbiosTable.Raw = TableAddress; if (SmbiosTable.Raw == NULL) { return EFI_INVALID_PARAMETER; } NeedSmbiosType0 = TRUE; while (SmbiosTable.Hdr->Type != 127) { // // Log the SMBIOS data for this structure // SmbiosHandle = SmbiosTable.Hdr->Handle; Status = Smbios->Add ( Smbios, NULL, &SmbiosHandle, (EFI_SMBIOS_TABLE_HEADER*) SmbiosTable.Raw ); ASSERT_EFI_ERROR (Status); if (SmbiosTable.Hdr->Type == 0) { NeedSmbiosType0 = FALSE; } // // Get the next structure address // SmbiosTable.Raw = (UINT8 *)(SmbiosTable.Raw + SmbiosTableLength (SmbiosTable)); } if (NeedSmbiosType0) { // // Add OVMF default Type 0 (BIOS Information) table // SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED; Status = Smbios->Add ( Smbios, NULL, &SmbiosHandle, (EFI_SMBIOS_TABLE_HEADER*) &mOvmfDefaultType0 ); ASSERT_EFI_ERROR (Status); } return EFI_SUCCESS; }
/** Install all structures from the given SMBIOS structures block @param Smbios SMBIOS protocol @param EntryPointStructure SMBIOS entry point structures block **/ EFI_STATUS InstallAllStructures ( IN EFI_SMBIOS_PROTOCOL *Smbios, IN SMBIOS_TABLE_ENTRY_POINT *EntryPointStructure ) { EFI_STATUS Status; SMBIOS_STRUCTURE_POINTER SmbiosTable; EFI_SMBIOS_HANDLE SmbiosHandle; SmbiosTable.Raw = (UINT8*)(UINTN) EntryPointStructure->TableAddress; if (SmbiosTable.Raw == NULL) { return EFI_INVALID_PARAMETER; } while (SmbiosTable.Hdr->Type != 127) { // // Log the SMBIOS data for this structure // SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED; Status = Smbios->Add ( Smbios, NULL, &SmbiosHandle, (EFI_SMBIOS_TABLE_HEADER*) SmbiosTable.Raw ); ASSERT_EFI_ERROR (Status); // // Get the next structure address // SmbiosTable.Raw = (UINT8 *)(SmbiosTable.Raw + SmbiosTableLength (SmbiosTable)); } return EFI_SUCCESS; }