mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 10:42:45 +00:00 
			
		
		
		
	 022f7790db
			
		
	
	
		022f7790db
		
	
	
	
	
		
			
			This is quite nice, although I wish [[gnu::always_inline]] implied inline. Also "gnu::" is kind of a wart, but whatcha gonna do.
		
			
				
	
	
		
			33 lines
		
	
	
	
		
			1.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			33 lines
		
	
	
	
		
			1.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #pragma once
 | |
| 
 | |
| #include <AK/Types.h>
 | |
| 
 | |
| //#define KMALLOC_DEBUG_LARGE_ALLOCATIONS
 | |
| 
 | |
| void kmalloc_init();
 | |
| [[gnu::malloc, gnu::returns_nonnull, gnu::alloc_size(1)]] void* kmalloc_impl(size_t);
 | |
| [[gnu::malloc, gnu::returns_nonnull, gnu::alloc_size(1)]] void* kmalloc_eternal(size_t);
 | |
| [[gnu::malloc, gnu::returns_nonnull, gnu::alloc_size(1)]] void* kmalloc_page_aligned(size_t);
 | |
| [[gnu::malloc, gnu::returns_nonnull, gnu::alloc_size(1)]] void* kmalloc_aligned(size_t, size_t alignment);
 | |
| void kfree(void*);
 | |
| void kfree_aligned(void*);
 | |
| 
 | |
| bool is_kmalloc_address(const void*);
 | |
| 
 | |
| extern volatile size_t sum_alloc;
 | |
| extern volatile size_t sum_free;
 | |
| extern volatile size_t kmalloc_sum_eternal;
 | |
| extern volatile size_t kmalloc_sum_page_aligned;
 | |
| 
 | |
| inline void* operator new(size_t, void* p) { return p; }
 | |
| inline void* operator new[](size_t, void* p) { return p; }
 | |
| 
 | |
| [[gnu::always_inline]] inline void* kmalloc(size_t size)
 | |
| {
 | |
| #ifdef KMALLOC_DEBUG_LARGE_ALLOCATIONS
 | |
|     // Any kernel allocation >= 1M is 99.9% a bug.
 | |
|     if (size >= 1048576)
 | |
|         asm volatile("cli;hlt");
 | |
| #endif
 | |
|     return kmalloc_impl(size);
 | |
| }
 |