1 /*- 2 * BSD LICENSE 3 * 4 * Copyright(c) 2010-2014 Intel Corporation. All rights reserved. 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 * 11 * * Redistributions of source code must retain the above copyright 12 * notice, this list of conditions and the following disclaimer. 13 * * Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in 15 * the documentation and/or other materials provided with the 16 * distribution. 17 * * Neither the name of Intel Corporation nor the names of its 18 * contributors may be used to endorse or promote products derived 19 * from this software without specific prior written permission. 20 * 21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 22 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 23 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 24 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 25 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 26 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 27 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 28 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 29 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 30 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 31 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 32 */ 33 34 #include <stdio.h> 35 #include <stdint.h> 36 #include <sys/wait.h> 37 #include <unistd.h> 38 39 #include <cmdline_parse.h> 40 41 #include <rte_debug.h> 42 #include <rte_common.h> 43 #include <rte_eal.h> 44 45 #include "test.h" 46 47 /* 48 * Debug test 49 * ========== 50 * 51 * - Call rte_dump_stack() and rte_dump_registers(). The result is not checked 52 * currently, as the functions are not implemented on baremetal. 53 * - Check that rte_panic() terminates the program using a non-zero error code. 54 * (Only implemented on linux, since it requires the fork() system call) 55 */ 56 57 #ifdef RTE_EXEC_ENV_BAREMETAL 58 59 /* baremetal - don't test rte_panic or rte_exit */ 60 static int 61 test_panic(void) 62 { 63 return 0; 64 } 65 66 static int 67 test_exit(void) 68 { 69 return 0; 70 } 71 72 #else 73 74 /* linuxapp - use fork() to test rte_panic() */ 75 static int 76 test_panic(void) 77 { 78 int pid; 79 int status; 80 81 pid = fork(); 82 83 if (pid == 0) 84 rte_panic("Test Debug\n"); 85 else if (pid < 0){ 86 printf("Fork Failed\n"); 87 return -1; 88 } 89 wait(&status); 90 if(status == 0){ 91 printf("Child process terminated normally!\n"); 92 return -1; 93 } else 94 printf("Child process terminated as expected - Test passed!\n"); 95 96 return 0; 97 } 98 99 /* linuxapp - use fork() to test rte_exit() */ 100 static int 101 test_exit_val(int exit_val) 102 { 103 int pid; 104 int status; 105 106 pid = fork(); 107 108 if (pid == 0) 109 rte_exit(exit_val, __func__); 110 else if (pid < 0){ 111 printf("Fork Failed\n"); 112 return -1; 113 } 114 wait(&status); 115 printf("Child process status: %d\n", status); 116 #ifndef RTE_EAL_ALWAYS_PANIC_ON_ERROR 117 if(!WIFEXITED(status) || WEXITSTATUS(status) != (uint8_t)exit_val){ 118 printf("Child process terminated with incorrect status (expected = %d)!\n", 119 exit_val); 120 return -1; 121 } 122 #endif 123 return 0; 124 } 125 126 static int 127 test_exit(void) 128 { 129 int test_vals[] = { 0, 1, 2, 255, -1 }; 130 unsigned i; 131 for (i = 0; i < sizeof(test_vals) / sizeof(test_vals[0]); i++){ 132 if (test_exit_val(test_vals[i]) < 0) 133 return -1; 134 } 135 printf("%s Passed\n", __func__); 136 return 0; 137 } 138 139 #endif 140 141 static void 142 dummy_app_usage(const char *progname) 143 { 144 RTE_SET_USED(progname); 145 } 146 147 static int 148 test_usage(void) 149 { 150 if (rte_set_application_usage_hook(dummy_app_usage) != NULL) { 151 printf("Non-NULL value returned for initial usage hook\n"); 152 return -1; 153 } 154 if (rte_set_application_usage_hook(NULL) != dummy_app_usage) { 155 printf("Incorrect value returned for application usage hook\n"); 156 return -1; 157 } 158 return 0; 159 } 160 161 int 162 test_debug(void) 163 { 164 rte_dump_stack(); 165 rte_dump_registers(); 166 if (test_panic() < 0) 167 return -1; 168 if (test_exit() < 0) 169 return -1; 170 if (test_usage() < 0) 171 return -1; 172 return 0; 173 } 174