/UEFI-Lessons

Lessons to get to know UEFI programming in Linux with the help of EDKII

Primary LanguageCMIT LicenseMIT

These series of lessons are intendend to get you started with UEFI programming in Linux with the help of EDKII. https://www.eet-china.com/mp/a150514.html UEFI入门必读的12本书

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 the ImageHandle protocols
  • Lesson 09: Get ImageHandle protocols with the ProtocolsPerHandle API function
  • Lesson 10: EFI_STATUS type and EFI_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 and ShellLib 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 use EFI_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 of ShellLib/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 and UninstallMultipleProtocolInterfaces 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 the DEBUG 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 the EFI_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 the EFI_HII_DATABASE_PROTOCOL directly to publish HII Package list with Strings packages. Part 2: String Packages data generation
  • Lesson 47: Use NewPackageList from the EFI_HII_DATABASE_PROTOCOL directly to publish HII Package list with Strings packages. Part 3: Combine everything together. Use NewPackageList and GetString protocol functions
  • Lesson 48: Use UNI files and HiiLib 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 -? and help work in shell. EFI_SHELL_GET_HELP_TEXT function from the EFI_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 and SetString functions from the EFI_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 of EDKII_VARIABLE_POLICY_PROTOCOL
  • Lesson 56: How to get module FILE_GUID and BASE_NAME in code. Autoconf variables gEfiCallerIdGuid/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 and text 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 the dmpstore command
  • Lesson 61: Use dmpstore command to save/load variables to/from files. Write an application to recalculate CRC32 checksums in the dmpstore 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 and efivarstore 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 and time
  • Lesson 68: More VFR input elements - Part 4: oneof and orderedlist
  • 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 and EFI_HII_CONFIG_ACCESS_PROTOCOL
  • Lesson XX: Create a driver with Buffer Storage - Part 2: Investigate when and how ExtractConfig/RouteConfig/Callback functions are called
  • Lesson XX: Create a driver with Buffer Storage - Part 3: Use BlockToConfig()/ConfigToBlock() functions to handle configuration requests
  • Lesson XX: Create a driver with Buffer Storage - Part 4: Make ExtractConfig() function compatible with UEFI specification
  • Lesson XX: Investigate when and how the Form Browser calls EFI_HII_CONFIG_ROUTING_PROTOCOL.Callback() function

  • 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 with RAW files
  • Lesson XX: File sections - Part 1: FREEFORM file and RAW 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

  1. https://blog.fpmurphy.com/

https://github.com/fpmurphy/UEFI-Utilities-2019

  1. https://github.com/andreiw/UefiToolsPkg

Check these if you don't afraid of the Chinese language:

  1. Principles and Programming of UEFI, Dai Zhenghua (https://www.amazon.com/Combat-UEFI-Principles-Programming-Chinese/dp/B07W3GFLRM)

https://github.com/zhenghuadai/uefi-programming

  1. http://www.lab-z.com/iof/

  2. https://blog.csdn.net/luobing4365

https://gitee.com/luobing4365/uefi-explorer


And for the Russian speakers:

  1. 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):

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