1 /* gdb-if.c -- sim interface to GDB.
3 Copyright (C) 2011-2014 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/>. */
30 #include "gdb/callback.h"
31 #include "gdb/remote-sim.h"
32 #include "gdb/signals.h"
33 #include "gdb/sim-rl78.h"
40 /* Ideally, we'd wrap up all the minisim's data structures in an
41 object and pass that around. However, neither GDB nor run needs
44 So we just have one instance, that lives in global variables, and
45 each time we open it, we re-initialize it. */
52 static struct sim_state the_minisim
= {
53 "This is the sole rl78 minisim instance."
58 static struct host_callback_struct
*host_callbacks
;
60 /* Open an instance of the sim. For this sim, only one instance
61 is permitted. If sim_open() is called multiple times, the sim
65 sim_open (SIM_OPEN_KIND kind
,
66 struct host_callback_struct
*callback
,
67 struct bfd
*abfd
, char **argv
)
70 fprintf (stderr
, "rl78 minisim: re-opened sim\n");
72 /* The 'run' interface doesn't use this function, so we don't care
73 about KIND; it's always SIM_OPEN_DEBUG. */
74 if (kind
!= SIM_OPEN_DEBUG
)
75 fprintf (stderr
, "rl78 minisim: sim_open KIND != SIM_OPEN_DEBUG: %d\n",
78 /* We use this for the load command. Perhaps someday, it'll be used
80 host_callbacks
= callback
;
82 /* We don't expect any command-line arguments. */
87 sim_disasm_init (abfd
);
92 /* Verify the sim descriptor. Just print a message if the descriptor
93 doesn't match. Nothing bad will happen if the descriptor doesn't
94 match because all of the state is global. But if it doesn't
95 match, that means there's a problem with the caller. */
98 check_desc (SIM_DESC sd
)
100 if (sd
!= &the_minisim
)
101 fprintf (stderr
, "rl78 minisim: desc != &the_minisim\n");
107 sim_close (SIM_DESC sd
, int quitting
)
111 /* Not much to do. At least free up our memory. */
117 /* Open the program to run; print a message if the program cannot
121 open_objfile (const char *filename
)
123 bfd
*prog
= bfd_openr (filename
, 0);
127 fprintf (stderr
, "Can't read %s\n", filename
);
131 if (!bfd_check_format (prog
, bfd_object
))
133 fprintf (stderr
, "%s not a rl78 program\n", filename
);
140 /* Load a program. */
143 sim_load (SIM_DESC sd
, char *prog
, struct bfd
*abfd
, int from_tty
)
148 abfd
= open_objfile (prog
);
152 rl78_load (abfd
, host_callbacks
, "sim");
157 /* Create inferior. */
160 sim_create_inferior (SIM_DESC sd
, struct bfd
*abfd
, char **argv
, char **env
)
165 rl78_load (abfd
, 0, "sim");
173 sim_read (SIM_DESC sd
, SIM_ADDR mem
, unsigned char *buf
, int length
)
179 else if (mem
+ length
> MEM_SIZE
)
180 length
= MEM_SIZE
- mem
;
182 mem_get_blk (mem
, buf
, length
);
189 sim_write (SIM_DESC sd
, SIM_ADDR mem
, const unsigned char *buf
, int length
)
195 else if (mem
+ length
> MEM_SIZE
)
196 length
= MEM_SIZE
- mem
;
198 mem_put_blk (mem
, buf
, length
);
202 /* Read the LENGTH bytes at BUF as an little-endian value. */
205 get_le (unsigned char *buf
, int length
)
209 while (--length
>= 0)
210 acc
= (acc
<< 8) + buf
[length
];
215 /* Store VAL as a little-endian value in the LENGTH bytes at BUF. */
218 put_le (unsigned char *buf
, int length
, SI val
)
222 for (i
= 0; i
< length
; i
++)
229 /* Verify that REGNO is in the proper range. Return 0 if not and
230 something non-zero if so. */
233 check_regno (enum sim_rl78_regnum regno
)
235 return 0 <= regno
&& regno
< sim_rl78_num_regs
;
238 /* Return the size of the register REGNO. */
241 reg_size (enum sim_rl78_regnum regno
)
245 if (regno
== sim_rl78_pc_regnum
)
253 /* Return the register address associated with the register specified by
257 reg_addr (enum sim_rl78_regnum regno
)
259 if (sim_rl78_bank0_r0_regnum
<= regno
260 && regno
<= sim_rl78_bank0_r7_regnum
)
261 return 0xffef8 + (regno
- sim_rl78_bank0_r0_regnum
);
262 else if (sim_rl78_bank1_r0_regnum
<= regno
263 && regno
<= sim_rl78_bank1_r7_regnum
)
264 return 0xffef0 + (regno
- sim_rl78_bank1_r0_regnum
);
265 else if (sim_rl78_bank2_r0_regnum
<= regno
266 && regno
<= sim_rl78_bank2_r7_regnum
)
267 return 0xffee8 + (regno
- sim_rl78_bank2_r0_regnum
);
268 else if (sim_rl78_bank3_r0_regnum
<= regno
269 && regno
<= sim_rl78_bank3_r7_regnum
)
270 return 0xffee0 + (regno
- sim_rl78_bank3_r0_regnum
);
271 else if (regno
== sim_rl78_psw_regnum
)
273 else if (regno
== sim_rl78_es_regnum
)
275 else if (regno
== sim_rl78_cs_regnum
)
277 /* Note: We can't handle PC here because it's not memory mapped. */
278 else if (regno
== sim_rl78_spl_regnum
)
280 else if (regno
== sim_rl78_sph_regnum
)
282 else if (regno
== sim_rl78_pmc_regnum
)
284 else if (regno
== sim_rl78_mem_regnum
)
290 /* Fetch the contents of the register specified by REGNO, placing the
291 contents in BUF. The length LENGTH must match the sim's internal
292 notion of the register's size. */
295 sim_fetch_register (SIM_DESC sd
, int regno
, unsigned char *buf
, int length
)
302 if (!check_regno (regno
))
305 size
= reg_size (regno
);
310 if (regno
== sim_rl78_pc_regnum
)
313 val
= memory
[reg_addr (regno
)];
315 put_le (buf
, length
, val
);
320 /* Store the value stored in BUF to the register REGNO. The length
321 LENGTH must match the sim's internal notion of the register size. */
324 sim_store_register (SIM_DESC sd
, int regno
, unsigned char *buf
, int length
)
331 if (!check_regno (regno
))
334 size
= reg_size (regno
);
339 val
= get_le (buf
, length
);
341 if (regno
== sim_rl78_pc_regnum
)
345 /* The rl78 program counter is 20 bits wide. Ensure that GDB
346 hasn't picked up any stray bits. This has occurred when performing
347 a GDB "return" command in which the return address is obtained
348 from a 32-bit container on the stack. */
349 assert ((pc
& ~0x0fffff) == 0);
352 memory
[reg_addr (regno
)] = val
;
356 /* Print out message associated with "info target". */
359 sim_info (SIM_DESC sd
, int verbose
)
363 printf ("The rl78 minisim doesn't collect any statistics.\n");
366 static volatile int stop
;
367 static enum sim_stop reason
;
371 /* Given a signal number used by the rl78 bsp (that is, newlib),
372 return the corresponding signal numbers. */
375 rl78_signal_to_target (int sig
)
380 return GDB_SIGNAL_ILL
;
383 return GDB_SIGNAL_TRAP
;
386 return GDB_SIGNAL_BUS
;
389 return GDB_SIGNAL_SEGV
;
392 return GDB_SIGNAL_XCPU
;
396 return GDB_SIGNAL_INT
;
399 return GDB_SIGNAL_FPE
;
403 return GDB_SIGNAL_ABRT
;
410 /* Take a step return code RC and set up the variables consulted by
411 sim_stop_reason appropriately. */
416 if (RL78_STEPPED (rc
) || RL78_HIT_BREAK (rc
))
418 reason
= sim_stopped
;
419 siggnal
= GDB_SIGNAL_TRAP
;
421 else if (RL78_STOPPED (rc
))
423 reason
= sim_stopped
;
424 siggnal
= rl78_signal_to_target (RL78_STOP_SIG (rc
));
428 assert (RL78_EXITED (rc
));
430 siggnal
= RL78_EXIT_STATUS (rc
);
435 /* Resume execution after a stop. */
438 sim_resume (SIM_DESC sd
, int step
, int sig_to_deliver
)
444 if (sig_to_deliver
!= 0)
447 "Warning: the rl78 minisim does not implement "
448 "signal delivery yet.\n" "Resuming with no signal.\n");
451 /* We don't clear 'stop' here, because then we would miss
452 interrupts that arrived on the way here. Instead, we clear
453 the flag in sim_stop_reason, after GDB has disabled the
454 interrupt signal handler. */
460 reason
= sim_stopped
;
461 siggnal
= GDB_SIGNAL_INT
;
465 rc
= setjmp (decode_jmp_buf
);
467 rc
= decode_opcode ();
469 if (!RL78_STEPPED (rc
) || step
)
480 sim_stop (SIM_DESC sd
)
487 /* Fetch the stop reason and signal. */
490 sim_stop_reason (SIM_DESC sd
, enum sim_stop
*reason_p
, int *sigrc_p
)
498 /* Execute the sim-specific command associated with GDB's "sim ..."
502 sim_do_command (SIM_DESC sd
, char *cmd
)
517 /* Skip leading whitespace. */
521 /* Find the extent of the command word. */
522 for (p
= cmd
; *p
; p
++)
526 /* Null-terminate the command word, and record the start of any
527 further arguments. */
532 while (isspace (*args
))
539 if (strcmp (cmd
, "trace") == 0)
541 if (strcmp (args
, "on") == 0)
543 else if (strcmp (args
, "off") == 0)
546 printf ("The 'sim trace' command expects 'on' or 'off' "
547 "as an argument.\n");
549 else if (strcmp (cmd
, "verbose") == 0)
551 if (strcmp (args
, "on") == 0)
553 else if (strcmp (args
, "noisy") == 0)
555 else if (strcmp (args
, "off") == 0)
558 printf ("The 'sim verbose' command expects 'on', 'noisy', or 'off'"
559 " as an argument.\n");
562 printf ("The 'sim' command expects either 'trace' or 'verbose'"
563 " as a subcommand.\n");
566 /* Stub for command completion. */
569 sim_complete_command (SIM_DESC sd
, const char *text
, const char *word
)
This page took 0.043765 seconds and 4 git commands to generate.