6#include <sys/syscall.h>
10 unsigned char* pages = MAP_FAILED;
11 unsigned char* hole = MAP_FAILED;
12 void* denied = MAP_FAILED;
13 pages = mmap(NULL, 4 * ml_page, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
14 hole = mmap(NULL, 2 * ml_page, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
15 denied = mmap(NULL, ml_page, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
16 CHECK(pages != MAP_FAILED && hole != MAP_FAILED && denied != MAP_FAILED);
17 CHECK(munmap(hole + ml_page, ml_page) == 0);
18 CHECK(ml_limit(3 * ml_page + 137) == 0 && ml_unprivileged() == 0);
19 CHECK(ml_resident(pages, 4, 0,
"anonymous before eager lock") == 0);
20 CHECK(mlock(pages + 1, ml_page) == 0);
21 CHECK(ml_resident(pages, 4, 3,
"unaligned eager lock") == 0);
22 CHECK(mlock(pages, 2 * ml_page) == 0);
23 CHECK(mlock(pages + 2 * ml_page, ml_page) == 0);
25 CHECK(mlock(pages + 3 * ml_page, ml_page) == -1 && errno == ENOMEM);
26 CHECK(munlock(pages + 1, ml_page) == 0);
27 CHECK(madvise(pages, 2 * ml_page, MADV_DONTNEED) == 0);
29 CHECK(madvise(pages + 2 * ml_page, ml_page, MADV_DONTNEED) == -1 && errno == EINVAL);
30 CHECK(mlock(pages, 3 * ml_page) == 0);
31 CHECK(munlock(pages, ml_page) == 0 && munlock(pages, ml_page) == 0);
32 CHECK(mlock(pages + 3 * ml_page, ml_page) == 0);
34 CHECK(munlockall() == 0 && madvise(pages, 4 * ml_page, MADV_DONTNEED) == 0);
35 CHECK(mlock2(pages, 3 * ml_page, MLOCK_ONFAULT) == 0);
36 CHECK(syscall(SYS_mlock2, pages, ml_page, MLOCK_ONFAULT) == 0);
37 CHECK(ml_resident(pages, 4, 0,
"onfault lock does not populate") == 0);
39 CHECK(mlock2(pages + 3 * ml_page, ml_page, MLOCK_ONFAULT) == -1 && errno == ENOMEM);
40 pages[ml_page] = 0x63;
41 CHECK(ml_resident(pages, 4, 2,
"one onfault page touched") == 0);
42 CHECK(munlock(pages + ml_page, ml_page) == 0);
43 CHECK(madvise(pages + ml_page, ml_page, MADV_DONTNEED) == 0);
44 CHECK(mlock(pages + 3 * ml_page, ml_page) == 0);
45 CHECK(munlockall() == 0);
48 CHECK(mlock2(pages, ml_page, MLOCK_ONFAULT << 1) == -1 && errno == EINVAL);
50 CHECK(mlockall(0) == -1 && errno == EINVAL);
52 CHECK(mlockall(MCL_ONFAULT) == -1 && errno == EINVAL);
54 CHECK(mlock(hole, 2 * ml_page) == -1 && errno == ENOMEM);
55 CHECK(munlockall() == 0);
57 CHECK(mlock(denied, ml_page) == -1 && errno == ENOMEM);
59 CHECK(madvise(denied, ml_page, MADV_DONTNEED) == -1 && errno == EINVAL);
60 CHECK(munlock(denied, ml_page) == 0);
61 CHECK(mprotect(denied, ml_page, PROT_READ | PROT_WRITE) == 0);
62 CHECK(mlock(denied, ml_page) == 0);
65 if (denied != MAP_FAILED)
66 munmap(denied, ml_page);
67 if (hole != MAP_FAILED)
68 munmap(hole, 2 * ml_page);
69 if (pages != MAP_FAILED)
70 munmap(pages, 4 * ml_page);