This repository has been archived by the owner on Jan 20, 2022. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 261
/
Copy pathdb_memory.c
83 lines (64 loc) · 2.37 KB
/
db_memory.c
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
/* SPDX-License-Identifier: LGPL-3.0-or-later */
/* Copyright (C) 2014 Stony Brook University */
/*
* This file contains APIs that allocate, free or protect virtual memory.
*/
#include "api.h"
#include "pal.h"
#include "pal_debug.h"
#include "pal_defs.h"
#include "pal_error.h"
#include "pal_internal.h"
int DkVirtualMemoryAlloc(PAL_PTR* addr, PAL_NUM size, PAL_FLG alloc_type, PAL_FLG prot) {
assert(addr);
void* map_addr = *addr;
if ((map_addr && !IS_ALLOC_ALIGNED_PTR(map_addr)) || !size || !IS_ALLOC_ALIGNED(size)) {
return -PAL_ERROR_INVAL;
}
if (map_addr && _DkCheckMemoryMappable(map_addr, size)) {
return -PAL_ERROR_DENIED;
}
return _DkVirtualMemoryAlloc(addr, size, alloc_type, prot);
}
int DkVirtualMemoryFree(PAL_PTR addr, PAL_NUM size) {
if (!addr || !size) {
return -PAL_ERROR_INVAL;
}
if (!IS_ALLOC_ALIGNED_PTR(addr) || !IS_ALLOC_ALIGNED(size)) {
return -PAL_ERROR_INVAL;
}
if (_DkCheckMemoryMappable((void*)addr, size)) {
return -PAL_ERROR_DENIED;
}
return _DkVirtualMemoryFree((void*)addr, size);
}
int DkVirtualMemoryProtect(PAL_PTR addr, PAL_NUM size, PAL_FLG prot) {
if (!addr || !size) {
return -PAL_ERROR_INVAL;
}
if (!IS_ALLOC_ALIGNED_PTR(addr) || !IS_ALLOC_ALIGNED(size)) {
return -PAL_ERROR_INVAL;
}
if (_DkCheckMemoryMappable((void*)addr, size)) {
return -PAL_ERROR_DENIED;
}
return _DkVirtualMemoryProtect((void*)addr, size, prot);
}
int add_preloaded_range(uintptr_t start, uintptr_t end, const char* comment) {
size_t new_len = g_pal_control.preloaded_ranges_len + 1;
void* new_ranges = malloc(new_len * sizeof(*g_pal_control.preloaded_ranges));
if (!new_ranges) {
return -PAL_ERROR_NOMEM;
}
if (g_pal_control.preloaded_ranges_len) {
memcpy(new_ranges, g_pal_control.preloaded_ranges,
g_pal_control.preloaded_ranges_len * sizeof(*g_pal_control.preloaded_ranges));
}
free(g_pal_control.preloaded_ranges);
g_pal_control.preloaded_ranges = new_ranges;
g_pal_control.preloaded_ranges[g_pal_control.preloaded_ranges_len].start = start;
g_pal_control.preloaded_ranges[g_pal_control.preloaded_ranges_len].end = end;
g_pal_control.preloaded_ranges[g_pal_control.preloaded_ranges_len].comment = comment;
g_pal_control.preloaded_ranges_len++;
return 0;
}