summaryrefslogtreecommitdiff
path: root/core/mem/tests/meminit.c
blob: e6c25c71e1347a6f9f2dbb9b114b31bc94b68d4c (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
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;
}