]>
git.ipfire.org Git - thirdparty/binutils-gdb.git/blob - sim/erc32/interf.c
aa3ffdc7ada11f7c1ec6358b21998f7178ee63e8
1 /* This file is part of SIS (SPARC instruction simulator)
3 Copyright (C) 1995-2022 Free Software Foundation, Inc.
4 Contributed by Jiri Gaisler, European Space Agency
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program. If not, see <http://www.gnu.org/licenses/>. */
19 /* This must come before any other includes. */
26 #include <sys/fcntl.h>
28 #include "libiberty.h"
31 #include "sim-config.h"
34 #include "gdb/signals.h"
38 extern struct disassemble_info dinfo
;
39 extern struct pstate sregs
;
40 extern struct estate ebase
;
48 extern int sis_verbose
;
49 extern char *sis_version
;
50 extern struct estate ebase
;
51 extern struct evcell evbuf
[];
52 extern struct irqcell irqarr
[];
53 extern int irqpend
, ext_irl
;
56 extern int sparclite_board
;
58 extern char uart_dev1
[], uart_dev2
[];
60 int sis_gdb_break
= 1;
62 host_callback
*sim_callback
;
65 run_sim(struct pstate
*sregs
, uint64_t icount
, int dis
)
70 (*sim_callback
->printf_filtered
) (sim_callback
, "resuming at %x\n",
73 sregs
->starttime
= get_time();
75 if ((sregs
->pc
!= 0) && (ebase
.simtime
== 0))
77 while (!sregs
->err_mode
& (icount
> 0)) {
83 if (sregs
->psr
& 0x080)
88 #if 0 /* DELETE ME! for debugging purposes only */
90 if (sregs
->pc
== 0 || sregs
->npc
== 0)
91 printf ("bogus pc or npc\n");
93 mexc
= memory_iread (sregs
->pc
, &sregs
->inst
, &sregs
->hold
);
94 #if 0 /* DELETE ME! for debugging purposes only */
96 printf("pc %x, np %x, sp %x, fp %x, wm %x, cw %x, i %08x\n",
97 sregs
->pc
, sregs
->npc
,
98 sregs
->r
[(((sregs
->psr
& 7) << 4) + 14) & 0x7f],
99 sregs
->r
[(((sregs
->psr
& 7) << 4) + 30) & 0x7f],
107 sregs
->pc
= sregs
->npc
;
108 sregs
->npc
= sregs
->npc
+ 4;
110 if (ext_irl
) irq
= check_interrupts(sregs
);
113 sregs
->trap
= I_ACC_EXC
;
115 if ((sis_gdb_break
) && (sregs
->inst
== 0x91d02001)) {
117 (*sim_callback
->printf_filtered
) (sim_callback
,
118 "SW BP hit at %x\n", sregs
->pc
);
124 dispatch_instruction(sregs
);
130 sregs
->err_mode
= execute_trap(sregs
);
139 sregs
->tottime
+= get_time() - sregs
->starttime
;
143 error_mode(sregs
->pc
);
148 (*sim_callback
->printf_filtered
) (sim_callback
,
149 "HW BP hit at %x\n", sregs
->pc
);
159 static int ATTRIBUTE_PRINTF (3, 4)
160 fprintf_styled (void *stream
, enum disassembler_style style
,
161 const char *fmt
, ...)
164 FILE *out
= (FILE *) stream
;
167 va_start (args
, fmt
);
168 ret
= vfprintf (out
, fmt
, args
);
175 sim_open (SIM_OPEN_KIND kind
, struct host_callback_struct
*callback
,
176 struct bfd
*abfd
, char * const *argv
)
183 sim_callback
= callback
;
185 argc
= countargv (argv
);
186 while (stat
< argc
) {
187 if (argv
[stat
][0] == '-') {
188 if (strcmp(argv
[stat
], "-v") == 0) {
191 if (strcmp(argv
[stat
], "-nfp") == 0) {
194 if (strcmp(argv
[stat
], "-ift") == 0) {
197 if (strcmp(argv
[stat
], "-sparclite") == 0) {
200 if (strcmp(argv
[stat
], "-sparclite-board") == 0) {
203 if (strcmp(argv
[stat
], "-dumbio") == 0) {
206 if (strcmp(argv
[stat
], "-wrp") == 0) {
209 if (strcmp(argv
[stat
], "-rom8") == 0) {
212 if (strcmp(argv
[stat
], "-uben") == 0) {
215 if (strcmp(argv
[stat
], "-uart1") == 0) {
216 if ((stat
+ 1) < argc
)
217 strcpy(uart_dev1
, argv
[++stat
]);
219 if (strcmp(argv
[stat
], "-uart2") == 0) {
220 if ((stat
+ 1) < argc
)
221 strcpy(uart_dev2
, argv
[++stat
]);
223 if (strcmp(argv
[stat
], "-nogdb") == 0) {
226 if (strcmp(argv
[stat
], "-freq") == 0) {
227 if ((stat
+ 1) < argc
) {
228 freq
= strtol(argv
[++stat
], (char **)NULL
, 0);
231 if (strncmp(argv
[stat
], "--sysroot=", sizeof("--sysroot=") - 1) == 0) {
232 /* Ignore until we start to support this. */
234 (*sim_callback
->printf_filtered
) (sim_callback
,
235 "unknown option %s\n",
239 bfd_load(argv
[stat
]);
244 (*sim_callback
->printf_filtered
) (sim_callback
, "\n SIS - SPARC instruction simulator %s\n", sis_version
);
245 (*sim_callback
->printf_filtered
) (sim_callback
, " Bug-reports to Jiri Gaisler ESA/ESTEC (jgais@wd.estec.esa.nl)\n");
247 (*sim_callback
->printf_filtered
) (sim_callback
, "no FPU\n");
249 (*sim_callback
->printf_filtered
) (sim_callback
, "simulating Sparclite\n");
251 (*sim_callback
->printf_filtered
) (sim_callback
, "dumb IO (no input, dumb output)\n");
252 if (sis_gdb_break
== 0)
253 (*sim_callback
->printf_filtered
) (sim_callback
, "disabling GDB trap handling for breakpoints\n");
255 (*sim_callback
->printf_filtered
) (sim_callback
, " ERC32 freq %d Mhz\n", freq
);
258 sregs
.freq
= freq
? freq
: 15;
260 termsave
= fcntl(0, F_GETFL
, 0);
262 INIT_DISASSEMBLE_INFO(dinfo
, stdout
,(fprintf_ftype
)fprintf
,
264 #ifdef HOST_LITTLE_ENDIAN
265 dinfo
.endian
= BFD_ENDIAN_LITTLE
;
267 dinfo
.endian
= BFD_ENDIAN_BIG
;
275 /* Fudge our descriptor for now. */
280 sim_close(SIM_DESC sd
, int quitting
)
285 fcntl(0, F_SETFL
, termsave
);
290 sim_load(SIM_DESC sd
, const char *prog
, bfd
*abfd
, int from_tty
)
297 sim_create_inferior(SIM_DESC sd
, bfd
*abfd
, char * const *argv
,
300 bfd_vma start_address
= 0;
302 start_address
= bfd_get_start_address (abfd
);
307 sregs
.pc
= start_address
& ~3;
308 sregs
.npc
= sregs
.pc
+ 4;
313 sim_store_register(SIM_DESC sd
, int regno
, unsigned char *value
, int length
)
317 regval
= (value
[0] << 24) | (value
[1] << 16)
318 | (value
[2] << 8) | value
[3];
319 set_regi(&sregs
, regno
, regval
);
325 sim_fetch_register(SIM_DESC sd
, int regno
, unsigned char *buf
, int length
)
327 get_regi(&sregs
, regno
, buf
);
332 sim_write (SIM_DESC sd
, SIM_ADDR mem
, const unsigned char *buf
, int length
)
336 for (i
= 0; i
< length
; i
++) {
337 sis_memory_write ((mem
+ i
) ^ EBT
, &buf
[i
], 1);
343 sim_read (SIM_DESC sd
, SIM_ADDR mem
, unsigned char *buf
, int length
)
347 for (i
= 0; i
< length
; i
++) {
348 sis_memory_read ((mem
+ i
) ^ EBT
, &buf
[i
], 1);
354 sim_info(SIM_DESC sd
, int verbose
)
362 sim_stop_reason(SIM_DESC sd
, enum sim_stop
*reason
, int *sigrc
)
367 *reason
= sim_stopped
;
368 *sigrc
= GDB_SIGNAL_INT
;
373 *reason
= sim_stopped
;
374 *sigrc
= GDB_SIGNAL_TRAP
;
378 *reason
= sim_exited
;
384 /* Flush all register windows out to the stack. Starting after the invalid
385 window, flush all windows up to, and including the current window. This
386 allows GDB to do backtraces and look at local variables for frames that
387 are still in the register windows. Note that strictly speaking, this
388 behavior is *wrong* for several reasons. First, it doesn't use the window
389 overflow handlers. It therefore assumes standard frame layouts and window
390 handling policies. Second, it changes system state behind the back of the
391 target program. I expect this to mainly pose problems when debugging trap
403 /* Keep current window handy */
405 cwp
= sregs
.psr
& PSR_CWP
;
407 /* Calculate the invalid window from the wim. */
409 for (invwin
= 0; invwin
<= PSR_CWP
; invwin
++)
410 if ((sregs
.wim
>> invwin
) & 1)
413 /* Start saving with the window after the invalid window. */
415 invwin
= (invwin
- 1) & PSR_CWP
;
417 for (win
= invwin
; ; win
= (win
- 1) & PSR_CWP
)
422 sp
= sregs
.r
[(win
* 16 + 14) & 0x7f];
424 if (sis_verbose
> 2) {
425 uint32_t fp
= sregs
.r
[(win
* 16 + 30) & 0x7f];
426 printf("flush_window: win %d, sp %x, fp %x\n", win
, sp
, fp
);
430 for (i
= 0; i
< 16; i
++)
431 memory_write (11, sp
+ 4 * i
, &sregs
.r
[(win
* 16 + 16 + i
) & 0x7f], 2,
440 sim_resume(SIM_DESC sd
, int step
, int siggnal
)
442 simstat
= run_sim(&sregs
, UINT64_MAX
, 0);
444 if (sis_gdb_break
) flush_windows ();
448 sim_do_command(SIM_DESC sd
, const char *cmd
)
450 exec_cmd(&sregs
, cmd
);
454 sim_complete_command (SIM_DESC sd
, const char *text
, const char *word
)
460 sim_memory_map (SIM_DESC sd
)
465 #if 0 /* FIXME: These shouldn't exist. */
468 sim_insert_breakpoint(int addr
)
470 if (sregs
.bptnum
< BPT_MAX
) {
471 sregs
.bpts
[sregs
.bptnum
] = addr
& ~0x3;
474 (*sim_callback
->printf_filtered
) (sim_callback
, "inserted HW BP at %x\n", addr
);
481 sim_remove_breakpoint(int addr
)
485 while ((i
< sregs
.bptnum
) && (sregs
.bpts
[i
] != addr
))
487 if (addr
== sregs
.bpts
[i
]) {
488 for (; i
< sregs
.bptnum
- 1; i
++)
489 sregs
.bpts
[i
] = sregs
.bpts
[i
+ 1];
492 (*sim_callback
->printf_filtered
) (sim_callback
, "removed HW BP at %x\n", addr
);