xref: /aosp_15_r20/external/igt-gpu-tools/lib/tests/igt_segfault.c (revision d83cc019efdc2edc6c4b16e9034a3ceb8d35d77c)
1*d83cc019SAndroid Build Coastguard Worker /*
2*d83cc019SAndroid Build Coastguard Worker  * Copyright © 2015 Intel Corporation
3*d83cc019SAndroid Build Coastguard Worker  *
4*d83cc019SAndroid Build Coastguard Worker  * Permission is hereby granted, free of charge, to any person obtaining a
5*d83cc019SAndroid Build Coastguard Worker  * copy of this software and associated documentation files (the "Software"),
6*d83cc019SAndroid Build Coastguard Worker  * to deal in the Software without restriction, including without limitation
7*d83cc019SAndroid Build Coastguard Worker  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*d83cc019SAndroid Build Coastguard Worker  * and/or sell copies of the Software, and to permit persons to whom the
9*d83cc019SAndroid Build Coastguard Worker  * Software is furnished to do so, subject to the following conditions:
10*d83cc019SAndroid Build Coastguard Worker  *
11*d83cc019SAndroid Build Coastguard Worker  * The above copyright notice and this permission notice (including the next
12*d83cc019SAndroid Build Coastguard Worker  * paragraph) shall be included in all copies or substantial portions of the
13*d83cc019SAndroid Build Coastguard Worker  * Software.
14*d83cc019SAndroid Build Coastguard Worker  *
15*d83cc019SAndroid Build Coastguard Worker  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16*d83cc019SAndroid Build Coastguard Worker  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17*d83cc019SAndroid Build Coastguard Worker  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18*d83cc019SAndroid Build Coastguard Worker  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19*d83cc019SAndroid Build Coastguard Worker  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20*d83cc019SAndroid Build Coastguard Worker  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21*d83cc019SAndroid Build Coastguard Worker  * IN THE SOFTWARE.
22*d83cc019SAndroid Build Coastguard Worker  *
23*d83cc019SAndroid Build Coastguard Worker  * Authors:
24*d83cc019SAndroid Build Coastguard Worker  *    Derek Morton <[email protected]>
25*d83cc019SAndroid Build Coastguard Worker  *
26*d83cc019SAndroid Build Coastguard Worker  */
27*d83cc019SAndroid Build Coastguard Worker 
28*d83cc019SAndroid Build Coastguard Worker /*
29*d83cc019SAndroid Build Coastguard Worker  * Testcase: Test the framework catches a segfault and returns an error.
30*d83cc019SAndroid Build Coastguard Worker  *
31*d83cc019SAndroid Build Coastguard Worker  * 1. Test a crashing simple test is reported.
32*d83cc019SAndroid Build Coastguard Worker  * 2. Test a crashing subtest is reported.
33*d83cc019SAndroid Build Coastguard Worker  * 3. Test a crashing subtest following a passing subtest is reported.
34*d83cc019SAndroid Build Coastguard Worker  * 4. Test a crashing subtest preceeding a passing subtest is reported.
35*d83cc019SAndroid Build Coastguard Worker  */
36*d83cc019SAndroid Build Coastguard Worker 
37*d83cc019SAndroid Build Coastguard Worker #include <signal.h>
38*d83cc019SAndroid Build Coastguard Worker #include <stdlib.h>
39*d83cc019SAndroid Build Coastguard Worker #include <sys/wait.h>
40*d83cc019SAndroid Build Coastguard Worker #include <sys/types.h>
41*d83cc019SAndroid Build Coastguard Worker #include <errno.h>
42*d83cc019SAndroid Build Coastguard Worker 
43*d83cc019SAndroid Build Coastguard Worker #include "drmtest.h"
44*d83cc019SAndroid Build Coastguard Worker #include "igt_core.h"
45*d83cc019SAndroid Build Coastguard Worker 
46*d83cc019SAndroid Build Coastguard Worker #include "igt_tests_common.h"
47*d83cc019SAndroid Build Coastguard Worker 
48*d83cc019SAndroid Build Coastguard Worker bool simple;
49*d83cc019SAndroid Build Coastguard Worker bool runa;
50*d83cc019SAndroid Build Coastguard Worker bool runc;
51*d83cc019SAndroid Build Coastguard Worker char test[] = "test";
52*d83cc019SAndroid Build Coastguard Worker char *argv_run[] = { test };
53*d83cc019SAndroid Build Coastguard Worker 
crashme(void)54*d83cc019SAndroid Build Coastguard Worker static void crashme(void)
55*d83cc019SAndroid Build Coastguard Worker {
56*d83cc019SAndroid Build Coastguard Worker 	raise(SIGSEGV);
57*d83cc019SAndroid Build Coastguard Worker }
58*d83cc019SAndroid Build Coastguard Worker 
do_fork(void)59*d83cc019SAndroid Build Coastguard Worker static int do_fork(void)
60*d83cc019SAndroid Build Coastguard Worker {
61*d83cc019SAndroid Build Coastguard Worker 	int pid, status;
62*d83cc019SAndroid Build Coastguard Worker 	int argc;
63*d83cc019SAndroid Build Coastguard Worker 
64*d83cc019SAndroid Build Coastguard Worker 	switch (pid = fork()) {
65*d83cc019SAndroid Build Coastguard Worker 	case -1:
66*d83cc019SAndroid Build Coastguard Worker 		internal_assert(0);
67*d83cc019SAndroid Build Coastguard Worker 	case 0:
68*d83cc019SAndroid Build Coastguard Worker 		argc = ARRAY_SIZE(argv_run);
69*d83cc019SAndroid Build Coastguard Worker 		if (simple) {
70*d83cc019SAndroid Build Coastguard Worker 			igt_simple_init(argc, argv_run);
71*d83cc019SAndroid Build Coastguard Worker 			crashme();
72*d83cc019SAndroid Build Coastguard Worker 
73*d83cc019SAndroid Build Coastguard Worker 			igt_exit();
74*d83cc019SAndroid Build Coastguard Worker 		} else {
75*d83cc019SAndroid Build Coastguard Worker 			igt_subtest_init(argc, argv_run);
76*d83cc019SAndroid Build Coastguard Worker 
77*d83cc019SAndroid Build Coastguard Worker 			if(runa)
78*d83cc019SAndroid Build Coastguard Worker 				igt_subtest("A")
79*d83cc019SAndroid Build Coastguard Worker 					;
80*d83cc019SAndroid Build Coastguard Worker 
81*d83cc019SAndroid Build Coastguard Worker 			igt_subtest("B")
82*d83cc019SAndroid Build Coastguard Worker 				crashme();
83*d83cc019SAndroid Build Coastguard Worker 
84*d83cc019SAndroid Build Coastguard Worker 			if(runc)
85*d83cc019SAndroid Build Coastguard Worker 				igt_subtest("C")
86*d83cc019SAndroid Build Coastguard Worker 					;
87*d83cc019SAndroid Build Coastguard Worker 
88*d83cc019SAndroid Build Coastguard Worker 			igt_exit();
89*d83cc019SAndroid Build Coastguard Worker 		}
90*d83cc019SAndroid Build Coastguard Worker 	default:
91*d83cc019SAndroid Build Coastguard Worker 		while (waitpid(pid, &status, 0) == -1 &&
92*d83cc019SAndroid Build Coastguard Worker 		       errno == EINTR)
93*d83cc019SAndroid Build Coastguard Worker 			;
94*d83cc019SAndroid Build Coastguard Worker 
95*d83cc019SAndroid Build Coastguard Worker 		return status;
96*d83cc019SAndroid Build Coastguard Worker 	}
97*d83cc019SAndroid Build Coastguard Worker }
98*d83cc019SAndroid Build Coastguard Worker 
main(int argc,char ** argv)99*d83cc019SAndroid Build Coastguard Worker int main(int argc, char **argv)
100*d83cc019SAndroid Build Coastguard Worker {
101*d83cc019SAndroid Build Coastguard Worker 	/* Test Crash in simple test is reported */
102*d83cc019SAndroid Build Coastguard Worker 	simple = true;
103*d83cc019SAndroid Build Coastguard Worker 	runa=false;
104*d83cc019SAndroid Build Coastguard Worker 	runc=false;
105*d83cc019SAndroid Build Coastguard Worker 	igt_info("Simple test.\n");
106*d83cc019SAndroid Build Coastguard Worker 	fflush(stdout);
107*d83cc019SAndroid Build Coastguard Worker 	internal_assert_wsignaled(do_fork(), SIGSEGV);
108*d83cc019SAndroid Build Coastguard Worker 
109*d83cc019SAndroid Build Coastguard Worker 	/* Test crash in a single subtest is reported */
110*d83cc019SAndroid Build Coastguard Worker 	simple = false;
111*d83cc019SAndroid Build Coastguard Worker 	igt_info("Single subtest.\n");
112*d83cc019SAndroid Build Coastguard Worker 	fflush(stdout);
113*d83cc019SAndroid Build Coastguard Worker 	internal_assert_wexited(do_fork(), SIGSEGV + 128);
114*d83cc019SAndroid Build Coastguard Worker 
115*d83cc019SAndroid Build Coastguard Worker 	/* Test crash in a subtest following a pass is reported */
116*d83cc019SAndroid Build Coastguard Worker 	simple = false;
117*d83cc019SAndroid Build Coastguard Worker 	runa=true;
118*d83cc019SAndroid Build Coastguard Worker 	igt_info("Passing then crashing subtest.\n");
119*d83cc019SAndroid Build Coastguard Worker 	fflush(stdout);
120*d83cc019SAndroid Build Coastguard Worker 	internal_assert_wexited(do_fork(), SIGSEGV + 128);
121*d83cc019SAndroid Build Coastguard Worker 
122*d83cc019SAndroid Build Coastguard Worker 	/* Test crash in a subtest preceeding a pass is reported */
123*d83cc019SAndroid Build Coastguard Worker 	simple = false;
124*d83cc019SAndroid Build Coastguard Worker 	runa=false;
125*d83cc019SAndroid Build Coastguard Worker 	runc=true;
126*d83cc019SAndroid Build Coastguard Worker 	igt_info("Crashing then passing subtest.\n");
127*d83cc019SAndroid Build Coastguard Worker 	fflush(stdout);
128*d83cc019SAndroid Build Coastguard Worker 	internal_assert_wexited(do_fork(), SIGSEGV + 128);
129*d83cc019SAndroid Build Coastguard Worker 
130*d83cc019SAndroid Build Coastguard Worker 	return 0;
131*d83cc019SAndroid Build Coastguard Worker }
132