summaryrefslogtreecommitdiff
path: root/com32/lib/syslinux/tests/memscan.c
blob: ea46ca9a56a2b1800b01b0e26124dead2d277cff (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
#include "unittest/unittest.h"

#include "../memscan.c"

struct memmap {
    addr_t start;
    size_t size;
    enum syslinux_memmap_types type;
    bool visited;
};

static struct memmap memmap[] = {
    { 0x00000, 0x2000, SMT_FREE, false },
    { 0x400000, 0x1000, SMT_TERMINAL, false},
};

#define MEMMAP_SIZE (sizeof(memmap) / sizeof(memmap[0]))

/*
 * Our dummy memory scanner. This is analogous to bios_scan_memory() or
 * efi_scan_memory(), etc.
 */
static int test_scan_memory(scan_memory_callback_t callback, void *data)
{
    int i, rv;

    for (i = 0; i < MEMMAP_SIZE; i++)
	rv = callback(data, memmap[i].start, memmap[i].size, memmap[i].type);

    return 0;
}

static int callback(void *data, addr_t start, addr_t size,
		    enum syslinux_memmap_types type)
{
    int i;

    for (i = 0; i < MEMMAP_SIZE; i++) {
	if (memmap[i].start == start && memmap[i].size == size) {
	    memmap[i].visited = true;
	    break;
	}
    }

    return 0;
}

static int verify_visited_all_memmap_entries(void)
{
    int i;

    syslinux_memscan_new(test_scan_memory);
    syslinux_scan_memory(callback, NULL);

    for (i = 0; i < MEMMAP_SIZE; i++) {
	addr_t start = memmap[i].start;
	bool visited_entry = memmap[i].visited;

	syslinux_assert(visited_entry, "Didn't pass entry %d to callback", i);
    }

    return 0;
}

static int verify_invoked_all_callbacks(void)
{
    syslinux_scan_memory(callback, NULL);
}

int main(int argc, char **argv)
{
    verify_visited_all_memmap_entries();

    return 0;
}