]>
git.ipfire.org Git - thirdparty/binutils-gdb.git/blob - sim/rl78/gdb-if.c
1 /* gdb-if.c -- sim interface to GDB.
3 Copyright (C) 2011-2021 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 "libiberty.h"
31 #include "sim/callback.h"
33 #include "gdb/signals.h"
34 #include "gdb/sim-rl78.h"
41 /* Ideally, we'd wrap up all the minisim's data structures in an
42 object and pass that around. However, neither GDB nor run needs
45 So we just have one instance, that lives in global variables, and
46 each time we open it, we re-initialize it. */
53 static struct sim_state the_minisim
= {
54 "This is the sole rl78 minisim instance."
59 static struct host_callback_struct
*host_callbacks
;
61 /* Open an instance of the sim. For this sim, only one instance
62 is permitted. If sim_open() is called multiple times, the sim
66 sim_open (SIM_OPEN_KIND kind
,
67 struct host_callback_struct
*callback
,
68 struct bfd
*abfd
, char * const *argv
)
71 fprintf (stderr
, "rl78 minisim: re-opened sim\n");
73 /* The 'run' interface doesn't use this function, so we don't care
74 about KIND; it's always SIM_OPEN_DEBUG. */
75 if (kind
!= SIM_OPEN_DEBUG
)
76 fprintf (stderr
, "rl78 minisim: sim_open KIND != SIM_OPEN_DEBUG: %d\n",
79 /* We use this for the load command. Perhaps someday, it'll be used
81 host_callbacks
= callback
;
83 /* We don't expect any command-line arguments. */
88 sim_disasm_init (abfd
);
91 while (argv
!= NULL
&& *argv
!= NULL
)
93 if (strcmp (*argv
, "g10") == 0 || strcmp (*argv
, "-Mg10") == 0)
95 fprintf (stderr
, "rl78 g10 support enabled.\n");
99 mem_set_mirror (0, 0xf8000, 4096);
102 if (strcmp (*argv
, "g13") == 0 || strcmp (*argv
, "-Mg13") == 0)
104 fprintf (stderr
, "rl78 g13 support enabled.\n");
110 if (strcmp (*argv
, "g14") == 0 || strcmp (*argv
, "-Mg14") == 0)
112 fprintf (stderr
, "rl78 g14 support enabled.\n");
124 /* Verify the sim descriptor. Just print a message if the descriptor
125 doesn't match. Nothing bad will happen if the descriptor doesn't
126 match because all of the state is global. But if it doesn't
127 match, that means there's a problem with the caller. */
130 check_desc (SIM_DESC sd
)
132 if (sd
!= &the_minisim
)
133 fprintf (stderr
, "rl78 minisim: desc != &the_minisim\n");
139 sim_close (SIM_DESC sd
, int quitting
)
143 /* Not much to do. At least free up our memory. */
149 /* Open the program to run; print a message if the program cannot
153 open_objfile (const char *filename
)
155 bfd
*prog
= bfd_openr (filename
, 0);
159 fprintf (stderr
, "Can't read %s\n", filename
);
163 if (!bfd_check_format (prog
, bfd_object
))
165 fprintf (stderr
, "%s not a rl78 program\n", filename
);
172 /* Load a program. */
175 sim_load (SIM_DESC sd
, const char *prog
, struct bfd
*abfd
, int from_tty
)
180 abfd
= open_objfile (prog
);
184 rl78_load (abfd
, host_callbacks
, "sim");
189 /* Create inferior. */
192 sim_create_inferior (SIM_DESC sd
, struct bfd
*abfd
,
193 char * const *argv
, char * const *env
)
198 rl78_load (abfd
, 0, "sim");
206 sim_read (SIM_DESC sd
, SIM_ADDR mem
, unsigned char *buf
, int length
)
212 else if (mem
+ length
> MEM_SIZE
)
213 length
= MEM_SIZE
- mem
;
215 mem_get_blk (mem
, buf
, length
);
222 sim_write (SIM_DESC sd
, SIM_ADDR mem
, const unsigned char *buf
, int length
)
228 else if (mem
+ length
> MEM_SIZE
)
229 length
= MEM_SIZE
- mem
;
231 mem_put_blk (mem
, buf
, length
);
235 /* Read the LENGTH bytes at BUF as an little-endian value. */
238 get_le (unsigned char *buf
, int length
)
242 while (--length
>= 0)
243 acc
= (acc
<< 8) + buf
[length
];
248 /* Store VAL as a little-endian value in the LENGTH bytes at BUF. */
251 put_le (unsigned char *buf
, int length
, SI val
)
255 for (i
= 0; i
< length
; i
++)
262 /* Verify that REGNO is in the proper range. Return 0 if not and
263 something non-zero if so. */
266 check_regno (enum sim_rl78_regnum regno
)
268 return 0 <= regno
&& regno
< sim_rl78_num_regs
;
271 /* Return the size of the register REGNO. */
274 reg_size (enum sim_rl78_regnum regno
)
278 if (regno
== sim_rl78_pc_regnum
)
286 /* Return the register address associated with the register specified by
290 reg_addr (enum sim_rl78_regnum regno
)
292 if (sim_rl78_bank0_r0_regnum
<= regno
293 && regno
<= sim_rl78_bank0_r7_regnum
)
294 return 0xffef8 + (regno
- sim_rl78_bank0_r0_regnum
);
295 else if (sim_rl78_bank1_r0_regnum
<= regno
296 && regno
<= sim_rl78_bank1_r7_regnum
)
297 return 0xffef0 + (regno
- sim_rl78_bank1_r0_regnum
);
298 else if (sim_rl78_bank2_r0_regnum
<= regno
299 && regno
<= sim_rl78_bank2_r7_regnum
)
300 return 0xffee8 + (regno
- sim_rl78_bank2_r0_regnum
);
301 else if (sim_rl78_bank3_r0_regnum
<= regno
302 && regno
<= sim_rl78_bank3_r7_regnum
)
303 return 0xffee0 + (regno
- sim_rl78_bank3_r0_regnum
);
304 else if (regno
== sim_rl78_psw_regnum
)
306 else if (regno
== sim_rl78_es_regnum
)
308 else if (regno
== sim_rl78_cs_regnum
)
310 /* Note: We can't handle PC here because it's not memory mapped. */
311 else if (regno
== sim_rl78_spl_regnum
)
313 else if (regno
== sim_rl78_sph_regnum
)
315 else if (regno
== sim_rl78_pmc_regnum
)
317 else if (regno
== sim_rl78_mem_regnum
)
323 /* Fetch the contents of the register specified by REGNO, placing the
324 contents in BUF. The length LENGTH must match the sim's internal
325 notion of the register's size. */
328 sim_fetch_register (SIM_DESC sd
, int regno
, unsigned char *buf
, int length
)
335 if (!check_regno (regno
))
338 size
= reg_size (regno
);
343 if (regno
== sim_rl78_pc_regnum
)
346 val
= memory
[reg_addr (regno
)];
348 put_le (buf
, length
, val
);
353 /* Store the value stored in BUF to the register REGNO. The length
354 LENGTH must match the sim's internal notion of the register size. */
357 sim_store_register (SIM_DESC sd
, int regno
, unsigned char *buf
, int length
)
364 if (!check_regno (regno
))
367 size
= reg_size (regno
);
372 val
= get_le (buf
, length
);
374 if (regno
== sim_rl78_pc_regnum
)
378 /* The rl78 program counter is 20 bits wide. Ensure that GDB
379 hasn't picked up any stray bits. This has occurred when performing
380 a GDB "return" command in which the return address is obtained
381 from a 32-bit container on the stack. */
382 assert ((pc
& ~0x0fffff) == 0);
385 memory
[reg_addr (regno
)] = val
;
389 /* Print out message associated with "info target". */
392 sim_info (SIM_DESC sd
, int verbose
)
396 printf ("The rl78 minisim doesn't collect any statistics.\n");
399 static volatile int stop
;
400 static enum sim_stop reason
;
404 /* Given a signal number used by the rl78 bsp (that is, newlib),
405 return the corresponding signal numbers. */
408 rl78_signal_to_target (int sig
)
413 return GDB_SIGNAL_ILL
;
416 return GDB_SIGNAL_TRAP
;
419 return GDB_SIGNAL_BUS
;
422 return GDB_SIGNAL_SEGV
;
425 return GDB_SIGNAL_XCPU
;
429 return GDB_SIGNAL_INT
;
432 return GDB_SIGNAL_FPE
;
436 return GDB_SIGNAL_ABRT
;
443 /* Take a step return code RC and set up the variables consulted by
444 sim_stop_reason appropriately. */
449 if (RL78_STEPPED (rc
) || RL78_HIT_BREAK (rc
))
451 reason
= sim_stopped
;
452 siggnal
= GDB_SIGNAL_TRAP
;
454 else if (RL78_STOPPED (rc
))
456 reason
= sim_stopped
;
457 siggnal
= rl78_signal_to_target (RL78_STOP_SIG (rc
));
461 assert (RL78_EXITED (rc
));
463 siggnal
= RL78_EXIT_STATUS (rc
);
468 /* Resume execution after a stop. */
471 sim_resume (SIM_DESC sd
, int step
, int sig_to_deliver
)
477 if (sig_to_deliver
!= 0)
480 "Warning: the rl78 minisim does not implement "
481 "signal delivery yet.\n" "Resuming with no signal.\n");
484 /* We don't clear 'stop' here, because then we would miss
485 interrupts that arrived on the way here. Instead, we clear
486 the flag in sim_stop_reason, after GDB has disabled the
487 interrupt signal handler. */
493 reason
= sim_stopped
;
494 siggnal
= GDB_SIGNAL_INT
;
498 rc
= setjmp (decode_jmp_buf
);
500 rc
= decode_opcode ();
502 if (!RL78_STEPPED (rc
) || step
)
513 sim_stop (SIM_DESC sd
)
520 /* Fetch the stop reason and signal. */
523 sim_stop_reason (SIM_DESC sd
, enum sim_stop
*reason_p
, int *sigrc_p
)
531 /* Execute the sim-specific command associated with GDB's "sim ..."
535 sim_do_command (SIM_DESC sd
, const char *cmd
)
538 char **argv
= buildargv (cmd
);
551 if (strcmp (cmd
, "trace") == 0)
553 if (strcmp (arg
, "on") == 0)
555 else if (strcmp (arg
, "off") == 0)
558 printf ("The 'sim trace' command expects 'on' or 'off' "
559 "as an argument.\n");
561 else if (strcmp (cmd
, "verbose") == 0)
563 if (strcmp (arg
, "on") == 0)
565 else if (strcmp (arg
, "noisy") == 0)
567 else if (strcmp (arg
, "off") == 0)
570 printf ("The 'sim verbose' command expects 'on', 'noisy', or 'off'"
571 " as an argument.\n");
574 printf ("The 'sim' command expects either 'trace' or 'verbose'"
575 " as a subcommand.\n");
580 /* Stub for command completion. */
583 sim_complete_command (SIM_DESC sd
, const char *text
, const char *word
)
589 sim_memory_map (SIM_DESC sd
)