| 1 | /* @title: Buddy allocator */ |
| 2 | #pragma once |
| 3 | #include <mem/alloc.h> |
| 4 | #include <stdbool.h> |
| 5 | #include <stddef.h> |
| 6 | #include <stdint.h> |
| 7 | #include <types/types.h> |
| 8 | |
| 9 | #define BUDDY_MAX_ORDER 18 |
| 10 | |
| 11 | struct page; |
| 12 | struct buddy_page; |
| 13 | struct limine_memmap_entry; |
| 14 | |
| 15 | struct buddy_free_area { |
| 16 | struct buddy_page *head; /* head->prev == NULL */ |
| 17 | struct buddy_page *tail; /* tail->next == NULL */ |
| 18 | uint64_t nr_free; |
| 19 | }; |
| 20 | |
| 21 | void buddy_add_to_free_area(struct buddy_page *page, |
| 22 | struct buddy_free_area *area); |
| 23 | struct buddy_page *buddy_remove_from_free_area(struct buddy_free_area *area); |
| 24 | paddr_t buddy_alloc_pages_global(size_t count, enum alloc_flags flags); |
| 25 | void buddy_free_pages_global(paddr_t addr, uint64_t count); |
| 26 | void buddy_add_entry(struct page *page_array, struct limine_memmap_entry *entry, |
| 27 | struct buddy_free_area *farea); |
| 28 | void buddy_reserve_range(uint64_t pfn, uint64_t pages); |
| 29 | |
| 30 | paddr_t buddy_alloc_pages(struct buddy_free_area *free_area, size_t count); |
| 31 | void buddy_free_pages(paddr_t addr, size_t count, |
| 32 | struct buddy_free_area *free_area, size_t total_pages); |
| 33 | void buddy_init(void); |
| 34 | |