blob: a2dd02847acdc4ebd9d3fa957961222a33106083 [file] [log] [blame]
/*
*
* 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();
}