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