|
1 | 1 | // SPDX-License-Identifier: GPL-2.0
|
2 |
| -// |
3 |
| -// Non-trivial C macros cannot be used in Rust. Similarly, inlined C functions |
4 |
| -// cannot be called either. This file explicitly creates functions ("helpers") |
5 |
| -// that wrap those so that they can be called from Rust. |
6 |
| -// |
7 |
| -// Even though Rust kernel modules should never use directly the bindings, some |
8 |
| -// of these helpers need to be exported because Rust generics and inlined |
9 |
| -// functions may not get their code generated in the crate where they are |
10 |
| -// defined. Other helpers, called from non-inline functions, may not be |
11 |
| -// exported, in principle. However, in general, the Rust compiler does not |
12 |
| -// guarantee codegen will be performed for a non-inline function either. |
13 |
| -// Therefore, this file exports all the helpers. In the future, this may be |
14 |
| -// revisited to reduce the number of exports after the compiler is informed |
15 |
| -// about the places codegen is required. |
16 |
| -// |
17 |
| -// All symbols are exported as GPL-only to guarantee no GPL-only feature is |
18 |
| -// accidentally exposed. |
| 2 | +/* |
| 3 | + * Non-trivial C macros cannot be used in Rust. Similarly, inlined C functions |
| 4 | + * cannot be called either. This file explicitly creates functions ("helpers") |
| 5 | + * that wrap those so that they can be called from Rust. |
| 6 | + * |
| 7 | + * Even though Rust kernel modules should never use directly the bindings, some |
| 8 | + * of these helpers need to be exported because Rust generics and inlined |
| 9 | + * functions may not get their code generated in the crate where they are |
| 10 | + * defined. Other helpers, called from non-inline functions, may not be |
| 11 | + * exported, in principle. However, in general, the Rust compiler does not |
| 12 | + * guarantee codegen will be performed for a non-inline function either. |
| 13 | + * Therefore, this file exports all the helpers. In the future, this may be |
| 14 | + * revisited to reduce the number of exports after the compiler is informed |
| 15 | + * about the places codegen is required. |
| 16 | + * |
| 17 | + * All symbols are exported as GPL-only to guarantee no GPL-only feature is |
| 18 | + * accidentally exposed. |
| 19 | + */ |
19 | 20 |
|
20 | 21 | #include <linux/bug.h>
|
21 | 22 | #include <linux/build_bug.h>
|
@@ -506,24 +507,25 @@ const struct of_device_id *rust_helper_of_match_device(
|
506 | 507 | }
|
507 | 508 | EXPORT_SYMBOL_GPL(rust_helper_of_match_device);
|
508 | 509 |
|
509 |
| -/* We use bindgen's --size_t-is-usize option to bind the C size_t type |
510 |
| - * as the Rust usize type, so we can use it in contexts where Rust |
511 |
| - * expects a usize like slice (array) indices. usize is defined to be |
512 |
| - * the same as C's uintptr_t type (can hold any pointer) but not |
513 |
| - * necessarily the same as size_t (can hold the size of any single |
| 510 | +/* |
| 511 | + * We use `bindgen`'s `--size_t-is-usize` option to bind the C `size_t` type |
| 512 | + * as the Rust `usize` type, so we can use it in contexts where Rust |
| 513 | + * expects a `usize` like slice (array) indices. `usize` is defined to be |
| 514 | + * the same as C's `uintptr_t` type (can hold any pointer) but not |
| 515 | + * necessarily the same as `size_t` (can hold the size of any single |
514 | 516 | * object). Most modern platforms use the same concrete integer type for
|
515 | 517 | * both of them, but in case we find ourselves on a platform where
|
516 | 518 | * that's not true, fail early instead of risking ABI or
|
517 | 519 | * integer-overflow issues.
|
518 | 520 | *
|
519 | 521 | * If your platform fails this assertion, it means that you are in
|
520 | 522 | * danger of integer-overflow bugs (even if you attempt to remove
|
521 |
| - * --size_t-is-usize). It may be easiest to change the kernel ABI on |
522 |
| - * your platform such that size_t matches uintptr_t (i.e., to increase |
523 |
| - * size_t, because uintptr_t has to be at least as big as size_t). |
524 |
| -*/ |
| 523 | + * `--size_t-is-usize`). It may be easiest to change the kernel ABI on |
| 524 | + * your platform such that `size_t` matches `uintptr_t` (i.e., to increase |
| 525 | + * `size_t`, because `uintptr_t` has to be at least as big as `size_t`). |
| 526 | + */ |
525 | 527 | static_assert(
|
526 | 528 | sizeof(size_t) == sizeof(uintptr_t) &&
|
527 | 529 | __alignof__(size_t) == __alignof__(uintptr_t),
|
528 |
| - "Rust code expects C size_t to match Rust usize" |
| 530 | + "Rust code expects C `size_t` to match Rust `usize`" |
529 | 531 | );
|
0 commit comments