[−][src]Crate r_efi
UEFI Reference Specification Protocol Constants and Definitions
This project provides protocol constants and definitions as defined in the UEFI Reference Specification. The aim is to provide all these constants as C-ABI compatible imports to rust. Safe rust abstractions over the UEFI API are out of scope of this project. That is, the purpose is really just to extract all the bits and pieces from the specification and provide them as rust types and constants.
While we strongly recommend using safe abstractions to interact with UEFI systems, this project serves both as base to write those abstractions, but also as last resort if you have to deal with quirks and peculiarities of UEFI systems directly. Therefore, several examples are included, which show how to interact with UEFI systems from rust. These serve both as documentation for anyone interested in how the system works, but also as base for anyone implementing safe abstractions on top.
Target Configuration
Rust code can be compiled natively for UEFI systems. However, you are quite unlikely to have a rust compiler running in an UEFI environment. Therefore, you will most likely want to cross compile your rust code for UEFI systems. To do this, you need a target-configuration for UEFI systems. In case your rust compiler does not provide these, this project has several of them included. As of February 2019, upstream rust includes the following UEFI targets:
x86_64-unknown-uefi
: A native UEFI target for x86-64 systems. Programs compiled for this target can run natively as UEFI binaries on 64bit Intel-compatible systems.
If none of these targets match your architecture, you have to create the target specification
yourself. Feel free to contact the r-efi
project for help.
Examples
To write free-standing UEFI applications, you need to disable the entry-point provided by rust
and instead provide your own. Most target-configurations look for a function called efi_main
during linking and set it as entry point. If you use the target-configurations provided with
upstream rust, they will pick the function called efi_main
as entry-point.
The following example shows a minimal UEFI application, which simply returns success upon
invocation. Note that you must provide your own panic-handler when running without libstd
.
In our case, we use a trivial implementation that simply loops forever.
#![no_main] #![no_std] use r_efi::efi; #[panic_handler] fn panic_handler(_info: &core::panic::PanicInfo) -> ! { loop {} } #[export_name = "efi_main"] pub extern fn main(_h: efi::Handle, _st: *mut efi::SystemTable) -> efi::Status { efi::Status::SUCCESS }
Modules
base | UEFI Base Environment |
efi | Flat EFI Namespace |
protocols | UEFI Protocols |
system | UEFI System Integration |
Macros
eficall | Annotate function with UEFI calling convention |