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 <rte_debug.h> 40 #include <rte_common.h> 41 #include <rte_eal.h> 42 43 #include "test.h" 44 45 /* 46 * Debug test 47 * ========== 48 * 49 * - Call rte_dump_stack() and rte_dump_registers(). The result is not checked 50 * currently, as the functions are not implemented on baremetal. 51 * - Check that rte_panic() terminates the program using a non-zero error code. 52 * (Only implemented on linux, since it requires the fork() system call) 53 */ 54 55 #ifdef RTE_EXEC_ENV_BAREMETAL 56 57 /* baremetal - don't test rte_panic or rte_exit */ 58 static int 59 test_panic(void) 60 { 61 return 0; 62 } 63 64 static int 65 test_exit(void) 66 { 67 return 0; 68 } 69 70 #else 71 72 /* linuxapp - use fork() to test rte_panic() */ 73 static int 74 test_panic(void) 75 { 76 int pid; 77 int status; 78 79 pid = fork(); 80 81 if (pid == 0) 82 rte_panic("Test Debug\n"); 83 else if (pid < 0){ 84 printf("Fork Failed\n"); 85 return -1; 86 } 87 wait(&status); 88 if(status == 0){ 89 printf("Child process terminated normally!\n"); 90 return -1; 91 } else 92 printf("Child process terminated as expected - Test passed!\n"); 93 94 return 0; 95 } 96 97 /* linuxapp - use fork() to test rte_exit() */ 98 static int 99 test_exit_val(int exit_val) 100 { 101 int pid; 102 int status; 103 104 pid = fork(); 105 106 if (pid == 0) 107 rte_exit(exit_val, __func__); 108 else if (pid < 0){ 109 printf("Fork Failed\n"); 110 return -1; 111 } 112 wait(&status); 113 printf("Child process status: %d\n", status); 114 #ifndef RTE_EAL_ALWAYS_PANIC_ON_ERROR 115 if(!WIFEXITED(status) || WEXITSTATUS(status) != (uint8_t)exit_val){ 116 printf("Child process terminated with incorrect status (expected = %d)!\n", 117 exit_val); 118 return -1; 119 } 120 #endif 121 return 0; 122 } 123 124 static int 125 test_exit(void) 126 { 127 int test_vals[] = { 0, 1, 2, 255, -1 }; 128 unsigned i; 129 for (i = 0; i < sizeof(test_vals) / sizeof(test_vals[0]); i++){ 130 if (test_exit_val(test_vals[i]) < 0) 131 return -1; 132 } 133 printf("%s Passed\n", __func__); 134 return 0; 135 } 136 137 #endif 138 139 static void 140 dummy_app_usage(const char *progname) 141 { 142 RTE_SET_USED(progname); 143 } 144 145 static int 146 test_usage(void) 147 { 148 if (rte_set_application_usage_hook(dummy_app_usage) != NULL) { 149 printf("Non-NULL value returned for initial usage hook\n"); 150 return -1; 151 } 152 if (rte_set_application_usage_hook(NULL) != dummy_app_usage) { 153 printf("Incorrect value returned for application usage hook\n"); 154 return -1; 155 } 156 return 0; 157 } 158 159 int 160 test_debug(void) 161 { 162 rte_dump_stack(); 163 rte_dump_registers(); 164 if (test_panic() < 0) 165 return -1; 166 if (test_exit() < 0) 167 return -1; 168 if (test_usage() < 0) 169 return -1; 170 return 0; 171 } 172