mirror of
https://github.com/acidanthera/audk.git
synced 2025-07-28 16:14:04 +02:00
Add core SMBIOS 2.7.0 and 2.7.1 support.
Signed-off-by: lzeng14 Reviewed-by: li-elvin git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@11690 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
parent
7ddba202a5
commit
afe3969cdc
@ -397,7 +397,7 @@
|
|||||||
gEfiMdeModulePkgTokenSpaceGuid.PcdLoadModuleAtFixAddressEnable|0|UINT64|0x30001015
|
gEfiMdeModulePkgTokenSpaceGuid.PcdLoadModuleAtFixAddressEnable|0|UINT64|0x30001015
|
||||||
|
|
||||||
## Smbios version
|
## Smbios version
|
||||||
gEfiMdeModulePkgTokenSpaceGuid.PcdSmbiosVersion|0x0206|UINT16|0x00010055
|
gEfiMdeModulePkgTokenSpaceGuid.PcdSmbiosVersion|0x0207|UINT16|0x00010055
|
||||||
|
|
||||||
## TFTP BlockSize. Initial value 0 means using default block size which is (MTU-IP_HEADER-UDP_HEADER-TFTP_HEADER)
|
## TFTP BlockSize. Initial value 0 means using default block size which is (MTU-IP_HEADER-UDP_HEADER-TFTP_HEADER)
|
||||||
# to handle all link layers. If the value is non zero, the PCD value will be used as block size.
|
# to handle all link layers. If the value is non zero, the PCD value will be used as block size.
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
This code produces the Smbios protocol. It also responsible for constructing
|
This code produces the Smbios protocol. It also responsible for constructing
|
||||||
SMBIOS table into system table.
|
SMBIOS table into system table.
|
||||||
|
|
||||||
Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>
|
Copyright (c) 2009 - 2011, Intel Corporation. All rights reserved.<BR>
|
||||||
This program and the accompanying materials
|
This program and the accompanying materials
|
||||||
are licensed and made available under the terms and conditions of the BSD License
|
are licensed and made available under the terms and conditions of the BSD License
|
||||||
which accompanies this distribution. The full text of the license may be found at
|
which accompanies this distribution. The full text of the license may be found at
|
||||||
@ -107,6 +107,7 @@ SMBIOS_TABLE_ENTRY_POINT EntryPointStructureData = {
|
|||||||
|
|
||||||
Get the full size of smbios structure including optional strings that follow the formatted structure.
|
Get the full size of smbios structure including optional strings that follow the formatted structure.
|
||||||
|
|
||||||
|
@param This The EFI_SMBIOS_PROTOCOL instance.
|
||||||
@param Head Pointer to the beginning of smbios structure.
|
@param Head Pointer to the beginning of smbios structure.
|
||||||
@param Size The returned size.
|
@param Size The returned size.
|
||||||
@param NumberOfStrings The returned number of optional strings that follow the formatted structure.
|
@param NumberOfStrings The returned number of optional strings that follow the formatted structure.
|
||||||
@ -118,6 +119,7 @@ SMBIOS_TABLE_ENTRY_POINT EntryPointStructureData = {
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
GetSmbiosStructureSize (
|
GetSmbiosStructureSize (
|
||||||
|
IN CONST EFI_SMBIOS_PROTOCOL *This,
|
||||||
IN EFI_SMBIOS_TABLE_HEADER *Head,
|
IN EFI_SMBIOS_TABLE_HEADER *Head,
|
||||||
OUT UINTN *Size,
|
OUT UINTN *Size,
|
||||||
OUT UINTN *NumberOfStrings
|
OUT UINTN *NumberOfStrings
|
||||||
@ -145,6 +147,7 @@ GetSmbiosStructureSize (
|
|||||||
CharInStr++;
|
CharInStr++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (This->MajorVersion < 2 || (This->MajorVersion == 2 && This->MinorVersion < 7)){
|
||||||
for (StrLen = 0 ; StrLen < SMBIOS_STRING_MAX_LENGTH; StrLen++) {
|
for (StrLen = 0 ; StrLen < SMBIOS_STRING_MAX_LENGTH; StrLen++) {
|
||||||
if (*(CharInStr+StrLen) == 0) {
|
if (*(CharInStr+StrLen) == 0) {
|
||||||
break;
|
break;
|
||||||
@ -154,6 +157,17 @@ GetSmbiosStructureSize (
|
|||||||
if (StrLen == SMBIOS_STRING_MAX_LENGTH) {
|
if (StrLen == SMBIOS_STRING_MAX_LENGTH) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
//
|
||||||
|
// Reference SMBIOS 2.7, chapter 6.1.3, it will have no limit on the length of each individual text string
|
||||||
|
//
|
||||||
|
for (StrLen = 0 ;; StrLen++) {
|
||||||
|
if (*(CharInStr+StrLen) == 0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// forward the pointer
|
// forward the pointer
|
||||||
//
|
//
|
||||||
@ -335,7 +349,7 @@ SmbiosAdd (
|
|||||||
//
|
//
|
||||||
// Calculate record size and string number
|
// Calculate record size and string number
|
||||||
//
|
//
|
||||||
Status = GetSmbiosStructureSize(Record, &StructureSize, &NumberOfStrings);
|
Status = GetSmbiosStructureSize(This, Record, &StructureSize, &NumberOfStrings);
|
||||||
if (EFI_ERROR(Status)) {
|
if (EFI_ERROR(Status)) {
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
@ -459,9 +473,15 @@ SmbiosUpdateString (
|
|||||||
}
|
}
|
||||||
|
|
||||||
InputStrLen = AsciiStrLen(String);
|
InputStrLen = AsciiStrLen(String);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Reference SMBIOS 2.7, chapter 6.1.3, it will have no limit on the length of each individual text string
|
||||||
|
//
|
||||||
|
if (This->MajorVersion < 2 || (This->MajorVersion == 2 && This->MinorVersion < 7)) {
|
||||||
if (InputStrLen > SMBIOS_STRING_MAX_LENGTH) {
|
if (InputStrLen > SMBIOS_STRING_MAX_LENGTH) {
|
||||||
return EFI_UNSUPPORTED;
|
return EFI_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Private = SMBIOS_INSTANCE_FROM_THIS (This);
|
Private = SMBIOS_INSTANCE_FROM_THIS (This);
|
||||||
//
|
//
|
||||||
@ -477,7 +497,7 @@ SmbiosUpdateString (
|
|||||||
SmbiosEntry = SMBIOS_ENTRY_FROM_LINK(Link);
|
SmbiosEntry = SMBIOS_ENTRY_FROM_LINK(Link);
|
||||||
Record = (EFI_SMBIOS_TABLE_HEADER*)(SmbiosEntry->RecordHeader + 1);
|
Record = (EFI_SMBIOS_TABLE_HEADER*)(SmbiosEntry->RecordHeader + 1);
|
||||||
|
|
||||||
if ((UINTN)Record->Handle == *SmbiosHandle) {
|
if (Record->Handle == *SmbiosHandle) {
|
||||||
//
|
//
|
||||||
// Find out the specified Smbios record
|
// Find out the specified Smbios record
|
||||||
//
|
//
|
||||||
@ -488,7 +508,7 @@ SmbiosUpdateString (
|
|||||||
//
|
//
|
||||||
// Point to unformed string section
|
// Point to unformed string section
|
||||||
//
|
//
|
||||||
StrStart = (CHAR8*)Record + Record->Length;
|
StrStart = (CHAR8 *) Record + Record->Length;
|
||||||
|
|
||||||
for (StrIndex = 1, TargetStrOffset = 0; StrIndex < *StringNumber; StrStart++, TargetStrOffset++) {
|
for (StrIndex = 1, TargetStrOffset = 0; StrIndex < *StringNumber; StrStart++, TargetStrOffset++) {
|
||||||
//
|
//
|
||||||
@ -508,8 +528,8 @@ SmbiosUpdateString (
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (*StrStart == 0) {
|
if (*StrStart == 0) {
|
||||||
StrStart ++;
|
StrStart++;
|
||||||
TargetStrOffset ++;
|
TargetStrOffset++;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
@ -625,7 +645,7 @@ SmbiosRemove (
|
|||||||
for (Link = Head->ForwardLink; Link != Head; Link = Link->ForwardLink) {
|
for (Link = Head->ForwardLink; Link != Head; Link = Link->ForwardLink) {
|
||||||
SmbiosEntry = SMBIOS_ENTRY_FROM_LINK(Link);
|
SmbiosEntry = SMBIOS_ENTRY_FROM_LINK(Link);
|
||||||
Record = (EFI_SMBIOS_TABLE_HEADER*)(SmbiosEntry->RecordHeader + 1);
|
Record = (EFI_SMBIOS_TABLE_HEADER*)(SmbiosEntry->RecordHeader + 1);
|
||||||
if ((UINTN)Record->Handle == SmbiosHandle) {
|
if (Record->Handle == SmbiosHandle) {
|
||||||
//
|
//
|
||||||
// Remove specified smobios record from DataList
|
// Remove specified smobios record from DataList
|
||||||
//
|
//
|
||||||
@ -637,7 +657,7 @@ SmbiosRemove (
|
|||||||
Head = &Private->AllocatedHandleListHead;
|
Head = &Private->AllocatedHandleListHead;
|
||||||
for (Link = Head->ForwardLink; Link != Head; Link = Link->ForwardLink) {
|
for (Link = Head->ForwardLink; Link != Head; Link = Link->ForwardLink) {
|
||||||
HandleEntry = SMBIOS_HANDLE_ENTRY_FROM_LINK(Link);
|
HandleEntry = SMBIOS_HANDLE_ENTRY_FROM_LINK(Link);
|
||||||
if ((UINTN)HandleEntry->SmbiosHandle == SmbiosHandle) {
|
if (HandleEntry->SmbiosHandle == SmbiosHandle) {
|
||||||
RemoveEntryList(Link);
|
RemoveEntryList(Link);
|
||||||
FreePool(HandleEntry);
|
FreePool(HandleEntry);
|
||||||
break;
|
break;
|
||||||
@ -765,9 +785,7 @@ SmbiosCreateTable (
|
|||||||
OUT VOID **TableEntryPointStructure
|
OUT VOID **TableEntryPointStructure
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
UINT8 CheckSum;
|
|
||||||
UINT8 *BufferPointer;
|
UINT8 *BufferPointer;
|
||||||
UINTN Index;
|
|
||||||
UINTN RecordSize;
|
UINTN RecordSize;
|
||||||
UINTN NumOfStr;
|
UINTN NumOfStr;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
@ -779,7 +797,6 @@ SmbiosCreateTable (
|
|||||||
|
|
||||||
Status = EFI_SUCCESS;
|
Status = EFI_SUCCESS;
|
||||||
BufferPointer = NULL;
|
BufferPointer = NULL;
|
||||||
CheckSum = 0;
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Initialize the EntryPointStructure with initial values.
|
// Initialize the EntryPointStructure with initial values.
|
||||||
@ -847,11 +864,11 @@ SmbiosCreateTable (
|
|||||||
);
|
);
|
||||||
|
|
||||||
if (Status == EFI_SUCCESS) {
|
if (Status == EFI_SUCCESS) {
|
||||||
GetSmbiosStructureSize(SmbiosRecord, &RecordSize, &NumOfStr);
|
GetSmbiosStructureSize(SmbiosProtocol, SmbiosRecord, &RecordSize, &NumOfStr);
|
||||||
//
|
//
|
||||||
// Record NumberOfSmbiosStructures, TableLength and MaxStructureSize
|
// Record NumberOfSmbiosStructures, TableLength and MaxStructureSize
|
||||||
//
|
//
|
||||||
EntryPointStructure->NumberOfSmbiosStructures ++;
|
EntryPointStructure->NumberOfSmbiosStructures++;
|
||||||
EntryPointStructure->TableLength = (UINT16) (EntryPointStructure->TableLength + RecordSize);
|
EntryPointStructure->TableLength = (UINT16) (EntryPointStructure->TableLength + RecordSize);
|
||||||
if (RecordSize > EntryPointStructure->MaxStructureSize) {
|
if (RecordSize > EntryPointStructure->MaxStructureSize) {
|
||||||
EntryPointStructure->MaxStructureSize = (UINT16) RecordSize;
|
EntryPointStructure->MaxStructureSize = (UINT16) RecordSize;
|
||||||
@ -885,7 +902,7 @@ SmbiosCreateTable (
|
|||||||
&PhysicalAddress
|
&PhysicalAddress
|
||||||
);
|
);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
FreePages ((VOID*)(UINTN)EntryPointStructure, EFI_SIZE_TO_PAGES (EntryPointStructure->TableLength));
|
FreePages ((VOID*) EntryPointStructure, EFI_SIZE_TO_PAGES (sizeof (SMBIOS_TABLE_ENTRY_POINT)));
|
||||||
EntryPointStructure = NULL;
|
EntryPointStructure = NULL;
|
||||||
return EFI_OUT_OF_RESOURCES;
|
return EFI_OUT_OF_RESOURCES;
|
||||||
}
|
}
|
||||||
@ -906,7 +923,7 @@ SmbiosCreateTable (
|
|||||||
NULL
|
NULL
|
||||||
);
|
);
|
||||||
if (Status == EFI_SUCCESS) {
|
if (Status == EFI_SUCCESS) {
|
||||||
GetSmbiosStructureSize(SmbiosRecord, &RecordSize, &NumOfStr);
|
GetSmbiosStructureSize(SmbiosProtocol, SmbiosRecord, &RecordSize, &NumOfStr);
|
||||||
CopyMem (BufferPointer, SmbiosRecord, RecordSize);
|
CopyMem (BufferPointer, SmbiosRecord, RecordSize);
|
||||||
BufferPointer = BufferPointer + RecordSize;
|
BufferPointer = BufferPointer + RecordSize;
|
||||||
}
|
}
|
||||||
@ -920,21 +937,10 @@ SmbiosCreateTable (
|
|||||||
//
|
//
|
||||||
// Fixup checksums in the Entry Point Structure
|
// Fixup checksums in the Entry Point Structure
|
||||||
//
|
//
|
||||||
CheckSum = 0;
|
EntryPointStructure->IntermediateChecksum =
|
||||||
EntryPointStructure->IntermediateChecksum = 0;
|
CalculateCheckSum8 ((UINT8 *) EntryPointStructure + 0x10, EntryPointStructure->EntryPointLength - 0x10);
|
||||||
for (Index = 0x10; Index < EntryPointStructure->EntryPointLength; Index++) {
|
EntryPointStructure->EntryPointStructureChecksum =
|
||||||
CheckSum = (UINT8) (CheckSum + ((UINT8 *) (EntryPointStructure))[Index]);
|
CalculateCheckSum8 ((UINT8 *) EntryPointStructure, EntryPointStructure->EntryPointLength);
|
||||||
}
|
|
||||||
|
|
||||||
EntryPointStructure->IntermediateChecksum = (UINT8) (0 - CheckSum);
|
|
||||||
|
|
||||||
CheckSum = 0;
|
|
||||||
EntryPointStructure->EntryPointStructureChecksum = 0;
|
|
||||||
for (Index = 0x0; Index < EntryPointStructure->EntryPointLength; Index++) {
|
|
||||||
CheckSum = (UINT8) (CheckSum + ((UINT8 *) (EntryPointStructure))[Index]);
|
|
||||||
}
|
|
||||||
|
|
||||||
EntryPointStructure->EntryPointStructureChecksum = (UINT8) (0 - CheckSum);
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Returns the pointer
|
// Returns the pointer
|
||||||
|
Loading…
x
Reference in New Issue
Block a user