EFI_SECTION_USER_INTERFACE
Let's investigate EFI_SECTION_USER_INTERFACE=0x15
section type:
EFI_SECTION_USER_INTERFACE
Summary:
A leaf section type that contains a Unicode string that contains a human-readable file name.
Prototype:
typedef struct {
EFI_COMMON_SECTION_HEADER CommonHeader;
CHAR16 FileNameString[];
} EFI_USER_INTERFACE_SECTION;
Description:
The user interface file name section is a leaf section that contains a Unicode string that contains a human-readable file name.
This section is optional and is not required for any file types. There must never be more than one user interface file name section contained within a file.
As you can see this section is really simple. Its data is just a CHAR16
string. EDKII has syntax to initialize this section in-place:
FILE FREEFORM = f6ed9cf0-cdc1-40a1-9909-ac6a2f435e23 {
SECTION UI = "MyUI"
}
VolInfo
can display string of this section:
$ VolInfo Build/UefiLessonsPkg/RELEASE_GCC5/FV/SIMPLEVOLUME.Fv -x Build/UefiLessonsPkg/RELEASE_GCC5/FV/Guid.xref
VolInfo Version 1.0 Build Developer Build based on Revision: Unknown
ParseGuidBaseNameFile: Build/UefiLessonsPkg/RELEASE_GCC5/FV/Guid.xref
Signature: _FVH (4856465F)
Attributes: 40800
EFI_FVB2_ERASE_POLARITY
EFI_FVB2_ALIGNMENT_16
Header Length: 0x00000048
File System ID: 8c8ce578-8a3d-4f1c-9935-896185c32dd3
Revision: 0x0002
Number of Blocks: 0x00000500
Block Length: 0x00000001
Total Volume Size: 0x00000500
============================================================
File Name: F6ED9CF0-CDC1-40A1-9909-AC6A2F435E23 MyUI
File Offset: 0x00000048
File Length: 0x00000026
File Attributes: 0x00
File State: 0xF8
EFI_FILE_DATA_VALID
File Type: 0x02 EFI_FV_FILETYPE_FREEFORM
------------------------------------------------------------
Type: EFI_SECTION_USER_INTERFACE
Size: 0x0000000E
String: MyUI
There are a total of 1 files in this FV
Intermidiate file for this section would have *.ui
extension:
Build/UefiLessonsPkg/RELEASE_GCC5/FV/Ffs/f6ed9cf0-cdc1-40a1-9909-ac6a2f435e23SIMPLEVOLUME/f6ed9cf0-cdc1-40a1-9909-ac6a2f435e23SEC1.ui -C
00000000 0e 00 00 15 4d 00 79 00 55 00 49 00 00 00 |....M.y.U.I...|
0000000e
EFI_SECTION_VERSION
Another simple section that you might come across is EFI_SECTION_VERSION
:
Summary:
A leaf section type that contains a numeric build number and an optional Unicode string that represents the file revision.
Prototype:
typedef struct {
EFI_COMMON_SECTION_HEADER CommonHeader;
UINT16 BuildNumber;
CHAR16 VersionString[];
} EFI_VERSION_SECTION;
Parameters:
CommonHeader Common section header. CommonHeader.Type = EFI_SECTION_VERSION.
BuildNumber A UINT16 that represents a particular build. Subsequent builds have monotonically
increasing build numbers relative to earlier builds.
VersionString A null-terminated Unicode string that contains a text representation of the version. If
there is no text representation of the version, then an empty string must be provided.
Description:
A version section is a leaf section that contains a numeric build number and an optional Unicode string that represents the file revision.
To facilitate versioning of PEIMs, DXE drivers, and other files, a version section may be included in a file.
There must never be more than one version section contained within a file.
The syntax for adding this section is this:
FILE FREEFORM = f6ed9cf0-cdc1-40a1-9909-ac6a2f435e23 {
SECTION BUILD_NUM = 42 VERSION = "MyVersion"
}
Once again VolInfo
is able to display the content of this section:
$ VolInfo Build/UefiLessonsPkg/RELEASE_GCC5/FV/SIMPLEVOLUME.Fv -x Build/UefiLessonsPkg/RELEASE_GCC5/FV/Guid.xref
VolInfo Version 1.0 Build Developer Build based on Revision: Unknown
Signature: _FVH (4856465F)
Attributes: 40800
EFI_FVB2_ERASE_POLARITY
EFI_FVB2_ALIGNMENT_16
Header Length: 0x00000048
File System ID: 8c8ce578-8a3d-4f1c-9935-896185c32dd3
Revision: 0x0002
Number of Blocks: 0x00000500
Block Length: 0x00000001
Total Volume Size: 0x00000500
============================================================
File Name: F6ED9CF0-CDC1-40A1-9909-AC6A2F435E23
File Offset: 0x00000048
File Length: 0x00000032
File Attributes: 0x00
File State: 0xF8
EFI_FILE_DATA_VALID
File Type: 0x02 EFI_FV_FILETYPE_FREEFORM
------------------------------------------------------------
Type: EFI_SECTION_VERSION
Size: 0x0000001A
Build Number: 0x002A
Version String: MyVersion
There are a total of 1 files in this FV
Intermidiate file for this section would have *.ver
extension:
$ hexdump Build/UefiLessonsPkg/RELEASE_GCC5/FV/Ffs/f6ed9cf0-cdc1-40a1-9909-ac6a2f435e23SIMPLEVOLUME/f6ed9cf0-cdc1-40a1-9909-ac6a2f435e23SEC1.ver -C
00000000 1a 00 00 14 2a 00 4d 00 79 00 56 00 65 00 72 00 |....*.M.y.V.e.r.|
00000010 73 00 69 00 6f 00 6e 00 00 00 |s.i.o.n...|
0000001a
EFI_SECTION_FREEFORM_SUBTYPE_GUID
EFI_SECTION_FREEFORM_SUBTYPE_GUID
section is very similar to raw, except that its header contains GUID value to describe the data inside the section.
Here is definition from the PI specification:
EFI_SECTION_FREEFORM_SUBTYPE_GUID
Summary:
A leaf section type that contains a single EFI_GUID in the header to describe the raw data.
Prototype:
typedef struct {
EFI_COMMON_SECTION_HEADER CommonHeader;
EFI_GUID SubTypeGuid;
} EFI_FREEFORM_SUBTYPE_GUID_SECTION;
Parameters:
CommonHeader Common section header. CommonHeader.Type = EFI_SECTION_FREEFORM_SUBTYPE_GUID.
SubtypeGuid This GUID is defined by the creator of the file. It is a vendor-defined file type.
Description:
A free-form subtype GUID section is a leaf section that contains a single EFI_GUIDin the header to describe the raw data
The syntax for adding this section is this:
SECTION SUBTYPE_GUID <Guid> = <File>
Let's try to use it:
FILE FREEFORM = f6ed9cf0-cdc1-40a1-9909-ac6a2f435e23 {
SECTION SUBTYPE_GUID cf1fce30-b181-4d6a-b860-354c922e5c3e = $(WORKDIR)/hello.txt
}
Here is how VolInfo
output looks like in this case:
$ VolInfo Build/UefiLessonsPkg/RELEASE_GCC5/FV/SIMPLEVOLUME.Fv
VolInfo Version 1.0 Build Developer Build based on Revision: Unknown
Signature: _FVH (4856465F)
Attributes: 40800
EFI_FVB2_ERASE_POLARITY
EFI_FVB2_ALIGNMENT_16
Header Length: 0x00000048
File System ID: 8c8ce578-8a3d-4f1c-9935-896185c32dd3
Revision: 0x0002
Number of Blocks: 0x00000500
Block Length: 0x00000001
Total Volume Size: 0x00000500
============================================================
File Name: F6ED9CF0-CDC1-40A1-9909-AC6A2F435E23
File Offset: 0x00000048
File Length: 0x00000033
File Attributes: 0x00
File State: 0xF8
EFI_FILE_DATA_VALID
File Type: 0x02 EFI_FV_FILETYPE_FREEFORM
------------------------------------------------------------
Type: EFI_SECTION_FREEFORM_SUBTYPE_GUID
Size: 0x0000001B
Guid: cf1fce30-b181-4d6a-b860-354c922e5c3e
There are a total of 1 files in this FV
Intermidiate file for this section would have *.guid
extension:
$ hexdump Build/UefiLessonsPkg/RELEASE_GCC5/FV/Ffs/f6ed9cf0-cdc1-40a1-9909-ac6a2f435e23SIMPLEVOLUME/f6ed9cf0-cdc1-40a1-9909-ac6a2f435e23SEC1.guid -C
00000000 1b 00 00 18 30 ce 1f cf 81 b1 6a 4d b8 60 35 4c |....0.....jM.`5L|
00000010 92 2e 5c 3e 68 65 6c 6c 6f 21 0a |..\>hello!.|
0000001b
EFI_SECTION_PE32
/EFI_SECTION_PIC
/EFI_SECTION_COMPATIBILITY16
/EFI_SECTION_TE
Next there is a couple of sections for executable images. Most often you would use EFI_SECTION_PE32
and include .efi
code as your data. But nevertheless here is some info about all of the sections from the caption.
Here in VolInfo output I will show you just the section part, as the rest doesn't have any interesting changes. Also as the build system doesn't check the content of the section data, I will just use the same hello.txt
file for the section content that we've created earlier:
EFI_SECTION_PE32
EFI_SECTION_PE32
Summary
A leaf section type that contains a complete PE32+ image.
Prototype
typedef EFI_COMMON_SECTION_HEADER EFI_PE32_SECTION;
Description
The PE32+ image section is a leaf section that contains a complete PE32+ image. Normal UEFI
executables are stored within PE32+ images
Example usage:
FILE FREEFORM = f6ed9cf0-cdc1-40a1-9909-ac6a2f435e23 {
SECTION PE32 = $(WORKDIR)/hello.txt
}
VolInfo
display for the section:
------------------------------------------------------------
Type: EFI_SECTION_PE32
Size: 0x0000000B
The section file extension is "*.pe32":
$ hexdump Build/UefiLessonsPkg/RELEASE_GCC5/FV/Ffs/f6ed9cf0-cdc1-40a1-9909-ac6a2f435e23SIMPLEVOLUME/f6ed9cf0-cdc1-40a1-9909-ac6a2f435e23SEC1.pe32 -C
00000000 0b 00 00 10 68 65 6c 6c 6f 21 0a |....hello!.|
0000000b
EFI_SECTION_PIC
EFI_SECTION_PIC
Summary
A leaf section type that contains a position-independent-code (PIC) image.
Prototype
typedef EFI_COMMON_SECTION_HEADER EFI_PIC_SECTION;
Description
A PIC image section is a leaf section that contains a position-independent-code (PIC) image.
Example usage:
FILE FREEFORM = f6ed9cf0-cdc1-40a1-9909-ac6a2f435e23 {
SECTION PIC = $(WORKDIR)/hello.txt
}
VolInfo
output for the section:
------------------------------------------------------------
Type: EFI_SECTION_PIC
Size: 0x0000000B
The section file extension is "*.pic":
$ hexdump Build/UefiLessonsPkg/RELEASE_GCC5/FV/Ffs/f6ed9cf0-cdc1-40a1-9909-ac6a2f435e23SIMPLEVOLUME/f6ed9cf0-cdc1-40a1-9909-ac6a2f435e23SEC1.pic -C
00000000 0b 00 00 11 68 65 6c 6c 6f 21 0a |....hello!.|
0000000b
EFI_SECTION_COMPATIBILITY16
EFI_SECTION_COMPATIBILITY16
Summary:
A leaf section type that contains an IA-32 16-bit executable image.
Prototype:
typedef EFI_COMMON_SECTION_HEADER EFI_COMPATIBILITY16_SECTION;
Description:
A Compatibility16 image section is a leaf section that contains an IA-32 16-bit executable image.
IA-32 16-bit legacy code that may be included in PI Architecture firmware is stored in a 16-bit
executable image.
Example usage:
FILE FREEFORM = f6ed9cf0-cdc1-40a1-9909-ac6a2f435e23 {
SECTION COMPAT16 = $(WORKDIR)/hello.txt
}
VolInfo
output for the section:
------------------------------------------------------------
Type: EFI_SECTION_COMPATIBILITY16
Size: 0x0000000B
The section file extension is "*.com16":
$ hexdump Build/UefiLessonsPkg/RELEASE_GCC5/FV/Ffs/f6ed9cf0-cdc1-40a1-9909-ac6a2f435e23SIMPLEVOLUME/f6ed9cf0-cdc1-40a1-9909-ac6a2f435e23SEC1.com16 -C
00000000 0b 00 00 16 68 65 6c 6c 6f 21 0a |....hello!.|
0000000b
EFI_SECTION_TE
EFI_SECTION_TE
Summary
A leaf section that contains a Terse Executable (TE) image.
Prototype
typedef EFI_COMMON_SECTION_HEADER EFI_TE_SECTION;
Description
The terse executable section is a leaf section that contains a Terse Executable (TE) image. A TE
image is an executable image format specific to the PI Architecture that is used for storing
executable images in a smaller amount of space than would be required by a full PE32+ image.
Example usage:
FILE FREEFORM = f6ed9cf0-cdc1-40a1-9909-ac6a2f435e23 {
SECTION TE = $(WORKDIR)/hello.txt
}
You would find that in this case build actually checks the file content. Build fails with the error:
DOS header signature was not found in /<...>/hello.txt image.
But if you would use correct file, the VolInfo
would show you EFI_SECTION_TE
section.
The section file extension is "*.te":
EFI_SECTION_DISPOSABLE
Creation of this type of section is not supported by edk2. There is no syntax for it. But nevertheless here is definition from the specification:
EFI_SECTION_DISPOSABLE
Summary:
An encapsulation section type in which the section data is disposable.
Prototype:
typedef EFI_COMMON_SECTION_HEADER EFI_DISPOSABLE_SECTION;
Description:
A disposable section is an encapsulation section in which the section data may be disposed of during the process of creating or updating a firmware image without significant impact on the usefulness of the file.
EFI_SECTION_PEI_DEPEX
/EFI_SECTION_DXE_DEPEX
There are also sections for the dependency expressions for DXE and PEI stages. You probably wouldn't write them yourself, but here is their description for completeness:
EFI_SECTION_PEI_DEPEX
Summary:
A leaf section type that is used to determine dispatch order for a PEIM.
Prototype:
typedef EFI_COMMON_SECTION_HEADER EFI_PEI_DEPEX_SECTION;
Description:
The PEI dependency expression section is a leaf section that contains a dependency expression that is used to determine dispatch order for a PEIM. See the Platform Initialization Pre-EFI Initialization Core Interface Specification for details regarding the format of the dependency expression.
EFI_SECTION_DXE_DEPEX
Summary:
A leaf section type that is used to determine the dispatch order for a DXE driver.
Prototype:
typedef EFI_COMMON_SECTION_HEADER EFI_DXE_DEPEX_SECTION;
Description
The DXE dependency expression section is a leaf section that contains a dependency expression that is used to determine the dispatch order for a DXE driver. See the Platform Initialization Driver Execution Environment Core Interface Specification for details regarding the format of the dependency expression.
The section file extension for these sections is "*.dpx"