1 /* main.c --- main function for stand-alone RX simulator.
3 Copyright (C) 2005-2024 Free Software Foundation, Inc.
4 Contributed by Red Hat, Inc.
6 This file is part of the GNU simulators.
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.
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.
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/>. */
21 /* This must come before any other includes. */
42 static int disassemble
= 0;
44 /* This must be higher than any other option index. */
47 #define ACT(E,A) (OPT_ACT + SIM_ERR_##E * SIM_ERRACTION_NUM_ACTIONS + SIM_ERRACTION_##A)
49 static struct option sim_options
[] =
51 { "end-sim-args", 0, NULL
, 'E' },
52 { "exit-null-deref", 0, NULL
, ACT(NULL_POINTER_DEREFERENCE
,EXIT
) },
53 { "warn-null-deref", 0, NULL
, ACT(NULL_POINTER_DEREFERENCE
,WARN
) },
54 { "ignore-null-deref", 0, NULL
, ACT(NULL_POINTER_DEREFERENCE
,IGNORE
) },
55 { "exit-unwritten-pages", 0, NULL
, ACT(READ_UNWRITTEN_PAGES
,EXIT
) },
56 { "warn-unwritten-pages", 0, NULL
, ACT(READ_UNWRITTEN_PAGES
,WARN
) },
57 { "ignore-unwritten-pages", 0, NULL
, ACT(READ_UNWRITTEN_PAGES
,IGNORE
) },
58 { "exit-unwritten-bytes", 0, NULL
, ACT(READ_UNWRITTEN_BYTES
,EXIT
) },
59 { "warn-unwritten-bytes", 0, NULL
, ACT(READ_UNWRITTEN_BYTES
,WARN
) },
60 { "ignore-unwritten-bytes", 0, NULL
, ACT(READ_UNWRITTEN_BYTES
,IGNORE
) },
61 { "exit-corrupt-stack", 0, NULL
, ACT(CORRUPT_STACK
,EXIT
) },
62 { "warn-corrupt-stack", 0, NULL
, ACT(CORRUPT_STACK
,WARN
) },
63 { "ignore-corrupt-stack", 0, NULL
, ACT(CORRUPT_STACK
,IGNORE
) },
74 /* Only use comma separated numbers when being very verbose.
75 Comma separated numbers are hard to parse in awk scripts. */
77 printf ("insns: %14s\n", comma (rx_cycles
));
79 printf ("insns: %u\n", rx_cycles
);
87 main (int argc
, char **argv
)
94 /* By default, we exit when an execution error occurs. */
95 execution_error_init_standalone ();
97 while ((o
= getopt_long (argc
, argv
, "tvdeEwi", sim_options
, NULL
)) != -1)
100 /* Stop processing the command line. This is so that any remaining
101 words on the command line that look like arguments will be passed
102 on to the program being simulated. */
110 e
= o
/ SIM_ERRACTION_NUM_ACTIONS
;
111 a
= o
% SIM_ERRACTION_NUM_ACTIONS
;
112 execution_error_set_action (e
, a
);
126 execution_error_init_standalone ();
129 execution_error_warn_all ();
132 execution_error_ignore_all ();
138 "usage: run [options] program [arguments]\n");
140 "\t-v\t- increase verbosity.\n"
142 "\t-d\t- disassemble.\n"
143 "\t-E\t- stop processing sim args\n"
144 "\t-e\t- exit on all execution errors.\n"
145 "\t-w\t- warn (do not exit) on all execution errors.\n"
146 "\t-i\t- ignore all execution errors.\n");
147 for (i
=0; sim_options
[i
].name
; i
++)
148 fprintf (stderr
, "\t--%s\n", sim_options
[i
].name
);
154 prog
= bfd_openr (argv
[optind
], 0);
157 fprintf (stderr
, "Can't read %s\n", argv
[optind
]);
161 if (!bfd_check_format (prog
, bfd_object
))
163 fprintf (stderr
, "%s not a rx program\n", argv
[optind
]);
172 rx_load (prog
, NULL
);
175 sim_disasm_init (prog
);
177 enable_counting
= verbose
;
179 rc
= setjmp (decode_jmp_buf
);
183 if (!trace
&& !disassemble
)
185 /* This will longjmp to the above if an exception
201 enable_counting
= verbose
;
204 rc
= decode_opcode ();
207 trace_register_changes ();
211 if (RX_HIT_BREAK (rc
))
213 else if (RX_EXITED (rc
))
214 done (RX_EXIT_STATUS (rc
));
215 else if (RX_STOPPED (rc
))
218 printf("Stopped on signal %d\n", RX_STOP_SIG (rc
));