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