mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	The following FFI types are replaced compared to `core::ffi`: 1. `char` type is now always mapped to `u8`, since kernel uses `-funsigned-char` on the C code. `core::ffi` maps it to platform default ABI, which can be either signed or unsigned. 2. `long` is now always mapped to `isize`. It's very common in the kernel to use `long` to represent a pointer-sized integer, and in fact `intptr_t` is a typedef of `long` in the kernel. Enforce this mapping rather than mapping to `i32/i64` depending on platform can save us a lot of unnecessary casts. Signed-off-by: Gary Guo <gary@garyguo.net> Reviewed-by: Alice Ryhl <aliceryhl@google.com> Link: https://lore.kernel.org/r/20240913213041.395655-5-gary@garyguo.net [ Moved `uaccess` changes from the next commit, since they were irrefutable patterns that Rust >= 1.82.0 warns about. Reworded slightly and reformatted a few documentation comments. Rebased on top of `rust-next`. Added the removal of two casts to avoid Clippy warnings. - Miguel ] Signed-off-by: Miguel Ojeda <ojeda@kernel.org>
		
			
				
	
	
		
			48 lines
		
	
	
	
		
			1.2 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			48 lines
		
	
	
	
		
			1.2 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;
 |