mirror of
https://github.com/torvalds/linux.git
synced 2025-12-07 20:06:24 +00:00
`kernel::ffi::CStr` was introduced in commitd126d23801("rust: str: add `CStr` type") in November 2022 as an upstreaming of earlier work that was done in May 2021[0]. That earlier work, having predated the inclusion of `CStr` in `core`, largely duplicated the implementation of `std::ffi::CStr`. `std::ffi::CStr` was moved to `core::ffi::CStr` in Rust 1.64 in September 2022. Hence replace `kernel::str::CStr` with `core::ffi::CStr` to reduce our custom code footprint, and retain needed custom functionality through an extension trait. Add `CStr` to `ffi` and the kernel prelude. Link:faa3cbcca0[0] Acked-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Reviewed-by: Alice Ryhl <aliceryhl@google.com> Acked-by: Danilo Krummrich <dakr@kernel.org> Reviewed-by: Benno Lossin <lossin@kernel.org> Signed-off-by: Tamir Duberstein <tamird@gmail.com> Link: https://patch.msgid.link/20251018-cstr-core-v18-16-9378a54385f8@gmail.com [ Removed assert that would now depend on the Rust version. - Miguel ] Signed-off-by: Miguel Ojeda <ojeda@kernel.org>
51 lines
1.3 KiB
Rust
51 lines
1.3 KiB
Rust
// SPDX-License-Identifier: GPL-2.0
|
|
|
|
//! Foreign function interface (FFI) types.
|
|
//!
|
|
//! This crate provides mapping from C primitive types to Rust ones.
|
|
//!
|
|
//! The Rust [`core`] crate provides [`core::ffi`], which maps integer types to the platform default
|
|
//! C ABI. The kernel does not use [`core::ffi`], so it can customise the mapping that deviates from
|
|
//! the platform default.
|
|
|
|
#![no_std]
|
|
|
|
macro_rules! alias {
|
|
($($name:ident = $ty:ty;)*) => {$(
|
|
#[allow(non_camel_case_types, missing_docs)]
|
|
pub type $name = $ty;
|
|
|
|
// Check size compatibility with `core`.
|
|
const _: () = assert!(
|
|
::core::mem::size_of::<$name>() == ::core::mem::size_of::<::core::ffi::$name>()
|
|
);
|
|
)*}
|
|
}
|
|
|
|
alias! {
|
|
// `core::ffi::c_char` is either `i8` or `u8` depending on architecture. In the kernel, we use
|
|
// `-funsigned-char` so it's always mapped to `u8`.
|
|
c_char = u8;
|
|
|
|
c_schar = i8;
|
|
c_uchar = u8;
|
|
|
|
c_short = i16;
|
|
c_ushort = u16;
|
|
|
|
c_int = i32;
|
|
c_uint = u32;
|
|
|
|
// In the kernel, `intptr_t` is defined to be `long` in all platforms, so we can map the type to
|
|
// `isize`.
|
|
c_long = isize;
|
|
c_ulong = usize;
|
|
|
|
c_longlong = i64;
|
|
c_ulonglong = u64;
|
|
}
|
|
|
|
pub use core::ffi::c_void;
|
|
|
|
pub use core::ffi::CStr;
|