1*5a7e48ddSDmitry Chagin /*-
2*5a7e48ddSDmitry Chagin * Copyright (c) 2023 Dmitry Chagin <dchagin@FreeBSD.org>
3*5a7e48ddSDmitry Chagin *
4*5a7e48ddSDmitry Chagin * SPDX-License-Identifier: BSD-2-Clause
5*5a7e48ddSDmitry Chagin */
6*5a7e48ddSDmitry Chagin
7*5a7e48ddSDmitry Chagin #include <sys/mman.h>
8*5a7e48ddSDmitry Chagin
9*5a7e48ddSDmitry Chagin #include <err.h>
10*5a7e48ddSDmitry Chagin #include <fcntl.h>
11*5a7e48ddSDmitry Chagin #include <stdlib.h>
12*5a7e48ddSDmitry Chagin #include <unistd.h>
13*5a7e48ddSDmitry Chagin
14*5a7e48ddSDmitry Chagin #define MAP_32BIT_MAX_ADDR ((vm_offset_t)1 << 31)
15*5a7e48ddSDmitry Chagin
16*5a7e48ddSDmitry Chagin int
main(void)17*5a7e48ddSDmitry Chagin main(void)
18*5a7e48ddSDmitry Chagin {
19*5a7e48ddSDmitry Chagin size_t pagesize;
20*5a7e48ddSDmitry Chagin void *s32;
21*5a7e48ddSDmitry Chagin int fd;
22*5a7e48ddSDmitry Chagin
23*5a7e48ddSDmitry Chagin if ((pagesize = getpagesize()) <= 0)
24*5a7e48ddSDmitry Chagin err(1, "getpagesize");
25*5a7e48ddSDmitry Chagin
26*5a7e48ddSDmitry Chagin fd = open("/dev/zero", O_RDONLY);
27*5a7e48ddSDmitry Chagin if (fd <= 0)
28*5a7e48ddSDmitry Chagin err(1, "open failed");
29*5a7e48ddSDmitry Chagin
30*5a7e48ddSDmitry Chagin s32 = mmap(NULL, pagesize, PROT_READ, MAP_32BIT | MAP_PRIVATE, fd, 0);
31*5a7e48ddSDmitry Chagin if (s32 == MAP_FAILED)
32*5a7e48ddSDmitry Chagin err(1, "mmap MAP_32BIT | MAP_PRIVATE failed");
33*5a7e48ddSDmitry Chagin if (((vm_offset_t)s32 + pagesize) > MAP_32BIT_MAX_ADDR)
34*5a7e48ddSDmitry Chagin errx(1, "mmap invalid result %p", s32);
35*5a7e48ddSDmitry Chagin
36*5a7e48ddSDmitry Chagin close(fd);
37*5a7e48ddSDmitry Chagin if (munmap(s32, pagesize) != 0)
38*5a7e48ddSDmitry Chagin err(1, "munmap failed");
39*5a7e48ddSDmitry Chagin
40*5a7e48ddSDmitry Chagin s32 = mmap(NULL, pagesize, PROT_READ | PROT_WRITE,
41*5a7e48ddSDmitry Chagin MAP_32BIT | MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
42*5a7e48ddSDmitry Chagin if (s32 == MAP_FAILED)
43*5a7e48ddSDmitry Chagin err(1, "mmap MAP_32BIT | MAP_ANONYMOUS | MAP_PRIVATE failed");
44*5a7e48ddSDmitry Chagin if (((vm_offset_t)s32 + pagesize) > MAP_32BIT_MAX_ADDR)
45*5a7e48ddSDmitry Chagin errx(1, "mmap invalid result %p", s32);
46*5a7e48ddSDmitry Chagin
47*5a7e48ddSDmitry Chagin if (munmap(s32, pagesize) != 0)
48*5a7e48ddSDmitry Chagin err(1, "munmap failed");
49*5a7e48ddSDmitry Chagin exit(0);
50*5a7e48ddSDmitry Chagin }
51