Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 31585ae

Browse files
Update the contribution guide (#63)
- Clarify a few points of the workflow - Add a section about UEFI FFI gotchas
1 parent 8e52b47 commit 31585ae

File tree

1 file changed

+42
-0
lines changed

1 file changed

+42
-0
lines changed

‎CONTRIBUTING.md

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@ First, change to the `uefi-test-runner` directory:
1313
cd 'uefi-test-runner'
1414
```
1515

16+
Please take a quick look at the README for an overview of the system requirements
17+
of the test runner.
18+
1619
Make some changes in your favourite editor / IDE:
1720
I use [VS Code][code] with the [RLS][rls] extension.
1821

@@ -24,11 +27,50 @@ Test your changes:
2427

2528
The line above will open a QEMU window where the test harness will run some tests.
2629

30+
Any contributions are also expected to pass [Clippy][clippy]'s static analysis,
31+
which you can run as follows:
32+
33+
```shell
34+
./build.py clippy
35+
```
36+
37+
[clippy]: https://github.com/rust-lang-nursery/rust-clippy
2738
[code]: https://code.visualstudio.com/
2839
[rls]: https://github.com/rust-lang-nursery/rls-vscode
2940

3041
## Style guide
3142

3243
This repository follows Rust's [standard style][style], the same one imposed by `rustfmt`.
3344

45+
You can apply the standard style to the whole package by running `cargo fmt --all`.
46+
3447
[style]: https://github.com/rust-lang-nursery/fmt-rfcs/blob/master/guide/guide.md
48+
49+
## UEFI pitfalls
50+
51+
Interfacing with a foreign and unsafe API is a difficult exercise in general, and
52+
UEFI is certainly no exception. This section lists some common pain points that
53+
you should keep in mind while working on UEFI interfaces.
54+
55+
### Enums
56+
57+
Rust and C enums differ in many way. One safety-critical difference is that the
58+
Rust compiler assumes that all variants of Rust enums are known at compile-time.
59+
UEFI, on the other hand, features many C enums which can be freely extended by
60+
implementations or future versions of the spec.
61+
62+
These enums must not be interfaced as Rust enums, as that could lead to undefined
63+
behavior. Instead, integer newtypes with associated constants should be used. The
64+
`newtype_enum` macro is provided by this crate to ease this exercise.
65+
66+
### Pointers
67+
68+
Pointer parameters in UEFI APIs come with many safety conditions. Some of these
69+
are usually expected by unsafe Rust code, while others are more specific to the
70+
low-level environment that UEFI operates in:
71+
72+
- Pointers must reference physical memory (no memory-mapped hardware)
73+
- Pointers must be properly aligned for their target type
74+
- Pointers may only be NULL where UEFI explicitly allows for it
75+
- When an UEFI function fails, nothing can be assumed about the state of data
76+
behind `*mut` pointers.

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /