1 /* err.c --- handle errors for RX simulator. 2 3 Copyright (C) 2008-2014 Free Software Foundation, Inc. 4 Contributed by Red Hat, Inc. 5 6 This file is part of the GNU simulators. 7 8 This program is free software; you can redistribute it and/or modify 9 it under the terms of the GNU General Public License as published by 10 the Free Software Foundation; either version 3 of the License, or 11 (at your option) any later version. 12 13 This program is distributed in the hope that it will be useful, 14 but WITHOUT ANY WARRANTY; without even the implied warranty of 15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 GNU General Public License for more details. 17 18 You should have received a copy of the GNU General Public License 19 along with this program. If not, see <http://www.gnu.org/licenses/>. */ 20 21 #include <stdio.h> 22 #include <stdlib.h> 23 24 #include "err.h" 25 26 static unsigned char ee_actions[SIM_ERR_NUM_ERRORS]; 27 28 static enum execution_error last_error; 29 30 static void 31 ee_overrides () 32 { 33 /* GCC may initialize a bitfield by reading the uninitialized byte, 34 masking in the bitfield, and writing the byte back out. */ 35 ee_actions[SIM_ERR_READ_UNWRITTEN_BYTES] = SIM_ERRACTION_IGNORE; 36 /* This breaks stack unwinding for exceptions because it leaves 37 MC_PUSHED_PC tags in the unwound stack frames. */ 38 ee_actions[SIM_ERR_CORRUPT_STACK] = SIM_ERRACTION_IGNORE; 39 } 40 41 void 42 execution_error_init_standalone (void) 43 { 44 int i; 45 46 for (i = 0; i < SIM_ERR_NUM_ERRORS; i++) 47 ee_actions[i] = SIM_ERRACTION_EXIT; 48 49 ee_overrides (); 50 } 51 52 void 53 execution_error_init_debugger (void) 54 { 55 int i; 56 57 for (i = 0; i < SIM_ERR_NUM_ERRORS; i++) 58 ee_actions[i] = SIM_ERRACTION_DEBUG; 59 60 ee_overrides (); 61 } 62 63 void 64 execution_error_exit_all (void) 65 { 66 int i; 67 68 for (i = 0; i < SIM_ERR_NUM_ERRORS; i++) 69 ee_actions[i] = SIM_ERRACTION_EXIT; 70 } 71 72 void 73 execution_error_warn_all (void) 74 { 75 int i; 76 77 for (i = 0; i < SIM_ERR_NUM_ERRORS; i++) 78 ee_actions[i] = SIM_ERRACTION_WARN; 79 } 80 81 void 82 execution_error_ignore_all (void) 83 { 84 int i; 85 86 for (i = 0; i < SIM_ERR_NUM_ERRORS; i++) 87 ee_actions[i] = SIM_ERRACTION_IGNORE; 88 } 89 90 void 91 execution_error (enum execution_error num, unsigned long address) 92 { 93 if (ee_actions[num] != SIM_ERRACTION_IGNORE) 94 last_error = num; 95 96 if (ee_actions[num] == SIM_ERRACTION_EXIT 97 || ee_actions[num] == SIM_ERRACTION_WARN) 98 { 99 switch (num) 100 { 101 case SIM_ERR_READ_UNWRITTEN_PAGES: 102 case SIM_ERR_READ_UNWRITTEN_BYTES: 103 printf("Read from unwritten memory at 0x%lx\n", address); 104 break; 105 106 case SIM_ERR_NULL_POINTER_DEREFERENCE: 107 printf ("NULL pointer dereference\n"); 108 break; 109 110 case SIM_ERR_CORRUPT_STACK: 111 printf ("Stack corruption detected at 0x%lx\n", address); 112 break; 113 114 default: 115 printf ("Unknown execution error %d\n", num); 116 exit (1); 117 } 118 } 119 120 if (ee_actions[num] == SIM_ERRACTION_EXIT) 121 exit (1); 122 } 123 124 enum execution_error 125 execution_error_get_last_error (void) 126 { 127 return last_error; 128 } 129 130 void 131 execution_error_clear_last_error (void) 132 { 133 last_error = SIM_ERR_NONE; 134 } 135 136 void 137 execution_error_set_action (enum execution_error num, enum execution_error_action act) 138 { 139 ee_actions[num] = act; 140 } 141