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
11struct page;
12struct buddy_page;
13struct limine_memmap_entry;
14
15struct 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
21void buddy_add_to_free_area(struct buddy_page *page,
22 struct buddy_free_area *area);
23struct buddy_page *buddy_remove_from_free_area(struct buddy_free_area *area);
24paddr_t buddy_alloc_pages_global(size_t count, enum alloc_flags flags);
25void buddy_free_pages_global(paddr_t addr, uint64_t count);
26void buddy_add_entry(struct page *page_array, struct limine_memmap_entry *entry,
27 struct buddy_free_area *farea);
28void buddy_reserve_range(uint64_t pfn, uint64_t pages);
29
30paddr_t buddy_alloc_pages(struct buddy_free_area *free_area, size_t count);
31void buddy_free_pages(paddr_t addr, size_t count,
32 struct buddy_free_area *free_area, size_t total_pages);
33void buddy_init(void);
34