xref: /freebsd/tests/sys/vm/mmap_map_32bit_helper.c (revision f3e11927dc287ff686b5cc3618aba4e1e58a5dca)
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