mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	The `kernel` crate currently includes all the abstractions that wrap kernel features written in C. These abstractions call the C side of the kernel via the generated bindings with the `bindgen` tool. Modules developed in Rust should never call the bindings themselves. In the future, as the abstractions grow in number, we may need to split this crate into several, possibly following a similar subdivision in subsystems as the kernel itself and/or moving the code to the actual subsystems. Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Co-developed-by: Alex Gaynor <alex.gaynor@gmail.com> Signed-off-by: Alex Gaynor <alex.gaynor@gmail.com> Co-developed-by: Geoffrey Thomas <geofft@ldpreload.com> Signed-off-by: Geoffrey Thomas <geofft@ldpreload.com> Co-developed-by: Finn Behrens <me@kloenk.de> Signed-off-by: Finn Behrens <me@kloenk.de> Co-developed-by: Adam Bratschi-Kaye <ark.email@gmail.com> Signed-off-by: Adam Bratschi-Kaye <ark.email@gmail.com> Co-developed-by: Sven Van Asbroeck <thesven73@gmail.com> Signed-off-by: Sven Van Asbroeck <thesven73@gmail.com> Co-developed-by: Gary Guo <gary@garyguo.net> Signed-off-by: Gary Guo <gary@garyguo.net> Co-developed-by: Boris-Chengbiao Zhou <bobo1239@web.de> Signed-off-by: Boris-Chengbiao Zhou <bobo1239@web.de> Co-developed-by: Boqun Feng <boqun.feng@gmail.com> Signed-off-by: Boqun Feng <boqun.feng@gmail.com> Co-developed-by: Fox Chen <foxhlchen@gmail.com> Signed-off-by: Fox Chen <foxhlchen@gmail.com> Co-developed-by: Viktor Garske <viktor@v-gar.de> Signed-off-by: Viktor Garske <viktor@v-gar.de> Co-developed-by: Dariusz Sosnowski <dsosnowski@dsosnowski.pl> Signed-off-by: Dariusz Sosnowski <dsosnowski@dsosnowski.pl> Co-developed-by: Léo Lanteri Thauvin <leseulartichaut@gmail.com> Signed-off-by: Léo Lanteri Thauvin <leseulartichaut@gmail.com> Co-developed-by: Niklas Mohrin <dev@niklasmohrin.de> Signed-off-by: Niklas Mohrin <dev@niklasmohrin.de> Co-developed-by: Milan Landaverde <milan@mdaverde.com> Signed-off-by: Milan Landaverde <milan@mdaverde.com> Co-developed-by: Morgan Bartlett <mjmouse9999@gmail.com> Signed-off-by: Morgan Bartlett <mjmouse9999@gmail.com> Co-developed-by: Maciej Falkowski <m.falkowski@samsung.com> Signed-off-by: Maciej Falkowski <m.falkowski@samsung.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> Co-developed-by: David Gow <davidgow@google.com> Signed-off-by: David Gow <davidgow@google.com> Co-developed-by: John Baublitz <john.m.baublitz@gmail.com> Signed-off-by: John Baublitz <john.m.baublitz@gmail.com> Co-developed-by: Björn Roy Baron <bjorn3_gh@protonmail.com> Signed-off-by: Björn Roy Baron <bjorn3_gh@protonmail.com> Signed-off-by: Wedson Almeida Filho <wedsonaf@google.com> Co-developed-by: Miguel Ojeda <ojeda@kernel.org> Signed-off-by: Miguel Ojeda <ojeda@kernel.org>
		
			
				
	
	
		
			64 lines
		
	
	
	
		
			1.8 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			64 lines
		
	
	
	
		
			1.8 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
// SPDX-License-Identifier: GPL-2.0
 | 
						|
 | 
						|
//! Allocator support.
 | 
						|
 | 
						|
use core::alloc::{GlobalAlloc, Layout};
 | 
						|
use core::ptr;
 | 
						|
 | 
						|
use crate::bindings;
 | 
						|
 | 
						|
struct KernelAllocator;
 | 
						|
 | 
						|
unsafe impl GlobalAlloc for KernelAllocator {
 | 
						|
    unsafe fn alloc(&self, layout: Layout) -> *mut u8 {
 | 
						|
        // `krealloc()` is used instead of `kmalloc()` because the latter is
 | 
						|
        // an inline function and cannot be bound to as a result.
 | 
						|
        unsafe { bindings::krealloc(ptr::null(), layout.size(), bindings::GFP_KERNEL) as *mut u8 }
 | 
						|
    }
 | 
						|
 | 
						|
    unsafe fn dealloc(&self, ptr: *mut u8, _layout: Layout) {
 | 
						|
        unsafe {
 | 
						|
            bindings::kfree(ptr as *const core::ffi::c_void);
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
#[global_allocator]
 | 
						|
static ALLOCATOR: KernelAllocator = KernelAllocator;
 | 
						|
 | 
						|
// `rustc` only generates these for some crate types. Even then, we would need
 | 
						|
// to extract the object file that has them from the archive. For the moment,
 | 
						|
// let's generate them ourselves instead.
 | 
						|
//
 | 
						|
// Note that `#[no_mangle]` implies exported too, nowadays.
 | 
						|
#[no_mangle]
 | 
						|
fn __rust_alloc(size: usize, _align: usize) -> *mut u8 {
 | 
						|
    unsafe { bindings::krealloc(core::ptr::null(), size, bindings::GFP_KERNEL) as *mut u8 }
 | 
						|
}
 | 
						|
 | 
						|
#[no_mangle]
 | 
						|
fn __rust_dealloc(ptr: *mut u8, _size: usize, _align: usize) {
 | 
						|
    unsafe { bindings::kfree(ptr as *const core::ffi::c_void) };
 | 
						|
}
 | 
						|
 | 
						|
#[no_mangle]
 | 
						|
fn __rust_realloc(ptr: *mut u8, _old_size: usize, _align: usize, new_size: usize) -> *mut u8 {
 | 
						|
    unsafe {
 | 
						|
        bindings::krealloc(
 | 
						|
            ptr as *const core::ffi::c_void,
 | 
						|
            new_size,
 | 
						|
            bindings::GFP_KERNEL,
 | 
						|
        ) as *mut u8
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
#[no_mangle]
 | 
						|
fn __rust_alloc_zeroed(size: usize, _align: usize) -> *mut u8 {
 | 
						|
    unsafe {
 | 
						|
        bindings::krealloc(
 | 
						|
            core::ptr::null(),
 | 
						|
            size,
 | 
						|
            bindings::GFP_KERNEL | bindings::__GFP_ZERO,
 | 
						|
        ) as *mut u8
 | 
						|
    }
 | 
						|
}
 |