1 /* gdb-if.c -- sim interface to GDB.
3 Copyright (C) 2011-2012 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 unsigned char hw_breakpoints
[MEM_SIZE
/8];
60 static struct host_callback_struct
*host_callbacks
;
62 /* Open an instance of the sim. For this sim, only one instance
63 is permitted. If sim_open() is called multiple times, the sim
67 sim_open (SIM_OPEN_KIND kind
,
68 struct host_callback_struct
*callback
,
69 struct bfd
*abfd
, char **argv
)
72 fprintf (stderr
, "rl78 minisim: re-opened sim\n");
74 /* The 'run' interface doesn't use this function, so we don't care
75 about KIND; it's always SIM_OPEN_DEBUG. */
76 if (kind
!= SIM_OPEN_DEBUG
)
77 fprintf (stderr
, "rl78 minisim: sim_open KIND != SIM_OPEN_DEBUG: %d\n",
80 /* We use this for the load command. Perhaps someday, it'll be used
82 host_callbacks
= callback
;
84 /* We don't expect any command-line arguments. */
89 sim_disasm_init (abfd
);
94 /* Verify the sim descriptor. Just print a message if the descriptor
95 doesn't match. Nothing bad will happen if the descriptor doesn't
96 match because all of the state is global. But if it doesn't
97 match, that means there's a problem with the caller. */
100 check_desc (SIM_DESC sd
)
102 if (sd
!= &the_minisim
)
103 fprintf (stderr
, "rl78 minisim: desc != &the_minisim\n");
109 sim_close (SIM_DESC sd
, int quitting
)
113 /* Not much to do. At least free up our memory. */
119 /* Open the program to run; print a message if the program cannot
123 open_objfile (const char *filename
)
125 bfd
*prog
= bfd_openr (filename
, 0);
129 fprintf (stderr
, "Can't read %s\n", filename
);
133 if (!bfd_check_format (prog
, bfd_object
))
135 fprintf (stderr
, "%s not a rl78 program\n", filename
);
142 /* Load a program. */
145 sim_load (SIM_DESC sd
, char *prog
, struct bfd
*abfd
, int from_tty
)
150 abfd
= open_objfile (prog
);
154 rl78_load (abfd
, host_callbacks
, "sim");
159 /* Create inferior. */
162 sim_create_inferior (SIM_DESC sd
, struct bfd
*abfd
, char **argv
, char **env
)
167 rl78_load (abfd
, 0, "sim");
175 sim_read (SIM_DESC sd
, SIM_ADDR mem
, unsigned char *buf
, int length
)
181 else if (mem
+ length
> MEM_SIZE
)
182 length
= MEM_SIZE
- mem
;
184 mem_get_blk (mem
, buf
, length
);
191 sim_write (SIM_DESC sd
, SIM_ADDR mem
, const unsigned char *buf
, int length
)
197 else if (mem
+ length
> MEM_SIZE
)
198 length
= MEM_SIZE
- mem
;
200 mem_put_blk (mem
, buf
, length
);
204 /* Read the LENGTH bytes at BUF as an little-endian value. */
207 get_le (unsigned char *buf
, int length
)
211 while (--length
>= 0)
212 acc
= (acc
<< 8) + buf
[length
];
217 /* Store VAL as a little-endian value in the LENGTH bytes at BUF. */
220 put_le (unsigned char *buf
, int length
, SI val
)
224 for (i
= 0; i
< length
; i
++)
231 /* Verify that REGNO is in the proper range. Return 0 if not and
232 something non-zero if so. */
235 check_regno (enum sim_rl78_regnum regno
)
237 return 0 <= regno
&& regno
< sim_rl78_num_regs
;
240 /* Return the size of the register REGNO. */
243 reg_size (enum sim_rl78_regnum regno
)
247 if (regno
== sim_rl78_pc_regnum
)
255 /* Return the register address associated with the register specified by
259 reg_addr (enum sim_rl78_regnum regno
)
261 if (sim_rl78_bank0_r0_regnum
<= regno
262 && regno
<= sim_rl78_bank0_r7_regnum
)
263 return 0xffef8 + (regno
- sim_rl78_bank0_r0_regnum
);
264 else if (sim_rl78_bank1_r0_regnum
<= regno
265 && regno
<= sim_rl78_bank1_r7_regnum
)
266 return 0xffef0 + (regno
- sim_rl78_bank1_r0_regnum
);
267 else if (sim_rl78_bank2_r0_regnum
<= regno
268 && regno
<= sim_rl78_bank2_r7_regnum
)
269 return 0xffee8 + (regno
- sim_rl78_bank2_r0_regnum
);
270 else if (sim_rl78_bank3_r0_regnum
<= regno
271 && regno
<= sim_rl78_bank3_r7_regnum
)
272 return 0xffee0 + (regno
- sim_rl78_bank3_r0_regnum
);
273 else if (regno
== sim_rl78_psw_regnum
)
275 else if (regno
== sim_rl78_es_regnum
)
277 else if (regno
== sim_rl78_cs_regnum
)
279 /* Note: We can't handle PC here because it's not memory mapped. */
280 else if (regno
== sim_rl78_spl_regnum
)
282 else if (regno
== sim_rl78_sph_regnum
)
284 else if (regno
== sim_rl78_pmc_regnum
)
286 else if (regno
== sim_rl78_mem_regnum
)
292 /* Fetch the contents of the register specified by REGNO, placing the
293 contents in BUF. The length LENGTH must match the sim's internal
294 notion of the register's size. */
297 sim_fetch_register (SIM_DESC sd
, int regno
, unsigned char *buf
, int length
)
304 if (!check_regno (regno
))
307 size
= reg_size (regno
);
312 if (regno
== sim_rl78_pc_regnum
)
315 val
= memory
[reg_addr (regno
)];
317 put_le (buf
, length
, val
);
322 /* Store the value stored in BUF to the register REGNO. The length
323 LENGTH must match the sim's internal notion of the register size. */
326 sim_store_register (SIM_DESC sd
, int regno
, unsigned char *buf
, int length
)
333 if (!check_regno (regno
))
336 size
= reg_size (regno
);
341 val
= get_le (buf
, length
);
343 if (regno
== sim_rl78_pc_regnum
)
346 memory
[reg_addr (regno
)] = val
;
350 /* Print out message associated with "info target". */
353 sim_info (SIM_DESC sd
, int verbose
)
357 printf ("The rl78 minisim doesn't collect any statistics.\n");
360 static volatile int stop
;
361 static enum sim_stop reason
;
365 /* Given a signal number used by the rl78 bsp (that is, newlib),
366 return the corresponding signal numbers. */
369 rl78_signal_to_target (int sig
)
374 return TARGET_SIGNAL_ILL
;
377 return TARGET_SIGNAL_TRAP
;
380 return TARGET_SIGNAL_BUS
;
383 return TARGET_SIGNAL_SEGV
;
386 return TARGET_SIGNAL_XCPU
;
390 return TARGET_SIGNAL_INT
;
393 return TARGET_SIGNAL_FPE
;
397 return TARGET_SIGNAL_ABRT
;
404 /* Take a step return code RC and set up the variables consulted by
405 sim_stop_reason appropriately. */
410 if (RL78_STEPPED (rc
) || RL78_HIT_BREAK (rc
))
412 reason
= sim_stopped
;
413 siggnal
= TARGET_SIGNAL_TRAP
;
415 else if (RL78_STOPPED (rc
))
417 reason
= sim_stopped
;
418 siggnal
= rl78_signal_to_target (RL78_STOP_SIG (rc
));
422 assert (RL78_EXITED (rc
));
424 siggnal
= RL78_EXIT_STATUS (rc
);
429 /* Resume execution after a stop. */
432 sim_resume (SIM_DESC sd
, int step
, int sig_to_deliver
)
438 if (sig_to_deliver
!= 0)
441 "Warning: the rl78 minisim does not implement "
442 "signal delivery yet.\n" "Resuming with no signal.\n");
445 /* We don't clear 'stop' here, because then we would miss
446 interrupts that arrived on the way here. Instead, we clear
447 the flag in sim_stop_reason, after GDB has disabled the
448 interrupt signal handler. */
454 reason
= sim_stopped
;
455 siggnal
= TARGET_SIGNAL_INT
;
459 if (hw_breakpoints
[pc
>> 3]
460 && (hw_breakpoints
[pc
>> 3] & (1 << (pc
& 0x7))))
462 reason
= sim_stopped
;
463 siggnal
= TARGET_SIGNAL_TRAP
;
466 rc
= setjmp (decode_jmp_buf
);
468 rc
= decode_opcode ();
470 if (!RL78_STEPPED (rc
) || step
)
481 sim_stop (SIM_DESC sd
)
488 /* Fetch the stop reason and signal. */
491 sim_stop_reason (SIM_DESC sd
, enum sim_stop
*reason_p
, int *sigrc_p
)
499 /* Execute the sim-specific command associated with GDB's "sim ..."
503 sim_do_command (SIM_DESC sd
, char *cmd
)
518 /* Skip leading whitespace. */
522 /* Find the extent of the command word. */
523 for (p
= cmd
; *p
; p
++)
527 /* Null-terminate the command word, and record the start of any
528 further arguments. */
533 while (isspace (*args
))
540 if (strcmp (cmd
, "trace") == 0)
542 if (strcmp (args
, "on") == 0)
544 else if (strcmp (args
, "off") == 0)
547 printf ("The 'sim trace' command expects 'on' or 'off' "
548 "as an argument.\n");
550 else if (strcmp (cmd
, "verbose") == 0)
552 if (strcmp (args
, "on") == 0)
554 else if (strcmp (args
, "noisy") == 0)
556 else if (strcmp (args
, "off") == 0)
559 printf ("The 'sim verbose' command expects 'on', 'noisy', or 'off'"
560 " as an argument.\n");
563 printf ("The 'sim' command expects either 'trace' or 'verbose'"
564 " as a subcommand.\n");
567 /* Stub for command completion. */
570 sim_complete_command (SIM_DESC sd
, char *text
, char *word
)
This page took 0.054882 seconds and 5 git commands to generate.