UEFI-Lessons
UEFI-Lessons copied to clipboard
Lessons to get to know UEFI programming in Linux with the help of EDKII
These series of lessons are intendend to get you started with UEFI programming in Linux with the help of EDKII.
Content
- Lesson 00: Getting started guide for EDKII. Compile OVMF and run it in QEMU
- Lesson 01: Create a simplest app and run it in OVMF
- Lesson 02: Create a simplest package
-
Lesson 03: Create
HelloWorld
app with the help of SystemTable services -
Lesson 04: Use edk2 libraries to simplify our
HelloWorld
app -
Lesson 05: Simplify build command with the help of files in the
Conf
folder - Lesson 06: Handle/Protocol databases internals - Part 1: Theory and raw access to an app ImageHandle
- Lesson 07: Handle/Protocol databases internals - Part 2: Raw access to app protocols
-
Lesson 08:
HandleProtocol
API function. Information from theImageHandle
protocols -
Lesson 09: Get ImageHandle protocols with the
ProtocolsPerHandle
API function -
Lesson 10:
EFI_STATUS
type andEFI_ERROR
macros - Lesson 11: Get EFI memory map information
-
Lesson 12:
EFI_SHELL_PARAMETERS_PROTOCOL
. Transform our EFI memory map to the Linux kernel style -
Lesson 13:
ShellAppMain
entry point -
Lesson 14: Get all variable names and GUIDs with the
gRT->GetNextVariableName
API -
Lesson 15: Get and parse boot variables (BootOrder/BootCurrent/BootXXXX) with the
gRT->GetVariable
API - Lesson 16: Build our own boot option inside OVMF image similar to the UEFI shell app
-
Lesson 17: Add
WaitForEvent
function to our boot option app to see its output on booting -
Lesson 18: Handle input from user with the
ReadKeyStroke
function -
Lesson 19: Boot option modification with the help of
bcfg
command - Lesson 20: Intro to Platfrom Configuration Database (PCD). Declare and get simple fixed PCD
- Lesson 21: Override order for PCD variables
- Lesson 22: Feature flag PCD and its comparision to BOOLEAN fixed at build PCD
-
Lesson 23: PatchableInModule PCDs and how they can be changed via
GenPatchPcdTable
/PatchPcdValue
utilities - Lesson 24: Dynamic/DynamicEx PCDs
- Lesson 25: More on PCDs
-
Lesson 26: Tables referenced in
EFI_CONFIGURATION_TABLE
-
Lesson 27: Get SMBIOS information with
dmem
/EFI_SMBIOS_PROTOCOL
/smbiosview
-
Lesson 28: Get ACPI tables and save them to files with a help of
EFI_SHELL_PROTOCOL
-
Lesson 29: Use
EFI_ACPI_SDT_PROTOCOL
andShellLib
to save a BMP image from the ACPI BGRT table -
Lesson 30: Find all PCI root bridges in the system with a help of
LocateHandleBuffer
/OpenProtocol
functions and useEFI_PCI_ROOT_BRIDGE_IO_PROTOCOL
to get all PCI functions in the system -
Lesson 31: Search
pci.ids
database to get PCI Vendor/Device information with a help ofShellLib
/PrintLib
functions -
Lesson 32: Show PCI Option ROM images with the help of
EFI_PCI_IO_PROTOCOL
protocol -
Lesson 33: Use
EfiRom
utility for parsing and creation of PCI Option ROM images -
Lesson 34: Create a simple UEFI driver. Use
load
/unload
UEFI shell commands to work with a driver image - Lesson 35: Create a simple library and use it in an app
-
Lesson 36: Library constructor and destructor.
NULL
libraries -
Lesson 37: Investigate ways how to add
acpiview
command functionality to your shell -
Lesson 38: Create and use your custom protocol.
InstallMultipleProtocolInterfaces
andUninstallMultipleProtocolInterfaces
functions -
Lesson 39: Create a driver that adds hot key functionality with a help of
RegisterKeyNotify
/UnregisterKeyNotify
functions -
Lesson 40:
Key####
NVRAM variables -
Lesson 41:
DEBUG
print statement internals.EFI_D_*
log levels and all the PCDs for theDEBUG
statement control. Getting and parsing OVMF boot log - Lesson 42: Debug your drivers/applications and OVMF itself with GDB
- Lesson 43: Intro to the HII. Create an application to display HII database content
- Lesson 44: HII database internals
-
Lesson 45: Use
NewPackageList
from theEFI_HII_DATABASE_PROTOCOL
directly to publish HII Package list with Strings packages. Part 1: Investigate common aspects of Package List data generation -
Lesson 46: Use
NewPackageList
from theEFI_HII_DATABASE_PROTOCOL
directly to publish HII Package list with Strings packages. Part 2: String Packages data generation -
Lesson 47: Use
NewPackageList
from theEFI_HII_DATABASE_PROTOCOL
directly to publish HII Package list with Strings packages. Part 3: Combine everything together. UseNewPackageList
andGetString
protocol functions -
Lesson 48: Use
UNI
files andHiiLib
to publish and work with HII String packages -
Lesson 49: UNI files declared with the help of
MODULE_UNI_FILE
/PACKAGE_UNI_FILE
/[UserExtensions.TianoCore."ExtraFiles"]
-
Lesson 50: Use
UEFI_HII_RESOURCE_SECTION
to publish HII Package list with Strings packages -
Lesson 51: Add manual to UEFI application. How
-?
andhelp
work in shell.EFI_SHELL_GET_HELP_TEXT
function from theEFI_SHELL_PROTOCOL
-
Lesson 52: Add Russian font - Part 1: investigate
EFI_NARROW_GLYPH
/EFI_WIDE_GLYPH
format, construct glyph array from the *.woff font file -
Lesson 53: Add Russian font - Part 2: construct
EFI_HII_SIMPLE_FONT_PACKAGE
and populate it to the HII database -
Lesson 54: Use
NewString
andSetString
functions from theEFI_HII_STRING_PROTOCOL
to add String Package for another language dynamically -
Lesson 55: Try to modify
PlatformLangCodes
EFI variable and add another language dynamically. Variable protection with a help ofEDKII_VARIABLE_POLICY_PROTOCOL
-
Lesson 56: How to get module
FILE_GUID
andBASE_NAME
in code. Autoconf variablesgEfiCallerIdGuid
/gEdkiiDscPlatformGuid
/gEfiCallerBaseName
-
Lesson 57: Use VFR to create a simple form and display it with a help of
EFI_FORM_BROWSER2_PROTOCOL.SendForm()
. IFR data investigation -
Lesson 58:
subtitle
andtext
VFR elements - Lesson 59: Create an application to display HII Forms by package list GUIDs. Convert our simple form application to UEFI driver form
-
Lesson 60: Use
gRT->SetVariable()
function to create and delete UEFI variables. Investigate variable attributes. Practical uses of thedmpstore
command -
Lesson 61: Use
dmpstore
command to save/load variables to/from files. Write an application to recalculate CRC32 checksums in thedmpstore
variable dumps -
Lesson 62: Structure of the UEFI
Device path
. Dynamic and static Device paths. Interation over Device paths -
Lesson 63: Create HII Form with a checkbox - Part 1: VFR code for
checkbox
element andefivarstore
element -
Lesson 64: Create HII Form with a checkbox - Part 2: Necessary code for
efivarstore
to work correctly -
Lesson 65: More VFR input elements - Part 1:
numeric
-
Lesson 66: More VFR input elements - Part 2:
string
-
Lesson 67: More VFR input elements - Part 3:
date
andtime
-
Lesson 68: More VFR input elements - Part 4:
oneof
andorderedlist
-
Lesson 69: Conditional keywords in VFR:
suppressif
/grayoutif
/disableif
/warningif
/nosubmitif
/inconsistentif
-
Lesson 70: Constants and operators in VFR. Basic condition statements with builtins
ideqval
/ideqvallist
/ideqid
/questionref
/pushthis
-
Lesson 71: Basic VFR builtins for strings:
stringref
/toupper
/tolower
/length
-
Lesson 72: Dynamically add elements to HII forms with a help of a
label
keyword -
Lesson 73: Setting defaults for the VFR questions:
default
/defaultstore
/resetbutton
keywords
-
Lesson XX: Register protocol installation callbacks with the
EFI_BOOT_SERVICES.RegisterProtocolNotify()
andEfiCreateProtocolNotifyEvent
functions -
Lesson XX: UEFI Configuration language. Dump current HII Database settings with the
EFI_HII_CONFIG_ROUTING_PROTOCOL.ExportConfig()
function - Lesson XX: UEFI Configuration language. Create a function to prettify configuration string data
-
Lesson XX: UEFI Configuration language. Extract individual form element configurations with the
EFI_HII_CONFIG_ROUTING_PROTOCOL.ExtractConfig()
function -
Lesson XX: UEFI Configuration language. Explore
ExtractConfig
request syntax on custom forms -
Lesson XX: UEFI Configuration language. Change form data with the
EFI_HII_CONFIG_ROUTING_PROTOCOL.RouteConfig()
function -
Lesson XX: UEFI Configuration language. Keyword handler protocol. Get keyword values with the
EFI_CONFIG_KEYWORD_HANDLER_PROTOCOL.GetData()
function -
Lesson XX: UEFI Configuration language. Keyword handler protocol. Add keywords to you Form elements. Use
EFI_CONFIG_KEYWORD_HANDLER_PROTOCOL.SetData()
function to chage data referred by keywords -
Lesson XX: Use
HiiSetToDefaults
function to set form elements to their default values non-interactively -
Lesson XX: Create a driver with
Buffer Storage
- Part 1:varstore
element andEFI_HII_CONFIG_ACCESS_PROTOCOL
-
Lesson XX: Create a driver with
Buffer Storage
- Part 2: Investigate when and howExtractConfig
/RouteConfig
/Callback
functions are called -
Lesson XX: Create a driver with
Buffer Storage
- Part 3: UseBlockToConfig()
/ConfigToBlock()
functions to handle configuration requests -
Lesson XX: Create a driver with
Buffer Storage
- Part 4: MakeExtractConfig()
function compatible with UEFI specification -
Lesson XX: Investigate when and how the Form Browser calls
EFI_HII_CONFIG_ROUTING_PROTOCOL.Callback()
function -
Lesson XX: Popup windows in edk2. Creating popups with the
EFI_HII_POPUP_PROTOCOL.CreatePopup()
andCreatePopUp
functions -
Lesson XX: Action requests for the Form Browser from the
EFI_HII_CONFIG_ROUTING_PROTOCOL.Callback()
function -
Lesson XX: The
password
VFR input element - Part 1: BasicCallback()
implementation to handle password element -
Lesson XX: The
password
VFR input element - Part 2: UseEFI_HASH2_PROTOCOL
to calculate password string hash
-
Lesson XX: Changing hidden BIOS settings. Using
IFRExtractor
utility to extract UEFI IFR data into human-readable text -
Lesson XX: Decompile UEFI modules with the help of
Ghidra
software and theefiSeek
plugin
- Lesson XX: Architecture specifier in section names
- Lesson XX: SKU specifier in section names
-
Lesson XX: Build tools configuration via
Conf/tools_def.txt
file and[BuildOptions]
section usage in INF and DSC files -
Lesson XX: Intro to FDF file format. Flash Device Image
[FD]
sections: flash chip defines and regions definition. OVMF image FDF file analysis -
Lesson XX: Firmware Volume (
FV
), FFS, files. Create simple FV withRAW
files -
Lesson XX: File sections - Part 1:
FREEFORM
file andRAW
section type. FV build process (GenSec
/GenFfs
/GenFv
tools) -
Lesson XX: File sections - Part 2: Other leaf sections:
USER_INTERFACE
/VERSION
/FREEFORM_SUBTYPE_GUID
/PE32
/PIC
/COMPATIBILITY16
/TE
/DISPOSABLE
/PEI_DEPEX
/DXE_DEPEX
-
Lesson XX: File sections - Part 3: Encapsulation sections:
COMPRESSION
/GUID_DEFINED
/FIRMWARE_VOLUME_IMAGE
- Lesson XX: File types
-
Lesson XX:
A priori
files.APRIORI PEI
/APRIORI DXE
syntax -
Lesson XX: Include modules to FDF via INF files.
Rule
sections -
Lesson XX: Binary modules.
[Binaries]
section and[Rule.<...>.BINARY]
rules -
Lesson XX:
OVMF
flash image structure. Working with FD image regions via memory-mapped flash -
Lesson XX: Using
EFI_FIRMWARE_VOLUME2_PROTOCOL
to read files from FFS -
Lesson XX: PCD storage methods:
Hii
PCDs ([PcdsDynamicHii]
/[PcdsDynamicExHii]
) -
Lesson XX: PCD storage methods:
VPD
PCDs ([PcdsDynamicVpd]
/[PcdsDynamicExVpd]
) - Lesson XX: How UEFI variables are stored in flash
Learning links
-
Beyond BIOS: Developing with the Unified Extensible Firmware Interface, Third Edition by Vincent Zimmer and Michael Rothman (https://www.amazon.com/Beyond-BIOS-Developing-Extensible-Interface/dp/1501514784)
-
Harnessing the Uefi Shell: Moving The Platform Beyond Dos, Second Edition by Michael Rothman and Vincent Zimmer (https://www.amazon.com/Harnessing-UEFI-Shell-Moving-Platform/dp/1501514806)
-
https://github.com/tianocore-training
https://github.com/Laurie0131
- https://blog.fpmurphy.com/
https://github.com/fpmurphy/UEFI-Utilities-2019
- https://github.com/andreiw/UefiToolsPkg
Check these if you don't afraid of the Chinese language:
- Principles and Programming of UEFI, Dai Zhenghua (https://www.amazon.com/Combat-UEFI-Principles-Programming-Chinese/dp/B07W3GFLRM)
https://github.com/zhenghuadai/uefi-programming
-
http://www.lab-z.com/iof/
-
https://blog.csdn.net/luobing4365
https://gitee.com/luobing4365/uefi-explorer
And for the Russian speakers:
- https://habr.com/ru/users/CodeRush/posts/
Specifications
UEFI specifications (https://uefi.org/specifications):
EDK2 specifications (https://github.com/tianocore/tianocore.github.io/wiki/EDK-II-Documentation#specifications):
- Build Specification
- Platform Description (DSC) File Specification
- Package Declaration (DEC) File Format Specification
- Module Information (INF) File Specification
- Flash Description (FDF) File Specification
- Platform Configuration Database Infrastructure Description
- Multi-String .UNI File Format Specification
- VFR Programming Language Specification
- Driver Writer's Guide
- Module Writer's Guide
- EDKII User Manual
Tools
- UEFITool - UEFITool is a cross-platform C++/Qt program for parsing, extracting and modifying UEFI firmware images
- CrScreenshotDxe - UEFI DXE driver to take screenshots from GOP-compatible graphic consoles
- RU.EFI - "Read Universal" - UEFI application to debug UEFI interfaces
- PCD_TABLE_parser - Parser for Platform Configuration Database (PCD) tables created in the EDKII build process