xref: /freebsd-src/tools/test/stress2/misc/signal2.sh (revision 2aba6e7aaf2fa993b0983457f3055450b1495569)
1*2aba6e7aSPeter Holm#!/bin/sh
2*2aba6e7aSPeter Holm
3*2aba6e7aSPeter Holm# Test scenario from:
4*2aba6e7aSPeter Holm# Bug 265889 - sys.kern.basic_signal.trap_signal_test crashes bhyve in i386 VM
5*2aba6e7aSPeter Holm# Test scenario by: Li-Wen Hsu <lwhsu@FreeBSD.org>
6*2aba6e7aSPeter Holm
7*2aba6e7aSPeter Holmcat > /tmp/signal2.c <<EOF
8*2aba6e7aSPeter Holm#include <stdio.h>
9*2aba6e7aSPeter Holm#include <signal.h>
10*2aba6e7aSPeter Holm
11*2aba6e7aSPeter Holm#include <machine/psl.h>
12*2aba6e7aSPeter Holm#define    SET_TRACE_FLAG(ucp)    (ucp)->uc_mcontext.mc_eflags |= PSL_T
13*2aba6e7aSPeter Holm#define    CLR_TRACE_FLAG(ucp)    (ucp)->uc_mcontext.mc_eflags &= ~PSL_T
14*2aba6e7aSPeter Holm
15*2aba6e7aSPeter Holmstatic volatile sig_atomic_t trap_signal_fired = 0;
16*2aba6e7aSPeter Holm
17*2aba6e7aSPeter Holmstatic void
18*2aba6e7aSPeter Holmtrap_sig_handler(int signo __unused, siginfo_t *info __unused, void *_ucp)
19*2aba6e7aSPeter Holm{
20*2aba6e7aSPeter Holm	ucontext_t *ucp = _ucp;
21*2aba6e7aSPeter Holm
22*2aba6e7aSPeter Holm	if (trap_signal_fired < 9) {
23*2aba6e7aSPeter Holm		SET_TRACE_FLAG(ucp);
24*2aba6e7aSPeter Holm	} else {
25*2aba6e7aSPeter Holm		CLR_TRACE_FLAG(ucp);
26*2aba6e7aSPeter Holm	}
27*2aba6e7aSPeter Holm	trap_signal_fired++;
28*2aba6e7aSPeter Holm}
29*2aba6e7aSPeter Holm
30*2aba6e7aSPeter Holmint main() {
31*2aba6e7aSPeter Holm	struct sigaction sa = {
32*2aba6e7aSPeter Holm		.sa_sigaction = trap_sig_handler,
33*2aba6e7aSPeter Holm		.sa_flags = SA_SIGINFO,
34*2aba6e7aSPeter Holm	};
35*2aba6e7aSPeter Holm
36*2aba6e7aSPeter Holm	sigemptyset(&sa.sa_mask);
37*2aba6e7aSPeter Holm	sigaction(SIGTRAP, &sa, NULL);
38*2aba6e7aSPeter Holm
39*2aba6e7aSPeter Holm	raise(SIGTRAP);
40*2aba6e7aSPeter Holm
41*2aba6e7aSPeter Holm	printf("test\n");
42*2aba6e7aSPeter Holm}
43*2aba6e7aSPeter HolmEOF
44*2aba6e7aSPeter Holmcc -o /tmp/signal2 -Wall -Wextra -O0 -m32 /tmp/signal2.c || exit 1
45*2aba6e7aSPeter Holm
46*2aba6e7aSPeter Holm/tmp/signal2; s=$?
47*2aba6e7aSPeter Holmfor i in `jot 30`; do
48*2aba6e7aSPeter Holm	/tmp/signal2 &
49*2aba6e7aSPeter Holmdone > /dev/null
50*2aba6e7aSPeter Holmwait
51*2aba6e7aSPeter Holm
52*2aba6e7aSPeter Holmrm -f /tmp/signal2 /tmp/signal2.c
53*2aba6e7aSPeter Holmexit $s
54