Thank You ! You are right. My pointer was incorrect and your correction fixed 
it Aaron. Next question. I'm trying to use CopyMem.Can I do something like this 
? It's not working right. Type, Length and Handle in my custom struct are 
exactly the same types as in (from Smbios.h)
typedef struct {  EFI_SMBIOS_TYPE   Type;  UINT8             Length;  
EFI_SMBIOS_HANDLE Handle;} EFI_SMBIOS_TABLE_HEADER;

My custom struct:
#pragma pack(1)
typedef struct _GENERAL_INFORMATION{  UINT8             Type;  UINT8            
 Length;  UINT16            Handle;  UINT16            MemberIdentifier;  UINT8 
            MemberName;  UINT8            Field_A  UINT8            Field_B;  
UINT8            Field_C;  UINT8            FIeld_D,  UINT8            
Field_E;} GENERAL_INFORMATION; #pragma pack()
GENERAL_INFORMATION foo;
CopyMem ((VOID *)&foo, (VOID *)&SmbiosRecord, SmbiosRecord->Length);
 Shubha D. ramanishubharam...@gmail.com
shubharam...@yahoo.com 


     On Thursday, July 23, 2015 2:08 PM, "aaron....@congatec.com" 
<aaron....@congatec.com> wrote:
   

 Your usage of pointers was incorrect. Pleasesee 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.  |  6262Ferris Square  |  San Diego CA  92121  |  USA |  
www.congatec.us

Any e-mail sent from congatecmay contain information which is confidential. If 
you are not the intendedrecipient, you may not
disclose, copy or useit; please notify the sender immediately and delete this 
e-mail and anycopies 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] GetNextof 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_HANDLEInSmbiosHandle = 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.efiand saw that indeed such a 
table
with Type=160 is present. I tried other validTypes too, though and the result 
is the same.
 
What I expect to be returned is the EFI_STATUSof “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, Iwould expect EFI_NOT_FOUND. According
To the protocol, this weird 0xB58FBD02 shouldnot be returned for EFI_STATUS.

I did search archives however, and it seemsthat others have had problems with 
Smbios GetNext,
With no resolution that I saw.
 
The following two paths are the Smbios Protocolimplementation 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 protocolat 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 Protocolbecause it’s simple and provides what 
we need.
We would like to avoid the backdoor approachembraced by Smbiosview if possible.
 
Can someone comment on my issue ? Am I usingGetNext 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