-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmem.c
66 lines (58 loc) · 1.04 KB
/
mem.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
#include "mem.h"
#include "common.h"
#include <linux/gfp.h>
#include <asm/io.h>
void* _kmalloc (u64 size)
{
return kmalloc (size, GFP_KERNEL);
}
u64 page_alloc (u8 order)
{
u64 addr = __get_free_pages (GFP_KERNEL, order);
if (!addr)
{
LOG_DBG ("failed to allocate pages - order: %d\n", order);
return -ENOMEM;
}
if (addr & (PAGE_SIZE - 1))
{
LOG_DBG ("allocated pages were not page aligned.\n");
page_free (addr, order);
return -ENOMEM;
}
return addr;
}
void page_free_safe (u64 addr, u8 order)
{
if (!addr)
{
return;
}
page_free (addr, order);
}
void page_free (u64 addr, u8 order)
{
free_pages (addr, order);
}
void page_zero (void *addr, u8 order)
{
if (!addr)
{
return;
}
for (int i = 0; i < (1 << order); i++)
{
clear_page (addr + (i * PAGE_SIZE));
}
}
void page_set (void *addr, u8 val, u8 order)
{
if (addr)
{
memset (addr, val, PAGE_SIZE << order);
}
}
u64 addr_virt_to_phys (void *addr)
{
return (u64)virt_to_phys (addr);
}