aboutsummaryrefslogtreecommitdiffstats
path: root/Lessons/Lesson_27/UefiLessonsPkg/SmbiosInfo/SmbiosInfo.c
blob: b75026d768d258ab6b6a6c5d9557e5aa1ff69f23 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#include <Library/UefiBootServicesTableLib.h>
#include <Library/UefiLib.h>

#include <Library/BaseMemoryLib.h>
#include <Protocol/Smbios.h>

CHAR8* GetRecordString(EFI_SMBIOS_TABLE_HEADER* Record, UINTN number)
{
  if (!number)
    return "";

  CHAR8* String = (CHAR8*)Record + Record->Length;
  UINTN i=1;
  while (i < number) {
    String = String + AsciiStrSize(String);
    i++;
  }
  return String;
}

EFI_STATUS
EFIAPI
UefiMain (
  IN EFI_HANDLE        ImageHandle,
  IN EFI_SYSTEM_TABLE  *SystemTable
  )
{
  for (UINTN i=0; i<SystemTable->NumberOfTableEntries; i++) {
    if (CompareGuid(&(SystemTable->ConfigurationTable[i].VendorGuid), &gEfiSmbiosTableGuid)) {
      Print(L"SMBIOS table is placed at %p\n\n", SystemTable->ConfigurationTable[i].VendorTable);
    }
  } 

  EFI_SMBIOS_PROTOCOL* SmbiosProtocol;
  EFI_STATUS Status = gBS->LocateProtocol (
                  &gEfiSmbiosProtocolGuid,
                  NULL,
                  (VOID**)&SmbiosProtocol
                  );
  if (EFI_ERROR (Status)) {
    return Status;
  }

  EFI_SMBIOS_HANDLE SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;
  EFI_SMBIOS_TABLE_HEADER* Record;
  Status = SmbiosProtocol->GetNext(SmbiosProtocol,
                                   &SmbiosHandle,
                                   NULL,
                                   &Record,
                                   NULL);
  while (!EFI_ERROR(Status)) {
    Print (L"SMBIOS Type %d \n", Record->Type);
    switch (Record->Type) {
      case EFI_SMBIOS_TYPE_BIOS_INFORMATION: {
        SMBIOS_TABLE_TYPE0* Type0Record = (SMBIOS_TABLE_TYPE0*) Record;
        Print(L"\tVendor=%a\n", GetRecordString(Record, Type0Record->Vendor));
        Print(L"\tBiosVersion=%a\n", GetRecordString(Record, Type0Record->BiosVersion));
        Print(L"\tBiosReleaseDate=%a\n", GetRecordString(Record, Type0Record->BiosReleaseDate));
        Print(L"\tBiosSegment=0x%x\n", Type0Record->BiosSegment);
        Print(L"\tSystemBiosMajorRelease=0x%x\n", Type0Record->SystemBiosMajorRelease);
        Print(L"\tSystemBiosMinorRelease=0x%x\n", Type0Record->SystemBiosMinorRelease);
        break;
      }
      case EFI_SMBIOS_TYPE_SYSTEM_INFORMATION: {
        SMBIOS_TABLE_TYPE1* Type1Record = (SMBIOS_TABLE_TYPE1*) Record;
        Print(L"\tManufacturer=%a\n", GetRecordString(Record, Type1Record->Manufacturer));
        Print(L"\tProductName=%a\n", GetRecordString(Record, Type1Record->ProductName));
        Print(L"\tVersion=%a\n", GetRecordString(Record, Type1Record->Version));
        Print(L"\tSerialNumber=%a\n", GetRecordString(Record, Type1Record->SerialNumber));
        Print(L"\tUUID=%g\n", Type1Record->Uuid);
        Print(L"\tWakeUpType=%d\n", Type1Record->WakeUpType);
        Print(L"\tSKUNumber=%a\n", GetRecordString(Record, Type1Record->SKUNumber));
        Print(L"\tFamily=%a\n", GetRecordString(Record, Type1Record->Family));
        break;
      }
      default:
        Print(L"\tTODO: Parsing for this table is not ready yet\n");
        break;
    }
    Status = SmbiosProtocol->GetNext(SmbiosProtocol,
                                     &SmbiosHandle,
                                     NULL,
                                     &Record,
                                     NULL);
  }
  
  return EFI_SUCCESS;
}