| // 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; |