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