1/* @title: Virtual address allocator */
2#pragma once
3#include <mem/fixed_size_alloc.h>
4#include <mem/page.h>
5#include <stdatomic.h>
6#include <stdint.h>
7#include <structures/list.h>
8#include <structures/rbt.h>
9#include <sync/spinlock.h>
10#include <types/types.h>
11
12struct address_range;
13
14#define VAS_CHUNK_SIZE PAGE_1GB
15
16struct vas_range {
17 vaddr_t start;
18 size_t length;
19 struct rbt_node node;
20};
21
22struct vas_local_tree {
23 struct spinlock lock;
24 struct rbt tree;
25 struct fixed_size_range fsr;
26 size_t total_free;
27};
28
29struct vas {
30 struct vas_local_tree global;
31
32 vaddr_t base;
33 vaddr_t limit;
34 size_t chunk_size;
35
36 struct vas_local_tree *local;
37};
38
39struct vas *vas_bootstrap(vaddr_t base, vaddr_t limit);
40struct vas *vas_create(vaddr_t base, vaddr_t limit);
41struct vas *vas_from(struct address_range *ar);
42struct vas *vas_bootstrap_from(struct address_range *ar);
43
44vaddr_t vas_alloc(struct vas *vas, size_t size, size_t align);
45void vas_free(struct vas *vas, vaddr_t addr, size_t size);
46
47void *vas_map(struct vas *vas, paddr_t paddr, size_t len, uint64_t flags,
48 enum vmm_flags vflags);
49void vas_unmap(struct vas *vas, void *vaddr, size_t len);
50
51void vas_reclaim_freelist_pages(struct vas_local_tree *lt);
52void vas_space_dump(struct vas *vas);
53
54static inline bool vas_vaddr_in_vas(struct vas *vas, vaddr_t vaddr) {
55 return vaddr >= vas->base && vaddr < vas->limit;
56}
57
58bool vas_vaddr_is_allocated(struct vas *vas, vaddr_t addr);
59