1d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj/* 2450ff20648579497cb788007438625aa74518d20subrata_modak * Copyright (C) Bull S.A. 1996 3d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * Copyright (c) International Business Machines Corp., 2001 4d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * 5d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * This program is free software; you can redistribute it and/or modify 6d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * it under the terms of the GNU General Public License as published by 7d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * the Free Software Foundation; either version 2 of the License, or 8d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * (at your option) any later version. 9d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * 10d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * This program is distributed in the hope that it will be useful, 11d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * but WITHOUT ANY WARRANTY; without even the implied warranty of 12d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See 13d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * the GNU General Public License for more details. 14d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * 15d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * You should have received a copy of the GNU General Public License 16d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * along with this program; if not, write to the Free Software 174548c6cf9bcdd96d8303caa4130ab638b61f8a30Wanlong Gao * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 18d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj */ 19d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj/*---------------------------------------------------------------------+ 20d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| shmem_test_04 | 21d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| ==================================================================== | 22d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| | 23d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| Description: Test to verify mapping a file into memory (can also | 24d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| be used as another anonymous shared memory test). | 25d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| | 26d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| Algorithm: o Create a file and map it into memory | 27d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| o Fork N processes | 28d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| o Each process writes ordered values to the memory | 29d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| segment and calculates a corresponding checksum | 30d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| o Each process then reads the values from the memory | 31d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| segment, checks the value and creates a comparison | 32d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| checksum | 33d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| o Verify checksums match | 34d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| o Unmap file | 35d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| | 36d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| System calls: The following system calls are tested: | 37d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| | 38d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| mmap () - maps a file-system object into virtual | 39d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| memory | 40d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| munmap () - unmaps a memory region | 41d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| | 42d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| Usage: shmem_test_04 | 43d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| | 44d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| To Compile: cc -O -o shmem_test_04 shmem_test_04.c | 45d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| | 46d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| Last update: Ver. 1.3, 1/30/94 00:40:27 | 47d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| | 48d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| Author: Scott Porter (scott@austin.ibm.com) | 49d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| | 50d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| Change Activity | 51d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| | 52d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| Version Date Name Reason | 53d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| 0.1 070193 SLP Initial version for AIX 3.2.5 VMM testing | 54d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| 0.2 011194 DJK Modified for AIX 4.1 testing | 55d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| 1.2 020794 DJK Moved to "prod" directory | 56d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| | 57d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj+---------------------------------------------------------------------*/ 58d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 59d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj#include <unistd.h> 60d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj#include <errno.h> 61d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj#include <stdio.h> 627e59475cd413011dbde146e60c3a0da94b472198robbiew#include <stdlib.h> 63f3a83d59cce260ab513313b2c43c41fc16983959robbiew#include <string.h> 64d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj#include <fcntl.h> 65d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj#include <signal.h> 663db2143227eb660e903d0d58225c66b6507e6363plars#include <stdint.h> 67d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj#include <sys/mman.h> 68d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 69d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj#ifdef _LINUX_ 70d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanojtypedef unsigned long ulong_t; 71d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj//#include <sys/except.h> 72354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#ifndef PAGE_SIZE 73354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#define PAGE_SIZE 0x400 74354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#endif 75354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#ifndef SIGDANGER 76354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#define SIGDANGER 4 77354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#endif 78d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj#else 79354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#include <sys/m_except.h> 80354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#include <sys/machine.h> 81d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj#endif 82d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 83d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj#ifdef _IA64 84d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj#include "dsi.h" 85d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj#endif 86d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 87d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj/* Defines 88d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * 89d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * USAGE: usage statement 90d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj */ 91d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj#define TEMPDIR "." 92d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj#define TEMPNAME "tmpfile" 93d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 94d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj#define MB (1024*1024) 95d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj#define WPERMB (MB/sizeof(int)) 96d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 97d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj#define FILEOBJ 1 98d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj#define MEMOBJ 2 99d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 100d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj#define MAXPROCS 1000 101d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj#define USAGE "\nUsage: %s [{-F | M}] [-l nloops] [-p nprocs] \n" \ 102d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj "\t[{-m totmegs | -b totbytes}] [-v] [-W]\n\n" \ 103d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj "\t-F Map a file\n" \ 104d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj "\t-M Map annonymous memory\n" \ 105d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj "\t-l nloops Number of loops\n" \ 106d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj "\t-p nprocs Number of processes\n" \ 107d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj "\t-m totmegs Length in MB\n" \ 108d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj "\t-b totbytes Length in bytes\n" \ 109d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj "\t-v Verbose\n" \ 110d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj "\t-W Allocate to pgsp warning level\n\n" 111d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 112d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj/* 113d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * Function prototypes 114d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * 115d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * parse_args (): Parse command line arguments 116d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * sys_error (): System error message function 117d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * error (): Error message function 118d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj */ 119354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaostatic int mkemptyfile(uint); 120354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaostatic void parse_args(int, char **); 121354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaostatic void cleanup(int); 122354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaostatic void setup_signal_handlers(); 123354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaostatic void int_handler(int signal); 124354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaostatic void segv_handler(int signal, int code, struct sigcontext *scp); 125354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaostatic void bus_handler(int signal, int code, struct sigcontext *scp); 126354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaostatic void sys_error(const char *, int); 127354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaostatic void error(const char *, int); 128d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 129d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj/* 130d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * Global variables 1314bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak * 132d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * *flg: command line parsing variables 133d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * filename: 134d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * fd: 135d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * nprocs: 136d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * childpid: 137d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj */ 138354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaostatic int bflg, lflg, mflg, pflg = 0; 139354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaostatic int Fflg, Mflg, Vflg, Wflg = 0; 140354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaochar *filename; 141354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaoint fd; 142354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaoint nprocs; 143354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaoint childpid[MAXPROCS]; 144d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 145354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaoint nloops, objtype, pgspblks; 146354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaopid_t parent_pid; 147354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaosize_t length; 148d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 149d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj/*---------------------------------------------------------------------+ 150d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| main | 151d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| ==================================================================== | 152d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| | 153d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| | 154d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| Function: Main program (see prolog for more details) | 155d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| | 156d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| Returns: (0) Successful completion | 157d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| (-1) Error occurred | 158d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| | 159d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj+---------------------------------------------------------------------*/ 160354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaoint main(int argc, char **argv) 161d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj{ 162d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj caddr_t region; 163d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj int *wptr; 164d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj int rc; 165d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj int word, nwords, addr, last, checksum, checksum2; 166d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj int loop; 167d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj pid_t pid; 168d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj int proc; 169d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj int fd; 170d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj int map_flags; 171d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 172d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj /* 173d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * Parse command line arguments and print out program header 174d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj */ 175354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao parse_args(argc, argv); 176354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao printf("%s: IPC Shared Memory TestSuite program\n", *argv); 177d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 178354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao setup_signal_handlers(); 179354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao parent_pid = getpid(); 180bdbaec51a423e715c2b03ed9e497e9a1fba6103esubrata_modak 181d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj /* 182d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * Show options in effect. 183d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj */ 184354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao printf("\n\tObject type to map = %s\n", 185354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao (objtype == MEMOBJ) ? "Anonymous memory" : "File"); 186354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao printf("\tNumber of loops = %d\n", nloops); 187354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao printf("\tNumber of procs = %d\n", nprocs); 188354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao printf("\tBytes per process = %ld (%ldMB)\n", (long)length, 189354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao (long)length / MB); 190d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 191d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj /* 192d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * Determine the number of words for that size. 193354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao */ 194d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj nwords = length / sizeof(int); 195d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 196d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj /* 197d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * Create shared memory mapping before forking 198d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj */ 199d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj if (objtype == FILEOBJ) { 200d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj fd = mkemptyfile(length); 201d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj map_flags = MAP_FILE; 202d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj } else { 203d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj fd = -1; 204d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj map_flags = MAP_ANONYMOUS; 205d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj } 206d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 207d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj /* 208d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * Map the object with the specified flags. 209d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj */ 210d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj if ((region = mmap(0, length, PROT_READ | PROT_WRITE, 211354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao map_flags | MAP_SHARED, fd, 0)) 212354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao == MAP_FAILED) { 213354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao sys_error("mmap failed", __LINE__); 214d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj } 215d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 216d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj /* 217d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * Fork off the additional processes. 218d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj */ 219d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj for (proc = 1; proc < nprocs; proc++) { 220d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj /* 221d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * Child leaves loop, parent continues to fork. 222d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj */ 223354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if ((pid = fork()) < (pid_t) 0) { 224354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao sys_error("fork failed\n", __LINE__); 225d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj } else if (pid == 0) 226d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj break; 227d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj else 228d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj childpid[proc] = pid; 229d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj } 230d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 231d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj pid = getpid(); 232d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 233d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj /* 234d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * Initialize each word in the region with a unique value. 235d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj */ 236354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao checksum = 0; 237354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao for (word = 0, wptr = (int *)region; word < nwords; word++, wptr++) { 238d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj if (Vflg) { 239d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj if (word && word % WPERMB == 0) 240354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao printf("\t[%d] %ldMB initialized...\n", 241354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao pid, (long)word / WPERMB); 242d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj } 243d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj *wptr = word; 244354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao checksum += word; 245354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao } 246d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj if (Vflg) { 247354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao printf("\t[%d] checksum = %d\n", pid, checksum); 248d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj } 249d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 250d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj for (loop = 1; loop <= nloops; loop++) { 251d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 252354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao /* 253354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao * Read back each word in the region and check its value. 254354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao */ 255354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao checksum2 = 0; 256354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao last = -1; 257354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao for (word = 0, wptr = (int *)region; word < nwords; 258354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao word++, wptr++) { 259354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (Vflg) { 260354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (word && word % WPERMB == 0) 261354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao printf("\t[%d][%d] %ldMB verified...\n", 262354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao pid, loop, (long)word / WPERMB); 263354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao } 264354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (*wptr != word) { 265354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao addr = ((intptr_t) wptr & 0x0fffffff) / 4096; 266354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (addr != last) { 267354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao last = addr; 268354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (Vflg) { 269354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao printf 270354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao ("\t[%d][%d] page in error at addr = %d\n", 271354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao pid, loop, addr); 272354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao } 273354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao } 274d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj if (Vflg) { 275354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao printf 276354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao ("\t[%d][%d] Word = %d, Value = %d\n", 277354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao pid, loop, word, *wptr); 278d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj } 279d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj } 280354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao checksum2 += *wptr; 281d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj } 282d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj if (Vflg) { 283354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao printf("\t[%d][%d] checksum2 = %d\n", pid, loop, 284354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao checksum2); 285d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj } 286d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 287354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (checksum2 == checksum) { 288354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (Vflg) { 289354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao printf("\t[%d][%d] Check sums compare\n", pid, 290354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao loop); 291354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao } 292354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao } else { 293354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (Vflg) { 294354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao printf("\t[%d][%d] Check sums DON'T compare\n", 295354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao pid, loop); 296354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao } 297354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao } 298354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao 299354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao } /* end loop */ 300d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 301d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj /* 302d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * Unmap the region. 303d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj */ 304d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj if ((rc = munmap(region, length)) != 0) { 305354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao sys_error("munmap failed", __LINE__); 306d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj } 3074bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak /* 308d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * Program completed successfully -- exit 309d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj */ 310354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (pid != parent_pid) 311354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao exit(0); 312d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 313354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao printf("\nsuccessful!\n"); 314d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj cleanup(0); 31549f7622e2018b6d1bbc55205c4a2e7d5197ff78dGarrett Cooper return 0; 316d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj} 317d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 318354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaostatic void cleanup(int rc) 319d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj{ 320d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj int i; 321d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 322d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj /* 323d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * Close and remove any file we've created. 324d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj */ 325d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj if (Fflg) { 326354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao close(fd); 327354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao unlink(filename); 328d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj } 329d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 330d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj /* 331d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * Kill any child processes we've started. 332d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj */ 333d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj if (rc) { 334d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj for (i = 1; i < nprocs; i++) { 335354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao kill(childpid[i], SIGKILL); 336d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj } 337d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj } 338d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 339d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj exit(rc); 340d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj} 341d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 342d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj/* 343d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * segv_handler - signal handler for SIGSEGV 344d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj */ 345354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaostatic void segv_handler(int signal, int code, struct sigcontext *scp) 346d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj{ 347d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj#ifndef _LINUX_ 348d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj int except; 349d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj ulong_t dar, dsisr; 350d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj int rc; 351d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 352d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj /* 353d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * Get the exception type. This is either an errno value 354d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * or an exception value from <sys/m_except.h>. 355d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj */ 356354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#ifdef _IA64 357354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao except = scp->sc_context.__excp_type; 358354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#else 359354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao except = scp->sc_jmpbuf.jmp_context.excp_type; 360354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#endif 361d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 362d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj /* 363d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * Get the Data Address Register and Interrupt Status Register 364d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * for the exception. 365d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj */ 366354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#ifdef _IA64 367354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao dar = scp->sc_context.__ifa; 368354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao dsisr = scp->sc_context.__isr; 369354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#else 370354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao dar = scp->sc_jmpbuf.jmp_context.except[0]; 371354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao dsisr = scp->sc_jmpbuf.jmp_context.except[1]; 372354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#endif 373d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 374354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao printf("SIGSEGV occurred on address 0x%08x.\n", dar); 375d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 376d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj /* 377d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * Determine if the operation was a load or a store. 378d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * Definition of bits in DSISR are in <sys/machine.h>. 379d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj */ 380d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj if (dsisr & DSISR_ST) { 381354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao printf("The operation was a store.\n"); 382d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj } else { 383354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao printf("The operation was a load.\n"); 384d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj } 385d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 386d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj switch (except) { 387d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 388d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj case EFAULT: 389354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao printf("Exception was due to a bad address.\n"); 390d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj break; 391d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 392d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj case EXCEPT_PROT: 393354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao printf("Exception was due to a protection violation.\n"); 394d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj break; 395d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 396d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj default: 397354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao printf("Exception type = 0x%08x.\n", except); 398d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj } 399d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj#else 400d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj printf("An unexpected segmentation fault occurred... Exiting\n"); 401d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj#endif 402d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 403d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj cleanup(1); 404d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj} 405d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 406d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj/* 407d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * bus_handler - signal handler for SIGBUS 408d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj */ 409354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaostatic void bus_handler(int signal, int code, struct sigcontext *scp) 410d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj{ 411d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj#ifndef _LINUX_ 412d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj int except; 413d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj ulong_t dar, dsisr; 414d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj int rc; 415d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 416d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj /* 417d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * Get the exception type. This is either an errno value 418d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * or an exception value from <sys/m_except.h>. 419d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj */ 420354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#ifdef _IA64 421354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao except = scp->sc_context.__excp_type; 422354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#else 423354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao except = scp->sc_jmpbuf.jmp_context.excp_type; 424354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#endif 425d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 426d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj /* 427d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * Get the Data Address Register and Interrupt Status Register 428d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * for the exception. 429d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj */ 430354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#ifdef _IA64 431354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao dar = scp->sc_context.__ifa; 432354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao dsisr = scp->sc_context.__isr; 433354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#else 434354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao dar = scp->sc_jmpbuf.jmp_context.except[0]; 435354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao dsisr = scp->sc_jmpbuf.jmp_context.except[1]; 436354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#endif 437d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 438354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao printf("SIGBUS occurred on address 0x%08x:\n", dar); 439d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 440d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj switch (except) { 441d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 442d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj case ENOSPC: 443354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao printf("A mapper fault required disk allocation and \ 444d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj no space is left on the device.\n"); 445d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj break; 446d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 447d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj case EDQUOT: 448354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao printf("A mapper fault required disk allocation and \ 449d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj the disc quota was exceeded.\n"); 450d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj break; 451d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 452d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj case EXCEPT_EOF: 453354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao printf("An mmap() mapper referenced beyond end-of-file.\n"); 454d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj break; 455d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 456d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj default: 457354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao printf("Exception type = 0x%08x.\n", except); 458d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj } 459d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj#else 460d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj printf("An unexpected bus error occurred... Exiting\n"); 461d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj#endif 462d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 463d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj cleanup(1); 464d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj} 465d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 466d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj/* 467d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * int_handler - signal handler for SIGINT 468d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj */ 469354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaostatic void int_handler(int sig) 470d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj{ 4714bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak cleanup(1); 472d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj} 473d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 474d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj/* 475d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * mkemptyfile() 476d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * 477d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * Make an empty temporary file of a given size and return its descriptor. 478d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj */ 479354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaostatic int mkemptyfile(uint size) 480d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj{ 481d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj#ifdef _LINUX_ 482d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 483d218f348c12b42a78fa0306d9a033bfa4f67238bCyril Hrubis filename = malloc(256); 484d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 485d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj sprintf(filename, "%s/%sXXXXXX", TEMPDIR, TEMPNAME); 486d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj fd = mkstemp(filename); 487d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 488d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj#else 489d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj /* Get a new file name 490d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj */ 491d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj filename = tempnam(TEMPDIR, TEMPNAME); 492d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 493d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj /* Create the file. 494354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao * O_EXCL: I'm supposed to be getting a unique name so if 495354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao * a file already exists by this name then fail. 496354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao * 0700: Set up for r/w access by owner only. 497d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj */ 498d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj if ((fd = open(filename, O_CREAT | O_EXCL | O_RDWR, 0700)) == -1) 499354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao return (-1); 500d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 501d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj#endif // _LINUX_ 502d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 503d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj /* Now extend it to the requested length. 504d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj */ 505354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (lseek(fd, size - 1, SEEK_SET) == -1) 506354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao return (-1); 507d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 508d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj if (write(fd, "\0", 1) == -1) 509354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao return (-1); 510d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 511d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj /* Sync the file out. 512d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj */ 513d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj fsync(fd); 514d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 515354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao return (fd); 516d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj} 517d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 518d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj/*---------------------------------------------------------------------+ 519d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| setup_signal_handlers | 520d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| ==================================================================== | 521d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| | 522d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| Function: Sets up signal handlers for following signals: | 523d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| | 524d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| SIGINT - interrupt, generated from terminal spec. char | 525d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| SIGBUS - bus error (specification execption) | 526d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| SIGSEGV - segmentation violation | 527d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| | 528d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj+---------------------------------------------------------------------*/ 529354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaostatic void setup_signal_handlers() 530d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj{ 531d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj struct sigaction sigact; 532d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 533d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj sigact.sa_flags = 0; 534354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao sigfillset(&sigact.sa_mask); 535d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 536d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj /* 537d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * Establish the signal handlers for SIGSEGV, SIGBUS & SIGINT 538d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj */ 539354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao sigact.sa_handler = (void (*)(int))segv_handler; 540354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (sigaction(SIGSEGV, &sigact, NULL) < 0) 541354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao sys_error("sigaction failed", __LINE__); 542d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 543354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao sigact.sa_handler = (void (*)(int))bus_handler; 544354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (sigaction(SIGBUS, &sigact, NULL) < 0) 545354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao sys_error("sigaction failed", __LINE__); 546d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 547354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao sigact.sa_handler = (void (*)(int))int_handler; 548354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (sigaction(SIGINT, &sigact, NULL) < 0) 549354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao sys_error("sigaction failed", __LINE__); 550d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj} 551d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 552d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj/*---------------------------------------------------------------------+ 553d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| parse_args () | 554d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| ==================================================================== | 555d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| | 556d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| Function: Parse the command line arguments & initialize global | 557d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| variables. | 558d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| | 559d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| Updates: (command line options) | 560d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| | 561d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| [-s] size: shared memory segment size | 562d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| | 563d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj+---------------------------------------------------------------------*/ 564354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaostatic void parse_args(int argc, char **argv) 565d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj{ 566354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao int opt; 567354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao int bytes = 0, megabytes = 0; 568354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao int errflag = 0; 569354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao char *program_name = *argv; 570354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao extern char *optarg; /* Command line option */ 571d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 572d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj /* 573d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * Parse command line options. 574d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj */ 575354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao while ((opt = getopt(argc, argv, "DFMWvb:l:m:p:")) != EOF) { 576354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao switch (opt) { 577d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj case 'F': /* map a file */ 578d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj Fflg++; 579d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj break; 580d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj case 'M': /* map anonymous memory */ 581d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj Mflg++; 582d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj break; 583d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj case 'v': /* verbose */ 584d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj Vflg++; 585d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj break; 586d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj case 'W': // allocate to pgsp warning level 587d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj Wflg++; 588d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj break; 589d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj case 'b': /* length in bytes */ 590d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj bflg++; 591d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj bytes = atoi(optarg); 592d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj break; 593d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj case 'l': /* number of loops */ 594d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj lflg++; 595d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj nloops = atoi(optarg); 596d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj break; 597d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj case 'm': /* length in MB */ 598d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj mflg++; 599d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj megabytes = atoi(optarg); 600d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj break; 601d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj case 'p': /* number of processes */ 602d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj pflg++; 603d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj nprocs = atoi(optarg); 604d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj break; 605d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj default: 606d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj errflag++; 607d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj break; 608d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj } 609d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj } 610d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj if (errflag) { 611354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao fprintf(stderr, USAGE, program_name); 612354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao exit(2); 613d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj } 614d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 615d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj /* 616d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * Determine the number of processes to run. 617354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao */ 6184bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak if (pflg) { 619d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj if (nprocs > MAXPROCS) 620d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj nprocs = MAXPROCS; 621d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj } else { 622d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj nprocs = 1; 623d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj } 624d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 625d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj /* 626d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * Determine the type of object to map. 627354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao */ 628d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj if (Fflg) { 629d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj objtype = FILEOBJ; 630d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj } else if (Mflg) { 631d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj objtype = MEMOBJ; 632d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj } else { 633d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj objtype = MEMOBJ; 634d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj } 635d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 636d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj /* 637d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * The 'W' flag is used to determine the size of an anonymous 638d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * region that will use the amount of paging space available 639d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * close to the paging space warning level. 640d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj */ 641bdbaec51a423e715c2b03ed9e497e9a1fba6103esubrata_modak 642354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (Wflg) 643d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj#ifdef _LINUX_ 644354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao printf 645354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao ("Option 'W' not implemented in Linux (psdanger() and SIGDANGER)\n"); 646d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj#else 647d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj { 648d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj pgspblks = psdanger(SIGDANGER); 6494bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak pgspblks -= 256; // leave a little room 650d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj if (pgspblks < 0) 651d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj pgspblks = 0; 652d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj bytes = pgspblks * PAGE_SIZE; 653d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj bflg = 1; 654d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj mflg = 0; 655d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj } 656d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj#endif 657d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 658d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj /* 659d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * Determine size of region to map in bytes for each process. 660d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj */ 661d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj if (mflg) { 662d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj length = megabytes * MB; 663d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj } else if (bflg) { 664d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj length = bytes; 665d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj } else { 666d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj length = 16 * MB; 667d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj } 668d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 669d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj /* 670d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj * Set default loops. 671d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj */ 672d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj if (!lflg) { 673d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj nloops = 1; 674d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj } 675d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj} 676d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 677d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj/*---------------------------------------------------------------------+ 678d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| sys_error () | 679d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| ==================================================================== | 680d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| | 681d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| Function: Creates system error message and calls error () | 682d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| | 683d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj+---------------------------------------------------------------------*/ 684354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaostatic void sys_error(const char *msg, int line) 685d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj{ 686354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao char syserr_msg[256]; 687d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 688354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao sprintf(syserr_msg, "%s: %s\n", msg, strerror(errno)); 689354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao error(syserr_msg, line); 690d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj} 691d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj 692d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj/*---------------------------------------------------------------------+ 693d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| error () | 694d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| ==================================================================== | 695d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| | 696d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| Function: Prints out message and exits... | 697d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj| | 698d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj+---------------------------------------------------------------------*/ 699354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaostatic void error(const char *msg, int line) 700d1c7ea471d417c9319bdf0ce5bb1fed011283b65iyermanoj{ 701354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao fprintf(stderr, "ERROR [line: %d] %s\n", line, msg); 702354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao cleanup(1); 70349f7622e2018b6d1bbc55205c4a2e7d5197ff78dGarrett Cooper} 704