Skip to content

Commit 9818a84

Browse files
authored
Merge pull request #231 from phip1611/uefi
2024-08: uefi v0.31 significant changes
2 parents c67b7c1 + 0613104 commit 9818a84

File tree

1 file changed

+101
-2
lines changed

1 file changed

+101
-2
lines changed

content/this-month/2024-08/index.md

Lines changed: 101 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ date = 2024-09-03
44

55
[extra]
66
month = "August 2024"
7-
editors = ["phil-opp"]
7+
editors = ["phil-opp", "phip1611"]
88
+++
99

1010
Welcome to a new issue of _"This Month in Rust OSDev"_. In these posts, we give a regular overview of notable changes in the Rust operating system development ecosystem.
@@ -101,6 +101,106 @@ In this section, we give an overview of notable changes to the projects hosted u
101101
<<changelog, either in list or text form>>
102102
-->
103103

104+
### [`uefi`](https://github.com/rust-osdev/uefi-rs)
105+
<span class="maintainers">Maintained by [@GabrielMajeri](https://github.com/GabrielMajeri), [@nicholasbishop](https://github.com/nicholasbishop), and [@phip1611](https://github.com/phip1611)</span>
106+
107+
`uefi` makes it easy to develop Rust software that leverages safe, convenient,
108+
and performant abstractions for UEFI functionality. Recently, we released
109+
version `v0.31` with some notable changes:
110+
111+
1. We introduced a completely new API to access boot and runtime services
112+
2. We reorganized the MemoryMap-related types.
113+
3. We reorganized and improved the documentation, and also added documentation
114+
about how the `std` implementation for UEFI targets compares to `uefi` and
115+
how both can be used together.
116+
117+
### 1. New API: Freestanding Functions API Change
118+
119+
We are planning a massive API change and introduced a new replacement API in
120+
release `v0.31`. The old API co-exists and will be marked as
121+
`#[deprecated]` in `0.32`. The new API will make it easier to call boot or
122+
runtime services without having to pass `&BootServices` around all the time.
123+
124+
The typical use-case of our library users is to write a UEFI bootloader
125+
application that heavily leverages boot services. Then control is handed over to
126+
the next stage, which is typically the kernel of an OS. Boot services are
127+
usually exited either just prior to launching the kernel or by the kernel
128+
itself. In any case, the UEFI application spends almost all of its time with
129+
boot services active.
130+
131+
Although the old API design ensures via the type system that no boot
132+
services can be called after they have been exited, the test of time has proven
133+
that this adds unjustified complexity without bringing much real value add.
134+
135+
Instead, with the new API, which we provide **additionally** at this point,
136+
one can use freestanding functions which are behind the new modules:
137+
138+
- `uefi::system`: is a new module that provides freestanding functions for
139+
accessing fields of the global system table.
140+
- `uefi::boot`:
141+
is a new module that provides freestanding functions for boot services using
142+
the global system table.
143+
- `uefi::runtime`: is a new module that provides freestanding functions for
144+
runtime services using the global system table.
145+
146+
The freestanding functions itself are close to the originals ones but without
147+
`&BootServices` or `&RuntimeServices` parameters, as you can see for example
148+
[here](https://github.com/rust-osdev/uefi-rs/pull/1344/files#diff-46f1e3c04d719fff471faf35c4d218430e1d664ac0a0fab9d2c15870c2d0f066).
149+
150+
The new API design solves API inconsistencies and restrictions already existing
151+
so far, and makes the overall handling a lot easier. This comes with the costs
152+
that functions may panic, if the boot services were exited but one tries to use
153+
them. However, the massive API simplification justifies this.
154+
155+
Find more and follow the progress and discussions on:
156+
- [the GitHub Issue](https://github.com/rust-osdev/uefi-rs/issues/893#issuecomment-2241610633).
157+
- [The function Migration Guide](https://github.com/rust-osdev/uefi-rs/blob/main/docs/funcs_migration.md)
158+
159+
#### 2. Memory Map Refactoring
160+
161+
TL;DR: What used to return `MemoryMap<'buf>` in the API, now returns
162+
`MemoryMapOwned`. Additionally, you can parse a chunk of memory using
163+
`MemoryMapRef` or `MemoryMapRefMut`.
164+
165+
We put significant effort into refactoring our abstractions for the UEFI memory
166+
map. These started in release v0.29 and were finalized in release v0.31.
167+
Instead of one `MemoryMap<'buf>` type, we now have the traits `MemoryMap` and
168+
`MemoryMapMut` along with the implementations `MemoryMapRef`, `MemoryMapRefMut`,
169+
and `MemoryMapOwned`. It is recommended to work with the specific
170+
implementations, as the main purpose for the traits is only to enforce a
171+
consistent API for these three implementations. This gives users the
172+
flexibility to cover all possible use cases one can have with an UEFI memory
173+
map. Read more:
174+
- [#1175](https://github.com/rust-osdev/uefi-rs/pull/1175)
175+
- [#1251](https://github.com/rust-osdev/uefi-rs/pull/1251)
176+
- [#1240](https://github.com/rust-osdev/uefi-rs/pull/1240)
177+
- [#1263](https://github.com/rust-osdev/uefi-rs/pull/1263)
178+
179+
In any case, obtaining the memory map from UEFI is hidden behind the
180+
public API of the crate, but we made it very easy to read/parse it in all
181+
possible scenarios!
182+
183+
#### 3. & 4.: Documentation Reorganization
184+
185+
We put notable work into our README and `lib.rs` files to improve the
186+
structure of our documentation. The main value-add and improvement is that we
187+
clearly, directly, and precisely talk about:
188+
189+
- What is `uefi`?
190+
- Which problems does it solve?
191+
- How can it be used?
192+
- How does it compare to the ecosystem, such as `std` for Rust targets?
193+
194+
To see an example how `uefi` and `std` can be used together, please head to
195+
[our repository](https://github.com/rust-osdev/uefi-rs/tree/main/uefi-std-example).
196+
197+
### Other
198+
199+
There were also a ton of other interesting fixes, changes, and additions!
200+
Check out our [Changelog](https://github.com/rust-osdev/uefi-rs/blob/main/uefi/CHANGELOG.md).
201+
202+
We merged the following PRs this month:
203+
<!-- todo -->
104204

105205
## Other Projects
106206

@@ -115,7 +215,6 @@ In this section, we describe updates to Rust OS projects that are not directly r
115215
...<<your project updates>>...
116216
-->
117217

118-
119218
## Join Us?
120219

121220
Are you interested in Rust-based operating system development? Our `rust-osdev` organization is always open to new members and new projects. Just let us know if you want to join! A good way for getting in touch is our [Zulip chat](https://rust-osdev.zulipchat.com).

0 commit comments

Comments
 (0)