UEFI is the successor to the BIOS. It provides an early boot environment for
OS loaders, hypervisors and other low-level applications. While it started out
as x86-specific, it has been adopted on other platforms, such as ARM.
This crate makes it easy to both:
Write UEFI applications in Rust (for i686, x86_64, or aarch64)
Call UEFI functions from an OS (usually built with a custom target)
The objective is to provide safe and performant wrappers for UEFI interfaces,
and allow developers to write idiomatic Rust code.
The uefi-test-runner directory contains a sample UEFI app which exercises
most of the library’s functionality.
Check out the testing project’s README.md for
prerequisites for running the tests.
Building UEFI programs
For instructions on how to create your own UEFI apps, see the BUILDING.md file.
Contributing
We welcome issues and pull requests! For instructions on how to set up a development
environment and how to add new protocols, check out CONTRIBUTING.md.
License
The code in this repository is licensed under the Mozilla Public License 2.
This license allows you to use the crate in proprietary programs, but any modifications to the files must be open-sourced.
The full text of the license is available in the license file.
uefi-rs
Description
UEFI is the successor to the BIOS. It provides an early boot environment for OS loaders, hypervisors and other low-level applications. While it started out as x86-specific, it has been adopted on other platforms, such as ARM.
This crate makes it easy to both:
i686
,x86_64
, oraarch64
)The objective is to provide safe and performant wrappers for UEFI interfaces, and allow developers to write idiomatic Rust code.
Check out the UEFI application template for a quick start.
Project structure
This project contains multiple sub-crates:
uefi
(top directory): defines the standard UEFI tables / interfaces. The objective is to stay unopionated and safely wrap most interfaces.Optional features:
alloc
: implements a global allocator using UEFI functions.logger
: logging implementation for the standard log crate.exts
: extensions providing utility functions for common patterns.alloc
crate (either enable thealloc
optional feature or your own custom allocator).uefi-macros
: procedural macros that are used to derive some traits inuefi
.uefi-services
: provides a panic handler, and initializes thealloc
/logger
features.uefi-test-runner
: a UEFI application that runs unit / integration tests.Documentation
The docs for the latest published crate version can be found at docs.rs/uefi/
This crate’s documentation is fairly minimal, and you are encouraged to refer to the UEFI specification for detailed information.
Building and testing uefi-rs
Install the
nightly
version of Rust and therust-src
component:Use the
cargo xtask
command to build and test the crate.Available commands:
build
: build all the UEFI packages--release
: build in release mode--target {x86_64,ia32,aarch64}
: choose target UEFI archclippy
: run clippy on all the packages--target {x86_64,ia32,aarch64}
: choose target UEFI arch--warnings-as-errors
: treat warnings as errorsdoc
: build the docs for the UEFI packages--open
: open the docs in a browser--warnings-as-errors
: treat warnings as errorsrun
: builduefi-test-runner
and run it in QEMU--ci
: disable some tests that don’t work in the CI--disable-kvm
: disable hardware accelerated virtualization support in QEMU.--headless
: run QEMU without a GUI--ovmf-dir <PATH>
: directory in which to look for OVMF files--release
: build in release mode--target {x86_64,ia32,aarch64}
: choose target UEFI archtest
: run unit tests and doctests on the hostThe
uefi-test-runner
directory contains a sample UEFI app which exercises most of the library’s functionality.Check out the testing project’s
README.md
for prerequisites for running the tests.Building UEFI programs
For instructions on how to create your own UEFI apps, see the BUILDING.md file.
Contributing
We welcome issues and pull requests! For instructions on how to set up a development environment and how to add new protocols, check out CONTRIBUTING.md.
License
The code in this repository is licensed under the Mozilla Public License 2. This license allows you to use the crate in proprietary programs, but any modifications to the files must be open-sourced.
The full text of the license is available in the license file.