xref: /freebsd/tools/test/stress2/misc/syscall5.sh (revision 02e9120893770924227138ba49df1edb3896112a)
1#!/bin/sh
2
3#
4# Copyright (c) 2013 Peter Holm
5# All rights reserved.
6#
7# Redistribution and use in source and binary forms, with or without
8# modification, are permitted provided that the following conditions
9# are met:
10# 1. Redistributions of source code must retain the above copyright
11#    notice, this list of conditions and the following disclaimer.
12# 2. Redistributions in binary form must reproduce the above copyright
13#    notice, this list of conditions and the following disclaimer in the
14#    documentation and/or other materials provided with the distribution.
15#
16# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26# SUCH DAMAGE.
27#
28
29# Call syscall4.sh with syscall number as argument.
30# Only run the last ~16 syscalls, if no argument is specified.
31
32[ `id -u ` -ne 0 ] && echo "Must be root!" && exit 1
33
34. ../default.cfg
35
36syscall=`grep SYS_MAXSYSCALL /usr/include/sys/syscall.h | awk '{print $NF}'`
37syscall=$((syscall - 1))
38esyscall=0
39
40last=/tmp/syscall5.last
41log=/tmp/syscall5.log
42
43while getopts ae:nrs:t:u flag; do
44	case "$flag" in
45	a) all=1 ;;
46	e) esyscall="$OPTARG" ;;
47	n) export noswap=1 ;;
48	r) [ -h $last ] &&
49	       syscall=`ls -l $last | awk '{print $NF}'`
50	       syscall=$((syscall - 1))
51	   ;;
52	s) syscall="$OPTARG" ;;
53	t) sleeptime="$OPTARG"
54	   export sleeptime=$((sleeptime / 10))	;; # used in syscall4.sh
55	u) unnamed=1 ;;
56	*) echo "Usage $0 [-a] [-n] [-r] [-s number] [-e number] "\
57	    "[-t seconds] [-u]"
58	   return 1 ;;
59	esac
60done
61[ $syscall -gt $esyscall ] ||
62    { echo "$syscall must be greater than $esyscall"; exit 1; }
63
64# syscalls with known issues:
65broken="
66swapcontext
67pdfork
68rfork
69pselect
70"
71
72rm -f $log
73n=$syscall
74start=`date '+%s'`
75while [ $n -gt 0 ]; do
76	ps -lUnobody | grep syscall4 | awk '{print $2}' | xargs kill
77	ln -fs $n $last
78	name=`grep -w "$n$" /usr/include/sys/syscall.h | awk '{print $2}' |
79		sed 's/SYS_//'`
80	[ -z "$name" ] && name="unknown"
81	rm -f /tmp/syscall5.name
82	[ -x ../tools/exclude_syscall.sh ] &&
83	    ../tools/exclude_syscall.sh $n &&
84	    { n=$((n - 1)); continue; }
85	[ "$name" = "unknown" ] && [ -f /tmp/syscall5.name ] &&
86	    name=`cat /tmp/syscall5.name`
87	[ -z "$name" -a -n "$unnamed" ] &&
88		{ n=$((n - 1)); continue; }
89	echo "`date '+%T'` syscall $n ($name)"
90	echo "`date '+%T'` syscall $n ($name)"  >> $log
91	printf "`date '+%T'` syscall $n ($name)\r\n" > /dev/console
92	sync; sleep 1
93	echo "$broken" | grep -qw "$name" ||
94		./syscall4.sh $n || break
95	[ $n -le $esyscall ] && break
96	n=$((n - 1))
97	[ -z "$all" -a `date '+%s'` -gt $((start + 1800)) ] && break
98done
99rm -f $log $last
100