Your usage of pointers was incorrect. Please see corrected code below:
EFI_STATUS EFIAPI SmbiosMain ( IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable ) { EFI_SMBIOS_PROTOCOL *Smb; EFI_STATUS Status = EFI_SUCCESS; EFI_SMBIOS_HANDLE InSmbiosHandle = 0xFFFE; EFI_SMBIOS_TYPE Type=160; EFI_SMBIOS_TABLE_HEADER *SmbiosRecord = NULL; KNL_GENERAL_INFORMATION knl; UINT16 size = 0; Status = gBS->LocateProtocol (&gEfiSmbiosProtocolGuid, NULL, (VOID **) &Smb); if (EFI_ERROR (Status)) { return Status; } Print(L"Status after gBS->LocateProtocol: %r\n", Status); SmbiosRecord = AllocateZeroPool (sizeof(EFI_SMBIOS_TABLE_HEADER)); Status = Smb->GetNext (Smb, &InSmbiosHandle, &Type, &SmbiosRecord, NULL); Print(L"Status after SmbiosProtocol->GetNext: %r\n", Status); if (EFI_ERROR (Status)) { return Status; } Print(L"Smbios In Handle: %d\n", InSmbiosHandle); Print(L"SmbiosRecord Address : 0X%llx\n", &SmbiosRecord); Print(L"SmbiosRecord->Type : %d\n", SmbiosRecord->Type); Print(L"SmbiosRecord->Length : %d\n\n", SmbiosRecord->Length); Print(L"SmbiosRecord->Handle : %d\n\n", SmbiosRecord->Handle); Print(L"Sizeof SmbiosRecord : %d\n", sizeof(SmbiosRecord)); FreePool (SmbiosRecord); return EFI_SUCCESS; Best Personal Regards, Aaron Pop Senior Software Engineer Phone: +1 858-457-2600 Ext. 318 Fax: +1 858-457-2602 | Email: aaron....@congatec.com congatec, Inc. | 6262 Ferris Square | San Diego CA 92121 | USA | www.congatec.us Any e-mail sent from congatec may contain information which is confidential. If you are not the intended recipient, you may not disclose, copy or use it; please notify the sender immediately and delete this e-mail and any copies from your systems. From: Shubha Ramani <shubharam...@yahoo.com> To: "edk2-devel@lists.sourceforge.net" <edk2-devel@lists.sourceforge.net>, Date: 07/23/2015 02:02 PM Subject: [edk2] GetNext of Smbios protocol not working Please see corrected code below: EFI_STATUS EFIAPI SmbiosMain ( IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable ) { EFI_SMBIOS_PROTOCOL *Smb; EFI_STATUS Status = EFI_SUCCESS; EFI_SMBIOS_HANDLE InSmbiosHandle = 0xFFFE; EFI_SMBIOS_TYPE Type=160; EFI_SMBIOS_TABLE_HEADER *SmbiosRecord = NULL; KNL_GENERAL_INFORMATION knl; UINT16 size = 0; Status = gBS->LocateProtocol (&gEfiSmbiosProtocolGuid, NULL, (VOID **) &Smb); if (EFI_ERROR (Status)) { return Status; } Print(L"Status after gBS->LocateProtocol: %r\n", Status); SmbiosRecord = AllocateZeroPool (sizeof(EFI_SMBIOS_TABLE_HEADER)); Status = Smb->GetNext (&Smb, &InSmbiosHandle, &Type, &SmbiosRecord, NULL); Print(L"Status after SmbiosProtocol->GetNext: %r\n", Status); if (EFI_ERROR (Status)) { return Status; } Print(L"Smbios In Handle: %d\n", InSmbiosHandle); Print(L"SmbiosRecord Address : 0X%llx\n", &SmbiosRecord); Print(L"SmbiosRecord->Type : %d\n", SmbiosRecord->Type); Print(L"SmbiosRecord->Length : %d\n\n", SmbiosRecord->Length); Print(L"SmbiosRecord->Handle : %d\n\n", SmbiosRecord->Handle); Print(L"Sizeof SmbiosRecord : %d\n", sizeof(SmbiosRecord)); FreePool (SmbiosRecord); return EFI_SUCCESS; Please see my code below. If you’ll notice, I’m passing In EFI_SMBIOS_HANDLE InSmbiosHandle = 0xFFFE; EFI_SMBIOS_TYPE Type=160; Which is as the header file “Smbios.h” and the protocol implementation “SmbiosDxe.c” Instruct. According to my understanding, GetNext should return the address of the First table whose Type=160. I used SmbiosView.efi and saw that indeed such a table with Type=160 is present. I tried other valid Types too, though and the result is the same. What I expect to be returned is the EFI_STATUS of “Success” and the correct Address for the SmbiosRecord with type=160. I’m getting neither. I’m getting an EFI_STATUS Code of 0xB58FBD02. At the very least, I would expect EFI_NOT_FOUND. According To the protocol, this weird 0xB58FBD02 should not be returned for EFI_STATUS. I did search archives however, and it seems that others have had problems with Smbios GetNext, With no resolution that I saw. The following two paths are the Smbios Protocol implementation in the latest EDK2 repo: C:\edk2\MyWorkspace\MdeModulePkg\Universal\SmbiosDxe\SmbiosDxe.c C:\edk2\MyWorkspace\MdeModulePkg\Universal\SmbiosDxe\Smbios.h There is also a shell tool C:\edk2\MyWorkspace\ShellPkg\Library\UefiShellDebug1CommandsLib\Sm biosView which does not use the Smbios protocol at all. It seems to use a backdoor approach of internal data structures. I wonder why ? Is this because the Smbios protocol doesn’t work ? We would like to use the Smbios Protocol because it’s simple and provides what we need. We would like to avoid the backdoor approach embraced by Smbiosview if possible. Can someone comment on my issue ? Am I using GetNext incorrectly ? EFI_STATUS EFIAPI SmbiosMain ( IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable ) { EFI_SMBIOS_PROTOCOL Smb; EFI_STATUS Status = EFI_SUCCESS; EFI_SMBIOS_HANDLE InSmbiosHandle = 0xFFFE; EFI_SMBIOS_TYPE Type=160; EFI_SMBIOS_TABLE_HEADER *SmbiosRecord = NULL; KNL_GENERAL_INFORMATION knl; UINT16 size = 0; Status = gBS->LocateProtocol (&gEfiSmbiosProtocolGuid, NULL, (VOID **) &Smb); if (EFI_ERROR (Status)) { return Status; } Print(L"Status after gBS->LocateProtocol: %r\n", Status); SmbiosRecord = AllocateZeroPool (sizeof(EFI_SMBIOS_TABLE_HEADER)); Status = Smb.GetNext (&Smb, &InSmbiosHandle, &Type, &SmbiosRecord, NULL); Print(L"Status after SmbiosProtocol->GetNext: %r\n", Status); if (EFI_ERROR (Status)) { return Status; } Print(L"Smbios In Handle: %d\n", InSmbiosHandle); Print(L"SmbiosRecord Address : 0X%llx\n", &SmbiosRecord); Print(L"SmbiosRecord->Type : %d\n", SmbiosRecord->Type); Print(L"SmbiosRecord->Length : %d\n\n", SmbiosRecord->Length); Print(L"SmbiosRecord->Handle : %d\n\n", SmbiosRecord->Handle); Print(L"Sizeof SmbiosRecord : %d\n", sizeof(SmbiosRecord)); FreePool (SmbiosRecord); return EFI_SUCCESS; Shubha D. Ramani shubharam...@gmail.com shubharam...@yahoo.com ------------------------------------------------------------------------------ _______________________________________________ edk2-devel mailing list edk2-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/edk2-devel
------------------------------------------------------------------------------
_______________________________________________ edk2-devel mailing list edk2-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/edk2-devel