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

Reply via email to