/* * * Copyright (c) National ICT Australia, 2006 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See * the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ /* NICTA */ /* 13/02/2006 Implemented carl.vanschaik at nicta.com.au */ /* mem03.c */ /* * NAME * mem03.c * * DESCRIPTION * - create two files, write known data to the files. * - mmap the files, verify data * - unmap files * - remmap files, swap virtual addresses ie: file1 at file2's address, etc * * REASONING * - If the kernel fails to correctly flush the TLB entry, the second mmap * will not show the correct data. * * * RESTRICTIONS * None */ #include <stdio.h> #include <signal.h> #include <stdlib.h> #include "test.h" #include <unistd.h> #include <errno.h> #include <time.h> #include <string.h> #include <sys/types.h> #include <sys/stat.h> /* definitions for open() */ #include <sys/mman.h> /* definitions for mmap() */ #include <fcntl.h> /* definition of open() */ #include <sys/user.h> #define FAILED (-1) /* return status for all funcs indicating failure */ #define SUCCESS 0 /* return status for all routines indicating success */ static void setup(); static void cleanup(); char *TCID = "mem03"; int TST_TOTAL = 1; int f1 = -1, f2 = -1; char *mm1 = NULL, *mm2 = NULL; /*--------------------------------------------------------------------*/ int main(void) { char tmp1[] = "./tmp.file.1"; char tmp2[] = "./tmp.file.2"; char str1[] = "testing 123"; char str2[] = "my test mem"; setup(); if ((f1 = open(tmp1, O_RDWR | O_CREAT, S_IREAD | S_IWRITE)) == -1) tst_brkm(TFAIL, cleanup, "failed to open/create file %s", tmp1); if ((f2 = open(tmp2, O_RDWR | O_CREAT, S_IREAD | S_IWRITE)) == -1) tst_brkm(TFAIL, cleanup, "failed to open/create file %s", tmp2); write(f1, str1, strlen(str1)); write(f2, str2, strlen(str2)); { char *save_mm1, *save_mm2; mm1 = mmap(0, 64, PROT_READ, MAP_PRIVATE, f1, 0); mm2 = mmap(0, 64, PROT_READ, MAP_PRIVATE, f2, 0); if ((mm1 == (void *)-1) || (mm2 == (void *)-1)) tst_brkm(TFAIL, cleanup, "mmap failed"); save_mm1 = mm1; save_mm2 = mm2; if (strncmp(str1, mm1, strlen(str1))) tst_brkm(TFAIL, cleanup, "failed on compare %s", tmp1); if (strncmp(str2, mm2, strlen(str2))) tst_brkm(TFAIL, cleanup, "failed on compare %s", tmp2); munmap(mm1, 64); munmap(mm2, 64); mm1 = mmap(save_mm2, 64, PROT_READ, MAP_PRIVATE, f1, 0); mm2 = mmap(save_mm1, 64, PROT_READ, MAP_PRIVATE, f2, 0); if ((mm1 == (void *)-1) || (mm2 == (void *)-1)) tst_brkm(TFAIL, cleanup, "second mmap failed"); if (mm1 != save_mm2) { printf("mmap not using same address\n"); } if (mm2 != save_mm1) { printf("mmap not using same address\n"); } if (strncmp(str1, mm1, strlen(str1))) tst_brkm(TFAIL, cleanup, "failed on compare %s", tmp1); if (strncmp(str2, mm2, strlen(str2))) tst_brkm(TFAIL, cleanup, "failed on compare %s", tmp2); munmap(mm1, 64); munmap(mm2, 64); } tst_resm(TPASS, "%s memory test succeeded", TCID); /* clean up and exit */ cleanup(); tst_exit(); } /* * setup() - performs all ONE TIME setup for this test */ void setup(void) { /* * Create a temporary directory and cd into it. */ tst_tmpdir(); } /* * cleanup() - performs all the ONE TIME cleanup for this test at completion * or premature exit. */ void cleanup(void) { if (mm1) munmap(mm1, 64); if (mm2) munmap(mm2, 64); if (f1 != -1) close(f1); if (f2 != -1) close(f2); tst_rmdir(); }