UEFI SMBIOS系列文章目录
UEFI 之SMBIOS解析系列1——SMBIOS概述
UEFI 之SMBIOS解析系列2——SMBIOS源码分析(上)
文章目录
- UEFI SMBIOS系列文章目录
- 前言
- 一、SmbiosAdd函数
- 二、SmbiosUpdateString 函数
- 三、SmbiosRemove 函数
- 总结
前言
上一章节,我们主要讲了SMBIOS源码中增删改查涉及的数据结构和内部结构之间的数据组织关系,今天,我们继续分析SMBIOS源码中的增删改查涉及的操作函数,深入理解背后实现的逻辑。
一、SmbiosAdd函数
SmbiosAdd函数增加一个新的SMBIOS type内容在DataListHead 链表中,同时增加一个新的SMBIOS句柄在AllocatedHandleListHead 链表中。
SmbiosAdd代码实现和注释:
EFI_STATUS
EFIAPI
SmbiosAdd (
IN CONST EFI_SMBIOS_PROTOCOL *This,
IN EFI_HANDLE ProducerHandle, OPTIONAL
IN OUT EFI_SMBIOS_HANDLE *SmbiosHandle,
IN EFI_SMBIOS_TABLE_HEADER *Record
)
{
VOID *Raw;
UINTN TotalSize;
UINTN RecordSize;
UINTN StructureSize;
UINTN NumberOfStrings;
EFI_STATUS Status;
LIST_ENTRY *Head;
SMBIOS_INSTANCE *Private;
EFI_SMBIOS_ENTRY *SmbiosEntry;
EFI_SMBIOS_HANDLE MaxSmbiosHandle;
SMBIOS_HANDLE_ENTRY *HandleEntry;
EFI_SMBIOS_RECORD_HEADER *InternalRecord;
BOOLEAN Smbios32BitTable;
BOOLEAN Smbios64BitTable;
if (SmbiosHandle == NULL) {
return EFI_INVALID_PARAMETER;
}
Private = SMBIOS_INSTANCE_FROM_THIS (This);
// 检查入参SmbiosHandle是否已经被使用(在AllocatedHandleListHead 链表中查找)
Head = &Private->AllocatedHandleListHead;
if (*SmbiosHandle != SMBIOS_HANDLE_PI_RESERVED && CheckSmbiosHandleExistance(Head, *SmbiosHandle)) {
return EFI_ALREADY_STARTED;
}
// 当入参SmbiosHandle=0xFFFE, 分配一个可使用的SmbiosHandle
if (*SmbiosHandle == SMBIOS_HANDLE_PI_RESERVED) {
Status = GetAvailableSmbiosHandle(This, SmbiosHandle);
if (EFI_ERROR(Status)) {
return Status;
}
} else {
// 检查入参SmbiosHandle是否有效
GetMaxSmbiosHandle(This, &MaxSmbiosHandle);
if (*SmbiosHandle > MaxSmbiosHandle) {
return EFI_INVALID_PARAMETER;
}
}
// 计算添加的smbios type数据的大小StructureSize和包含的字符串个数NumberOfStrings
Status = GetSmbiosStructureSize(This, Record, &StructureSize, &NumberOfStrings);
if (EFI_ERROR(Status)) {
return Status;
}

4301

被折叠的 条评论
为什么被折叠?



