xref: /dpdk/app/test/test_debug.c (revision 71bdd8a1785d25f91de7908ff915e4db7871eb2b)
1a9de470cSBruce Richardson /* SPDX-License-Identifier: BSD-3-Clause
2a9de470cSBruce Richardson  * Copyright(c) 2010-2014 Intel Corporation
3a9de470cSBruce Richardson  */
4a9de470cSBruce Richardson 
5a9de470cSBruce Richardson #include <stdio.h>
6a9de470cSBruce Richardson #include <stdint.h>
7a9de470cSBruce Richardson #include <sys/wait.h>
8a9de470cSBruce Richardson #include <unistd.h>
9a9de470cSBruce Richardson 
10a9de470cSBruce Richardson #include <rte_debug.h>
11a9de470cSBruce Richardson #include <rte_common.h>
12a9de470cSBruce Richardson #include <rte_eal.h>
13a9de470cSBruce Richardson #include <rte_service_component.h>
14a9de470cSBruce Richardson 
15a9de470cSBruce Richardson #include "test.h"
16a9de470cSBruce Richardson 
17a9de470cSBruce Richardson /*
18a9de470cSBruce Richardson  * Debug test
19a9de470cSBruce Richardson  * ==========
20a9de470cSBruce Richardson  */
21a9de470cSBruce Richardson 
22a9de470cSBruce Richardson /* use fork() to test rte_panic() */
23a9de470cSBruce Richardson static int
24a9de470cSBruce Richardson test_panic(void)
25a9de470cSBruce Richardson {
26a9de470cSBruce Richardson 	int pid;
27a9de470cSBruce Richardson 	int status;
28a9de470cSBruce Richardson 
29a9de470cSBruce Richardson 	pid = fork();
30a9de470cSBruce Richardson 
31a9de470cSBruce Richardson 	if (pid == 0)
32a9de470cSBruce Richardson 		rte_panic("Test Debug\n");
33a9de470cSBruce Richardson 	else if (pid < 0){
34a9de470cSBruce Richardson 		printf("Fork Failed\n");
35a9de470cSBruce Richardson 		return -1;
36a9de470cSBruce Richardson 	}
37a9de470cSBruce Richardson 	wait(&status);
38a9de470cSBruce Richardson 	if(status == 0){
39a9de470cSBruce Richardson 		printf("Child process terminated normally!\n");
40a9de470cSBruce Richardson 		return -1;
41a9de470cSBruce Richardson 	} else
42a9de470cSBruce Richardson 		printf("Child process terminated as expected - Test passed!\n");
43a9de470cSBruce Richardson 
44a9de470cSBruce Richardson 	return 0;
45a9de470cSBruce Richardson }
46a9de470cSBruce Richardson 
47a9de470cSBruce Richardson /* use fork() to test rte_exit() */
48a9de470cSBruce Richardson static int
49a9de470cSBruce Richardson test_exit_val(int exit_val)
50a9de470cSBruce Richardson {
51a9de470cSBruce Richardson 	int pid;
52a9de470cSBruce Richardson 	int status;
53a9de470cSBruce Richardson 
54a9de470cSBruce Richardson 	/* manually cleanup EAL memory, as the fork() below would otherwise
55a9de470cSBruce Richardson 	 * cause the same hugepages to be free()-ed multiple times.
56a9de470cSBruce Richardson 	 */
57a9de470cSBruce Richardson 	rte_service_finalize();
58a9de470cSBruce Richardson 
59a9de470cSBruce Richardson 	pid = fork();
60a9de470cSBruce Richardson 
61a9de470cSBruce Richardson 	if (pid == 0)
62a9de470cSBruce Richardson 		rte_exit(exit_val, __func__);
63a9de470cSBruce Richardson 	else if (pid < 0){
64a9de470cSBruce Richardson 		printf("Fork Failed\n");
65a9de470cSBruce Richardson 		return -1;
66a9de470cSBruce Richardson 	}
67a9de470cSBruce Richardson 	wait(&status);
68a9de470cSBruce Richardson 	printf("Child process status: %d\n", status);
69a9de470cSBruce Richardson #ifndef RTE_EAL_ALWAYS_PANIC_ON_ERROR
70a9de470cSBruce Richardson 	if(!WIFEXITED(status) || WEXITSTATUS(status) != (uint8_t)exit_val){
71a9de470cSBruce Richardson 		printf("Child process terminated with incorrect status (expected = %d)!\n",
72a9de470cSBruce Richardson 				exit_val);
73a9de470cSBruce Richardson 		return -1;
74a9de470cSBruce Richardson 	}
75a9de470cSBruce Richardson #endif
76a9de470cSBruce Richardson 	return 0;
77a9de470cSBruce Richardson }
78a9de470cSBruce Richardson 
79a9de470cSBruce Richardson static int
80a9de470cSBruce Richardson test_exit(void)
81a9de470cSBruce Richardson {
82a9de470cSBruce Richardson 	int test_vals[] = { 0, 1, 2, 255, -1 };
83a9de470cSBruce Richardson 	unsigned i;
84*71bdd8a1SPavan Nikhilesh 	for (i = 0; i < RTE_DIM(test_vals); i++) {
85a9de470cSBruce Richardson 		if (test_exit_val(test_vals[i]) < 0)
86a9de470cSBruce Richardson 			return -1;
87a9de470cSBruce Richardson 	}
88a9de470cSBruce Richardson 	printf("%s Passed\n", __func__);
89a9de470cSBruce Richardson 	return 0;
90a9de470cSBruce Richardson }
91a9de470cSBruce Richardson 
92a9de470cSBruce Richardson static void
93a9de470cSBruce Richardson dummy_app_usage(const char *progname)
94a9de470cSBruce Richardson {
95a9de470cSBruce Richardson 	RTE_SET_USED(progname);
96a9de470cSBruce Richardson }
97a9de470cSBruce Richardson 
98a9de470cSBruce Richardson static int
99a9de470cSBruce Richardson test_usage(void)
100a9de470cSBruce Richardson {
101a9de470cSBruce Richardson 	if (rte_set_application_usage_hook(dummy_app_usage) != NULL) {
102a9de470cSBruce Richardson 		printf("Non-NULL value returned for initial usage hook\n");
103a9de470cSBruce Richardson 		return -1;
104a9de470cSBruce Richardson 	}
105a9de470cSBruce Richardson 	if (rte_set_application_usage_hook(NULL) != dummy_app_usage) {
106a9de470cSBruce Richardson 		printf("Incorrect value returned for application usage hook\n");
107a9de470cSBruce Richardson 		return -1;
108a9de470cSBruce Richardson 	}
109a9de470cSBruce Richardson 	return 0;
110a9de470cSBruce Richardson }
111a9de470cSBruce Richardson 
112a9de470cSBruce Richardson static int
113a9de470cSBruce Richardson test_debug(void)
114a9de470cSBruce Richardson {
115a9de470cSBruce Richardson 	rte_dump_stack();
116a9de470cSBruce Richardson 	rte_dump_registers();
117a9de470cSBruce Richardson 	if (test_panic() < 0)
118a9de470cSBruce Richardson 		return -1;
119a9de470cSBruce Richardson 	if (test_exit() < 0)
120a9de470cSBruce Richardson 		return -1;
121a9de470cSBruce Richardson 	if (test_usage() < 0)
122a9de470cSBruce Richardson 		return -1;
123a9de470cSBruce Richardson 	return 0;
124a9de470cSBruce Richardson }
125a9de470cSBruce Richardson 
126a9de470cSBruce Richardson REGISTER_TEST_COMMAND(debug_autotest, test_debug);
127