- Mar 02, 2023
-
-
Arnaldo Carvalho de Melo authored
To address this build error: BINDGEN rust/bindings/bindings_generated.rs BINDGEN rust/bindings/bindings_helpers_generated.rs EXPORTS rust/exports_core_generated.h RUSTC P rust/libmacros.so RUSTC L rust/compiler_builtins.o RUSTC L rust/alloc.o RUSTC L rust/bindings.o RUSTC L rust/build_error.o EXPORTS rust/exports_alloc_generated.h error[E0588]: packed type cannot transitively contain a `#[repr(align)]` type --> /var/home/acme/git/linux/rust/bindings/bindings_generated.rs:10094:1 | 10094 | / pub struct alt_instr { 10095 | | pub instr_offset: s32, 10096 | | pub repl_offset: s32, 10097 | | pub __bindgen_anon_1: alt_instr__bindgen_ty_1, 10098 | | pub instrlen: u8_, 10099 | | pub replacementlen: u8_, 10100 | | } | |_^ | note: `alt_instr__bindgen_ty_1__bindgen_ty_1` has a `#[repr(align)]` attribute --> /var/home/acme/git/linux/rust/bindings/bindings_generated.rs:10111:1 | 10111 | / pub struct alt_instr__bindgen_ty_1__bindgen_ty_1 { 10112 | | pub _bitfield_1: __BindgenBitfieldUnit<[u8; 4usize], u16>, 10113 | | } | |_^ note: `alt_instr` contains a field of type `alt_instr__bindgen_ty_1` --> /var/home/acme/git/linux/rust/bindings/bindings_generated.rs:10097:9 | 10097 | pub __bindgen_anon_1: alt_instr__bindgen_ty_1, | ^^^^^^^^^^^^^^^^ note: ...which contains a field of type `alt_instr__bindgen_ty_1__bindgen_ty_1` --> /var/home/acme/git/linux/rust/bindings/bindings_generated.rs:10104:9 | 10104 | pub __bindgen_anon_1: alt_instr__bindgen_ty_1__bindgen_ty_1, | ^^^^^^^^^^^^^^^^ error: aborting due to previous error For more information about this error, try `rustc --explain E0588`. make[1]: *** [rust/Makefile:389: rust/bindings.o] Error 1 make: *** [Makefile:1293: prepare] Error 2 Cc: Derek Barbosa <debarbos@redhat.com> Cc: Miguel Ojeda <ojeda@kernel.org> Signed-off-by:
Arnaldo Carvalho de Melo <acme@redhat.com> Fixes: 5d1dd961 ("x86/alternatives: Add alt_instr.flags") Reported-by:
kernel test robot <lkp@intel.com> Reported-by:
Vincenzo Palazzo <vincenzopalazzodev@gmail.com> Reviewed-by:
Martin Rodriguez Reboredo <yakoyoku@gmail.com> Reviewed-by:
Vincenzo Palazzo <vincenzopalazzodev@gmail.com> Signed-off-by:
Miguel Ojeda <ojeda@kernel.org>
-
- Feb 07, 2023
-
-
Wedson Almeida Filho authored
This allows us to hand ownership of Rust ref-counted objects to the C side of the kernel. Signed-off-by:
Wedson Almeida Filho <wedsonaf@gmail.com> Reviewed-by:
Gary Guo <gary@garyguo.net> Reviewed-by:
Vincenzo Palazzo <vincenzopalazzodev@gmail.com> Reviewed-by:
Alice Ferrazzi <alice.ferrazzi@miraclelinux.com> Reviewed-by:
Andreas Hindborg <a.hindborg@samsung.com> Signed-off-by:
Miguel Ojeda <ojeda@kernel.org>
-
- Feb 01, 2023
-
-
Wedson Almeida Filho authored
This allows us to use the unit type `()` when we have no object whose ownership must be managed but one implementing the `ForeignOwnable` trait is needed. Signed-off-by:
Wedson Almeida Filho <wedsonaf@gmail.com> Reviewed-by:
Vincenzo Palazzo <vincenzopalazzodev@gmail.com> Reviewed-by:
Gary Guo <gary@garyguo.net> Reviewed-by:
Andreas Hindborg <a.hindborg@samsung.com> Signed-off-by:
Miguel Ojeda <ojeda@kernel.org>
-
Wedson Almeida Filho authored
This allows us to hand ownership of Rust dynamically allocated objects to the C side of the kernel. Signed-off-by:
Wedson Almeida Filho <wedsonaf@gmail.com> Reviewed-by:
Gary Guo <gary@garyguo.net> Reviewed-by:
Vincenzo Palazzo <vincenzopalazzodev@gmail.com> Reviewed-by:
Alice Ferrazzi <alice.ferrazzi@miraclelinux.com> Reviewed-by:
Andreas Hindborg <a.hindborg@samsung.com> Signed-off-by:
Miguel Ojeda <ojeda@kernel.org>
-
Wedson Almeida Filho authored
It was originally called `PointerWrapper`. It is used to convert a Rust object to a pointer representation (void *) that can be stored on the C side, used, and eventually returned to Rust. Signed-off-by:
Wedson Almeida Filho <wedsonaf@gmail.com> Reviewed-by:
Vincenzo Palazzo <vincenzopalazzodev@gmail.com> Reviewed-by:
Martin Rodriguez Reboredo <yakoyoku@gmail.com> Reviewed-by:
Gary Guo <gary@garyguo.net> Reviewed-by:
Andreas Hindborg <a.hindborg@samsung.com> Signed-off-by:
Miguel Ojeda <ojeda@kernel.org>
-
- Jan 31, 2023
-
-
Wedson Almeida Filho authored
This allows us to run some code when the guard is dropped (e.g., implicitly when it goes out of scope). We can also prevent the guard from running by calling its `dismiss()` method. Signed-off-by:
Wedson Almeida Filho <wedsonaf@gmail.com> Reviewed-by:
Vincenzo Palazzo <vincenzopalazzodev@gmail.com> Reviewed-by:
Andreas Hindborg <a.hindborg@samsung.com> Signed-off-by:
Miguel Ojeda <ojeda@kernel.org>
-
- Jan 22, 2023
-
-
Masahiro Yamada authored
scripts/ is a better place to generate files used treewide. With target.json moved to scripts/, you do not need to add target.json to no-clean-files or MRPROPER_FILES. 'make clean' does not visit scripts/, but 'make mrproper' does. Signed-off-by:
Masahiro Yamada <masahiroy@kernel.org> Reviewed-by:
Miguel Ojeda <ojeda@kernel.org> Tested-by:
Miguel Ojeda <ojeda@kernel.org>
-
Masahiro Yamada authored
rustc may put comments in dep-info, so sed is used to drop them before passing it to fixdep. Now that fixdep can remove comments, Makefiles do not need to run sed. Signed-off-by:
Masahiro Yamada <masahiroy@kernel.org> Reviewed-by:
Miguel Ojeda <ojeda@kernel.org> Tested-by:
Miguel Ojeda <ojeda@kernel.org> Reviewed-by:
Vincenzo Palazzo <vincenzopalazzodev@gmail.com>
-
Masahiro Yamada authored
In Kbuild, two different rules must not write to the same file, but it happens when compiling rust source files. For example, set CONFIG_SAMPLE_RUST_MINIMAL=m and run the following: $ make -j$(nproc) samples/rust/rust_minimal.o samples/rust/rust_minimal.rsi \ samples/rust/rust_minimal.s samples/rust/rust_minimal.ll [snip] RUSTC [M] samples/rust/rust_minimal.o RUSTC [M] samples/rust/rust_minimal.rsi RUSTC [M] samples/rust/rust_minimal.s RUSTC [M] samples/rust/rust_minimal.ll mv: cannot stat 'samples/rust/rust_minimal.d': No such file or directory make[3]: *** [scripts/Makefile.build:334: samples/rust/rust_minimal.ll] Error 1 make[3]: *** Waiting for unfinished jobs.... mv: cannot stat 'samples/rust/rust_minimal.d': No such file or directory make[3]: *** [scripts/Makefile.build:309: samples/rust/rust_minimal.o] Error 1 mv: cannot stat 'samples/rust/rust_minimal.d': No such file or directory make[3]: *** [scripts/Makefile.build:326: samples/rust/rust_minimal.s] Error 1 make[2]: *** [scripts/Makefile.build:504: samples/rust] Error 2 make[1]: *** [scripts/Makefile.build:504: samples] Error 2 make: *** [Makefile:2008: .] Error 2 The reason for the error is that 4 threads running in parallel renames the same file, samples/rust/rust_minimal.d. This does not happen when compiling C or assembly files because -Wp,-MMD,$(depfile) explicitly specifies the dependency filepath. $(depfile) is a unique path for each target. Currently, rustc is only given --out-dir and --emit=<list-of-types> So, all the rust build rules output the dep-info into the default <CRATE_NAME>.d, which causes the path conflict. Fortunately, the --emit option is able to specify the output path individually, with the form --emit=<type>=<path>. Add --emit=dep-info=$(depfile) to the common part. Also, remove the redundant --out-dir because the output path is specified for each type. The code gets much cleaner because we do not need to rename *.d files. Signed-off-by:
Masahiro Yamada <masahiroy@kernel.org> Reviewed-by:
Miguel Ojeda <ojeda@kernel.org> Tested-by:
Miguel Ojeda <ojeda@kernel.org> Reviewed-by:
Vincenzo Palazzo <vincenzopalazzodev@gmail.com>
-
- Jan 16, 2023
-
-
Finn Behrens authored
This shows exactly where the items are from, previously the items from macros, alloc and core were shown as a declaration from the kernel crate, this shows the correct path. Link: https://github.com/rust-lang/rust/issues/106713 Signed-off-by:
Finn Behrens <fin@nyantec.com> Reviewed-by:
Vincenzo Palazzo <vincenzopalazzodev@gmail.com> [Reworded to add Link, fixed two typos and comment style] Signed-off-by:
Miguel Ojeda <ojeda@kernel.org>
-
Wedson Almeida Filho authored
Trait objects (`dyn T`) require trait `T` to be "object safe". One of the requirements for "object safety" is that the receiver have one of the allowed types. This commit adds `Arc<T>` and `ArcBorrow<'_, T>` to the list of allowed types. Signed-off-by:
Wedson Almeida Filho <wedsonaf@gmail.com> Reviewed-by:
Alice Ryhl <aliceryhl@google.com> Reviewed-by:
Gary Guo <gary@garyguo.net> Reviewed-by:
Vincenzo Palazzo <vincenzopalazzodev@gmail.com> Acked-by:
Boqun Feng <boqun.feng@gmail.com> Signed-off-by:
Miguel Ojeda <ojeda@kernel.org>
-
Wedson Almeida Filho authored
Since `Arc<T>` does not allow mutating `T` directly (i.e., without inner mutability), it is currently not possible to do some initialisation of `T` post construction but before being shared. `UniqueArc<T>` addresses this problem essentially being an `Arc<T>` that has a refcount of 1 and is therefore writable. Once initialisation is completed, it can be transitioned (without failure paths) into an `Arc<T>`. Suggested-by:
Gary Guo <gary@garyguo.net> Signed-off-by:
Wedson Almeida Filho <wedsonaf@gmail.com> Reviewed-by:
Alice Ryhl <aliceryhl@google.com> Reviewed-by:
Gary Guo <gary@garyguo.net> Reviewed-by:
Vincenzo Palazzo <vincenzopalazzodev@gmail.com> Acked-by:
Boqun Feng <boqun.feng@gmail.com> Signed-off-by:
Miguel Ojeda <ojeda@kernel.org>
-
Wedson Almeida Filho authored
This allows associated functions whose `self` argument has `ArcBorrow<T>` as their type. This, in turn, allows callers to use the dot syntax to make calls. Signed-off-by:
Wedson Almeida Filho <wedsonaf@gmail.com> Reviewed-by:
Alice Ryhl <aliceryhl@google.com> Reviewed-by:
Gary Guo <gary@garyguo.net> Reviewed-by:
Vincenzo Palazzo <vincenzopalazzodev@gmail.com> Acked-by:
Boqun Feng <boqun.feng@gmail.com> Signed-off-by:
Miguel Ojeda <ojeda@kernel.org>
-
Wedson Almeida Filho authored
This allows us to create references to a ref-counted allocation without double-indirection and that still allow us to increment the refcount to a new `Arc<T>`. Signed-off-by:
Wedson Almeida Filho <wedsonaf@gmail.com> Reviewed-by:
Alice Ryhl <aliceryhl@google.com> Acked-by:
Boqun Feng <boqun.feng@gmail.com> Reviewed-by:
Gary Guo <gary@garyguo.net> Reviewed-by:
Vincenzo Palazzo <vincenzopalazzodev@gmail.com> Signed-off-by:
Miguel Ojeda <ojeda@kernel.org>
-
Wedson Almeida Filho authored
The coercion is only allowed if `U` is a compatible dynamically-sized type (DST). For example, if we have some type `X` that implements trait `Y`, then this allows `Arc<X>` to be coerced into `Arc<dyn Y>`. Suggested-by:
Gary Guo <gary@garyguo.net> Signed-off-by:
Wedson Almeida Filho <wedsonaf@gmail.com> Reviewed-by:
Alice Ryhl <aliceryhl@google.com> Reviewed-by:
Gary Guo <gary@garyguo.net> Reviewed-by:
Vincenzo Palazzo <vincenzopalazzodev@gmail.com> Acked-by:
Boqun Feng <boqun.feng@gmail.com> Signed-off-by:
Miguel Ojeda <ojeda@kernel.org>
-
Wedson Almeida Filho authored
This allows associated functions whose `self` argument has `Arc<T>` or variants as their type. This, in turn, allows callers to use the dot syntax to make calls. Signed-off-by:
Wedson Almeida Filho <wedsonaf@gmail.com> Reviewed-by:
Alice Ryhl <aliceryhl@google.com> Reviewed-by:
Gary Guo <gary@garyguo.net> Reviewed-by:
Vincenzo Palazzo <vincenzopalazzodev@gmail.com> Acked-by:
Boqun Feng <boqun.feng@gmail.com> Signed-off-by:
Miguel Ojeda <ojeda@kernel.org>
-
Wedson Almeida Filho authored
This is a basic implementation of `Arc` backed by C's `refcount_t`. It allows Rust code to idiomatically allocate memory that is ref-counted. Cc: Will Deacon <will@kernel.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Boqun Feng <boqun.feng@gmail.com> Cc: Mark Rutland <mark.rutland@arm.com> Signed-off-by:
Wedson Almeida Filho <wedsonaf@gmail.com> Reviewed-by:
Alice Ryhl <aliceryhl@google.com> Reviewed-by:
Gary Guo <gary@garyguo.net> Reviewed-by:
Vincenzo Palazzo <vincenzopalazzodev@gmail.com> Acked-by:
Boqun Feng <boqun.feng@gmail.com> Signed-off-by:
Miguel Ojeda <ojeda@kernel.org>
-
Gary Guo authored
Currently we define a number of stubs for compiler-builtin intrinsics that compiled libcore generates. The defined stubs are weak so they will not conflict with genuine implementation of these intrinsics, but their effect is global and will cause non-libcore code that accidently generate these intrinsics calls compile and bug on runtime. Instead of defining a stub that can affect all code, this patch uses objcopy's `--redefine-sym` flag to redirect these calls (from libcore only) to a prefixed version (e.g. redirect `__multi3` to `__rust_multi3`), so we can define panciking stubs that are only visible to libcore. This patch was previously discussed on GitHub [1]. This approach was also independently proposed by Nick Desaulniers in [2]. Link: https://github.com/Rust-for-Linux/linux/pull/779 [1] Link: https://lore.kernel.org/lkml/CAKwvOdkc0Qhwu=gfe1+H23TnAa6jnO6A3ZCO687dH6mSrATmDA@mail.gmail.com/ Suggested-by:
Nick Desaulniers <ndesaulniers@google.com> Acked-by:
Nick Desaulniers <ndesaulniers@google.com> Signed-off-by:
Gary Guo <gary@garyguo.net> Reviewed-by:
Wei Liu <wei.liu@kernel.org> Signed-off-by:
Miguel Ojeda <ojeda@kernel.org>
-
Miguel Ojeda authored
The `Cow` type [1] requires that its generic parameter type implements the `ToOwned` trait [2], which provides a method to create owned data from borrowed data, usually by cloning. However, it is infallible, and thus in most cases it is not useful for the kernel. [3] Therefore, introduce `cfg(no_borrow)` to remove the `borrow` module (which contains `ToOwned` and `Cow`) from `alloc`. Link: https://doc.rust-lang.org/alloc/borrow/enum.Cow.html [1] Link: https://doc.rust-lang.org/alloc/borrow/trait.ToOwned.html [2] Link: https://lore.kernel.org/rust-for-linux/20221204103153.117675b1@GaryWorkstation/ [3] Cc: Gary Guo <gary@garyguo.net> Cc: Wedson Almeida Filho <wedsonaf@gmail.com> Cc: Josh Triplett <josh@joshtriplett.org> Signed-off-by:
Miguel Ojeda <ojeda@kernel.org> Reviewed-by:
Wei Liu <wei.liu@kernel.org> Reviewed-by:
Finn Behrens <fin@nyantec.com>
-
- Jan 15, 2023
-
-
Miguel Ojeda authored
At the moment it is possible to perform unsafe operations in the arguments of `pr_*` macros since they are evaluated inside an `unsafe` block: let x = &10u32 as *const u32; pr_info!("{}", *x); In other words, this is a soundness issue. Fix it so that it requires an explicit `unsafe` block. Reported-by:
Wedson Almeida Filho <wedsonaf@gmail.com> Reported-by:
Domen Puncer Kugler <domen.puncerkugler@nccgroup.com> Link: https://github.com/Rust-for-Linux/linux/issues/479 Signed-off-by:
Miguel Ojeda <ojeda@kernel.org> Reviewed-by:
Boqun Feng <boqun.feng@gmail.com> Reviewed-by:
Gary Guo <gary@garyguo.net> Reviewed-by:
Björn Roy Baron <bjorn3_gh@protonmail.com> Reviewed-by:
Vincenzo Palazzo <vincenzopalazzodev@gmail.com>
-
- Dec 04, 2022
-
-
Wedson Almeida Filho authored
Add the `Opaque` type, which is meant to be used with FFI objects that are never interpreted by Rust code, e.g.: struct Waiter { completion: Opaque<bindings::completion>, next: *mut Waiter, } It has the advantage that the objects don't have to be zero-initialised before calling their init functions, making the code performance closer to C. Signed-off-by:
Wedson Almeida Filho <wedsonaf@gmail.com> [Reworded, adapted for upstream and applied latest changes] Signed-off-by:
Miguel Ojeda <ojeda@kernel.org>
-
Wedson Almeida Filho authored
Introduce the new `types` module of the `kernel` crate with `Either` as its first type. `Either<L, R>` is a sum type that always holds either a value of type `L` (`Left` variant) or `R` (`Right` variant). For instance: struct Executor { queue: Either<BoxedQueue, &'static Queue>, } Signed-off-by:
Wedson Almeida Filho <wedsonaf@gmail.com> Reviewed-by:
Wei Liu <wei.liu@kernel.org> [Reworded, adapted for upstream and applied latest changes] Signed-off-by:
Miguel Ojeda <ojeda@kernel.org>
-
Gary Guo authored
Add the `build_error!` and `build_assert!` macros which leverage the previously introduced `build_error` crate. Do so in a new module, called `build_assert`. The former fails the build if the code path calling it can possibly be executed. The latter asserts that a boolean expression is `true` at compile time. In particular, `build_assert!` can be used in some contexts where `static_assert!` cannot: fn f1<const N: usize>() { static_assert!(N > 1);` // Error. build_assert!(N > 1); // Build-time check. assert!(N > 1); // Run-time check. } #[inline] fn f2(n: usize) { static_assert!(n > 1); // Error. build_assert!(n > 1); // Build-time check. assert!(n > 1); // Run-time check. } Signed-off-by:
Gary Guo <gary@garyguo.net> Reviewed-by:
Wei Liu <wei.liu@kernel.org> [Reworded, adapted for upstream and applied latest changes] Signed-off-by:
Miguel Ojeda <ojeda@kernel.org>
-
Gary Guo authored
The `build_error` crate provides a function `build_error` which will panic at compile-time if executed in const context and, by default, will cause a build error if not executed at compile time and the optimizer does not optimise away the call. The `CONFIG_RUST_BUILD_ASSERT_ALLOW` kernel option allows to relax the default build failure and convert it to a runtime check. If the runtime check fails, `panic!` will be called. Its functionality will be exposed to users as a couple macros in the `kernel` crate in the following patch, thus some documentation here refers to them for simplicity. Signed-off-by:
Gary Guo <gary@garyguo.net> Reviewed-by:
Wei Liu <wei.liu@kernel.org> [Reworded, adapted for upstream and applied latest changes] Signed-off-by:
Miguel Ojeda <ojeda@kernel.org>
-
Miguel Ojeda authored
Add the `static_assert!` macro, which is a compile-time assert, similar to the C11 `_Static_assert` and C++11 `static_assert` declarations [1,2]. Do so in a new module, called `static_assert`. For instance: static_assert!(42 > 24); static_assert!(core::mem::size_of::<u8>() == 1); const X: &[u8] = b"bar"; static_assert!(X[1] == b'a'); const fn f(x: i32) -> i32 { x + 2 } static_assert!(f(40) == 42); Link: https://en.cppreference.com/w/c/language/_Static_assert [1] Link: https://en.cppreference.com/w/cpp/language/static_assert [2] Co-developed-by:
Alex Gaynor <alex.gaynor@gmail.com> Signed-off-by:
Alex Gaynor <alex.gaynor@gmail.com> Signed-off-by:
Miguel Ojeda <ojeda@kernel.org>
-
Niklas Mohrin authored
The Rust standard library has a really handy macro, `dbg!` [1,2]. It prints the source location (filename and line) along with the raw source code that is invoked with and the `Debug` representation of the given expression, e.g.: let a = 2; let b = dbg!(a * 2) + 1; // ^-- prints: [src/main.rs:2] a * 2 = 4 assert_eq!(b, 5); Port the macro over to the `kernel` crate inside a new module called `std_vendor`, using `pr_info!` instead of `eprintln!` and make the rules about committing uses of `dbg!` into version control more concrete (i.e. tailored for the kernel). Since the source code for the macro is taken from the standard library source (with only minor adjustments), the new file is licensed under `Apache 2.0 OR MIT`, just like the original [3,4]. Link: https://doc.rust-lang.org/std/macro.dbg.html [1] Link: https://github.com/rust-lang/rust/blob/master/library/std/src/macros.rs#L212 [2] Link: https://github.com/rust-lang/rust/blob/master/library/std/Cargo.toml [3] Link: https://github.com/rust-lang/rust/blob/master/COPYRIGHT [4] Signed-off-by:
Niklas Mohrin <dev@niklasmohrin.de> [Reworded, adapted for upstream and applied latest changes] Signed-off-by:
Miguel Ojeda <ojeda@kernel.org>
-
Wedson Almeida Filho authored
Add the `fmt!` macro, which is a convenience alias for the Rust `core::format_args!` macro. For instance, it may be used to create a `CString`: CString::try_from_fmt(fmt!("{}{}", "abc", 42))? Signed-off-by:
Wedson Almeida Filho <wedsonaf@gmail.com> Reviewed-by:
Gary Guo <gary@garyguo.net> [Reworded, adapted for upstream and applied latest changes] Signed-off-by:
Miguel Ojeda <ojeda@kernel.org>
-
Wedson Almeida Filho authored
Add the `CString` type, which is an owned string that is guaranteed to have exactly one `NUL` byte at the end, i.e. the owned equivalent to `CStr` introduced earlier. It is used for interoperability with kernel APIs that take C strings. In order to do so, implement the `RawFormatter::new()` constructor and the `RawFormatter::bytes_written()` method as well. Signed-off-by:
Wedson Almeida Filho <wedsonaf@gmail.com> [Reworded, adapted for upstream and applied latest changes] Signed-off-by:
Miguel Ojeda <ojeda@kernel.org>
-
Wedson Almeida Filho authored
Add the `Formatter` type, which leverages `RawFormatter`, but fails if callers attempt to write more than will fit in the buffer. In order to so, implement the `RawFormatter::from_buffer()` constructor as well. Co-developed-by:
Adam Bratschi-Kaye <ark.email@gmail.com> Signed-off-by:
Adam Bratschi-Kaye <ark.email@gmail.com> Signed-off-by:
Wedson Almeida Filho <wedsonaf@gmail.com> Reviewed-by:
Gary Guo <gary@garyguo.net> [Reworded, adapted for upstream and applied latest changes] Signed-off-by:
Miguel Ojeda <ojeda@kernel.org>
-
Gary Guo authored
Add `c_str!`, which is a convenience macro that creates a new `CStr` from a string literal. It is designed to be similar to a `str` in usage, and it is usable in const contexts, for instance: const X: &CStr = c_str!("Example"); Co-developed-by:
Alex Gaynor <alex.gaynor@gmail.com> Signed-off-by:
Alex Gaynor <alex.gaynor@gmail.com> Signed-off-by:
Gary Guo <gary@garyguo.net> [Reworded, adapted for upstream and applied latest changes] Signed-off-by:
Miguel Ojeda <ojeda@kernel.org>
-
Milan Landaverde authored
Add unit tests for `CStr::from_bytes_with_nul()` and `CStr::from_bytes_with_nul_unchecked()`. These serve as an example of the first unit tests for Rust code (i.e. different from documentation tests). Signed-off-by:
Milan Landaverde <milan@mdaverde.com> [Reworded, adapted for upstream and applied latest changes] Signed-off-by:
Miguel Ojeda <ojeda@kernel.org>
-
Gary Guo authored
Implement `Debug`, `Display`, `Deref` (into `BStr`), `AsRef<BStr>` and a set of `Index<...>` traits. This makes it `CStr` more convenient to use (and closer to `str`). Co-developed-by:
Alex Gaynor <alex.gaynor@gmail.com> Signed-off-by:
Alex Gaynor <alex.gaynor@gmail.com> Co-developed-by:
Morgan Bartlett <mjmouse9999@gmail.com> Signed-off-by:
Morgan Bartlett <mjmouse9999@gmail.com> Signed-off-by:
Gary Guo <gary@garyguo.net> [Reworded, adapted for upstream and applied latest changes] Signed-off-by:
Miguel Ojeda <ojeda@kernel.org>
-
Gary Guo authored
Add the `CStr` type, which is a borrowed string that is guaranteed to have exactly one `NUL` byte, which is at the end. It is used for interoperability with kernel APIs that take C strings. Add it to the prelude too. Co-developed-by:
Alex Gaynor <alex.gaynor@gmail.com> Signed-off-by:
Alex Gaynor <alex.gaynor@gmail.com> Co-developed-by:
Milan Landaverde <milan@mdaverde.com> Signed-off-by:
Milan Landaverde <milan@mdaverde.com> Signed-off-by:
Gary Guo <gary@garyguo.net> [Reworded, adapted for upstream and applied latest changes] Signed-off-by:
Miguel Ojeda <ojeda@kernel.org>
-
Gary Guo authored
Add the `b_str!` macro, which creates a new `BStr` from a string literal. It is usable in const contexts, for instance: const X: &BStr = b_str!("Example"); Signed-off-by:
Gary Guo <gary@garyguo.net> [Reworded, adapted for upstream and applied latest changes] Signed-off-by:
Miguel Ojeda <ojeda@kernel.org>
-
Gary Guo authored
Add the `BStr` type, which is a byte string without UTF-8 validity guarantee. It is simply an alias to `[u8]`, but has a more evident semantical meaning. Signed-off-by:
Gary Guo <gary@garyguo.net> [Reworded, adapted for upstream and applied latest changes] Signed-off-by:
Miguel Ojeda <ojeda@kernel.org>
-
Miguel Ojeda authored
Add `Vec::try_with_capacity()` and `Vec::try_with_capacity_in()` as the fallible versions of `Vec::with_capacity()` and `Vec::with_capacity_in()`, respectively. The implementations follow the originals and use the previously added `RawVec::try_with_capacity_in()`. In turn, `Vec::try_with_capacity()` will be used to implement the `CString` type (which wraps a `Vec<u8>`) in a later patch. Reviewed-by:
Gary Guo <gary@garyguo.net> Signed-off-by:
Miguel Ojeda <ojeda@kernel.org>
-
Miguel Ojeda authored
Add the `RawVec::try_with_capacity_in()` constructor as the fallible version of `RawVec::with_capacity_in()`. The implementation follows the original. The infallible constructor is implemented in terms of the private `RawVec::allocate_in()` constructor, thus also add the private `RawVec::try_allocate_in()` constructor following the other. It will be used to implement `Vec::try_with_capacity{,_in}()` in the next patch. Reviewed-by:
Gary Guo <gary@garyguo.net> Signed-off-by:
Miguel Ojeda <ojeda@kernel.org>
-
Wedson Almeida Filho authored
It is convenient to have all the `Error` constant items (such as `EINVAL`) available as-is everywhere (i.e. for code using the kernel prelude such as kernel modules). Therefore, add all of them to the prelude. For instance, this allows to write `Err(EINVAL)` to create a kernel `Result`: fn f() -> Result<...> { ... Err(EINVAL) } Signed-off-by:
Wedson Almeida Filho <wedsonaf@gmail.com> Reviewed-by:
Gary Guo <gary@garyguo.net> [Reworded, adapted for upstream and applied latest changes] Signed-off-by:
Miguel Ojeda <ojeda@kernel.org>
-
Wedson Almeida Filho authored
Add a set of `From` implementations for the `Error` kernel type. These implementations allow to easily convert from standard Rust error types to the usual kernel errors based on one of the `E*` integer codes. On top of that, the question mark Rust operator (`?`) implicitly performs a conversion on the error value using the `From` trait when propagating. Thus it is extra convenient to use. For instance, a kernel function that needs to convert a `i64` into a `i32` and to bubble up the error as a kernel error may write: fn f(x: i64) -> Result<...> { ... let y = i32::try_from(x)?; ... } which will transform the `TryFromIntError` into an `Err(EINVAL)`. Co-developed-by:
Adam Bratschi-Kaye <ark.email@gmail.com> Signed-off-by:
Adam Bratschi-Kaye <ark.email@gmail.com> Co-developed-by:
Nándor István Krácser <bonifaido@gmail.com> Signed-off-by:
Nándor István Krácser <bonifaido@gmail.com> Signed-off-by:
Wedson Almeida Filho <wedsonaf@gmail.com> Reviewed-by:
Finn Behrens <me@kloenk.dev> [Reworded, adapted for upstream and applied latest changes] Signed-off-by:
Miguel Ojeda <ojeda@kernel.org>
-
Viktor Garske authored
Only a few codes were added so far. With the `declare_err!` macro in place, add the remaining ones (which is most of them) from `include/uapi/asm-generic/errno-base.h`. Co-developed-by:
Wedson Almeida Filho <wedsonaf@gmail.com> Signed-off-by:
Wedson Almeida Filho <wedsonaf@gmail.com> Signed-off-by:
Viktor Garske <viktor@v-gar.de> Reviewed-by:
Gary Guo <gary@garyguo.net> [Reworded, adapted for upstream and applied latest changes] Signed-off-by:
Miguel Ojeda <ojeda@kernel.org>
-