xref: /netbsd-src/external/gpl3/gdb/dist/sim/rx/err.c (revision 1f4e7eb9e5e045e008f1894823a8e4e6c9f46890)
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