summaryrefslogtreecommitdiff
path: root/kc/core/memory.h
blob: 1303a993d34e1b5ff9724a7ab800cb927a57e7ef (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#pragma once

#include <kernel/entry.h>
#include <kernel/memory/paging.h>
#include <kernel/memory/range.h>

#include <lib/kstring.h>

#include <core/memory.h>

#include "vm_tree.h"

typedef int (*memory_space_handler_func)(uint32_t code, void *vaddr);

enum page_map_flags
{
    CONTENT_CODE = 0x1,
    CONTENT_RODATA = 0x2,
    CONTENT_RWDATA = 0x3,
    CONTENT_MASK = 0x3,
    
    SIZE_4K = 0x4,
    SIZE_2M = 0x8,
    SIZE_1G = 0xc,
    SIZE_MASK = 0xc,
};

enum page_alloc_flags
{
    PAGE_ALLOC_NONE,
    PAGE_ALLOC_LOW,
    PAGE_ALLOC_CONV,
    PAGE_ALLOC_HIGH,
    PAGE_ALLOC_ANY
};

enum vm_alloc_flags
{
    VM_ALLOC_ANY = 0,
    VM_ALLOC_CACHE = 1,
    VM_ALLOC_CORE = 2,
    VM_ALLOC_TYPE_MASK = 3,

    VM_ALLOC_IMMEDIATE = 4,
    VM_ALLOC_ACTION_MASK = 4,

    VM_ALLOC_ANONYMOUS = 8,
    VM_ALLOC_DIRECT = 16,
    VM_ALLOC_TRANSLATE = 24,
    VM_ALLOC_MECHANISM_MASK = 24,
};

void memory_init(void);

void page_set_present(kc_phys_addr page);
void page_set_allocated(kc_phys_addr page);
void page_set_free(kc_phys_addr page);

int page_inc_ref(kc_phys_addr page);
int page_dec_ref(kc_phys_addr page); 

void *page_map(phys_addr_t paddr, enum page_map_flags flags);
void page_unmap(void *vaddr);

phys_addr_t page_alloc(enum page_alloc_flags flags);
void page_free(phys_addr_t paddr);

void *heap_alloc(size_t size);
void heap_free(void *block);

void *vm_alloc(size_t size, enum vm_alloc_flags flags);
void vm_free(void *block);

void *memory_alloc(size_t size);
void memory_free(void *block);

struct vm_tree *vm_get_tree(void);

int anonymous_page_handler(struct vm_tree_node *, uint32_t, void *);