2 * This file is part of SIS.
4 * SIS, SPARC instruction simulator V1.6 Copyright (C) 1995 Jiri Gaisler,
5 * European Space Agency
7 * This program is free software; you can redistribute it and/or modify it under
8 * the terms of the GNU General Public License as published by the Free
9 * Software Foundation; either version 2 of the License, or (at your option)
12 * This program is distributed in the hope that it will be useful, but WITHOUT
13 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
17 * You should have received a copy of the GNU General Public License along with
18 * this program; if not, write to the Free Software Foundation, Inc., 675
19 * Mass Ave, Cambridge, MA 02139, USA.
26 #include <sys/fcntl.h>
31 #include "remote-sim.h"
37 #define VAL(x) strtol(x,(char *)NULL,0)
39 extern char **buildargv(char *input
);
41 extern struct disassemble_info dinfo
;
42 extern struct pstate sregs
;
43 extern struct estate ebase
;
50 extern int sis_verbose
;
51 extern char *sis_version
;
52 extern struct estate ebase
;
53 extern struct evcell evbuf
[];
54 extern struct irqcell irqarr
[];
55 extern int irqpend
, ext_irl
;
58 extern char uart_dev1
[], uart_dev2
[];
60 int sis_gdb_break
= 1;
62 host_callback
*sim_callback
;
64 run_sim(sregs
, go
, icount
, dis
)
73 (*sim_callback
->printf_filtered
) (sim_callback
, "resuming at %x\n",
76 sregs
->starttime
= time(NULL
);
77 while ((!sregs
->err_mode
& (go
|| (icount
> 0))) &&
78 ((sregs
->bptnum
== 0) || !(sregs
->bphit
= check_bpt(sregs
)))) {
84 check_interrupts(sregs
);
86 sregs
->err_mode
= execute_trap(sregs
);
88 if (sregs
->psr
& 0x080)
93 mexc
= memory_read(sregs
->asi
, sregs
->pc
, &sregs
->inst
, &sregs
->hold
);
97 sregs
->pc
= sregs
->npc
;
98 sregs
->npc
= sregs
->npc
+ 4;
101 sregs
->trap
= I_ACC_EXC
;
103 if (sregs
->histlen
) {
104 sregs
->histbuf
[sregs
->histind
].addr
= sregs
->pc
;
105 sregs
->histbuf
[sregs
->histind
].time
= ebase
.simtime
;
107 if (sregs
->histind
>= sregs
->histlen
)
111 printf(" %8d ", ebase
.simtime
);
112 dis_mem(sregs
->pc
, 1, &dinfo
);
114 if ((sis_gdb_break
) && (sregs
->inst
== 0x91d02001)) {
116 (*sim_callback
->printf_filtered
) (sim_callback
,
117 "SW BP hit at %x\n", sregs
->pc
);
123 dispatch_instruction(sregs
);
128 sregs
->err_mode
= execute_trap(sregs
);
137 sregs
->tottime
+= time(NULL
) - sregs
->starttime
;
141 error_mode(sregs
->pc
);
146 (*sim_callback
->printf_filtered
) (sim_callback
,
147 "HW BP hit at %x\n", sregs
->pc
);
158 sim_set_callbacks (ptr
)
171 sim_open (kind
, callback
, abfd
, argv
)
173 struct host_callback_struct
*callback
;
184 sim_callback
= callback
;
186 (*sim_callback
->printf_filtered
) (sim_callback
, "\n SIS - SPARC instruction simulator %s\n", sis_version
);
187 (*sim_callback
->printf_filtered
) (sim_callback
, " Bug-reports to Jiri Gaisler ESA/ESTEC (jgais@wd.estec.esa.nl)\n");
190 while (stat
< argc
) {
191 if (argv
[stat
][0] == '-') {
192 if (strcmp(argv
[stat
], "-v") == 0) {
195 if (strcmp(argv
[stat
], "-nfp") == 0) {
196 (*sim_callback
->printf_filtered
) (sim_callback
, "no FPU\n");
199 if (strcmp(argv
[stat
], "-ift") == 0) {
202 if (strcmp(argv
[stat
], "-sparclite") == 0) {
203 (*sim_callback
->printf_filtered
) (sim_callback
, "simulating Sparclite\n");
206 if (strcmp(argv
[stat
], "-wrp") == 0) {
209 if (strcmp(argv
[stat
], "-rom8") == 0) {
212 if (strcmp(argv
[stat
], "-uart1") == 0) {
213 if ((stat
+ 1) < argc
)
214 strcpy(uart_dev1
, argv
[++stat
]);
216 if (strcmp(argv
[stat
], "-uart2") == 0) {
217 if ((stat
+ 1) < argc
)
218 strcpy(uart_dev2
, argv
[++stat
]);
220 if (strcmp(argv
[stat
], "-nogdb") == 0) {
221 (*sim_callback
->printf_filtered
) (sim_callback
, "disabling GDB trap handling for breakpoints\n");
224 if (strcmp(argv
[stat
], "-freq") == 0)
225 if ((stat
+ 1) < argc
) {
226 freq
= VAL(argv
[++stat
]);
227 (*sim_callback
->printf_filtered
) (sim_callback
, " ERC32 freq %d Mhz\n", freq
);
230 bfd_load(argv
[stat
]);
234 termsave
= fcntl(0, F_GETFL
, 0);
235 INIT_DISASSEMBLE_INFO(dinfo
, stdout
,(fprintf_ftype
)fprintf
);
236 dinfo
.endian
= BFD_ENDIAN_BIG
;
244 /* Fudge our descriptor for now. */
249 sim_close(sd
, quitting
)
255 fcntl(0, F_SETFL
, termsave
);
259 /* For communication from sim_load to sim_create_inferior. */
260 static bfd_vma start_address
;
263 sim_load(sd
, prog
, abfd
, from_tty
)
269 start_address
= bfd_load (prog
);
274 sim_create_inferior(sd
, argv
, env
)
282 sregs
.pc
= start_address
& ~3;
283 sregs
.npc
= sregs
.pc
+ 4;
288 sim_store_register(sd
, regno
, value
)
291 unsigned char *value
;
293 /* FIXME: Review the computation of regval. */
294 int regval
= (value
[0] << 24) | (value
[1] << 16) | (value
[2] << 8) | value
[3];
295 set_regi(&sregs
, regno
, regval
);
300 sim_fetch_register(sd
, regno
, buf
)
305 get_regi(&sregs
, regno
, buf
);
309 sim_write(sd
, mem
, buf
, length
)
315 return (sis_memory_write(mem
, buf
, length
));
319 sim_read(sd
, mem
, buf
, length
)
325 return (sis_memory_read(mem
, buf
, length
));
329 sim_info(sd
, verbose
)
339 sim_stop_reason(sd
, reason
, sigrc
)
341 enum sim_stop
* reason
;
347 *reason
= sim_stopped
;
353 *reason
= sim_stopped
;
361 *reason
= sim_exited
;
367 /* Flush all register windows out to the stack. Starting after the invalid
368 window, flush all windows up to, and including the current window. This
369 allows GDB to do backtraces and look at local variables for frames that
370 are still in the register windows. Note that strictly speaking, this
371 behavior is *wrong* for several reasons. First, it doesn't use the window
372 overflow handlers. It therefore assumes standard frame layouts and window
373 handling policies. Second, it changes system state behind the back of the
374 target program. I expect this to mainly pose problems when debugging trap
388 /* Keep current window handy */
390 cwp
= sregs
.psr
& PSR_CWP
;
392 /* Calculate the invalid window from the wim. */
394 for (invwin
= 0; invwin
<= PSR_CWP
; invwin
++)
395 if ((sregs
.wim
>> invwin
) & 1)
398 /* Start saving with the window after the invalid window. */
400 invwin
= (invwin
- 1) & PSR_CWP
;
402 for (win
= invwin
; ; win
= (win
- 1) & PSR_CWP
)
407 sp
= sregs
.r
[(win
* 16 + 14) & 0x7f];
409 for (i
= 0; i
< 16; i
++)
410 memory_write (11, sp
+ 4 * i
, &sregs
.r
[(win
* 16 + 16 + i
) & 0x7f], 2,
419 sim_resume(SIM_DESC sd
, int step
, int siggnal
)
421 simstat
= run_sim(&sregs
, 1, 0, 0);
423 if (sis_gdb_break
) flush_windows ();
430 /* FIXME: unfinished */
431 sim_resume (sd
, 0, 0);
436 sim_do_command(sd
, cmd
)
440 exec_cmd(&sregs
, cmd
);
443 #if 0 /* FIXME: These shouldn't exist. */
446 sim_insert_breakpoint(int addr
)
448 if (sregs
.bptnum
< BPT_MAX
) {
449 sregs
.bpts
[sregs
.bptnum
] = addr
& ~0x3;
452 (*sim_callback
->printf_filtered
) (sim_callback
, "inserted HW BP at %x\n", addr
);
459 sim_remove_breakpoint(int addr
)
463 while ((i
< sregs
.bptnum
) && (sregs
.bpts
[i
] != addr
))
465 if (addr
== sregs
.bpts
[i
]) {
466 for (; i
< sregs
.bptnum
- 1; i
++)
467 sregs
.bpts
[i
] = sregs
.bpts
[i
+ 1];
470 (*sim_callback
->printf_filtered
) (sim_callback
, "removed HW BP at %x\n", addr
);
This page took 0.041175 seconds and 5 git commands to generate.