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