1 /* err.c --- handle errors for RX simulator. 2 3 Copyright (C) 2008-2024 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 /* This must come before any other includes. */ 22 #include "defs.h" 23 24 #include <stdio.h> 25 #include <stdlib.h> 26 27 #include "err.h" 28 29 static unsigned char ee_actions[SIM_ERR_NUM_ERRORS]; 30 31 static enum execution_error last_error; 32 33 static void 34 ee_overrides (void) 35 { 36 /* GCC may initialize a bitfield by reading the uninitialized byte, 37 masking in the bitfield, and writing the byte back out. */ 38 ee_actions[SIM_ERR_READ_UNWRITTEN_BYTES] = SIM_ERRACTION_IGNORE; 39 /* This breaks stack unwinding for exceptions because it leaves 40 MC_PUSHED_PC tags in the unwound stack frames. */ 41 ee_actions[SIM_ERR_CORRUPT_STACK] = SIM_ERRACTION_IGNORE; 42 } 43 44 void 45 execution_error_init_standalone (void) 46 { 47 int i; 48 49 for (i = 0; i < SIM_ERR_NUM_ERRORS; i++) 50 ee_actions[i] = SIM_ERRACTION_EXIT; 51 52 ee_overrides (); 53 } 54 55 void 56 execution_error_init_debugger (void) 57 { 58 int i; 59 60 for (i = 0; i < SIM_ERR_NUM_ERRORS; i++) 61 ee_actions[i] = SIM_ERRACTION_DEBUG; 62 63 ee_overrides (); 64 } 65 66 void 67 execution_error_warn_all (void) 68 { 69 int i; 70 71 for (i = 0; i < SIM_ERR_NUM_ERRORS; i++) 72 ee_actions[i] = SIM_ERRACTION_WARN; 73 } 74 75 void 76 execution_error_ignore_all (void) 77 { 78 int i; 79 80 for (i = 0; i < SIM_ERR_NUM_ERRORS; i++) 81 ee_actions[i] = SIM_ERRACTION_IGNORE; 82 } 83 84 void 85 execution_error (enum execution_error num, unsigned long address) 86 { 87 if (ee_actions[num] != SIM_ERRACTION_IGNORE) 88 last_error = num; 89 90 if (ee_actions[num] == SIM_ERRACTION_EXIT 91 || ee_actions[num] == SIM_ERRACTION_WARN) 92 { 93 switch (num) 94 { 95 case SIM_ERR_READ_UNWRITTEN_PAGES: 96 case SIM_ERR_READ_UNWRITTEN_BYTES: 97 printf("Read from unwritten memory at 0x%lx\n", address); 98 break; 99 100 case SIM_ERR_NULL_POINTER_DEREFERENCE: 101 printf ("NULL pointer dereference\n"); 102 break; 103 104 case SIM_ERR_CORRUPT_STACK: 105 printf ("Stack corruption detected at 0x%lx\n", address); 106 break; 107 108 default: 109 printf ("Unknown execution error %d\n", num); 110 exit (1); 111 } 112 } 113 114 if (ee_actions[num] == SIM_ERRACTION_EXIT) 115 exit (1); 116 } 117 118 enum execution_error 119 execution_error_get_last_error (void) 120 { 121 return last_error; 122 } 123 124 void 125 execution_error_clear_last_error (void) 126 { 127 last_error = SIM_ERR_NONE; 128 } 129 130 void 131 execution_error_set_action (enum execution_error num, enum execution_error_action act) 132 { 133 ee_actions[num] = act; 134 } 135