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: 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: Changing hidden BIOS settings. Using
IFRExtractor
utility to extract UEFI IFR data into human-readable text
- 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
1) 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)
2) 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)
3) https://github.com/tianocore-training
https://github.com/Laurie0131
4) https://blog.fpmurphy.com/
https://github.com/fpmurphy/UEFI-Utilities-2019
5) https://github.com/andreiw/UefiToolsPkg
Check these if you don't afraid of the Chinese language:
6) Principles and Programming of UEFI, Dai Zhenghua (https://www.amazon.com/Combat-UEFI-Principles-Programming-Chinese/dp/B07W3GFLRM)
https://github.com/zhenghuadai/uefi-programming
7) http://www.lab-z.com/iof/
8) https://blog.csdn.net/luobing4365
https://gitee.com/luobing4365/uefi-explorer
And for the Russian speakers:
9) https://habr.com/ru/users/CodeRush/posts/
Specifications
UEFI specifications (https://uefi.org/specifications): - UEFI Specification - UEFI Platform Initialization Specification - UEFI Shell Specification
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