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