12c28215423293e443469a07ae7011135d058b671Garrett Cooper/*
20dc076565f772bb1953209fb69ea150b494aaa40robbiew * Copyright (c) 2002, Intel Corporation. All rights reserved.
344de8a350c48dcf079d2871493d8d635fe1d7de0Cyril Hrubis * Copyright (c) 2012, Cyril Hrubis <chrubis@suse.cz>
443c1224558e7ea2df04e16ba6b88b4945c750dfaCyril Hrubis *
50dc076565f772bb1953209fb69ea150b494aaa40robbiew * This file is licensed under the GPL license.  For the full content
62c28215423293e443469a07ae7011135d058b671Garrett Cooper * of this license, see the COPYING file at the top level of this
70dc076565f772bb1953209fb69ea150b494aaa40robbiew * source tree.
80dc076565f772bb1953209fb69ea150b494aaa40robbiew *
90dc076565f772bb1953209fb69ea150b494aaa40robbiew * When the implementation selects a
100dc076565f772bb1953209fb69ea150b494aaa40robbiew * value for pa, it never places a mapping at address 0.
110dc076565f772bb1953209fb69ea150b494aaa40robbiew *
1243c1224558e7ea2df04e16ba6b88b4945c750dfaCyril Hrubis * Test steps:
130dc076565f772bb1953209fb69ea150b494aaa40robbiew * This is not a good test. Cannot make sure (pa == 0) never happens.
142c28215423293e443469a07ae7011135d058b671Garrett Cooper * Repeat LOOP_NUM times mmap() and mnumap(),
150dc076565f772bb1953209fb69ea150b494aaa40robbiew * make sure pa will not equal 0.
160dc076565f772bb1953209fb69ea150b494aaa40robbiew */
170dc076565f772bb1953209fb69ea150b494aaa40robbiew
180dc076565f772bb1953209fb69ea150b494aaa40robbiew#define _XOPEN_SOURCE 600
190dc076565f772bb1953209fb69ea150b494aaa40robbiew
200dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <stdio.h>
210dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <stdlib.h>
220dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <unistd.h>
230dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <sys/mman.h>
240dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <sys/types.h>
250dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <sys/stat.h>
260dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <sys/wait.h>
270dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <fcntl.h>
280dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <string.h>
290dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <errno.h>
300dc076565f772bb1953209fb69ea150b494aaa40robbiew#include "posixtest.h"
312c28215423293e443469a07ae7011135d058b671Garrett Cooper
320dc076565f772bb1953209fb69ea150b494aaa40robbiew#define LOOP_NUM 100000
330dc076565f772bb1953209fb69ea150b494aaa40robbiew
3444de8a350c48dcf079d2871493d8d635fe1d7de0Cyril Hrubisint main(void)
350dc076565f772bb1953209fb69ea150b494aaa40robbiew{
3644de8a350c48dcf079d2871493d8d635fe1d7de0Cyril Hrubis	int rc;
3744de8a350c48dcf079d2871493d8d635fe1d7de0Cyril Hrubis	unsigned long cnt;
382c28215423293e443469a07ae7011135d058b671Garrett Cooper
3944de8a350c48dcf079d2871493d8d635fe1d7de0Cyril Hrubis	char tmpfname[256];
4044de8a350c48dcf079d2871493d8d635fe1d7de0Cyril Hrubis	long total_size;
410dc076565f772bb1953209fb69ea150b494aaa40robbiew
4244de8a350c48dcf079d2871493d8d635fe1d7de0Cyril Hrubis	void *pa;
4344de8a350c48dcf079d2871493d8d635fe1d7de0Cyril Hrubis	size_t size;
4444de8a350c48dcf079d2871493d8d635fe1d7de0Cyril Hrubis	int fd;
450dc076565f772bb1953209fb69ea150b494aaa40robbiew
4644de8a350c48dcf079d2871493d8d635fe1d7de0Cyril Hrubis	total_size = 1024;
4744de8a350c48dcf079d2871493d8d635fe1d7de0Cyril Hrubis	size = total_size;
482c28215423293e443469a07ae7011135d058b671Garrett Cooper
4944de8a350c48dcf079d2871493d8d635fe1d7de0Cyril Hrubis	snprintf(tmpfname, sizeof(tmpfname), "/tmp/pts_mmap_10_1_%d", getpid());
5044de8a350c48dcf079d2871493d8d635fe1d7de0Cyril Hrubis	unlink(tmpfname);
5144de8a350c48dcf079d2871493d8d635fe1d7de0Cyril Hrubis	fd = open(tmpfname, O_CREAT | O_RDWR | O_EXCL, S_IRUSR | S_IWUSR);
5244de8a350c48dcf079d2871493d8d635fe1d7de0Cyril Hrubis	if (fd == -1) {
5344de8a350c48dcf079d2871493d8d635fe1d7de0Cyril Hrubis		printf("Error at open(): %s\n", strerror(errno));
5444de8a350c48dcf079d2871493d8d635fe1d7de0Cyril Hrubis		return PTS_UNRESOLVED;
5544de8a350c48dcf079d2871493d8d635fe1d7de0Cyril Hrubis	}
5644de8a350c48dcf079d2871493d8d635fe1d7de0Cyril Hrubis	unlink(tmpfname);
5744de8a350c48dcf079d2871493d8d635fe1d7de0Cyril Hrubis	if (ftruncate(fd, total_size) == -1) {
5844de8a350c48dcf079d2871493d8d635fe1d7de0Cyril Hrubis		printf("Error at ftruncate(): %s\n", strerror(errno));
5944de8a350c48dcf079d2871493d8d635fe1d7de0Cyril Hrubis		return PTS_UNRESOLVED;
6044de8a350c48dcf079d2871493d8d635fe1d7de0Cyril Hrubis	}
610dc076565f772bb1953209fb69ea150b494aaa40robbiew
6244de8a350c48dcf079d2871493d8d635fe1d7de0Cyril Hrubis	for (cnt = 0; cnt < LOOP_NUM; cnt++) {
63354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		pa = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd,
64354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			  0);
6544de8a350c48dcf079d2871493d8d635fe1d7de0Cyril Hrubis		if (pa == MAP_FAILED) {
6644de8a350c48dcf079d2871493d8d635fe1d7de0Cyril Hrubis			printf("Test FAILED: Error at mmap: %s\n",
6744de8a350c48dcf079d2871493d8d635fe1d7de0Cyril Hrubis			       strerror(errno));
6844de8a350c48dcf079d2871493d8d635fe1d7de0Cyril Hrubis			return PTS_FAIL;
6944de8a350c48dcf079d2871493d8d635fe1d7de0Cyril Hrubis		}
702c28215423293e443469a07ae7011135d058b671Garrett Cooper
7144de8a350c48dcf079d2871493d8d635fe1d7de0Cyril Hrubis		if (pa == NULL) {
7244de8a350c48dcf079d2871493d8d635fe1d7de0Cyril Hrubis			printf("Test FAILED:"
7344de8a350c48dcf079d2871493d8d635fe1d7de0Cyril Hrubis			       " mmap() map the file to 0 address "
7444de8a350c48dcf079d2871493d8d635fe1d7de0Cyril Hrubis			       "without setting MAP_FIXED\n");
7544de8a350c48dcf079d2871493d8d635fe1d7de0Cyril Hrubis			return PTS_FAIL;
7644de8a350c48dcf079d2871493d8d635fe1d7de0Cyril Hrubis		}
7744de8a350c48dcf079d2871493d8d635fe1d7de0Cyril Hrubis		rc = munmap(pa, size);
7844de8a350c48dcf079d2871493d8d635fe1d7de0Cyril Hrubis		if (rc != 0) {
7944de8a350c48dcf079d2871493d8d635fe1d7de0Cyril Hrubis			printf("Error at mnumap(): %s\n", strerror(errno));
8044de8a350c48dcf079d2871493d8d635fe1d7de0Cyril Hrubis			return PTS_UNRESOLVED;
8144de8a350c48dcf079d2871493d8d635fe1d7de0Cyril Hrubis		}
8244de8a350c48dcf079d2871493d8d635fe1d7de0Cyril Hrubis	}
832c28215423293e443469a07ae7011135d058b671Garrett Cooper
8444de8a350c48dcf079d2871493d8d635fe1d7de0Cyril Hrubis	close(fd);
8544de8a350c48dcf079d2871493d8d635fe1d7de0Cyril Hrubis	printf("Test PASSED\n");
8644de8a350c48dcf079d2871493d8d635fe1d7de0Cyril Hrubis	return PTS_PASS;
87ec6edca7aa42b6affd989ef91b5897f96795e40fChris Dearman}
88