【BIOS】Win从零开始搭建EDK II环境
一、效果体验
运行效果
二、官网说明
地址:https://github.com/tianocore/tianocore.github.io/wiki/Getting-Started-with-EDK-II
Getting Started with EDK II
三、环境准备
1、win10 x86_64位
pc环境
2、VS2017
下载vs2017专业版 (地址:https://msdn.itellyou.cn/)

下载Visual Studio Professional 2017
3、Python3.7.8
下载python3.7.8 (地址:https://www.python.org/downloads/windows/)
安装到C:\Python
下载Python 3.7.8
注意:安装的目录名不要有空格。
4、IASL
下载地址:https://acpica.org/sites/acpica/files/iasl-win-20200717.zip
解压到C:\IASL
下载IASL
5、NASM
官网版本库:https://www.nasm.us/pub/nasm/releasebuilds/?C=M;O=D
下载地址:https://www.nasm.us/pub/nasm/releasebuilds/2.15.02/win64/
安装到C:\NASM
下载nasm-2.15.02-installer-x64.exe
6、EDK II源码
下载源码 :https://github.com/tianocore/edk2/tags
本节使用的是:edk2-stable202002版本
解压到自己的工作目录
下载edk2-stable202002
Laurie Jarlstrom 编辑了此页面 2019 年 5 月 11 日 · 14次修订
下载和编译代码
本页展示了从 GitHub下载EDK II并在各种 OS/编译器环境下编译项目的步骤。
如何设置本地 EDK II 树
支持并记录了多种构建环境。如果没有针对您的确切系统配置的说明,您仍然可以调整说明以在您的系统上工作。
- Linux:将 EDK II 与 Native GCC 结合使用(推荐用于当前版本的 Linux)
- 微软视窗:视窗系统(Win7/8/8.1/10)
- Mac OS X:Xcode
- UNIX:类 Unix 系统(对于非 Linux UNIX、较旧的 Linux 发行版或使用 Cygwin 时)
注意:根据项目或包,可能需要其他一些构建工具:
- 纳斯姆
- ASL 编译器
- 安装 Python 3.7 或更高版本 ( https://www.python.org/ ) 以从源代码运行 python 工具
- Python 2.7.10 或更高版本仍可与 PYTHON_HOME 一起使用
注意:一些示例使用Multiple_Workspace `PACKAGES_PATH` 特性来配置 EDK II 构建环境。例如,这是使用基于 edk2-platforms 的平台代码所必需的:(https://github.com/tianocore/edk2-platforms)。
运行基本构建环境后,您可以在 RELEASE 或DEBUG模式下构建项目。
GitHub 帮助
GitHub ( https://help.github.com/index.html ) 提供用户注册的分步说明和 GitHub 支持的基本功能
- 为 Linux/Windows/MAC 设置 GitHub ( https://help.github.com/articles/set-up-git )
- 下载并安装一个 git GUI 界面:git GUI Clients ( https://git-scm.com/download/gui/win ) | TortoiseGit ( https://tortoisegit.org/ )
GitHub EDK II 项目存储库
- EDK II 项目存储库可从https://github.com/tianocore/edk2 获得。
- 预构建的 Windows 工具可在https://github.com/tianocore/edk2-BaseTools-win32 获得。
- EDK II 平台可在https://github.com/tianocore/edk2-platforms 获得。
- 未根据公认的开源许可发布的内容可以在https://github.com/tianocore/edk2-non-osi找到。
EDK II 开发流程
设置构建环境后,请参阅 EDK II 开发流程以对 EDK II 项目做出贡献。
进一步帮助
如果您对代码有疑问或遇到障碍,请加入 EDK II 开发人员邮件列表 并在列表中询问您的 EDK II 相关问题。
有关编写简单 UEFI EDK II 应用程序的信息,请参阅:开始编写简单应用程序
要查看 .DSC、.DEC 和 .INF 文件的基本设置,请参阅:构建描述文件
视窗系统
此页面提供逐步说明或在 Windows 系统上设置EDK II构建环境。
目录
- GitHub 帮助
- 如何设置 EDK II 树
- 从 Github下载Checkout EDK II 源代码树
- 编译工具Build EDK II BaseTools for Windows
- 构建EDK II
GitHub 帮助
GitHub ( https://help.github.com/index.html ) 提供了用户注册的分步说明和 GitHub 支持的基本功能。
适用于 Windows 操作系统的 Git GUI 界面
- 适用于 Windows 操作系统的 Git 可从以下网址获得:( http://git-scm.com/download/win )
- 适用于 Windows 操作系统的 TortoiseGit 可在 ( https://tortoisegit.org/download/ ) 获得
GitHub EDK II 项目存储库
- EDK II 项目存储库可从https://github.com/tianocore/edk2 获得。
注意:以下步骤将从 edk2 master 拉取最新代码。要使用稳定版本,请参阅UDK2017的 Microsoft Windows 构建步骤:https : //github.com/tianocore/tianocore.github.io/wiki/UDK2017-How-to-Build#how-to-build-视窗系统
互联网代理
如果您的网络使用带有 Web 代理的防火墙,那么您可能需要为各种命令行应用程序配置代理信息才能工作。您可能需要咨询您的网络管理员以找出用于代理设置的计算机名称和端口。以下命令是常见的Git Bash示例,说明如何通过设置环境变量来配置代理:
$ git config --global https.proxy <proxyname>.domain.com:<port>
$ git config --global http.proxy <proxyname>.domain.com:<port>
如何设置 EDK II 树
注意:以下一些示例使用多工作区功能来配置 EDK II BaseTools。可以在以下位置找到有关多工作区功能的更多信息。
下载
从 Github 下载/检出 EDK II 源代码树
使用 Web 浏览器下载
- 下载 EDK II 项目
- 在浏览器中打开https://github.com/tianocore/edk2
- 单击克隆或下载按钮(右绿色)
- 点击下载ZIP
- 解压到 C:/
- 将目录“edk2-master”重命名为“edk2”
在 Windows应用程序中使用Git
- 克隆 EDK II 项目存储库
- 打开 Git 图形用户界面
- 使用Clone Exiting Repository和 Source location https://github.com/tianocore/edk2.git
- 选择目标目录 C:/edk2
- 也检查递归克隆子模块
- 单击克隆按钮
如果您使用命令行版本,那么您可以使用以下 git 命令轻松地将 edk2 检出到 C:\edk2 目录: 主存储库:https : //github.com/tianocore/edk2
$git 克隆 https://github.com/tianocore/edk2
编译工具
对于 Windows 上使用源 BaseTools 的 EDK II 项目开发人员:
- 创建工作区目录
- 切换到工作区目录
- 克隆 EDK II 项目存储库(请参阅上面的下载部分)
- 示例:git clone https://github.com/tianocore/edk2
- 安装 Python37 或更高版本(https://www.python.org/)以从源代码运行 python 工具
- 编译 BaseTools C 源工具
- Git Bash 内幕
$ git clone https://github.com/tianocore/edk2
例子:
- 打开命令提示符和 CD C:\edk2:
C:\edk2> 设置 PYTHON_HOME=C:\Python27
C:\edk2> edksetup.bat 重建
建造
C:\Users\MySid> CD \edk2
C:\edk2> edksetup
构建 MdeModulePkg
您将需要编辑 Conf\target.txt 文件。首先,将 ACTIVE_PLATFORM 更改为 MdeModulePkg:
C:\edk2> 记事本 Conf\target.txt
ACTIVE_PLATFORM 在 Conf\target.txt 中应如下所示:
ACTIVE_PLATFORM = MdeModulePkg/MdeModulePkg.dsc
为系统上安装的工具链修改 target.txt 中的 TOOL_CHAIN_TAG。有很多选项,因此请查看 tools_def.txt 以找到适合您系统的工具链。在 tools_def.txt 中搜索“支持的工具链”以查看 TOOL_CHAIN_TAG 的有效选项。
TOOL_CHAIN_TAG = VS2015x86
另请参阅:Windows-systems-ToolChain-Matrix了解如何更改工具链标签。
另外,请考虑是否要通过更改 target.txt 中的 TARGET_ARCH 值来构建不同的处理器体系结构。请考虑某些工具链仅支持构建某些处理器架构。
构建你好世界!(以及 MdeModulePkg 的其余部分)
现在您应该能够简单地运行构建命令来编译 MdeModulePkg。
C:\edk2> 构建
作为构建的实际结果,您应该拥有 HelloWorld UEFI 应用程序。如果您有一个与您构建的处理器架构相匹配的 UEFI 系统可用,那么该应用程序应该能够在 shell 下成功运行。
C:\edk2> dir /s Build\MdeModule\DEBUG_...\IA32\HelloWorld.efi
构建OVMF(可选)
构建环境设置好后,您可能对构建包含在主 edk2 源代码树中的OVMF平台感兴趣 。由于OVMF构建完整的系统固件映像,因此 UEFI 系统固件开发人员可能会对此感兴趣。
UDK2018 发布维基页面
UDK2018 是基于EDK II验证快照的UDK版本。之前的稳定分支是UDK2017。
UDK2018 于 2018 年 3 月发布。请参阅UDK2018 发布页面:https : //github.com/tianocore/edk2/releases/tag/vUDK2018
注意:此 wiki 页面包含有关此版本更改的更多详细信息。
如何构建UDK2018
请参阅:UDK2018 如何构建wiki 页面,了解有关如何为 Windows* 和 Linux 等开发系统构建的详细信息。
UDK2018 分支/标签
github 中有一个UDK2018 版本的标签 ( vUDK2018 ):https : //github.com/tianocore/edk2/tree/vUDK2018。使用该标签可以使用git clone
带标签的命令下载官方发布的UDK2018源代码。
例子:> git clone https://github.com/tianocore/edk2.git vUDK2018
github 中还有一个 UDK2018 分支,如果开发人员想要跟踪正式发布后进行的关键错误修复,它会很有用:https : //github.com/tianocore/edk2/tree/UDK2018
UDK2018 特性/更新/变化
- 请参阅UDK2018 主要特性了解行业范围的主要特性
- 有关UEFI EDK II 核心包更改的更改,请参阅UDK2018 核心更新说明。
- 已知的问题:
- “edksetup.bat”不支持包含空格的目录名,所以请使用诸如“MyWorkspace”之类的目录名(而不是“My Workspace”)。
- 有关其他已知问题,请参阅包装说明。
- 各种各样的
- EDK II 文档可从EDK-II-Documents General Documentation: EDKII User Manual 和 EDK II Module Writer's Guide 中获得。请参阅下文以了解与此 UDK2018 版本对应的 EDK II 规范
UDK2018 封装说明
以下链接是UDK2018正式版对EDK II包的详细更新
- BaseTools 注释
- CryptoPkg 注释
- IntelFrameworkModulePkg 注释
- IntelFrameworkPkg 注释
- IntelFsp2Pkg 注释
- IntelFsp2WrapperPkg 注释
- IntelSiliconPkg 注释
- MdeModulePkg 注释
- MdePkg 注释
- 网络包注释
- PcAtChipsetPkg 注释
- 安全包注释
- ShellPkg 注释
- SourceLevelDebugPkg 注释
- UefiCpuPkg 注释
下载带有文档的 UDK2018 版本
源代码
注意:这些文件也可以从UDK2018 发布页面下载:https : //github.com/tianocore/edk2/releases/tag/vUDK2018
这些源代码下载来自UDK2018官方发布的标签vUDK2018。
UDK2018 edk-vUDK2018 Workspace Source code (zip file)
UDK2018 edk-vUDK2018 Workspace Source code (tar.gz file)
文档
注意:此文件也可以从UDK2018 发布页面 下载:https : //github.com/tianocore/edk2/releases/tag/vUDK2018
此下载包含 UDK2018 的所有 .chm 和 .html 文档。每个包都包含有关定义(包括 PPI/PROTOCOL/GUID 和库类)和与每个包关联的库实例的详细信息。
UDK2018 文档(ZIP 文件)
单独的文档包
- CryptoPkg - CHM | HTML
- MdeModulePkg - CHM | HTML
- 带库的 MdePkg - CHM | HTML
- MdePkg - CHM | HTML
- 网络包 - CHM | HTML
- SecurityPkg - CHM | HTML
- UefiCpuPkg - CHM | HTML
UDK2018 的 EDK II 规范
开始编写简单的应用程序
如何编写简单的 EDK II UEFI 应用程序
目录 |
1) 创建工作空间目录
例如mkdir edk2
2) 下载 Edk II 源码和构建工具
- 最新的 EDK II 源来自以下分步说明的说明
- 即示例>git clone https://github.com/tianocore/edk2.git
3)运行edksetup
在 Work Space 目录的命令行提示符下运行edksetup --nt32脚本
- Windows 命令提示符:C:\edk2> edksetup --nt32
- Linux 喜欢:bash$ 。edksetup.sh 基础工具
4) 编辑文件conf/target.txt
根据需要修改TARGET_ARCH和TOOL_CHAIN_TAG。
- TOOL_CHAIN_TAG 见:
- Windows Windows 系统工具链矩阵
- 使用 EDK II 和 Native GCC 的较新版本的 Linux
- 较旧的 Linux 发行版类 Unix 系统
- Mac OS X Xcode
- TARGET_ARCH - 可选也可以在 BUILD 命令行上使用“-a”
- IA32 和 X64:TARGET_ARCH = IA32 X64
- 只是 X64 : TARGET_ARCH = X64
- 在覆盖 target.txt 的 commnad 行上:BUILD -a X64
5)创建项目
- 创建一个新目录。可以是工作空间目录中任何位置的目录(例如 C:\edk2\ MyHelloWorld或 ~/src/edk2/ MyHelloWorld)
- 在项目目录中创建一个 .c 文件(参见示例:MyHelloWorld.c)
- 在项目目录中创建一个 .inf 文件(参见示例:MyHelloWorld.inf)
6) 构建您的 UEFI 应用程序
- 使用您的项目 .inf 文件更新现有平台 .DSC 文件。下面列出了一些示例。
- 编辑 DuetPkg/DuetPkgX64.dsc 并将您的新应用程序添加到[Components]部分和[BuildOptions]部分之前。(例如MyHelloWorld/MyHelloWorld.inf)
- 调用构建
- 在命令提示符> Build -a X64 -p DuetPkg/DuetPkgX64.dsc
- 最终输出 .efi 文件将位于WorkSpace /Build/DuetPkg/DEBUG_$( TOOL_CHAIN_TAG )/X64 目录中
- 由于这是根据 target.txt 更新 Nt32Pkg/Nt32Pkg.dsc 文件的默认设置。
- 编辑 Nt32Pkg/Nt32Pkg.dsc 并将您的新应用程序添加到[Components]部分和[BuildOptions]部分之前。(例如MyHelloWorld/MyHelloWorld.inf)
- 调用构建
- 在命令提示符 >构建
- 最终输出 .efi 文件将在目录WorkSpace /Build/NT32/DEBUG_$( TOOL_CHAIN_TAG )/IA32 中
- 使用 Windows NT 32 仿真进行测试:命令提示符 >构建运行
四、环境变量配置
1、配置Path变量
系统变量Path中添加
2、新增PYTHON_HOME变量
添加PYTHON_HOME变量
五、开始编译
官网说明:https://github.com/tianocore/tianocore.github.io/wiki/Windows-systems
以下步骤均在cmd中运行,总结如下:
所在目录为EDK II源码根目录
\edk2>set PYTHON_HOME=C:\Python
\edk2>edksetup.bat Rebuild
\edk2 edksetup.bat
\edk2>notepad Conf\target.txt
修改:TOOL_CHAIN_TAG = VS2017
保存target.txt
\edk2>build
编译成功后,你应该会看到如下信息:
编译成功效果
六、运行模拟环境
\edk2>cd Build\EmulatorIA32\DEBUG_VS2017\IA32
\edk2\Build\EmulatorIA32\DEBUG_VS2017\IA32>WinHost.exe
生成文件
运行效果-1
运行效果-2
七、搭建完成
1人点赞
UDK2018 BaseTools 笔记
介绍
这是处理 EDK II 内容的主要工具集。它包含配置模板和源文件。这些工具支持基于 Makefile 的 EDK II 构建,无需额外的包——编译器工具链、汇编器和可选的 ACPI 汇编器是构建 EDK II 项目所需的唯一额外工具。
源代码分为两种:
- 用 C (ANSI C) 编写的工具主要用于修改二进制数据结构的工具。
- 基于 Python (Python) 的工具主要用于解析或处理文本文件的工具。
新功能和增强功能
- 添加
/Gw
到CC_FLAGS
Visual Studio 2013(VS2013) 和更高版本的工具链标签 - 增强报告不显示空白部分
- 更新 tools_def.template 以删除旧的 XCLANG 和 XCODE32
MM
使用构建工具注册模块类型- 支持python脚本
PREBUILD/POSTBUILD
- 添加python脚本以运行makefile
-pie
在 GCC 工具链中添加缺少的链接选项- 将 FFS 对齐扩展到 16M
- 报告由 EDK II Build 模块测量的构建时间
- 添加对带有二进制缓存的 BIOS 构建的支持
- PI 1.6 支持 FV 扩展头包含 FV 使用的大小
- 在 Mac 上解析 Xcode 生成的地图文件
Guid.xref
包含来自 FDF 中的 FILE 语句的信息- 在 BaseTools tools_def.template 中添加 Visual Studio 2017 (VS2017) 工具链
GenFfs
支持从 SectionFile 获取对齐值- 更新 Makefile 以支持 FFS 文件生成
- 将
PcdValueCommon
逻辑添加到 C 源代码中CommonLib
- 支持 DEC/DSC 中的结构 PCD 值分配
- 收集
DynamicHii
PCD 值并将其分配给 VPD PCD 值 - 支持结构 PCD 值在不同 SKU 之间继承
- 报告结构 PCD 值和 SKU,
DefaultStore
信息 - 支持 PCD 灵活值格式
- 添加对 PCD 值的 DevicePath 支持
- 当只有单个 SKUID 时,不打印 PCD 的 SKUID 信息
- 启用
MAX_CONCURRENT_THREAD_NUMBER = 0
功能 - 在命令行中结构 Pcd
- StructurePcd 数组值支持灵活的格式
GNUmakefile:
将HOST_ARCH
检测移动到通用 makefile 中GNUmakefile:
HOST_ARCH
在每个工具 Makefile 中删除*B
为来自命令行的字段添加标志- 当添加更多的错误消息
PcdValue
是错误的 - 提高结构 PCD 值生成的构建性能
- DSC Components 部分支持灵活的 PCD
- 更新
--pcd
解析器以支持灵活的 pcd 格式 - 检测结构pcd头文件变化。
- 添加
PackageDocumentTools
到脚本文件夹
BUG修复
- 将“MODULE_UNI_FILE”文件复制到OUTPUT目录中
- 将“TianoCore”用户扩展复制到 As Built Inf
- 修复使用
'|'
或'||'
在 DSC 文件的 Pcd 值中的错误 - 使用
-m
选项修复多次构建相同 INF 的错误 - 修复 FDF 文件解析
!include
文件问题 - 修复错误以正确检查FDF文件中的Pcd类型
- 修复 DEC 文件中 section 标签之间使用 TabSpace 的问题
*B
当构建选项中的 Pcd 值与 DEC 相同时不显示- 修复报告中显示混合 Pcd 值的错误
- 修复一个错误以纠正
SourceFileList
- 修复
'DSC DEFAULT'
报告错误使用FDF值的bug - 修复一个错误 Build 目录应该相对于 WORKSPACE
- 修复为库重新构建uni文件的错误
- 修复按构建规则族收集源文件的错误
- 使用
GenC/GenMake
选项修复单个模块构建的错误 - 更新 Makefile 以在绝对路径下工作
- 修复了多个 Sku 总是被禁用的问题
- 生成正确的 VPD PCD 值以存储默认设置
- 修复结构 pcd 归档 sku 继承覆盖的问题
- 更新 SkuId 检查器以确保它是有效的 UINT64 值
- 更新 Python Makefile 以包含新添加的 Python 文件
- 修复不同 FV 使用相同 FILE 语句 Guid 的错误
- 修复
QuarkPlatformPkg
构建失败的bug - 修复 Visual Studio 2010 (VS2010) 上的编译错误
- 修复 SKU 继承导致的 Pcd 值覆盖问题
- 修复
GenFds
缺少覆盖命令选项更改的增量构建错误 - 增强二进制文件
[Binaries]
部分使用相对路径 - 更新 SKUID 值以支持整数和十六进制数
- 添加
DefaultStore
节格式检查 CommonLib
修复崩溃以写入最后一个字节HiiPcd
如果它们链接到相同的变量,则组合该值- 修复了 PCD 值初始化的构建失败
- 支持多个.h文件
- 更新
Expression.py
字符串比较和宏替换问题 - 更正生成压缩段过程
- 添加检查 INF 语句必须是 .inf 文件
GenFv
: 更新错误消息以描述 PE 图像对齐BuildOptions
在 DSC 中覆盖 MAKE_FLAGS- 转换 XIP 图像时更新
GenFw
以更正DebugEntry
偏移 - GUID 格式 PCD 值分配在结构 PCD 字段中失败
- 对齐
WIN_CERTIFICATE_UEFI_GUID
定义MdePkg
一个 - 修复
*M
报告中显示错误标志的错误 - 如果标志
LABEL()
无效则报告错误 - 修复了 Pcd 值覆盖问题
- 报告中的正确结构 Pcd 值
- 修复相对于工作空间搜索Fv.txt文件的bug
- 修复转换 iSCSI 节点时的错误
- 处理 8 字节数组时修复字节顺序
- 更新
DNS_DEVICE_PATH/URI_DEVICE_PATH
定义 - 修复一个
--pcd
用于ConditionalStatement
计算的错误 - 修复解析
OFFSET_OF
得到错误的偏移量 DatumType
从 DEC 文件中获取 Pcd--pcd
--hash --binary-destination
生成错误的二进制路径- 修复
VOID*
DynamicDefault
Pcd 使用灵活格式的错误
已知的问题
- 在外部文件中使用多个
"!if"
or"!endif"
语句会导致构建中断。将破坏构建的示例:
在 DSC 部分之一中,使用以下 !include 语句,例如:
[Components]
!include externalFile.txt
!endif
!endif
在 externalFile.txt 中,内容是:
!if True
!if True
TestPkg1/TestModule1/Test1.Inf
-
如果在命令行和 Conf\target.txt 文件中都没有指定构建目标信息,构建工具将立即退出构建。
-
在 FDF 条件指令语句中使用的 PCD 没有 SET 语句在 FDF 文件中定义此 PCD 将导致构建中断。一个例子如下:
在 DEC 文件中:
[PcdsFixedAtBuild]
gEfiPcdname.Pcdtoken|0x0|UINT32|0x11112222
在 DSC 文件中:
[PcdsFixedAtBuild]
gEfiPcdname.Pcdtoken|0x0
在 FDF 文件中:
[FD.NT32]
!if gEfiPcdname.Pcdtoken == 0x00000000
XXXXXXXXXXX
!endif
另一个例子是:
[FD.Nt32]
BaseAddress = 0x0|gEfiNt32PkgTokenSpaceGuid.PcdWinNtFdBaseAddress
!if gEfiNt32PkgTokenSpaceGuid.PcdWinNtFdBaseAddress
xxxxx
!endif
-
如果使用工具链DDK3790 和ARCH X64 构建,并且HII 资源由Resource Compiler (RC) 工具生成,则构建将中断。但是 BaseTools 项目在修订版 2656 中添加了此支持。解决方法是将 WINDDK_BIN32 添加到
%PATH%
. -
nmake 的目标路径名不能超过 256 个字符,长文件路径特性只能支持纯二进制构建,不生成 Makefile。
-
对于
--pcd option
,在 python 选项解析器之后没有引号字符,所以存在一些关于--pcd Pcd=Value
and 的错误--pcd Pcd="Value"
,例如:--pcd Pcd="3"
对于 UINT8 类型的 PCD,当前工具仍然将此 PCD 的值设置为数字 3 而不是字符串 3。 -
对于灵活格式支持的结构体 pcd 字段值分配,由于工具不知道定义文件中定义的字段的数据类型,因此会导致一些构建错误。例如:该字段是
UINT8
类型,但用户将值设置为{1}
,这将导致构建中断。 -
DSC
[Components]
部分、INF 和 FDF 文件不支持结构 pcd 字段值分配。 -
无法在 Visual Studio x64 命令提示符下编译 BaseTools C 源文件。
笔记
-
DSC/FDF 文件中引用的宏现在需要包含
"$()"
以避免歧义。 -
EFI_SPECIFICATION_VERSION
并且PI_SPECIFICATION_VERSION
不再是 autogen 代码中的公共宏定义。 -
CLM 支持的特性增加了在一个工作空间下两个平台构建失败的机会。我们需要避免在一个工作空间下并发构建不同平台。
-
BRG 的执行顺序预测功能需要名为 EOT 的新内部 Python 工具。它需要在 Python home 中安装 ANTRL v3.0.1 以获得 Python 运行时支持。该工具解析平台构建中涉及的所有源文件,甚至可能需要数小时才能完成解析并生成报告。
-
[Capsule]
不支持 FDF 文件部分中CAPSULE_FLAGS 的空白设置。如果没有CAPSULE_FLAGS
设置,则CAPSULE_FLAGS
无需在[Capsule]
节中指定。 -
除了一些预定义的情况外,EDK II INF 中不允许使用全局宏;请参阅 INF 规范 1.26 第 2.2.6 章中的详细信息。
-
!if
,!ifdef
,后的表达式!elseif
不能为空。 -
FDF 中的节头不能包含宏。
-
定义部分中的名称和值定义必须遵循 DSC 规范。
-
DSC 文件中定义的 PCD 类型应与 DEC 文件中此 PCD 的可能类型相匹配。
-
MACRO 使用范围请参考元数据文件规范。以下是一些一般信息。
INF - [Defines] section or any statements contain <PATH> or [BuildOptions] section
DEC - [Defines] section or any statements contain <PATH>
DSC - [Defines] section or any statements contain <PATH> or [BuildOptions] or Conditional Directive statements
FDF - Whole File
- VfrCompile 工具为 Oneof 和 Numeric 操作码添加了数据类型检查。对于Oneof和数字问题的有效的数据类型为
UINT8
,UINT16
,UINT32
和UINT64
。
最广为人知的方法
-
当构建工具更新时,in中的构建配置模板
$(WORKSPACE)\BaseTools\Conf\*.template
也可能会更新,需要与local合并$(WORKSPACE)\Conf\*.txt
以避免一些构建错误。 -
为确保平台在没有任何先前构建影响的情况下干净重建,
$(WORKSPACE)\Conf\.cache
可以删除缓存的元数据信息目录 ie 。 -
如果由于访问错误导致构建失败
$(WORKSPACE)\Conf\.cache\build.db
,可以在同一工作空间下重新构建提示,无需任何并发构建过程。 -
当使用不同的 MACRO 设置在两次构建中启用具有相同模块 GUID 和驱动程序名称的不同驱动程序时,增量构建将无法正常工作。第二次构建需要干净的构建。
-
EOT 工具依赖于 ANTRL 3.0.1 运行时库,较新的 ANTRL 版本(例如 3.1.2)与旧版本不兼容。所以需要从www.antlr.org下载ANTLR 3.0.1 ,安装python运行库到本地python home。
-
通知功能相关功能未集成到 BRG 输出纯文本报告文件中。当调用 EOT(来自 BRG)时,会在工作空间目录下生成 Report.html。此 HTML 报告文件显示每个模块下的通知功能的详细信息(如果可用)。
-
Prebuild 和 Postbuild 条目必须是可以执行的工具。
UDK2018 CryptoPkg 笔记
新功能和变化
-
OpenSSL 版本已更新为新的 1.1.0g(于 2017 年 11 月 2 日发布)。
-
OpenSSL git 存储库作为一个子模块添加到 EDK II 项目中。请参阅 CryptoPkg/Library/OpensslLib/OpenSSL-HOWTO.txt 了解如何克隆/提取主 EDK II 存储库和
openssl
子模块。 -
的
Cryptest
应用除去从CryptoPkg
,这是仅适用于单元测试。
包接口变化
-
以下 API 被添加到
BaseCryptLib.h
- 一种
X509GetCommonName()
用于从一个X.509
证书中检索主题通用名称 (CN) 字符串的新API 。
- 一种
UDK2018 IntelFrameworkModulePkg 注释
新功能和变化
-
添加IOMMU支护在
LegacyBiosDxe
。 -
更新
FwVolDxe
以获取从 PEI 为 PI 1.5 传播的 FV 身份验证状态。 -
更新
FwVolDxe
以支持FFS_ATTRIB_DATA_ALIGNMENT_2
PI 1.5。 -
更新
LegacyBiosDxe
,KeyboardDxe
使用宏来enable/disable page 0
。
包接口变化
- 删除无用的性能“
Perf
中的”代码BdsDxe
和GenericBdsLib
。
BUG修复
-
修复滥用
AllocateCopyPool
导致堆内存溢出的问题。 -
更新
KeyboardDxe
并Ps2KeyboardDxe ReadKeyStrokeEx()
始终返回密钥状态。 -
修复Xcode 9 Beta将 32 位左移视为未定义;
UDK2018 IntelFrameworkPkg 注释
新功能和变化
- 添加宏 ACCESS_PAGE0_CODE 保证页面 0 访问
- 在 PeiHobLibFramework 中实现 BuildFv3Hob。
IntelFsp2Pkg
该软件包提供了创建 FSP 二进制文件的组件。
源代码库:https : //github.com/tianocore/edk2/tree/master/IntelFsp2Pkg
描述 IntelFsp2Pkg 的白皮书:https ://firmware.intel.com/sites/default/files/A_Tour_Beyond_BIOS_Creating_the_Intel_Firmware_Support_Package_with_the_EFI_Developer_Kit_II_%28FSP2.0%29.pdf
UDK2018 IntelFsp2WrapperPkg 注释
新功能和变化
- 为平台预先分配 FSP UPD 缓冲区提供灵活性。添加了 2 个新 PCD
gIntelFsp2WrapperTokenSpaceGuid.PcdFspmUpdDataAddress gIntelFsp2WrapperTokenSpaceGuid.PcdFspsUpdDataAddress
UDK2018 IntelSiliconPkg 笔记
新功能和变化
-
为 PEI/DXE添加基于 Intel VTd 的IOMMU支持。它们可用于抵抗对固件的 DMA 攻击。添加 Platform VTd Policy 协议并
PlatformVTdSampleDxe
演示如何生成该协议。注:该
GetExceptionDeviceList
接口和PlatformVTdSampleDxe
应仅用于开发/调试的目的,绝不能用于生产的基础之上。 -
添加
MicrocodeUpdate
胶囊支持。
UDK2018 MdeModulePkg 注释
新功能和变化
-
培芯:
- 处理来自 SEC 的通知 PPI。
- 安装
SEC HOB
数据。 - 支持预内存页分配。
- 消耗新的 PCD
PcdInitValueInTempStack
以获取临时堆栈中的初始值。
-
PeiCore和DxeCore:
- 支持
FFS_ATTRIB_DATA_ALIGNMENT_2
。 - 将
PEI-phase
FV 身份验证状态传播到 DXE。 - 支持
EFI_FIRMWARE_VOLUME_EXT_ENTRY_USED_SIZE_TYPE
。
- 支持
-
核心:
- 增强“
ConvertPages: Incompatible memory types
”。 - 删除 UEFI 应用程序的额外连接。
- 增强“
-
PiSmmCore:在注册的 SMI 处理程序中安装
EndOfS3Resume
和S3SmmInitDone
协议。 -
PiSmmIpl:
- 处理
CommSize OPTIONAL
的情况SmmCommunicationCommunicate
。 - 删除 的
NX
页面属性SMRAM
。
- 处理
-
DxeIplPeim:将页表标记为只读。
-
更新
DxeIplPeim
并SectionExtractionPei
移除硬编码对齐调整。部分数据对齐应在构建生成中进行。 -
空指针检测:
DxeIplPeim
并DxeCore
已更新以支持该功能。- 此功能用于检测对
NULL
指针的无效访问,如果检测到此类问题将触发页面错误异常。由于实施限制,此功能实际上会检测访问第 0 页 (000-FFF) 中的任何地址。此功能是通过启用BIT0
和BIT1
的PcdNullPointerDetectionPropertyMask
的UEFI和SMM代码分开。 - 对于需要在第 0 页访问遗留内存的源遗留驱动程序
ACCESS_PAGE0_CODE
,如果需要启用此功能,则可以使用宏将这些语句括起来以避免不必要的页面错误异常而不会丢失其原始功能。 - 对于二进制传统驱动程序,遗留
OptionROM
和传统兼容的操作系统加载器,这将正常访问网页0BIT7
的PcdNullPointerDetectionPropertyMask
可以使用,作为最后的手段,到之后禁用此功能EndOfDxe
的事件。 - 默认情况下禁用此功能。
- 此功能用于检测对
-
Heap Guard:
DxeIplPeim, DxeCore
并PiSmmCore
更新以支持该功能。- Heap Guard 用于检测堆内存溢出,如果检测到此类问题将触发页面错误异常。它由页后卫和游泳池后卫,这可以通过单独或同时被激活的
BIT0
和BIT1
的PcdHeapGuardPropertyMask
对UEFI内存,并通过BIT2
和BIT3
SMM的记忆。 - 为了让 Heap Guard 开始工作,用户仍然需要启用一种或多种内存分配类型(如
EfiBootServicesData
),需要通过PcdHeapGuardPageType
和/或进行检测PcdHeapGuardPoolType
。这两个 PCD 控制 UEFI 和 SMM 内存。 - 对于池内存,
BIT7
ofPcdHeapGuardPropertyMask
旨在详细说明从访问增长或下降方向检测缓冲区溢出。默认情况下它被清除(增长方向)。 - 由于内存消耗、性能和潜在的操作系统启动影响,不建议在生产 BIOS 中启用此功能。
- 默认情况下禁用此功能。
- Heap Guard 用于检测堆内存溢出,如果检测到此类问题将触发页面错误异常。它由页后卫和游泳池后卫,这可以通过单独或同时被激活的
-
Stack Guard:
DxeIplPeim, DxeCore
已更新以支持该功能。- 该特性用于检测整个 UEFI 堆栈内存的溢出,包括 BSP 和所有 AP 的堆栈。如果检测到此类问题,将触发缺页异常。它可以通过 启用/禁用
PcdCpuStackGuard
。 - 默认情况下禁用此功能。
- 该特性用于检测整个 UEFI 堆栈内存的溢出,包括 BSP 和所有 AP 的堆栈。如果检测到此类问题,将触发缺页异常。它可以通过 启用/禁用
-
添加IOMMU支持。
- 添加 IOMMU PPI 和协议定义。
- 更新
PciBusDxe
以支持 IOMMU。安装IOMMU协议后,PciBus调用IOMMU为Map/Ummap中的PCI设备设置访问属性。 - 更新
PciHostBridgeDxe
以支持 IOMMU。当安装 IOMMU 协议时,PciHostBridge
只需调用 IOMMUAllocateBuffer/FreeBuffer/Map/Unmap
。 - 更新
SdBlockIoPei, EmmcBlockIoPei, UfsBlockIoPei, EhciPei, UhciPei
并XhciPei
支持 IOMMU。
-
添加
EndOfS3Resume
GUID定义,S3 SMM初始化完成后,S3启动脚本执行前,GUID会在S3恢复阶段结束时作为SMM环境中的协议安装。 -
添加
S3SmmInitDone
GUID 定义,GUID 在 PEI 中将作为 PPI 安装,在 SMM 环境中安装为协议。 -
添加
SmmMemoryAttribute
协议定义,该协议旨在PiSmmCore
能够为了堆保护功能而更改内存页面属性。 -
添加
LOCK_BOX_ATTRIBUTE_RESTORE_IN_S3_ONLY
lockbox
属性并更新LockBoxLib
以支持它。 -
添加一个新的API
InitializeCpuExceptionHandlersEx
中CpuExceptionHandlerLib
,以支持初始化异常处理程序与需要额外的初始化数据,如栈溢出保护功能的堆叠交换机的额外功能。 -
在
BootScriptExecutorDxe
:删除保留的 NX 页面属性FfsBuffer
。 -
更新
RuntimeDxe
和PeiCrc32GuidedSectionExtractLib
消费CalculateCrc32()
的APIBaseLib
。 -
在
UefiBootManagerLib
:- 支持DNS设备路径描述。
- 为 SD/eMMC 生成引导描述。
- 删除无用的性能代码。
-
MemoryTest:更新
GenericMemoryTestDxe
并NullMemoryTestDxe
处理更可靠的内存类型。 -
In
SmbiosMeasurementDxe
: 跳过测量 OEM 类型和平台代码,如果需要,可以自行测量。 -
FirmwarePerformancePei
:删除SEC性能数据获取代码SecCore
中UefiCpuPkg
增加了SecPerformancePpiCallBack
获得SEC的性能数据,并建立HOB传达了SEC的性能数据DXE阶段。 -
PeiDxeDebugLibReportStatusCode
: 格式字符串太长时部分打印。 -
SerialDxe
:- 进程超时始终如一
SerialRead
。 - 在
SerialSetAttributes
.
- 进程超时始终如一
-
重置系统:
- 添加
PlatformSpecificResetFilter
和PlatformSpecificResetHandler
PPI和协议定义。 - 添加
PlatformSpecificResetNotification
PPI 定义。 - 更新
ResetSystemRuntimeDxe
来实现ResetNotification
,ResetFilter
和ResetHandler
协议。 - 添加
ResetSystemPei
到实施Reset2, ResetNotification, ResetFilter
和ResetHandler
PPI。 - 添加
ResetSystemLib
实例,PeiResetSystemLib调用PEI服务表中的ResetSystem2()服务,DxeResetSystemLib
调用ResetSystem()
UEFI运行时服务表中的服务。 - 添加
ResetUtility
库类和 BASE 实例。提供服务以生成特定于 GUID 的重置、从特定于 GUID 的重置解析 GUID 以及ResetData
为需要额外数据的任何类型的重置构建缓冲区的库类。 - 更新
PeiCore
为始终首先尝试使用Reset2
PPI。
- 添加
-
PCD:
- 更新 PCD 驱动程序以支持优化的
PcdDataBase
. - 启用固件以恢复默认设置,添加两个 PCD
PcdSetNvStoreDefaultId
和PcdNvStoreDefaultValueBuffer
. - 删除未使用的
PCD attribute PCD_TYPE_SKU_ENABLED
.
- 更新 PCD 驱动程序以支持优化的
-
可变 DXE/SMM 驱动程序:
- 弃用
EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS
。 - 更新
GetNextVariableName
以遵循 UEFI 2.7。 - 更新代码以在 NV 变量存储为 auth 格式时也支持正常格式的变量存储 HOB。
- 弃用
-
健康保险:
-
EFI
Varstore/Buffer Varstore BIT
现场支持- 为 BitField 支持添加 GUID/标志定义。
- 更新
SetupBrowserDxe, HiiDatabaseDxe, UefiHiiLib
并VarCheckHiiLib
处理/检查存储在 EFI 的 BIT 字段中的问题Varstore/Bufffer Varstore
。 - 添加示例案例
DriverSampleDxe
以创建 BIT/UNION varstore 并添加示例问题以使用bit/union VarStore
-
更新
HiiDatabaseDxe
以将 vfr 文件中的默认设置替换为通过DynamicHii
PCD设置的设置。 -
更新
DisplayEngineDxe
以添加HiiPopup
UEFI2.7 规范中定义的协议的实现 -
更新
DriverSampleDxe
以添加示例案例以使用HiiPopup
协议。
-
-
网络:
- 更新网络堆栈驱动程序 (
DHCP, iSCSI, PXE
) 以检查 AIP 协议的“网络媒体状态”类型,如果EFI_NOT_READY
返回,则等待 NIC 恢复网络连接。 HttpLib
:HttpMappingToStatusCode()
更新以处理HTTP_STATUS_308_PERMANENT_REDIRECT
UEFI 规范中新定义的 HTTP 状态代码 。- IP4:
- 更新
Ip4Config.SetData()
以清理某些配置数据。 Ip4
Ip4Config2
如果默认IPv4
地址不可用且UseDefaultAddress
设置为,驱动程序将更新以触发协议以检索默认地址TRUE
。- 更新
IP4
堆栈以支持具有 31 位掩码 (RFC3021
)的点对点链接。
- 更新
NetLib
: 新增库接口NetLibDetectMediaWaitTimeout()
,支持AIP协议的媒体状态检测。
- 更新网络堆栈驱动程序 (
-
性能基础设施:更新 EDK II 性能基础设施以记录和转储性能条目作为 ACPI FPDT 表中的 FPDT 记录。更新后的性能基础架构可以支持在 UEFI Shell 和 OS 中转储性能数据。
PeiPerformanceLib
:- 更新
PeiPerformanceLib
以在 PEI 阶段将 Perf 条目转换为 FPDT 记录。 DxeCorePerformanceLib
通过 GUID 滚刀报告 PEI 阶段的 FPDT 记录。
- 更新
SmmCorePerformanceLib
:- 更新
SmmCorePerformanceLib
以在 SMM 阶段将 Perf 条目转换为 FPDT 记录。 - 定义一个新的结构smm boot performance table来保存SMM阶段FPDT记录的内容和大小,并将smm boot performance table的地址上报到
FirmwarePerformanceDataTableSmm
.
- 更新
DxeCorePerformanceLib
:- 更新
DxeCorePerformanceLib
以在 DXE 阶段将 Perf 条目转换为 FPDT 记录。 - 通过 GUID 滚刀收集 PEI 阶段的 FPDT 记录。
- 通过MM Communication协议收集SMM阶段的FPDT记录。
- 分配启动性能表保存所有的FPDT记录,并将启动性能表的地址上报到
FirmwarePerformanceDataTableDxe
.
- 更新
FirmwarePerformanceDataTablePei
: 将 FPDT 记录添加到 S3 阶段的基本启动性能表中FirmwarePerformanceDataTableSmm
:更新FirmwarePerformanceDataTableSmm
以接收 .smm 报告的 smm 启动性能表地址SmmCorePerformanceLib
。FirmwarePerformanceDataTableDxe
:- 更新
FirmwarePerformanceDataTableDxe
以接收由DxeCorePerformanceLib
. - 更新
FirmwarePerformanceDataTableDxe
到 HookEFI_SW_DXE_BS_PC_READY_TO_BOOT_EVENT
以安装 ACPI 表。 - 删除宏
EXTENSION_RECORD_SIZE
,因为可以通过扩展大小PcdExtFpdtBootRecordPadSize
。 - 删除 SMM 阶段收集引导记录的代码(代码已移至 DxeCorePerformanceLib)。
- 更新
-
更新
ReadKeyStrokeEx()
的Ps2KeyboardDxe, TerminalDxe
和ConSplitterDxe
始终返回键状态,即使没有按键。 -
AtaAtapiPassThruDxe
: 将 PHY 检测超时值从 10ms 放宽到 15ms。 -
SdDxe
和EmmcDxe
:为 SD/eMMC 设备生成磁盘信息协议。 -
UfsPassThruDxe
: 产生 EFI UFS 设备配置协议。 -
总线:
- 在安装
PciEnumerationComplete
PciIo 协议之后安装协议,而不是在硬件枚举完成之后。更改是为了遵循 PI 规范,并且也有利于某些依赖PciIo
于PciEnumerationComplete
回调句柄的实现。 - 为非根和根热插拔控制器保留总线编号。旧实现仅保留根热插拔控制器。
- 在安装
-
将翻译字段添加到
PCI_ROOT_BRIDGE_APERTURE
. 转换用于表示设备地址和主机地址之间的差异,如果它们在某些平台上不相同。
BUG修复
-
PeiCore : 更新调试消息以正确打印 FV 句柄。
-
核心:
- 避免在 CoreValidateHandle
CoreDisconnectControllersUsingProtocolInterface()
和CoreOpenProtocol()
. - 修复
LoadImage
失败路径上的双空闲页面。 - 修复 返回的接口
CoreOpenProtocol
。
- 避免在 CoreValidateHandle
-
PiSmmCore :
- 相互取消注册 LegacyBoot 和
ExitBootServices
SMI 处理程序。 - 将 ForwardLink 设置为
NULL
inRemoveOldEntry()
以修复潜在的链表断言。 - 修复由于已经释放的内存取消引用而导致的挂起。
- 相互取消注册 LegacyBoot 和
-
修复
AllocateCopyPool
inUiApp, BootMaintenanceManagerUiLib, DeviceManageruiLib, UefiHiiLib, FvSimpleFileSystemDxe
和 的误用HiiDatabaseDxe
。 -
DxePrintLibPrint2Protocol
:修复精度位置计算中的错误。 -
SmmLockBox
: 返回更新后的长度EFI_BUFFER_TOO_SMALL
。 -
SmmLockBoxDxeLib
:SmmCommRegion
通过gEdkiiPiSmmCommunicationRegionTableGuid
系统配置表获取SMM通信缓冲区。 -
(SMM)
S3SaveState
:在功能正确的顺序提取参数EFI_BOOT_SCRIPT_PCI_CONFIG2_WRITE_OPCODE
和EFI_BOOT_SCRIPT_PCI_CONFIG2_READ_WRITE_OPCODE
。 -
PiSmmCoreMemoryAllocationLib
:修复链接FreePool()
时的断言问题。PiSmmCore
PeiDxeDebugLibReportStatusCode
-
UefiBootManagerLib
:- 删除不必要的断言
BmCharToUnit
以避免系统挂起。 - 当“
BootOptionSupport
”变量不存在时删除断言。 - 删除多余的
TimerLib
依赖。
- 删除不必要的断言
-
DxeCapsuleLibFmp
:- 使用 FMP 验证嵌套胶囊。当前使用 ESRT 表的逻辑不起作用,因为在准备启动事件中发布 ESRT 表之前处理胶囊。
- 为 UX 胶囊添加更多检查。
-
CapsulePei
: 对内存资源条目进行排序和合并,以处理BOOT_ON_FLASH_UPDATE
引导模式和正常引导模式之间报告内存资源 HOB 不同的情况。 -
FrameBufferBltLib
:- 修复未对齐内存的复制。
- 修复了
PixelsPerScanLine
在计算线宽时使用导致显示损坏的错误。
-
SerialDxe
:- 修复无法更改串行属性。
SetAttributes
不支持时不要失败重置。
-
可变 DXE/SMM 驱动程序:
- 删除并锁定操作系统创建的 MOR 变量。
- 在没有 SMM 的情况下删除并锁定 MOR。
-
健康保险:
SetupBrowserDxe
:更新 APIIsResetRequired
以缓存由 UI 配置更改触发的所有重置信号。DisplayEngineDxe
:修复角落用例暴露的不正确显示问题。用例:在一个页面中,当刷新某些问题时,可能会在突出显示菜单和屏幕顶部菜单之间动态插入一些新菜单。如果新添加的菜单导致高亮菜单和屏幕顶部菜单无法在一页中显示,则会出现错误显示。UefiHiiLib
:修复了错误检查字符串操作码的字符串长度的错误。BootManagerUiLib
:退出UiApp前检查重置要求,如果需要重置,平台将被重置。BootMaintenanceManagerUiLib
:退出UiApp前检查重置要求,如果需要重置,平台将被重置。
-
网络:
- 修复 IP4 驱动程序中
TxToken
的错误,如果传输中发生错误,则该错误会被错误删除。 - 修复了 PXE 驱动程序中用户选择的选项在 DHCP 选项 43 的 PXE BootMenu 中被忽略的错误。
- 修复 IP4 驱动程序中的错误,
Ip4IpSecProcessPacket()
即使尚未安装 IpSec 协议,该驱动程序仍会始终调用以定位 IpSec 协议。 - 修复了在修剪操作之前未用 0 选中的
DxeNetLib NetbufTrim()
函数中的错误NetBuf TotalSize
。
- 修复 IP4 驱动程序中
-
TerminalDxe
:修复和的PCANSI
映射。TRIANGLE
ARROW
-
AtaAtapiPassThru
: 禁用 BM DMA 后取消映射 DMA 缓冲区。 -
ScsiBusDxe
:不应在不存在的 LUN 上生成 EFI SCSI I/O 协议。 -
ScsiDiskDxe
:EFI_NO_MEDIA
应该返回而不是EFI_MEDIA_CHANGED
在从设备中移除媒体时返回。 -
EmmcDxe
:修复了可能会删除额外数据的错误EFI_ERASE_BLOCK_PROTOCOL.EraseBlocks()
。 -
UfsPassThruDxe
和UfsBlockIoPei
: 将 的 'DATA SEGMENT LENGTH
' 字段设置UPIU
为要写入的描述符字节数。 -
优盘:
-
EhciDxe
: 当同步中断传输完成时,调用 EhcFreeUrb 将映射的 DMA 缓冲区的内容复制到实际缓冲区中。 -
XhciPei
和XhciDxe
:当 BABBLE 错误发生时恢复停止的端点。 -
XhciDxe
- 修复中断传输中的数据丢失问题。数据丢失不会影响 USB 键盘/鼠标功能,但可能会导致 BLE 连接随机故障。
- 修复异步中断传输的 DMA 缓冲区映射和取消映射不一致。
-
UsbMassStorageDxe
:修复设备兼容性问题,以便支持更多 USB 软盘和 USB 密钥。
-
-
NonDiscoverablePciDeviceDxe
:修复PciIoPciRead
界面中的内存覆盖错误。 -
NvmExpressDxe
:- 当阻塞 PassThru 请求超时时,通过重置 NVMe 控制器来中止请求。
- 系统重置时通知 NVMe 控制器。
- 修复
NvmExpressPassThru()
. - 修复未为 NVMe 写入命令映射的数据缓冲区。
-
SdMmcPciHcDxe
: 调用SdMmcFreeTrb()
完成一个同步操作。 -
PciBus : 修复
EfiBusSpecificDriverOverride
包含 option rom 的设备不生成协议的问题。 -
PartitionDxe
:修复ProbeMediaStatusEx()
将堆栈中缓冲区的地址而不是 NULL 指针传递给 的ReadDisk()
接口EFI_DISK_IO_PROTOCOL
。
已知的问题
-
当前
SmiHandlerProfile
实现在SmmReadyToLock
. 所以之后注册的 SMI 处理程序的配置文件SmmReadyToLock
将不会被记录。 -
健康保险:
EFI_IFR_IMAGE, EFI_IFR_ANIMATION
,EFI_IFR_VARSTORE_DEVICE
不支持操作码。Suppressif/DisableIf/GrayoutIf
不支持单个语句的嵌套条件。
-
MNP 驱动程序更新为异步回收来自 SNP 的 TX 缓冲区。UNDI/SNP 实现必须按照 UEFI 2.6 附录 E.4.16 在 UNDI GetStatus 命令中返回回收的传输缓冲区地址才能使其工作,否则错误的回收缓冲区地址将导致 DEBUG 版本 MNP 驱动程序断言。
UDK2018 MdePkg 笔记
新功能和变化
-
添加统一可扩展固件 (UEFI) 规范 2.7 定义的协议/PPI/GUID 及其相关数据结构定义。
-
协议:
EFI_HII_POPUP_PROTOCOL
EFI_HTTP_BOOT_CALLBACK_PROTOCOL
EFI_NVDIMM_LABEL_PROTOCOL
EFI_PARTITION_INFO_PROTOCOL
EFI_RESET_NOTIFICATION_PROTOCOL
EFI_UFS_DEVICE_CONFIG_GUID -
GUID:
EFI_BTT_ABSTRACTION_GUID
EFI_ADAPTER_INFO_MEDIA_TYPE_GUID
EFI_KMS_FORMAT_GENERIC_DYNAMIC_GUID -
杂元素:
a)增加DNS_DEVICE_PATH设备路径
b)中添加定义EFI_FIRMWARE_ERROR_TYPE_SOC_TYPE1 / _TYPE2
c)中更新的struct EFI_FIRMWARE_ERROR_DATA
d)更新结构EFI_FTP4_COMMAND_TOKEN
E)添加定义HTTP_STATUS_308_PERMANENT_REDIRECT
F)正确定义HTTP_STATUS_300_MULTIPLE_CHOICES
克)弃用属性EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS
1H)更新EFI_SERIAL_IO_PROTOCOL.SetAttributes()的返回状态
i) 添加注释以解决 Pkcs7Verify 协议中的安全问题
j) 更正 EFI_RESET_NOTIFICATION_PROTOCOL.UnregisterResetNotify
-
-
添加平台初始化(PI)规范 1.5/1.6 定义的协议/PPI/GUID 及其相关数据结构定义。
-
协议:
EFI_DXE_MM_READY_TO_LOCK_PROTOCOL
EFI_MM_ACCESS_PROTOCOL
EFI_MM_BASE_PROTOCOL
EFI_MM_COMMUNICATION_PROTOCOL
EFI_MM_CONFIGURATION_PROTOCOL
EFI_MM_CONTROL_PROTOCOL
EFI_MM_CPU_PROTOCOL
EFI_MM_CPU_IO_PROTOCOL
EFI_MM_END_OF_DXE_PROTOCOL
EFI_MM_GPI_DISPATCH_PROTOCOL
EFI_MM_IO_TRAP_DISPATCH_PROTOCOL
EFI_MM_PCI_ROOT_BRIDGE_IO_PROTOCOL
EFI_MM_PERIODIC_TIMER_DISPATCH_PROTOCOL
EFI_MM_POWER_BUTTON_DISPATCH_PROTOCOL
EFI_MM_READY_TO_LOCK_PROTOCOL
EFI_MM_RSC_HANDLER_PROTOCOL
EFI_MM_STANDBY_BUTTON_DISPATCH_PROTOCOL
EFI_MM_STATUS_CODE_PROTOCOL
EFI_MM_SW_DISPATCH_PROTOCOL
EFI_MM_SX_DISPATCH_PROTOCOL
EFI_MM_USB_DISPATCH_PROTOCOL
EFI_LEGACY_SPI_CONTROLLER_GUID
EFI_LEGACY_SPI_FLASH_PROTOCOL
EFI_LEGACY_SPI_SMM_CONTROLLER_PROTOCOL
EFI_LEGACY_SPI_SMM_FLASH_PROTOCOL
EFI_SPI_CONFIGURATION_GUID
EFI_SPI_HOST_GUID
EFI_SPI_IO_PROTOCOL
EFI_SPI_NOR_FLASH_PROTOCOL
EFI_SPI_SMM_CONFIGURATION_PROTOCOL
EFI_SPI_SMM_HC_PROTOCOL
EFI_SPI_SMM_NOR_FLASH_PROTOCOL -
PPI:
EFI_SEC_HOB_DATA_PPI -
GUID:
EFI_DISK_INFO_SD_MMC_INTERFACE_GUID -
杂元素:
一)正确EfiGcdMemoryTypePersistent名称
b)中添加FFS_ATTRIB_DATA_ALIGNMENT_2
c)中添加EFI_FIRMWARE_VOLUME_EXT_ENTRY_USED_SIZE_TYPE
d)添加EFI_HOB_FIRMWARE_VOLUME3
E)添加EFI_MM_SYSTEM_TABLE
F)添加EFI_PEI_FREE_PAGES
克)添加EFI_SW_DXE_BS_PC_ATTEMPT_BOOT_ORDER_EVENT
1H)弃用SMM通信ACPI表
I)更新描述用于通知PPI从SEC
j)的更正 EFI_PEI_RESET2_SYSTEM 的注释
-
-
添加/升级行业标准定义。
- 添加 ACPI6.2 表
- 更新 ACPI6.0/ACPI6.1 表
a) 添加缺失的 PCCT 子空间类型 1 和 2 定义 - 添加 EFI_ACPI_DMAR_FLAGS_DMA_CTRL_PLATFORM_OPT_IN_FLAG
- 添加 ACPI IO 重映射表 (IORT) 定义
- 添加特定于 PCI 供应商的功能标头
- 正确的 PCI_REG_PCIE_SLOT_CONTROL 定义
- 添加新的 TPM 位以取消当前正在执行的命令
- 添加NVME关机通知相关宏
-
添加新的库类。
- PciSegmentInfoLib
- S3PciSegmentLib
-
在现有库类中添加新的库 API。
- 在 BaseLib 中添加 IsNodeInList()、CalculateCrc32()、AsmWriteTr()。
- 在 HobLib 中添加 BuildFv3Hob()
- 在 PeiServicesLib 中添加 PeiServicesFreePages() 和 PeiServicesResetSystem2()
- 在 DevicePathLib 中添加 DevPathFromTextDns() 和 DevPathToTextDns()
-
添加新的库实例。
- BasePciSegmentInfoLibNull
- BasePciSegmentLibSegmentInfo
- DxeRuntimePciSegmentLibSegmentInfo
- BaseS3PciSegmentLib
- 基本库内在服务
-
更新基础定义
- 在 BaseLib.h 中添加 struct IA32_TASK_STATE_SEGMENT 和 IA32_TSS_DESCRIPTOR
- 在 BaseLib.h 中添加两个宏 IA32_GDT_TYPE_TSS 和 IA32_GDT_ALIGNMENT
- 更正和澄清 Base.h 中 VA_LIST 的文档
-
禁用 VS2017 的 C4701 和 C4703 警告
BUG修复
-
更新 UefiDevicePathLib
- 修复 DevicePathFromText 中 iSCSI.Lun 的字节顺序。
- 修复转换 iSCSI 节点时应使用默认 TCP(0) 的错误。
-
在 UefiRuntimeLib 中支持更多模块类型。
-
更新 BaseLib
- 修复 SafeString 中潜在的越界内存访问
- 避免阅读超出字符串边界的内容
- 更新内部 LinkedList 验证。
-
更新 BasePrintLib
- 修复可能的负值左移
-
在IndustryStandard\PciExpress21.h中添加宏PCI_ECAM_ADDRESS
-
修复 Xcode 9 Beta 将 32 位左移视为 BaseUefiDecompressLib 中未定义的问题
-
修复 DxeHstiLib 中的内存泄漏问题
-
在 Base.h 中为 MSFT 工具链声明 _ReturnAddress()
已知的问题
-
EFI_SIZE_TO_PAGES() 宏要求输入参数为 UINTN 数据类型。
-
SecPeiDxeTimerLibCpu 库实例可由 DXE_RUNTIME_DRIVER 和 DXE_SMM_DRIVER 类型的驱动程序在初始化时使用,没有任何问题。但是,这些驱动程序在运行时服务和 SMI 处理程序的实现中需要小心。
-
BaseExtractGuidedSectionLib 库实例可由 DXE_RUNTIME_DRIVER 和 DXE_SMM_DRIVER 类型的驱动程序在初始化时使用,没有任何问题。
UDK2018 NetworkPkg 笔记
新功能和变化
-
更新网络堆栈驱动程序(
DHCP6, DNS, iSCSI, PXE
和HTTP
Boot)检查“Network Media State
”类型的AIP协议,如果EFI_NOT_READY
返回则等待网卡恢复网络连接。 -
HTTP 启动更新
- 显示更多 HTTP 启动错误消息,可以帮助用户识别问题。例如,如果收到 HTTP 重定向响应,
Redirection
将显示HTTP 3xx状态代码以及 HTTP 启动映像的新 URI 地址。 - 添加
EFI_HTTP_BOOT_CALLBACK_PROTOCOL
支持。 - 将 DNS 设备路径节点添加到 HTTP 启动选项的文件路径。
- 在
IPv6 Support from UNDI
通过 IPv6 启动 HTTP Boot 之前,会检查“ ”类型的 AIP 协议。 - 修复了 HTTP 启动配置表单中无效的 URI 地址可能会损坏设置屏幕的错误。
- 显示更多 HTTP 启动错误消息,可以帮助用户识别问题。例如,如果收到 HTTP 重定向响应,
-
IP6 更新
- 修复了如果更改 IPv6 策略,IP6 PXE 引导选项可能会消失的错误。
- 更新
Ip6Config.SetData()
以清理某些配置数据。 - 修复
Ip6IpSecProcessPacket()
即使未安装 IpSec 协议也始终调用定位 IpSec 协议的错误。
-
HTTP 更新
- 添加 HTTP PATCH 方法支持。
- 修复消息正文中重复数据返回给调用者的错误。
-
iSCSI 更新
iSCSIISID:#
根据http://uefi.org/confignamespace 中的 x-UEFI 关键字定义,允许将 " " 关键字配置为长度为 6(仅最后 3 个字节)或 12(完整 ISID)的值 。- 修复 iSCSI 关键字“
iSCSIInitiatorIpAddress:#
”、“iSCSIInitiatorNetmask:#
”、“iSCSIInitiatorGateway:#
”和“iSCSITargetIpAddress:#
”的最大长度不正确的问题。 - 删除
/
返回的 "ISCSIMacAddr
" 关键字中多余的 ' ' 字符。 - 修复了如果 iSCSI 尝试未与当前 NIC 关联时 DHCP 启动不正确的错误。
- 更新 iSCSI 配置表单以显示从 DHCP 服务检索的启动器配置。
- 在
IPv6 Support from UNDI
通过 IPv6 启动 iSCSI 引导之前,会检查“ ”类型的 AIP 协议。 - 修复 iSCSI 配置表单中未删除的先前显示的尝试页面中的 TargetIp 地址将保存到新创建的尝试中的错误。
- 当目标信息首先设置为从 DHCP 检索然后静态配置时,修复 iSCSI 连接失败。
- 修复了从 DHCP 检索目标信息并表示为 URI 格式时 iSCSI 连接失败的问题。
-
DNS 更新
- 修复
RetryCount/RetryInterval
根据 UEFI 规范使用不正确调用方配置的错误。
- 修复
-
DHCP6 更新
- 在开始 DHCP 进程之前检查媒体存在状态。
-
PXE 更新
- 修复了如果在
PXE.Dhcp()
界面中没有收到有效的 PXE 报价,则使用不正确的返回状态代码的错误。 - 修复一个错误,如果输入参数是
PXE.SetStationIp()
,则StationIp/SubnetMask
不应修改地址。NewStationIP/NewSubnetMask
NULL
- 如果 PXE 无法从 Smbios 读取系统 GUID,则添加警告调试消息。
- 修复了如果在
包接口变化
- 删除
ping6
和ifconfig6
外壳应用程序。
Edk IIping6/ifconfig6
在NetworkPkg
和 中重复了实现ShellPkg
。这两个版本的用法和参数格式完全一样。这两个命令已经加入到UEFI Shell规范中,所以ShellPkg\Library\UefiShellNetwork2CommandsLib\
以后会主动维护下NetworkPkg
副本,删除副本。
UEFI PI 规范合规性
-
添加
EFI_HTTP_BOOT_CALLBACK_PROTOCOL
UEFI 2.7 A 中第 24.7.6 节中所述的支持。HTTP 引导驱动程序已更新为支持 EFI HTTP 引导Callback
协议。当 HTTP Boot 驱动程序即将传输或已接收数据包时,将调用新协议。如果平台不提供,将安装新协议的默认实现,以百分比格式显示引导文件下载进度。 -
UEFI 2.7 A 添加了澄清以
EFI_IP6_CONFIG_PROTOCOL.SetData()
清除具有零值 DataSize 参数的某些数据类型。IP6 驱动程序已更新以支持此功能。 -
IPV6 Support from UNDI
根据IPV6 Support from UNDI
UEFI 2.7 A 中的第 11.12.4 节“ ”,在启动 IPv6 iSCSI/HTTP Boot 之前检查“ ”类型。
已知的问题
-
启用 IPsec 的 iSCSI 远程操作系统安装/启动。在当前的实现中,iSCSI 驱动程序能够在启用 IPsec 的情况下访问 pre-OS 环境中的存储服务器;而 iSCSI 远程操作系统安装/启动无法与 IPsec 一起使用,因为 IPsec 所需的参数不会传送到操作系统。将此类参数移交给操作系统的一种可能方式是使用 GUIDed 设备路径。
-
不支持 iSCSI NOP-Out 包。在当前实施中,不支持 iSCSI NOP-Out 功能。收到 NOP-In 并将“
Target Transfer Tag
”设置为有效值而不是默认值时0xFFFFFFFF
,连接可能会中断。用户需要关闭 iSCSI 目标端的 NOP-In 功能以避免此故障。 -
启用 IpSec IKEv2 时出现 iSCSI 连接问题。由于 UEFI 驱动程序模型限制,当 iSCSI 驱动程序尝试初始化与 iSCSI 目标的连接时,IpSec 驱动程序可能尚未启动。如果将 IpSec IKEv2 配置为使用,这将使 iSCSI 连接失败。用户可以在启用 IpSec 之前先建立 iSCSI 连接以解决此问题。
-
不支持在系统重置后立即通过 Wi-Fi 网络启动 PXE/HTTP 启动。Wi-Fi 设备需要额外的时间连接到 AP,在自动加载启动选项之前无法完成。用户可以在连接 Wi-Fi 网络后进入 Boot Manager 菜单选择并启动 PXE/HTTP Boot。
-
Wi-Fi 网络上的 iSCSI 连接问题。由于 UEFI 驱动程序模型限制,当 iSCSI 驱动程序尝试初始化与 iSCSI 目标的连接时,Wi-Fi 设备无法连接到 AP。这将使 iSCSI 连接在 Wi-Fi 网络上失败。用户可以在连接 Wi-Fi 网络后从 UEFI shell 加载 iSCSI 驱动程序以解决此问题。
UDK2018 PcAtChipsetPkg 注释
新功能和变化
- 添加
PeiAcpiTimerLib
和更改DxeAcpiTimerLib
.PeiAcpiTimerLib
在 HOB 中缓存性能计数器频率。DxeAcpiTimerLib
使用缓存的频率或在HOB中找不到它时重新计算频率。
BUG修复
- 修复了 IsaAcpiDxe 中可能导致键盘故障的错误
"reconnect -r"
。
包接口变化
- 在 PcAtChipsetPkg.dec 文件中添加以下 PCD。
PcdInitialValueRtcRegisterA
PcdInitialValueRtcRegisterB
PcdInitialValueRtcRegisterD
UDK2018 SecurityPkg 注释
新功能和变化
-
经过身份验证的变量和安全启动
- 更新
SecureBootConfigDxe
以 2 层格式呈现 DBX 内容 - 将可信证书策略从整个签名者的证书堆栈更改为顶级颁发者证书,
tbscertificate + SignerCert CN
以实现更好的管理兼容性。散列用于减少存储开销。
- 更新
-
TCG
- 执行 TPM2.0 有序关闭以与平台重置合并。
- 定义新的 Pre-Hashed FV PPI 以避免在测量过程中重复哈希计算。
- 启用 TPM2.0 中断支持。2个pcds暴露报告可重配置和不可重配置的TPM中断资源
- 如果 TPM2.0 命令执行超时,支持命令取消
OpalPasswordPei
添加以修复由 IOMMU 功能导致的 S3 路径中的 DMA 操作中止问题。- 在 TPM1.2、TPM2.0 命令库中应用更多检查以修复内存损坏漏洞
-
杂项
- 删除
RngTest
应用程序。 VerifySignature
在Pkcs7Verify
协议中实现接口。
- 删除
包接口变化
-
不再支持基于计数器的身份验证变量。带有属性的 SetVariable
EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS
将返回EFI_INVALID_PARAMETER
. 当用户实际存在被断言时,仍然允许删除现有的基于计数器的身份验证变量。 -
PcdTpm2CurrentIrqNum
并PcdTpm2PossibleIrqNumBuf
引入平台上报TPM中断资源。PcdTpm2CurrentIrqNum
由 报告,_CRS
而PcdTpm2PossibleIrqNumBuf
由 报告_PRS
。 -
TrEE
删除所有库和驱动程序。平台应使用Tcg2
如下所述的库和驱动程序。
包含/Guid/TrEEConfigHii.h < - 包含/Guid/Tcg2ConfigHii.h
Include/Guid/TrEEPhysicalPresenceData.h < - Include/Guid/Tcg2PhysicalPresenceData.h
Include/Library/TrEEPhysicalPresenceLib.h < - Include/Library/Tcg2PhysicalPresenceLib.h
Include/Library/TrEEPpVendorLib.h < - Include/Library/Tcg2PpVendorLib.h
库/TrEEPpVendorLibNull < - 库/Tcg2PpVendorLibNull
库/DxeTrEEPhysicalPresenceLib < - 库/DxeTcg2PhysicalPresenceLib
库/Tpm2DeviceLibTrEE < - 库/Tpm2DeviceLibTcg2
Tcg/TrEEConfig < - Tcg/Tcg2Config
Tcg/TrEEPei < - Tcg/Tcg2Pei
Tcg/TrEEDxe < - Tcg/Tcg2Dxe
Tcg/TrEESmm < - Tcg/Tcg2Smm
BUG修复
-
返回
NOT_IMPLEMENTED
固件中不支持的非供应商特定 PP。 -
拒绝非法
PCR
银行分配实体存在请求 -
修复
HashInterfaceHob
溢出问题
UDK2018 ShellPkg 注释
新功能和变化
- 已进行以下更改以提高输出可读性:
- 以更亮的蓝色/绿色显示所有输出。
- 更改“驱动程序”以在非 SFO 模式下显示图像名称而不是图像路径。
- 更改“ dmpstore ”以显示已知变量供应商 GUID 的名称。
- 改变“ dh ”:
- 在一行中显示所有协议名称。
- 以亮色而非蓝色显示关键信息。
-v
提供“ ”时显示协议实例指针值。- 支持最新 UEFI/PI 规范中定义的协议。
- 显示以下协议的更多信息:
ImageDevicePath
DevicePath
LoadedImage
BusSpecificDriverOverride
BlockIo
DebugSupport
GraphicsOutput
PciIo
UsbIo
PartitionInfo
-
将“dp”和“tftp”从“NULL”类库转换为动态命令。
-
删除不必要的
TimerLib
从依赖ShellPkg.dsc
。 -
将“ edit ”和“ hexedit ”更改为通过
SimpleTextInEx
接口读取输入。 -
更改“ mm ”以移除不必要的 IO 地址限制 (
<=
0xFFFF
)。
BUG修复
-
修复“ dh ”以显示正确的驱动程序型号信息。
-
修复“ ls ”以本地时间显示文件时间。
-
修复“映射”以在 CDROM 介质状态更改时显示正确的块 IO 信息。
-
修复“ dblk ”以在调用
BlockIo
接口时使用对齐的缓冲区。 -
修复“ mkdir ”以支持创建嵌套目录。
-
修复“ map -r ”后无法更改当前目录的错误。
-
修复“ ifconfig ”以显示正确的媒体状态。
-
修复控制台最大列大于 200 时的“编辑”挂起问题。
-
修复存储介质已满时“ tftp ”挂起的问题。
-
修复“ hexedit ”以便能够访问任何范围的 MMIO 空间。
-
修复运行命令前按Ctrl+C会意外终止命令的问题。
-
修复“ ping ”以不丢失第一个数据包。
已知的问题
-
“ rm ”可以通过其他地图名称删除当前工作目录。
-
“ devcfg ”不重叠引导管理器功能。
UDK2018 SourceLevelDebugPkg 注释
新功能和变化
- DebugCommunicationLibUsb3:使用 EdkiiIommu 接口获取 DMA 缓冲区。
包接口变化
- 添加 PCD PcdTransferProtocolRevision。
BUG修复
新功能和变化
包接口变化
FIRMWARE_VARIABLE_MTRR_NUMBER
MTRR_LIB_IA32_MTRR_CAP
MTRR_LIB_IA32_MTRR_CAP_VCNT_MASK
MTRR_LIB_IA32_MTRR_FIX64K_00000
MTRR_LIB_IA32_MTRR_FIX16K_80000
MTRR_LIB_IA32_MTRR_FIX16K_A0000
MTRR_LIB_IA32_MTRR_FIX4K_C0000
MTRR_LIB_IA32_MTRR_FIX4K_C8000
MTRR_LIB_IA32_MTRR_FIX4K_D0000
MTRR_LIB_IA32_MTRR_FIX4K_D8000
MTRR_LIB_IA32_MTRR_FIX4K_E0000
MTRR_LIB_IA32_MTRR_FIX4K_E8000
MTRR_LIB_IA32_MTRR_FIX4K_F0000
MTRR_LIB_IA32_MTRR_FIX4K_F8000
MTRR_LIB_IA32_VARIABLE_MTRR_BASE
MTRR_LIB_IA32_VARIABLE_MTRR_END
MTRR_LIB_IA32_MTRR_DEF_TYPE
MTRR_LIB_MSR_VALID_MASK
MTRR_LIB_CACHE_VALID_ADDRESS
MTRR_LIB_CACHE_MTRR_ENABLED
MTRR_LIB_CACHE_FIXED_MTRR_ENABLED
BUG修复
- SmmDebugAgentLib:退出 SMM 环境时恢复 APIC 计时器。
UDK2018 UefiCpuPkg 笔记
- 新功能和变化
- 包接口更改
- Bug修复
-
BaseXApicLib 和 BaseXApicX2ApicLib:支持 AMD。
-
CpuCommonFeaturesLib:
- 启用 PPIN(受保护处理器库存编号)功能。
- 删除 SENTER 功能,因为它已合并到 SMX 功能。
- 启用 LMCE(本地机器检查异常)功能。
- 启用 PROC_TRACE(处理器跟踪)功能。
-
PiSmmCommunicationSmm:弃用 SMM 通信 ACPI 表。
-
CpuExceptionHandlerLib:当启用堆栈保护时,为异常处理程序使用单独的堆栈。
-
PiSmmCpuDxeSmm:
- 在 S3 恢复路径中组合 2 个独立的 INIT-SIPI-SIPI 以提高 S3 启动性能。
- 产生 EDKII_SMM_MEMORY_ATTRIBUTE_PROTOCOL。它由 SMM 堆 gurad 功能使用。
- 在 SMM 环境中启用 NULL 指针检测。
-
S3Resume2Pei:
- 在 S3 恢复路径结束时发出信号 EdkiiEndOfS3Resume 事件。
- 在 S3 SMM 环境初始化之后和启动脚本执行之前发出 EdkiiS3SmmInitDone 事件信号。
- 删除 Include/Library/MtrrLib.h 中废弃的宏:
-
MtrrLib:添加 API MtrrSetMemoryAttributesInMtrrSettings()。
-
为 AMD 添加 CPUID 定义:Include/Register/Amd/Cpuid.h。
-
CpuCommonFeaturesLib:修复错误启用 SMX/VMX 的错误。
-
CpuMpDxe:修复可能导致 S4 恢复失败的错误。
-
MtrrLib:重新实现库以确保始终可以计算最佳 MTRR 设置。
-
MpInitLib:
- 重新启用 AP 时完全初始化 AP。
- 修复导致 AP 在源级调试启用环境中进入定时器中断处理程序的错误。
- 修复了在 SwitchBSP() 之后在新 BSP 中禁用定时器中断的错误。
- 修复了在 PEI 阶段为 AP 唤醒缓冲区找不到由于低于 1MB 的可用内存而导致系统挂起的错误。
- 修复了可能导致由于 StartupApSignal 引用错误导致 AP 无法唤醒的问题。
-
CpuExceptionHandlerLib:修复导致无法在发布版本中转储异常信息的错误。
-
PiSmmMCpuDxeSmm:修复启用 SMM 配置文件时潜在的无限循环问题。
-
SecCore:修复了一个错误,以保证可以通过 SecPerformancePpi 获得正确的 SEC 性能数据。
-
CpuCommonFeaturesLib:
- 修复 AESNI 特征检测。
- 修复 Haswell CPU 挂起 50% 的问题。
- 即使 MCA 已禁用,也不要无条件启用它。
EDK II Security White Papers
Kevin Shaw edited this page on 11 Dec 2020 · 15 revisions
A list of White Papers and information for EDK II Security from multiple sources
- https://uefi.org
- https://software.intel.com/en-us/firmware/
- https://tianocore.org
- Industry standard:
- SideChannel: Intel Software Developer Zone -firmware speculative execution
- MDS: Intel Software Developer Zone - microarchitectural data sampling
General:
- uefi.org - Threat Modeling for Modern System FW.pdf (July 2013)
- uefi.org - An Introduction to Platform Security (Spring 2018)
EDK II Code:
- A Tour Beyond BIOS - Security Design Guide in_EDK_II.pdf (Sept 2016)
- EDK II Secure Coding Guide (June 2019)
- EDK II Secure Code Review Guide (June 2019)
Memory Protection:
- A Tour Beyond BIOS – Memory Protection in UEFI BIOS - gitbook (March 2017)
- A Tour Beyond BIOS - Mitigate Buffer Overflow in UEFI (April 2018)
SMM Protection:
- A Tour Beyond BIOS Secure SMM Communication (April 2016)
- uefi.org - SMM Protection in EDK II (Spring 2017)
SecureBoot/AuthVariable:
- A Tour Beyond BIOS - Implementing UEFI Authenticated Variables in SMM with EDK II (Oct 2015)
- Understanding the UEFI Secure Boot Chain (June 2019)
TrustedBoot/TPM2:
- A Tour Beyond BIOS - with the UEFI TPM2 Support in EDK II (Sept 2014)
- Understanding the Trusted Boot Chain Implementation (Nov 2020)
DMA: A Tour Beyond BIOS - Using IOMMU for DMA Protection in UEFI firmware (Oct 2017)
Capsule/Recovery: A Tour Beyond BIOS - Capsule Update and Recovery in EDK II (Dec 2016)
S3: A Tour Beyond BIOS - Implementing S3 Resume with EDK II (Oct 2015)
Profile: A Tour Beyond BIOS - Implementing Profiling in EDK_II (July 2016)
STM/VMM:
- A Tour Beyond BIOS - Launching STM to Monitor SMM in EDK II (Aug 2015)
- A Tour Beyond BIOS - Launching a VMM in EDK II (Oct 2015)
- A Tour Beyond BIOS - Supporting SMM Resource Monitor using EDK II (June 2015)
StandaloneMM: A Tour Beyond BIOS - Launching Standalone SMM Drivers in the PEI Phase using EDK II (May 2015)
Home | Getting Started with EDK II | Reporting Issues | Community Information | Community Support | Tasks | BSD+Patent
Pages 359
Wiki Navigation:
Home
Getting Started with EDK II
EDK II Platforms
EDK II Documents
EDK II Release Planning
Reporting Issues
Reporting Security Issues
Community Information
Additional Projects & Tasks
Training
Community Support
Community Virtual Meetings
Clone this wiki locally
Code Style C
Laurie Jarlstrom edited this page on 6 Apr 2016 · 3 revisions
This is just a brief overview of the C Code Style used for our projects. The official C Coding Standards specification can be found at:
Table of Contents |
Overview
- CamelCase used for variables, functions and file names
- UPPERCASE used for types and macros
- Use UEFI types rather than C types
- int=>INTN; unsigned int=>UINTN; void=>VOID; etc...
- Limit line length to 80 characters
- 2 spaces of indentation
- Never use tab characters.
- Set editor to insert spaces rather than a tab character.
- if, for, while, etc. always use { }, even when there is only one statement
- The opening brace ({) should always appear at the end of the line previous line.
- The opening brace ({) for a function should always appear separately on the a new line.
Example of Properly Formatted Code
C File Example:
/** Brief and Detailed Descriptions. @param[in] Arg1 Description of Arg1. @param[in] Arg2 Description of Arg2, which is optional. @param[out] Arg3 Description of Arg3. @param[in, out] Arg4 Description of Arg4. @retval EFI_SUCCESS Description of what EFI_SUCCESS means. @retval !EFI_SUCCESS Failure. **/ EFI_STATUS EFIAPI FooName ( IN UINTN Arg1, IN UINTN Arg2 OPTIONAL, OUT UINTN *Arg3, IN OUT UINTN *Arg4 ) { UINTN Local; UINTN AnotherLocal; ... for (Local = 0; Local < 5; Local++) { if (Local == 2) { Print (L"Local: %d (yes! 2)\n", Local); } else { Print (L"Local: %d\n", Local); } } ... }
H File Example:
#define FOO_MACRO(a, b) ((a) * (b)) #define FOO_CONSTANT 0xcafe /** Brief and Detailed Descriptions. @param[in] Arg1 Description of Arg1. @param[in] Arg2 Description of Arg2, which is optional. @param[out] Arg3 Description of Arg3. @param[in, out] Arg4 Description of Arg4. @retval EFI_SUCCESS Description of what EFI_SUCCESS means. @retval !EFI_SUCCESS Failure. **/ EFI_STATUS EFIAPI FooName ( IN UINTN Arg1, IN UINTN Arg2 OPTIONAL, OUT UINTN *Arg3, IN OUT UINTN *Arg4 ); ... #endif
Examples
CamelCase
Used for variables, functions and file names
Correct:
#include "FooFileName.h" ... VOID SuperFunction ( ... UINTN ALocalVariable; UINTN UefiVersion;
Incorrect:
#include "foo-file_name.h" ... VOID superFunction ( ... UINTN a_local_variable; UINTN UEFIVersion;
UPPERCASE
Used for types and macros
Correct:
#define FOO_MACRO(a, b) ((a) * (b)) typedef struct _STRUCT_NAME STRUCT_NAME; struct _STRUCT_NAME { ... };
Incorrect:
#define FooMacro(a, b) ((a) * (b)) #define Foo_Macro(a, b) ((a) * (b)) typedef struct _Struct_Name StructName;
Use UEFI types
Don't use C types directly
Correct:
INTN ALocalVariable; UINTN UefiVersion; VOID *Ptr;
Incorrect:
int ALocalVariable; unsigned int UefiVersion; void *Ptr;
2 spaces of indentation
Correct:
if (TRUE) { Print (L"Hello, world!\n"); }
Incorrect:
if (TRUE) { Print (L"Hello, world!\n"); }
Always use { }
If, for, while, etc. always use { }, even when there is only one statement
Correct:
if (TRUE) { Print (L"Hello, world!\n"); }
Incorrect:
if (TRUE) Print (L"Hello, world!\n");