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;
}
|