1/* @title: Address Ranges */
2#pragma once
3#include <compiler.h>
4#include <linker/symbols.h>
5#include <stddef.h>
6#include <stdint.h>
7#include <structures/rbt.h>
8#include <types/types.h>
9
10/* TODO: To different architectures, change this (also, for 32 bit) */
11#define ADDRESS_RANGE_KERNEL_START 0xFFFF800000000000
12#define ADDRESS_RANGE_KERNEL_END 0xFFFFFFFFFFFFFFFF
13
14enum address_range_flags {
15 ADDRESS_RANGE_DYNAMIC = 1 << 0,
16 ADDRESS_RANGE_STATIC = 0,
17};
18
19struct address_range {
20 const char *name;
21 vaddr_t base;
22 size_t size;
23 size_t align;
24 enum address_range_flags flags;
25 struct rbt_node rbt_node_internal;
26 struct page_fault_handler *page_fault_handler;
27};
28
29#define ADDRESS_RANGE_DECLARE(sym, ...) \
30 LINKER_SECTION_OBJECT(struct address_range, address_ranges) \
31 __address_range_##sym = { \
32 .name = #sym, __VA_ARGS__, .rbt_node_internal = RBT_NODE_INIT}
33
34#define ADDRESS_RANGE(sym) (__address_range_##sym)
35
36LINKER_SECTION_DEFINE(struct address_range, address_ranges);
37
38void address_ranges_init();
39void address_ranges_print();
40struct address_range *address_range_for_addr(vaddr_t vaddr);
41
42static inline bool address_range_addr_in_range(struct address_range *ar,
43 vaddr_t vaddr) {
44 return vaddr >= ar->base && vaddr < ar->base + ar->size;
45}
46