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
|
#include "unittest/unittest.h"
#include "unittest/memmap.h"
/*
* Fake data objects.
*
* These are the dependencies required by mem_init().
*/
struct com32_sys_args {
unsigned long cs_memsize;
} __com32 = {
.cs_memsize = 4
};
char __lowmem_heap[32];
char free_high_memory[32];
#include "../init.c"
void __inject_free_block(struct free_arena_header *ah)
{
}
static unsigned long free_start = (unsigned long)free_high_memory;
static inline bool free_list_empty(void)
{
if (__com32.cs_memsize != free_start)
return false;
return true;
}
static struct test_memmap_entry *__test_entries;
static size_t __test_nr_entries;
int syslinux_scan_memory(scan_memory_callback_t callback, void *data)
{
struct test_memmap_entry *e;
int i;
for (i = 0; i < __test_nr_entries; i++) {
e = &__test_entries[i];
callback(data, e->start, e->size, e->type);
}
return 0;
}
void __setup(struct test_memmap_entry *entries, size_t nr_entries)
{
uint16_t __fake_free_mem = 64;
bios_free_mem = &__fake_free_mem;
__test_entries = entries;
__test_nr_entries = nr_entries;
}
/*
* scan_highmem_area() will prepend a free arena header if the size of
* the region is larger than the following expression. Using this small
* size allows us to test the interface safely without worrying about
* scan_highmem_area() writing data to random parts of our address
* space.
*/
#define safe_entry_sz ((2 * sizeof(struct arena_header)) - 1)
/*
* Can we add SMT_RESERVED regions to the free list?
*/
static int test_mem_init_reserved(void)
{
struct test_memmap_entry entries[] = {
0x2000, safe_entry_sz, SMT_RESERVED,
0x100000, safe_entry_sz, SMT_RESERVED,
0x2fffff, safe_entry_sz, SMT_RESERVED,
0x400000, safe_entry_sz, SMT_RESERVED,
};
__setup(entries, array_sz(entries));
mem_init();
syslinux_assert_str(free_list_empty(),
"Added SMT_RESERVED regions to free list");
return 0;
}
/*
* Can we add regions outside of the valid address range?
*/
static int test_mem_limits(void)
{
struct test_memmap_entry entries[] = {
0x00000000, safe_entry_sz, SMT_FREE,
0x000fffff, safe_entry_sz, SMT_FREE,
E820_MEM_MAX + 1, safe_entry_sz, SMT_FREE,
};
__setup(entries, array_sz(entries));
mem_init();
syslinux_assert_str(free_list_empty(),
"Added regions outside of valid range to free list");
return 0;
}
int main(int argc, char **argv)
{
test_mem_init_reserved();
test_mem_limits();
return 0;
}
|