89 lines
2.1 KiB
C
89 lines
2.1 KiB
C
#ifndef PMM_H
|
|
#define PMM_H
|
|
|
|
#include <stdint.h>
|
|
#include <stddef.h>
|
|
#include <stdbool.h>
|
|
#include <limine.h>
|
|
|
|
#define PAGE_SIZE 4096UL
|
|
#define PAGE_SHIFT 12
|
|
#define PMM_PAGE_ALIGN(x) (((x) + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1))
|
|
|
|
#define PMM_MAX_ORDER 10
|
|
#define PMM_MAX_ORDER_NR (PMM_MAX_ORDER + 1)
|
|
|
|
#define SLAB_MIN_SIZE 8
|
|
#define SLAB_MAX_SIZE 4096
|
|
#define SLAB_NUM_CACHES 10
|
|
|
|
#define PMM_FREE_MIN_PHYS 0x100000ULL
|
|
|
|
typedef struct pmm_block {
|
|
struct pmm_block *next;
|
|
struct pmm_block *prev;
|
|
int order;
|
|
} pmm_block_t;
|
|
|
|
typedef struct {
|
|
pmm_block_t head;
|
|
size_t count;
|
|
} pmm_free_list_t;
|
|
|
|
typedef struct {
|
|
uintptr_t hhdm_offset;
|
|
uintptr_t mem_start;
|
|
uintptr_t mem_end;
|
|
size_t total_pages;
|
|
size_t usable_pages;
|
|
size_t free_pages;
|
|
pmm_free_list_t orders[PMM_MAX_ORDER_NR];
|
|
} pmm_buddy_state_t;
|
|
|
|
typedef struct slab {
|
|
struct slab *next;
|
|
struct slab *prev;
|
|
void *freelist;
|
|
uint16_t obj_size;
|
|
uint16_t total;
|
|
uint16_t used;
|
|
uint16_t _pad;
|
|
} slab_t;
|
|
|
|
typedef struct {
|
|
size_t obj_size;
|
|
slab_t *partial;
|
|
slab_t *full;
|
|
size_t total_allocs;
|
|
size_t total_frees;
|
|
} slab_cache_t;
|
|
|
|
void pmm_init(struct limine_memmap_response *memmap,
|
|
struct limine_hhdm_response *hhdm);
|
|
|
|
void *pmm_alloc(size_t pages);
|
|
void *pmm_alloc_zero(size_t pages);
|
|
void *pmm_alloc_aligned(size_t pages, size_t alignment);
|
|
void pmm_free(void *addr, size_t pages);
|
|
void pmm_free_single(void *addr);
|
|
|
|
void *pmm_phys_to_virt(uintptr_t phys);
|
|
uintptr_t pmm_virt_to_phys(void *vaddr);
|
|
uint64_t pmm_get_hhdm_offset(void);
|
|
|
|
size_t pmm_get_total_pages(void);
|
|
size_t pmm_get_usable_pages(void);
|
|
size_t pmm_get_free_pages(void);
|
|
size_t pmm_get_used_pages(void);
|
|
void pmm_print_stats(void);
|
|
|
|
void slab_init(void);
|
|
void *kmalloc(size_t size);
|
|
void *kzalloc(size_t size);
|
|
void *krealloc(void *ptr, size_t new_size);
|
|
void kfree(void *ptr);
|
|
void slab_print_stats(void);
|
|
|
|
extern slab_cache_t g_caches[SLAB_NUM_CACHES];
|
|
|
|
#endif |