1 /*- 2 * BSD LICENSE 3 * 4 * Copyright(c) 2010-2012 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 35 #include <stdio.h> 36 #include <stdint.h> 37 #include <sys/wait.h> 38 #include <unistd.h> 39 40 #include <cmdline_parse.h> 41 42 #include <rte_debug.h> 43 #include <rte_common.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 if(!WIFEXITED(status) || WEXITSTATUS(status) != (uint8_t)exit_val){ 117 printf("Child process terminated with incorrect return code!\n"); 118 return -1; 119 } 120 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 int 140 test_debug(void) 141 { 142 rte_dump_stack(); 143 rte_dump_registers(); 144 if (test_panic() < 0) 145 return -1; 146 if (test_exit() < 0) 147 return -1; 148 return 0; 149 } 150