This schema defines the UEFI/PI
Distribution Package description (PKG) file. It describes the content
of:
1) Package descriptions with
definitions and headers.
2) Modules in either source or binary
format. (Note that Binary format is for FFS leaf section file types
only, complete FFS files cannot be distributed using this distribution
format.)
3) The distribution of custom tools
used to modify the binary images to create UEFI/PI compliant images.
4) Finally, it can be used to
distribute other miscellaneous content that is not specific to UEFI/PI
images.
The Package Surface Area describes the
content of packages, while the Module Surface Area provides information
relevant to source and/or binary distributions.
This header contains (legal)
information usually required for distributing both binary and/or
source code.
The list of packages in this
distribution.
Packages are groups of files
and/or modules that are similar in nature.
Packages are uniquely identified
by a package GUID and a package version.
A package can declare public
mappings of C names to GUID values.
A package can provide header
files for library classes and/or other industry standard
definitions.
A package can also declare
public mappings of platform configuration database (PCD)
"knobs" to control features and operation of
modules within a platform.
Finally, a package lists the
library instances and/or modules that are provided in a
distribution package.
The listing of UEFI/PI compliant
modules in this distribution that are NOT part of a Package. Every
module that is provided as part of a package needs to be described
in a PackageSurfaceArea.Modules section.
The ModuleSurfaceArea section
describes how each module in a distribution is coded, or, in the
case of a binary module distribution, how it was built.
UEFI/PI compliant libraries and
modules are uniquely identified by the Module's GUID and version
number.
This section will typically be
used for modules that don't require any additional files that
would be included in a package. For example, the Enhanced FAT
driver binary does not need to have a package description, as no
additional files are provided.
This section is for distributing
vendor specific executable tools, tool source code and/or
configuration files. These tools are primarily for manipulating
code and/or binary images.
Tools in this section
can:
1) Parse build meta-data files
to create source code files and build scripts.
2) Modify image files to conform
to UEFI/PI specifications.
3) Generate binary files from
certain types of text/unicode files.
4) Generate PCI Option Roms or
Firmware Device images.
5) Implement external
encoding/decoding/signature/GUIDed tools.
6) Distribution Package
create/install/remove tools.
The list of miscellaneous files
in this distribution. Any files that are not listed in either the
Package, Module or Tools sections can be listed here. This section
can be used to distribute specifications for packages and modules
that are not "industry standards" such as a
specification for a chipset or a video device.
The UserExtensions section is
used to disseminate processing instructions that may be custom to
the content provided by the distribution. This section contains
information that is common to all aspects of this disribution.
This section defines the content of
the UEIF/PI compliant Distribution Package Header. This is the only
required element of a UEFI/PI compliant distribution package.
This is the User Interface Name
for this Distribution Package.
Each Distribution Package is
uniquely identified by it's GUID and Version number.
The reference name of
the Distribution Package file. This single word name can
be used by tools as a keyword or for directory and/or file
creation.
White space and special
characters (dash and underscore characters may be used)
are not permitted in this name.
This 128-bit GUID and the
Version attribute uniquely identify this Distribution Package.
Backward compatible releases of
a distribution package need only change the version number, while
non-backward compatible changes require the GUID to change
(resetting the version number to 1.0 is optional.)
This value, along with
the GUID, is used to uniquely identify this object. The
higher the number, the more recent the content.
A string identifying who created
this distribution package.
The date and time this
distribution was created. The format is: YYYY-MM-DDThh:mm:ss, for
example: 2001-01-31T13:30:00 (note the T character separator
between the calendar date and the time.
The copyright for this file that
is generated by the creator of the distribution. If a derivative
work is generated from an existing distribution, then the existing
copyright must be maintained, and additional copyrights may be
appended to the end of this element. It may also be the primary
copyright for all code provided in the Distribution Package.
A license that describes any
restrictions on the use of this distribution. If a derivative work
is allowed by the original license and a derivative work is
generated from an existing distribution, then the existing license
must be maintained, and additional licenses may be appended to the
end of this element. It may also be the primary license for all
code provided in the distribution file. Alternatively, this may
point to a filename that contains the License. The file (included
in the content zip file) will be stored in the same location as
the distribution package's .pkg file.
A one line description of the
Distribution Package.
A complete description of the
Distribution Package. This description may include the release
name of the file, the version of the file, and a complete
description of the file contents and/or features including a
description of the updates since the previous file release.
The packaging utilities will use this
MD5 sum value of the included ZIP file containing files and/or code. If
this element is not present, then installation tools should assume that
the content is correct, or that other methods may be needed to verify
content.
This version of this XML Schema is 1.1
Changes to 1.1 from 1.0
#1 Updated to present date and new
version which is important to reflect the present state of the
matter
#2 Added definition/enumeration of
UNDEFIND type 2 is important since there is a large body of legacy code
for which the GUID’s and other code/data objects were not decorated with
their usage. This document will allow for importing today’s source
artifacts and producing decorations using the ‘Undefined’ versus having
an error
#3 Allow for inclusion of ARM and future
architecture types
If set to true, all content within
this Distribution Package should NOT be modified. The default
permits modification of all content.
If set to true, then the content
can be repackaged into another distribution package. The default
prohibits repackaging the Distribution content.
A package is a collection of related
objects - Includes, Libraries and Modules.
Each package is uniquely identified by
it's GUID and Version number. Backward compatible releases of a package
need only change the version number, while non-backward compatible
changes require the GUID to change (resetting the version number to 1.0
is optional.)
This is the User Interface
Name for this package.
This is a single
word BaseName of the package. This BaseName can be
used by tools as a keyword and for directory/file
creation.
This GUID and the Version
attribute uniquely identify a given package.
This value, along
with the GUID, is used to uniquely identify this
object.
Backward
compatible changes must make sure this number is
incremented from the most recent version.
Non-backward compatible changes require a new GUID,
and the version can be reset.
If the package requires a
different copyright than the distribution package, this
element can list one or more copyright lines.
If the package requires
licenses that are different from the distribution package
license, this element can contain one or more license text
paragraphs (or license filenames.)
A one line description of
this package.
A complete description of
a package. This description may include the release name of
the package, the version of the package, and a complete
description of the package contents and/or features
including a description of the updates since the previous
package’s release.
This element is the
location (in the ZIP file) for the root directory of a
package.
The term cloned is used here to
indicate that this package as been copied and modified to a
completely different package. An example might be for a new
generation of chipsets that have few or no elements in common with
the original.
This GUID and the Version
attribute uniquely identify the Package that this Package
was copied from.
This value, along
with the GUID, is used to uniquely identify the
package that this package was cloned from.
Library Classes are public
interfaces that can be used by modules. One or more library
instances can implement a library class, however only one library
instance can be linked to an individual module. This provides the
platform integrator with the flexibility of choosing one library
instance's implementation over a different library instance.
The header file
provides definitions and function prototypes for a
library class. Modules can be coded against these
functions, using the definitions in this header,
without concerning themselves about the libraries'
implementation details. This is a PackagePath relative
path and filename for the include file.
This GUID and
the Version attribute uniquely identify the
Recommended Library Instance.
This
value, along with the GUID, is used to
uniquely identify this object. If this
value is not specified, then any version
of the library instance is recommended.
The single word name
of the Library Class that module developers will use to
identify a library class dependency.
This section is used to list
header files for industry standards not under the auspices of
UEFI.org. For example, headers that contain definitions and data
structures for the USB specifications.
The package relative
path and filename (in the content zip file) of the
industry standard include file.
All top level header files that
are included by a package that are not listed above. They cannot
be:
1) Local to a module (module
specific.)
2) An industry standard header.
3) A library class header.
This is the Package
relative path and filename location within the content
ZIP file.
This section lists the
Module Surface Area for all modules provided with this
package.
This section defines the mapping
of GUID C names to GUID values as a Registry Format GUID.
Modules that use these GUIDs
must specify their dependency on this package.
Individual GUID
Declarations
This section defines the mapping
of Protocol C names to GUID values as a Registry Format GUID.
Modules that use these Protocols
must specify their dependency on this package.
Individual Protocol
Declarations
This section defines the mapping
of Ppi C names to GUID values as a Registry Format GUID.
Modules that use these Ppis must
specify their dependency on this package.
Individual PPI
Declarations
This section is used to declare
platform configuration knobs that are defined by this package.
Modules that use these PCD
values must specify their dependency on this package.
Specifies the C name
of the Token Space GUID of which this PCD Entry is a
member. This C name should also be listed in the GUIDs
section, (specified above,) where the C name is
assigned to a GUID value.
Specifies the 32-bit
token value for this PCD Entry. The Token number must
be unique to the Token Space that declares the PCD.
The minLength of 3
is required to handle the "0x" prefix to the hex
number.
A string that
contains the data type of this PCD Entry. PCD data
types are restricted to the following set:UINT8,
UINT16, UINT32, UINT64, VOID*, BOOLEAN.
A string that
contains one or more PCD Item types separated by
spaces. The PCD Item types are restricted to
FeaturePcd, FixedPcd, PatchPcd, Pcd and/or PcdEx.
This is a
recommended maximum data size for VOID* data types,
the actual value should be defined by the Platform
Integrator. It is not required for the other data
types.
The minLength of 3
is required to handle the "0x" prefix to the hex
number.
Valid Error messages
that may be implemented in a module for the PCD Entry.
Only One Error Number per PcdError, (multiple
ErrorMessage entries are permitted) and multiple
PcdError elements are permitted.
One of the
following types of comparisons, which must be
able to evaluate to either true or false.
The PCD
Value must be space separated list of values.
Values are restricted to the data type of this
PCD.
The PCD must
be within a specifed range of numeric values.
Restricted to C style Relational, Equality and
Logicial Operators and parenthesis are valid.
Only the CName for this PCD is permitted in
the ValidValueRange expression. All other
values must be numeric.
LValue (op
RValue)+
A in-fix
logical expression using C style logical
operators.
A hexadecimal
value for the error message as defined by
specifications.
The minLength
of 3 is required to handle the "0x" prefix to
the hex number.
This string
should be defined by specifications. There are
pre-defined error number ranges in the UEFI/PI
specificaiton.
This section is used to describe
any PCD interdependencies or relationships.
This entry must used
TokenSpaceGuidCName.PcdCname for every named PCD. Restricted
to Relational, Equality and Logical Operators (NOT, AND, OR,
GT, GE, EQ, LE, LT and XOR) and parenthesis are valid. Only
the TokenSpaceGuidCName.PcdCname us permitted to name PCDs
in the expression. All other values must be numeric.
LValue (op RValue)+
This section contains files that
are not part of the code distributed with this package.
Only required if different
from the Package Copyright.
Only required if different
from the Package License.
A one line description of
this section's content.
A complete description of
the files in this section.
This is the PackagePath
relative path and filename location within the ZIP file.
If true, used by
installation tools to ensure that a file that must
be executable has the correct properties to permit
execution.
This section is used for any
processing instructions that may be custom to the content provided
by this package that are common to this package.
This is a single word
identifier for grouping similar content that does not fit into
previously defined sections or other sections of the
Distribution.
This can be used to
differentiate multiple sections with a grouping.
For example, a PRE_PROCESS
Identifier might indicate specific steps and tools required
before processing module content, while a different
UserExtensions section with a POST_PROCESS Identifier might
describe steps that need to be executed after operations on
the modules in this package.
Each module is uniquely identified by
it's GUID and Version number. Backward compatible releases of a module
need only change the version number, while non-backward compatible
changes require the GUID to change (resetting the version number to 1.0
is optional.)
This is the User Interface
Name for this Module.
This is a single
word BaseName that will be used to create a module
meta-data file.
This name should
also be used to create output file names and
directories.
This GUID and the Version
attribute uniquely identify a given Module.
This value, along
with the GUID, is used to uniquely identify this
object.
Backward
compatible changes must make sure this number is
incremented from the most recent version.
Non-backward compatible changes require a new GUID,
and the version can be reset.
This is only required if
the Copyright is different from either the Package or
Distribution copyright. Multiple copyright lines are
permitted within this section.
This is only required if
the license is different from either the Package or
Distribution license. Multiple licenses are permitted
within this section.
A brief text description
of the module.
A complete description of
the module contents and/or features including a description
of the updates since the previous module release.
List general information about a
module, including the Supported Architectures, this module's type,
specifications the module is coded against, and other
informational content.
One of the Enumerated
module types that limit the use of a module.
For stand-alone modules
that are NOT part of any package, this is the path to the
root of the module as listed in the ZIP file. For modules
included in a package, this is the location, relative to the
root of the package (PackagePath) this module belongs to.
This element is only
required for the PEIM that produces the PCD PPI or the DXE
Driver that produces the PCD Protocol.
This is a list of other
specifications that this module is written against. These
entries can be used in #define statements (depending on the
build system implementation, they may be autogenerated.)
Different firmware
execution paths may be taken based on a given state of the
hardware, firmware, or through feature settings. A BootMode
may be declared (PRODUCES) or discovered (CONSUMES) based on
these states and feature settings. The supported boot modes
map to the PI specification Boot Modes. The boot modes
listed with Recovery are to indicate that the BootMode is
valid during a recovery boot.
The module
always supports the given boot modes.
The module may
support a given mode on some execution paths.
The module will
change the boot mode.
The module will
change the boot mode on some exection paths.
The package
creator does not know how the boot mode is used.
The functions that make up
the Event, Timer, and Task Priority Services are used during
preboot to create, close, signal, and wait for events; to
set timers; and to raise and restore task priority levels as
defined in the UEFI specification. GUIDed events should be
listed in the Guids section.
The module will
register a notification function and calls the
function when it is signaled.
The module will
register a notification function and calls the
function when it is signaled on some execution
paths.
The module will
signal all events in an event group.
The module will
signal all events in an event group under some
execution paths.
The package
creator does not know how an event is used.
This is a list of
non-GUIDed Hand Off Blocks (HOBs) produced or consumed by
this module.
A HOB must be
present in the system.
If present, the
HOB will be used.
The HOB is
always produced by the module.
The HOB may be
produced by the module under some execution paths.
The package
creator knows that a HOB is used, but does not
know how it is used.
This section may be included for
Modules that are copied from a different module.
This GUID and the Version
attribute uniquely identify the Module that this Module was
copied from.
This value, along
with the GUID, is used to uniquely identify this
object.
A list of the different Library
Classes consumed by a driver, core and/or application module, or
produced by a Library module.
Used by tools to
identify different instances of libraries that provide
the library class. This keyword identifies the library
class this module needs to be linked against.
This GUID and
the Version attribute uniquely identify the
recommended Library Instance for this module .
This
value, along with the GUID, is used to
uniquely identify this object.
Library instances
can provide code for a library class, or may require
other library instances themselves. Since different
execution paths in a library (or module) may need
different library classes based on some setting,
library classes may not alway be required.
A FeatureFlag
attribute must evaluate to either true or false - it may
be a fixed value of true or false, a C name or an in-fix
expression.
This is the module
relative (ModuleProperties.Path) path and filename location
within the ZIP file.
The Family
attribute is used to restrict usage to a given
family of compilers, such as GCC or MSFT. Since not
all code processing tools use the same syntax,
especially for assembly, this field can be used to
identify different syntax.
This is the module
relative (ModuleProperties.Path) path and filename
location within the ZIP file.
Binary
file distribution is limited to UEFI/PI
FFS leaf section file types.
A
UEFI/PI FFS Leaf section file type, not
a raw PE32 file.
This section
contains information about how the module was coded,
such as Compiler Tools, Flags, PCDs (only PatchPcd
and/or PcdEx) and Library Class Instances used to
build the binary.
The element is
the Patchable PCD Value that was used during the
build.
The
minLength of 3 is required to handle the
"0x" prefix to the hex number.
This
field is required if the Pcd Datum Type is
VOID*
The
minLength of 3 is required to handle the
"0x" prefix to the hex number.
The
minLength of 3 is required to handle the
"0x" prefix to the hex number.
Error
information implemented by the module.
The
minLength of 3 is required to handle the
"0x" prefix to the hex number.
The element is
the DynamicEx PCD Value that was used during the
build.
The
minLength of 3 is required to handle the
"0x" prefix to the hex number.
This
field is required if the Pcd Datum Type is
VOID*
Error
information implemented by the module.
The
minLength of 3 is required to handle the
"0x" prefix to the hex number.
This is the
actual library instance that was used to link
against the module.
This
GUID and the Version attribute uniquely
identify the actual Library Instance
linked in this module.
This
value, along with the GUID, is used to
uniquely identify this object.
Any
description of OS, Tool, and flags for the
individual tool can go in this section.
This GUID and the
Version attribute uniquely identify Package that this
Module depends on.
This value,
along with the GUID, is used to uniquely
identify this object. If the version attribute
is not specified, the most recent version of
the package can be used.
Only valid for
Variable GUID types.
This can be either a Hex Array or
Unicode Data.
The module does
not install the GUID, and the GUID must be present
for the module to execute.
The module does
not install the GUID, however, the GUID will be
used if it is present.
The module
always installs the GUID.
The Module will
install the GUID under certain execution paths.
The package
creator knows that a GUID is used, but does not
know how it is used.
A listing of protocols required
or produced by this module.
A listing of PPIs required or
produced by this module.
These elements specify
additional information about the module. This area may be used by
tools to generate code.
This section describes how a
platform is coded with respect to the platform configuration
knobs.
This is the PEI dependency
expression for a Dependency Section.
An in-fix expression, of C
identifiers and TRUE, FALSE, AND, OR, NOT, BEFORE, and AFTER
as well as parenthesis () in the in-fix notation. The
operators are restricted to grammar defined in the PI
specification.
This is the DXE dependency
expression for a Dependency Section.
An in-fix expression, of C
identifiers and TRUE, FALSE, AND, OR, NOT, BEFORE, and AFTER
as well as parenthesis () in the in-fix notation. The
operators are restricted to grammar defined in the PI
specification.
This is the SMM dependency
expression for a Dependency Section.
An in-fix expression, of C
identifiers and TRUE, FALSE, AND, OR, NOT, BEFORE, and AFTER
as well as parenthesis () in the in-fix notation. The
operators are restricted to grammar defined in the PI
specification.
This section is used to provide
comments and/or list auxiliary files, such as pdb or map files.
This is the path and
filename location within the ZIP file.
If true, used by
installation tools to ensure that a file that must
be executable has the correct properties to permit
execution.
This section is used for any
processing instructions that may be custom to the content provided
by the distribution that are common to module.
The content is vendor specific.
The content can be plain text as
well as any user-defined, properly formatted XML structure.
This is a single word
identifier for grouping similar content. For example,
ReferenceBuild might be used to identify non-PI compliant
build steps, with two different UserExtensions sections, one
with an Identifier of Prebuild, and another of PostBuild. Both
UserExtensions sections would use the same UserId.
This can be any string used
to differentiate or identify this section from other
UserExtensions sections.
For example, a PRE_PROCESS
Identifier might indicate specific steps and tools required
before processing module content, while a different
UserExtensions section with a POST_PROCESS Identifier might
describe steps that need to be executed after operations on
this module.
This attribute is used when the
binaries are distributed for this module and no code generation from
source files is required. If set, then the BinaryFiles section
should be used, and any files listed in the SourceFiles section do
not have to be built. Additionally, the AsBuilt section for each
binary file must be included.
This is the User Interface
Name for this Tools Distribution.
This is only required if
the Copyright is different from the Distribution Package
copyright.
This is only required if
the License is different from the Distribution Package
license.
This is only required if
the Abstract is different from the Distribution Package
Abstract.
This is only required if
the Description is different from the Distribution Package
Description.
This is the path and filename
location within the ZIP file.
This is required for
tools that execute; it should not be used for
configuration files.
If true, used by
installation tools to ensure that a file that must be
executable has the correct properties to permit execution.
This section contains a list of files
that are not part of the code distributed with modules, packages or
tools.
The User interface name
for this content.
This is only required if
the Copyright is different from the Distribution Package
Copyright.
This is only required if
the License is different from the Distribution Package
License.
This is the path and filename
location within the ZIP file.
If true, used by
installation tools to ensure that a file that must be
executable has the correct properties to permit execution.
This is a single word identifier
for grouping similar content. For example, ReferenceBuild might be
used to identify non-PI compliant build steps, with two different
UserExtensions sections, one with an Identifier of Prebuild, and
another of PostBuild. Both UserExtensions sections would use the
same UserId.
This can be any string used to
differentiate or identify this section from other UserExtensions
sections.
For example, a PRE_PROCESS
Identifier might indicate specific steps and tools required before
processing distribution package content, while a different
UserExtensions section with a POST_PROCESS Identifier might describe
steps that need to be executed after operations on this content.
Any processor architecture not
listed above. The Architecture must be a target architecture of one
or more compiler tool chains.
Any other family of build
utilities for which compiler tools exist.
The following module types are defined
by specifications.
Module types for components and
libraries defined for this distribution mechanism.
Use of this module is not
restricted.
This module is only applicable to
the DXE core.
This module is only applicable to
a DXE driver.
This module is only applicable to
a DXE runtime driver.
This module is only applicable to
an IPF DXE runtime driver.
This module is only applicable to
a DXE SMM driver.
This module is only applicable to
the PEI core.
This module is only valid for PEI
modules.
This module is only applicable to
Security phase.
This module is only valid for UEFI
drivers.
This module is only valid for UEFI
runtime drivers.
This module is only valid for UEFI
applications.
This module is only applicable to the SMM
core.
This content is restricted to a specific
implementation.
This enumeration is for use in a list that
where the package creator does not know the what module types are supported
by a module.
This pattern has been added for use in a
module lists - for future expansion.
The following data types are defined
by the PCD specification (or PCD section of the UEFI/PI specifications.)
The Feature PCD is a binary,
evaluating to either true or false. This is used during build to
include/exclude content. It can also be used during execution to
force execution paths within drivers, or to enable/disable features
within a driver for a given platform.
The Fixed PCD is a #define value
that is set at build time.
The Patch PCD is a #define that is
set at build time, and that can be modified within a binary file.
Additional information, such as the offset location of the value,
along with it's length may need to be provided.
This PCD type has an overloaded
definition. Prior to build, the platform integrator may choose to
implement a PCD as Fixed, Patchable or a Dynamic PCD. If the
platform integrator choose to use the PCD as dynamic, then a PCD
driver is required in the platform (PEI/DXE/both) to track the PCD
in some sort of 'database' of these items. For Dynamic PCDs, the
PcdGet* must pass in the token space guid and the token number to
retrieve data (PcdSet* also needs these values.)
The PCD can only be used as
Dynamic, and the platform firmware must contain a driver to maintain
a 'database' of these items. For Dynamic PCDs, the PcdGet* must pass
in the token space guid and the token number to retrieve data
(PcdSet* also needs these values.)
A GUID must contain five different
Hexadecimal character sets that are separated by a dash (-) character.
The EDK II build system supports
workstations running one of the following supported operating systems.
This is the OS for the developer's workstation, not the target platform.
For Windows 2003, Windows XP and
Windows Vista.
For Windows 2003, Windows XP and
Windows Vista.
Typically, this is used for
Windows Batch files.
Typically use for shell scripts -
valid for any Linux and Mac OS/X.