-
Notifications
You must be signed in to change notification settings - Fork 8
Expand file tree
/
Copy pathmm.h
More file actions
115 lines (86 loc) · 2.39 KB
/
Copy pathmm.h
File metadata and controls
115 lines (86 loc) · 2.39 KB
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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#pragma once
#include <stdint.h>
#include <stdbool.h>
#include "vm.h"
#include "range.h"
#define KiB *1L*1024
#define MiB *1L*1024*1024
#define GiB *1L*1024*1024*1024
#define PAGE_SIZE_4K 4096
typedef uint64_t mm_gvirt_t;
typedef enum {
MM_MMAP_TYPE_ALLOC,
MM_MMAP_TYPE_MMAP,
} mm_mmap_type_t;
typedef int mm_mmap_prot_t;
static const mm_mmap_prot_t MM_MMAP_PROT_NONE = 0;
static const mm_mmap_prot_t MM_MMAP_PROT_READ = VM_MMAP_PROT_READ;
static const mm_mmap_prot_t MM_MMAP_PROT_WRITE = VM_MMAP_PROT_WRITE;
static const mm_mmap_prot_t MM_MMAP_PROT_EXEC = VM_MMAP_PROT_EXEC;
static const mm_mmap_prot_t MM_MMAP_PROT_RE = MM_MMAP_PROT_READ | MM_MMAP_PROT_EXEC;
static const mm_mmap_prot_t MM_MMAP_PROT_RW = MM_MMAP_PROT_READ | MM_MMAP_PROT_WRITE;
static const mm_mmap_prot_t MM_MMAP_PROT_RWE = MM_MMAP_PROT_READ | MM_MMAP_PROT_WRITE | MM_MMAP_PROT_EXEC;
typedef struct {
range_t range;
void *hvirt;
uint64_t size;
mm_mmap_type_t type;
} mm_mmap_range_t;
typedef struct {
vm_t *vm;
mm_mmap_range_t *mmap_range_root;
mm_gvirt_t stack_top, stack_bottom;
size_t stack_size;
void *stack;
mm_gvirt_t heap_start, heap_end;
size_t heap_size;
void *heap;
mm_gvirt_t kernel_start;
uint64_t kernel_size;
#define PAGE_ENTRY_COUNT 512
struct kernel {
uint64_t pml4[PAGE_ENTRY_COUNT];
uint64_t pdpt[PAGE_ENTRY_COUNT];
char tss[PAGE_SIZE_4K];
char idt[PAGE_SIZE_4K];
uint64_t gdt[3];
} *kernel;
} mm_t;
void
mm_init(mm_t *mm, vm_t *vm);
void
mm_setup_kernel(mm_t *mm);
void
mm_setup_stack(mm_t *mm);
mm_gvirt_t
mm_get_stack_top(mm_t *mm);
void
mm_setup_heap(mm_t *mm, mm_gvirt_t heap_start);
int
mm_expand_heap(mm_t *mm, mm_gvirt_t new_heap_end);
void
mm_get_sysregs(mm_t *mm, vcpu_sysregs_t *sysregs);
void
mm_push(mm_t *mm, const void *data, size_t n);
void
mm_mmap(mm_t *mm, mm_gvirt_t gvirt, void *hvirt, size_t size, mm_mmap_prot_t prot, mm_mmap_type_t type);
void *
mm_gvirt_to_hvirt(mm_t *mm, mm_gvirt_t gvirt);
bool
mm_copy_from_user(mm_t *mm, void *dst, mm_gvirt_t src, size_t size);
bool
mm_copy_to_user(mm_t *mm, mm_gvirt_t dst, void *src, size_t size);
void
mm_dump_range_tree(mm_t *mm);
static inline void *
mm_stack_gvirt_to_hvirt(mm_t *mm, mm_gvirt_t gvirt)
{
return (char *)mm->stack + (gvirt - mm->stack_bottom);
}
#if 0
static inline mm_gphys_t
mm_stack_hvirt_to_gphys(vm_t *vm, void *hvirt)
{
return (uint64_t)hvirt - (uint64_t)vm->stack + vm->stack_top_gphys - vm->stack_size;
}
#endif