1*d4514f0bSApple OSS Distributions #include <errno.h>
2*d4514f0bSApple OSS Distributions #include <unistd.h>
3*d4514f0bSApple OSS Distributions #include <sys/mman.h>
4*d4514f0bSApple OSS Distributions
5*d4514f0bSApple OSS Distributions #include <darwintest.h>
6*d4514f0bSApple OSS Distributions
7*d4514f0bSApple OSS Distributions #include "jumbo_va_spaces_common.h"
8*d4514f0bSApple OSS Distributions
9*d4514f0bSApple OSS Distributions #define GB (1ULL * 1024 * 1024 * 1024)
10*d4514f0bSApple OSS Distributions
11*d4514f0bSApple OSS Distributions /*
12*d4514f0bSApple OSS Distributions * This test expects the entitlement to be the enabling factor for a process to
13*d4514f0bSApple OSS Distributions * allocate at least this many GB of VA space. i.e. with the entitlement, n GB
14*d4514f0bSApple OSS Distributions * must be allocatable; whereas without it, it must be less.
15*d4514f0bSApple OSS Distributions * This value was determined experimentally to fit on applicable devices and to
16*d4514f0bSApple OSS Distributions * be clearly distinguishable from the default VA limit.
17*d4514f0bSApple OSS Distributions */
18*d4514f0bSApple OSS Distributions #define ALLOC_TEST_GB 51
19*d4514f0bSApple OSS Distributions
20*d4514f0bSApple OSS Distributions void
verify_jumbo_va(bool entitled)21*d4514f0bSApple OSS Distributions verify_jumbo_va(bool entitled)
22*d4514f0bSApple OSS Distributions {
23*d4514f0bSApple OSS Distributions T_LOG("Attemping to allocate VA space in 1 GB chunks.");
24*d4514f0bSApple OSS Distributions void *res;
25*d4514f0bSApple OSS Distributions int i;
26*d4514f0bSApple OSS Distributions
27*d4514f0bSApple OSS Distributions for (i = 0; i < (ALLOC_TEST_GB * 2); i++) {
28*d4514f0bSApple OSS Distributions res = mmap(NULL, 1 * GB, PROT_NONE, MAP_PRIVATE | MAP_ANON, 0, 0);
29*d4514f0bSApple OSS Distributions if (res == MAP_FAILED) {
30*d4514f0bSApple OSS Distributions if (errno != ENOMEM) {
31*d4514f0bSApple OSS Distributions T_WITH_ERRNO;
32*d4514f0bSApple OSS Distributions T_LOG("mmap failed: stopped at %d of %d GB allocated", i, ALLOC_TEST_GB);
33*d4514f0bSApple OSS Distributions }
34*d4514f0bSApple OSS Distributions break;
35*d4514f0bSApple OSS Distributions } else {
36*d4514f0bSApple OSS Distributions T_LOG("%d: %p\n", i, res);
37*d4514f0bSApple OSS Distributions }
38*d4514f0bSApple OSS Distributions }
39*d4514f0bSApple OSS Distributions
40*d4514f0bSApple OSS Distributions if (entitled) {
41*d4514f0bSApple OSS Distributions T_EXPECT_GE_INT(i, ALLOC_TEST_GB, "Allocate at least %d GB of VA space", ALLOC_TEST_GB);
42*d4514f0bSApple OSS Distributions } else {
43*d4514f0bSApple OSS Distributions T_EXPECT_LT_INT(i, ALLOC_TEST_GB, "Not permitted to allocate %d GB of VA space", ALLOC_TEST_GB);
44*d4514f0bSApple OSS Distributions }
45*d4514f0bSApple OSS Distributions }
46