xref: /netbsd-src/external/gpl3/gdb.old/dist/sim/m32c/gdb-if.c (revision 8b657b0747480f8989760d71343d6dd33f8d4cf9)
1bb16d227Schristos /* gdb.c --- sim interface to GDB.
2bb16d227Schristos 
3*8b657b07Schristos Copyright (C) 2005-2023 Free Software Foundation, Inc.
4bb16d227Schristos Contributed by Red Hat, Inc.
5bb16d227Schristos 
6bb16d227Schristos This file is part of the GNU simulators.
7bb16d227Schristos 
8bb16d227Schristos This program is free software; you can redistribute it and/or modify
9bb16d227Schristos it under the terms of the GNU General Public License as published by
10bb16d227Schristos the Free Software Foundation; either version 3 of the License, or
11bb16d227Schristos (at your option) any later version.
12bb16d227Schristos 
13bb16d227Schristos This program is distributed in the hope that it will be useful,
14bb16d227Schristos but WITHOUT ANY WARRANTY; without even the implied warranty of
15bb16d227Schristos MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16bb16d227Schristos GNU General Public License for more details.
17bb16d227Schristos 
18bb16d227Schristos You should have received a copy of the GNU General Public License
19bb16d227Schristos along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
20bb16d227Schristos 
21*8b657b07Schristos /* This must come before any other includes.  */
22*8b657b07Schristos #include "defs.h"
23*8b657b07Schristos 
24bb16d227Schristos #include <stdio.h>
25bb16d227Schristos #include <assert.h>
26bb16d227Schristos #include <signal.h>
27bb16d227Schristos #include <stdlib.h>
28bb16d227Schristos #include <string.h>
29bb16d227Schristos #include <ctype.h>
30bb16d227Schristos 
31bb16d227Schristos #include "ansidecl.h"
32*8b657b07Schristos #include "libiberty.h"
33*8b657b07Schristos #include "sim/callback.h"
34*8b657b07Schristos #include "sim/sim.h"
35bb16d227Schristos #include "gdb/signals.h"
36bb16d227Schristos #include "gdb/sim-m32c.h"
37bb16d227Schristos 
38bb16d227Schristos #include "cpu.h"
39bb16d227Schristos #include "mem.h"
40bb16d227Schristos #include "load.h"
41bb16d227Schristos #include "syscalls.h"
42bb16d227Schristos #ifdef TIMER_A
43bb16d227Schristos #include "timer_a.h"
44bb16d227Schristos #endif
45bb16d227Schristos 
46bb16d227Schristos /* I don't want to wrap up all the minisim's data structures in an
47bb16d227Schristos    object and pass that around.  That'd be a big change, and neither
48bb16d227Schristos    GDB nor run needs that ability.
49bb16d227Schristos 
50bb16d227Schristos    So we just have one instance, that lives in global variables, and
51bb16d227Schristos    each time we open it, we re-initialize it.  */
52bb16d227Schristos struct sim_state
53bb16d227Schristos {
54bb16d227Schristos   const char *message;
55bb16d227Schristos };
56bb16d227Schristos 
57bb16d227Schristos static struct sim_state the_minisim = {
58bb16d227Schristos   "This is the sole m32c minisim instance.  See libsim.a's global variables."
59bb16d227Schristos };
60bb16d227Schristos 
61*8b657b07Schristos static int is_open;
62bb16d227Schristos 
63bb16d227Schristos SIM_DESC
64bb16d227Schristos sim_open (SIM_OPEN_KIND kind,
65bb16d227Schristos 	  struct host_callback_struct *callback,
66e5cb852cSchristos 	  struct bfd *abfd, char * const *argv)
67bb16d227Schristos {
68bb16d227Schristos   setbuf (stdout, 0);
69*8b657b07Schristos   if (is_open)
70bb16d227Schristos     fprintf (stderr, "m32c minisim: re-opened sim\n");
71bb16d227Schristos 
72bb16d227Schristos   /* The 'run' interface doesn't use this function, so we don't care
73bb16d227Schristos      about KIND; it's always SIM_OPEN_DEBUG.  */
74bb16d227Schristos   if (kind != SIM_OPEN_DEBUG)
75bb16d227Schristos     fprintf (stderr, "m32c minisim: sim_open KIND != SIM_OPEN_DEBUG: %d\n",
76bb16d227Schristos 	     kind);
77bb16d227Schristos 
78bb16d227Schristos   if (abfd)
79bb16d227Schristos     m32c_set_mach (bfd_get_mach (abfd));
80bb16d227Schristos 
81bb16d227Schristos   /* We can use ABFD, if non-NULL to select the appropriate
82bb16d227Schristos      architecture.  But we only support the r8c right now.  */
83bb16d227Schristos 
84bb16d227Schristos   set_callbacks (callback);
85bb16d227Schristos 
86bb16d227Schristos   /* We don't expect any command-line arguments.  */
87bb16d227Schristos 
88bb16d227Schristos   init_mem ();
89bb16d227Schristos   init_regs ();
90bb16d227Schristos 
91*8b657b07Schristos   is_open = 1;
92bb16d227Schristos   return &the_minisim;
93bb16d227Schristos }
94bb16d227Schristos 
95bb16d227Schristos static void
96bb16d227Schristos check_desc (SIM_DESC sd)
97bb16d227Schristos {
98bb16d227Schristos   if (sd != &the_minisim)
99bb16d227Schristos     fprintf (stderr, "m32c minisim: desc != &the_minisim\n");
100bb16d227Schristos }
101bb16d227Schristos 
102bb16d227Schristos void
103bb16d227Schristos sim_close (SIM_DESC sd, int quitting)
104bb16d227Schristos {
105bb16d227Schristos   check_desc (sd);
106bb16d227Schristos 
107bb16d227Schristos   /* Not much to do.  At least free up our memory.  */
108bb16d227Schristos   init_mem ();
109bb16d227Schristos 
110*8b657b07Schristos   is_open = 0;
111bb16d227Schristos }
112bb16d227Schristos 
113bb16d227Schristos static bfd *
114bb16d227Schristos open_objfile (const char *filename)
115bb16d227Schristos {
116bb16d227Schristos   bfd *prog = bfd_openr (filename, 0);
117bb16d227Schristos 
118bb16d227Schristos   if (!prog)
119bb16d227Schristos     {
120bb16d227Schristos       fprintf (stderr, "Can't read %s\n", filename);
121bb16d227Schristos       return 0;
122bb16d227Schristos     }
123bb16d227Schristos 
124bb16d227Schristos   if (!bfd_check_format (prog, bfd_object))
125bb16d227Schristos     {
126bb16d227Schristos       fprintf (stderr, "%s not a m32c program\n", filename);
127bb16d227Schristos       return 0;
128bb16d227Schristos     }
129bb16d227Schristos 
130bb16d227Schristos   return prog;
131bb16d227Schristos }
132bb16d227Schristos 
133bb16d227Schristos 
134bb16d227Schristos SIM_RC
135bb16d227Schristos sim_load (SIM_DESC sd, const char *prog, struct bfd * abfd, int from_tty)
136bb16d227Schristos {
137bb16d227Schristos   check_desc (sd);
138bb16d227Schristos 
139bb16d227Schristos   if (!abfd)
140bb16d227Schristos     abfd = open_objfile (prog);
141bb16d227Schristos   if (!abfd)
142bb16d227Schristos     return SIM_RC_FAIL;
143bb16d227Schristos 
144bb16d227Schristos   m32c_load (abfd);
145bb16d227Schristos 
146bb16d227Schristos   return SIM_RC_OK;
147bb16d227Schristos }
148bb16d227Schristos 
149bb16d227Schristos SIM_RC
150e5cb852cSchristos sim_create_inferior (SIM_DESC sd, struct bfd * abfd,
151e5cb852cSchristos 		     char * const *argv, char * const *env)
152bb16d227Schristos {
153bb16d227Schristos   check_desc (sd);
154bb16d227Schristos 
155bb16d227Schristos   if (abfd)
156bb16d227Schristos     m32c_load (abfd);
157bb16d227Schristos 
158bb16d227Schristos   return SIM_RC_OK;
159bb16d227Schristos }
160bb16d227Schristos 
161bb16d227Schristos int
162*8b657b07Schristos sim_read (SIM_DESC sd, SIM_ADDR mem, void *buf, int length)
163bb16d227Schristos {
164bb16d227Schristos   check_desc (sd);
165bb16d227Schristos 
166bb16d227Schristos   if (mem == 0)
167bb16d227Schristos     return 0;
168bb16d227Schristos 
169bb16d227Schristos   mem_get_blk ((int) mem, buf, length);
170bb16d227Schristos 
171bb16d227Schristos   return length;
172bb16d227Schristos }
173bb16d227Schristos 
174bb16d227Schristos int
175*8b657b07Schristos sim_write (SIM_DESC sd, SIM_ADDR mem, const void *buf, int length)
176bb16d227Schristos {
177bb16d227Schristos   check_desc (sd);
178bb16d227Schristos 
179bb16d227Schristos   mem_put_blk ((int) mem, buf, length);
180bb16d227Schristos 
181bb16d227Schristos   return length;
182bb16d227Schristos }
183bb16d227Schristos 
184bb16d227Schristos 
185bb16d227Schristos /* Read the LENGTH bytes at BUF as an little-endian value.  */
186bb16d227Schristos static DI
187*8b657b07Schristos get_le (const unsigned char *buf, int length)
188bb16d227Schristos {
189bb16d227Schristos   DI acc = 0;
190bb16d227Schristos   while (--length >= 0)
191bb16d227Schristos     acc = (acc << 8) + buf[length];
192bb16d227Schristos 
193bb16d227Schristos   return acc;
194bb16d227Schristos }
195bb16d227Schristos 
196bb16d227Schristos /* Store VAL as a little-endian value in the LENGTH bytes at BUF.  */
197bb16d227Schristos static void
198bb16d227Schristos put_le (unsigned char *buf, int length, DI val)
199bb16d227Schristos {
200bb16d227Schristos   int i;
201bb16d227Schristos 
202bb16d227Schristos   for (i = 0; i < length; i++)
203bb16d227Schristos     {
204bb16d227Schristos       buf[i] = val & 0xff;
205bb16d227Schristos       val >>= 8;
206bb16d227Schristos     }
207bb16d227Schristos }
208bb16d227Schristos 
209bb16d227Schristos static int
210bb16d227Schristos check_regno (enum m32c_sim_reg regno)
211bb16d227Schristos {
212bb16d227Schristos   return 0 <= regno && regno < m32c_sim_reg_num_regs;
213bb16d227Schristos }
214bb16d227Schristos 
215bb16d227Schristos static size_t
216bb16d227Schristos mask_size (int addr_mask)
217bb16d227Schristos {
218bb16d227Schristos   switch (addr_mask)
219bb16d227Schristos     {
220bb16d227Schristos     case 0xffff:
221bb16d227Schristos       return 2;
222bb16d227Schristos     case 0xfffff:
223bb16d227Schristos     case 0xffffff:
224bb16d227Schristos       return 3;
225bb16d227Schristos     default:
226bb16d227Schristos       fprintf (stderr,
227bb16d227Schristos 	       "m32c minisim: addr_mask_size: unexpected mask 0x%x\n",
228bb16d227Schristos 	       addr_mask);
229bb16d227Schristos       return sizeof (addr_mask);
230bb16d227Schristos     }
231bb16d227Schristos }
232bb16d227Schristos 
233bb16d227Schristos static size_t
234bb16d227Schristos reg_size (enum m32c_sim_reg regno)
235bb16d227Schristos {
236bb16d227Schristos   switch (regno)
237bb16d227Schristos     {
238bb16d227Schristos     case m32c_sim_reg_r0_bank0:
239bb16d227Schristos     case m32c_sim_reg_r1_bank0:
240bb16d227Schristos     case m32c_sim_reg_r2_bank0:
241bb16d227Schristos     case m32c_sim_reg_r3_bank0:
242bb16d227Schristos     case m32c_sim_reg_r0_bank1:
243bb16d227Schristos     case m32c_sim_reg_r1_bank1:
244bb16d227Schristos     case m32c_sim_reg_r2_bank1:
245bb16d227Schristos     case m32c_sim_reg_r3_bank1:
246bb16d227Schristos     case m32c_sim_reg_flg:
247bb16d227Schristos     case m32c_sim_reg_svf:
248bb16d227Schristos       return 2;
249bb16d227Schristos 
250bb16d227Schristos     case m32c_sim_reg_a0_bank0:
251bb16d227Schristos     case m32c_sim_reg_a1_bank0:
252bb16d227Schristos     case m32c_sim_reg_fb_bank0:
253bb16d227Schristos     case m32c_sim_reg_sb_bank0:
254bb16d227Schristos     case m32c_sim_reg_a0_bank1:
255bb16d227Schristos     case m32c_sim_reg_a1_bank1:
256bb16d227Schristos     case m32c_sim_reg_fb_bank1:
257bb16d227Schristos     case m32c_sim_reg_sb_bank1:
258bb16d227Schristos     case m32c_sim_reg_usp:
259bb16d227Schristos     case m32c_sim_reg_isp:
260bb16d227Schristos       return mask_size (addr_mask);
261bb16d227Schristos 
262bb16d227Schristos     case m32c_sim_reg_pc:
263bb16d227Schristos     case m32c_sim_reg_intb:
264bb16d227Schristos     case m32c_sim_reg_svp:
265bb16d227Schristos     case m32c_sim_reg_vct:
266bb16d227Schristos       return mask_size (membus_mask);
267bb16d227Schristos 
268bb16d227Schristos     case m32c_sim_reg_dmd0:
269bb16d227Schristos     case m32c_sim_reg_dmd1:
270bb16d227Schristos       return 1;
271bb16d227Schristos 
272bb16d227Schristos     case m32c_sim_reg_dct0:
273bb16d227Schristos     case m32c_sim_reg_dct1:
274bb16d227Schristos     case m32c_sim_reg_drc0:
275bb16d227Schristos     case m32c_sim_reg_drc1:
276bb16d227Schristos       return 2;
277bb16d227Schristos 
278bb16d227Schristos     case m32c_sim_reg_dma0:
279bb16d227Schristos     case m32c_sim_reg_dma1:
280bb16d227Schristos     case m32c_sim_reg_dsa0:
281bb16d227Schristos     case m32c_sim_reg_dsa1:
282bb16d227Schristos     case m32c_sim_reg_dra0:
283bb16d227Schristos     case m32c_sim_reg_dra1:
284bb16d227Schristos       return 3;
285bb16d227Schristos 
286bb16d227Schristos     default:
287bb16d227Schristos       fprintf (stderr, "m32c minisim: unrecognized register number: %d\n",
288bb16d227Schristos 	       regno);
289bb16d227Schristos       return -1;
290bb16d227Schristos     }
291bb16d227Schristos }
292bb16d227Schristos 
293bb16d227Schristos int
294*8b657b07Schristos sim_fetch_register (SIM_DESC sd, int regno, void *buf, int length)
295bb16d227Schristos {
296bb16d227Schristos   size_t size;
297bb16d227Schristos 
298bb16d227Schristos   check_desc (sd);
299bb16d227Schristos 
300bb16d227Schristos   if (!check_regno (regno))
301bb16d227Schristos     return 0;
302bb16d227Schristos 
303bb16d227Schristos   size = reg_size (regno);
304bb16d227Schristos   if (length == size)
305bb16d227Schristos     {
306bb16d227Schristos       DI val;
307bb16d227Schristos 
308bb16d227Schristos       switch (regno)
309bb16d227Schristos 	{
310bb16d227Schristos 	case m32c_sim_reg_r0_bank0:
311bb16d227Schristos 	  val = regs.r[0].r_r0;
312bb16d227Schristos 	  break;
313bb16d227Schristos 	case m32c_sim_reg_r1_bank0:
314bb16d227Schristos 	  val = regs.r[0].r_r1;
315bb16d227Schristos 	  break;
316bb16d227Schristos 	case m32c_sim_reg_r2_bank0:
317bb16d227Schristos 	  val = regs.r[0].r_r2;
318bb16d227Schristos 	  break;
319bb16d227Schristos 	case m32c_sim_reg_r3_bank0:
320bb16d227Schristos 	  val = regs.r[0].r_r3;
321bb16d227Schristos 	  break;
322bb16d227Schristos 	case m32c_sim_reg_a0_bank0:
323bb16d227Schristos 	  val = regs.r[0].r_a0;
324bb16d227Schristos 	  break;
325bb16d227Schristos 	case m32c_sim_reg_a1_bank0:
326bb16d227Schristos 	  val = regs.r[0].r_a1;
327bb16d227Schristos 	  break;
328bb16d227Schristos 	case m32c_sim_reg_fb_bank0:
329bb16d227Schristos 	  val = regs.r[0].r_fb;
330bb16d227Schristos 	  break;
331bb16d227Schristos 	case m32c_sim_reg_sb_bank0:
332bb16d227Schristos 	  val = regs.r[0].r_sb;
333bb16d227Schristos 	  break;
334bb16d227Schristos 	case m32c_sim_reg_r0_bank1:
335bb16d227Schristos 	  val = regs.r[1].r_r0;
336bb16d227Schristos 	  break;
337bb16d227Schristos 	case m32c_sim_reg_r1_bank1:
338bb16d227Schristos 	  val = regs.r[1].r_r1;
339bb16d227Schristos 	  break;
340bb16d227Schristos 	case m32c_sim_reg_r2_bank1:
341bb16d227Schristos 	  val = regs.r[1].r_r2;
342bb16d227Schristos 	  break;
343bb16d227Schristos 	case m32c_sim_reg_r3_bank1:
344bb16d227Schristos 	  val = regs.r[1].r_r3;
345bb16d227Schristos 	  break;
346bb16d227Schristos 	case m32c_sim_reg_a0_bank1:
347bb16d227Schristos 	  val = regs.r[1].r_a0;
348bb16d227Schristos 	  break;
349bb16d227Schristos 	case m32c_sim_reg_a1_bank1:
350bb16d227Schristos 	  val = regs.r[1].r_a1;
351bb16d227Schristos 	  break;
352bb16d227Schristos 	case m32c_sim_reg_fb_bank1:
353bb16d227Schristos 	  val = regs.r[1].r_fb;
354bb16d227Schristos 	  break;
355bb16d227Schristos 	case m32c_sim_reg_sb_bank1:
356bb16d227Schristos 	  val = regs.r[1].r_sb;
357bb16d227Schristos 	  break;
358bb16d227Schristos 
359bb16d227Schristos 	case m32c_sim_reg_usp:
360bb16d227Schristos 	  val = regs.r_usp;
361bb16d227Schristos 	  break;
362bb16d227Schristos 	case m32c_sim_reg_isp:
363bb16d227Schristos 	  val = regs.r_isp;
364bb16d227Schristos 	  break;
365bb16d227Schristos 	case m32c_sim_reg_pc:
366bb16d227Schristos 	  val = regs.r_pc;
367bb16d227Schristos 	  break;
368bb16d227Schristos 	case m32c_sim_reg_intb:
369bb16d227Schristos 	  val = regs.r_intbl * 65536 + regs.r_intbl;
370bb16d227Schristos 	  break;
371bb16d227Schristos 	case m32c_sim_reg_flg:
372bb16d227Schristos 	  val = regs.r_flags;
373bb16d227Schristos 	  break;
374bb16d227Schristos 
375bb16d227Schristos 	  /* These registers aren't implemented by the minisim.  */
376bb16d227Schristos 	case m32c_sim_reg_svf:
377bb16d227Schristos 	case m32c_sim_reg_svp:
378bb16d227Schristos 	case m32c_sim_reg_vct:
379bb16d227Schristos 	case m32c_sim_reg_dmd0:
380bb16d227Schristos 	case m32c_sim_reg_dmd1:
381bb16d227Schristos 	case m32c_sim_reg_dct0:
382bb16d227Schristos 	case m32c_sim_reg_dct1:
383bb16d227Schristos 	case m32c_sim_reg_drc0:
384bb16d227Schristos 	case m32c_sim_reg_drc1:
385bb16d227Schristos 	case m32c_sim_reg_dma0:
386bb16d227Schristos 	case m32c_sim_reg_dma1:
387bb16d227Schristos 	case m32c_sim_reg_dsa0:
388bb16d227Schristos 	case m32c_sim_reg_dsa1:
389bb16d227Schristos 	case m32c_sim_reg_dra0:
390bb16d227Schristos 	case m32c_sim_reg_dra1:
391bb16d227Schristos 	  return 0;
392bb16d227Schristos 
393bb16d227Schristos 	default:
394bb16d227Schristos 	  fprintf (stderr, "m32c minisim: unrecognized register number: %d\n",
395bb16d227Schristos 		   regno);
396bb16d227Schristos 	  return -1;
397bb16d227Schristos 	}
398bb16d227Schristos 
399bb16d227Schristos       put_le (buf, length, val);
400bb16d227Schristos     }
401bb16d227Schristos 
402bb16d227Schristos   return size;
403bb16d227Schristos }
404bb16d227Schristos 
405bb16d227Schristos int
406*8b657b07Schristos sim_store_register (SIM_DESC sd, int regno, const void *buf, int length)
407bb16d227Schristos {
408bb16d227Schristos   size_t size;
409bb16d227Schristos 
410bb16d227Schristos   check_desc (sd);
411bb16d227Schristos 
412bb16d227Schristos   if (!check_regno (regno))
413bb16d227Schristos     return -1;
414bb16d227Schristos 
415bb16d227Schristos   size = reg_size (regno);
416bb16d227Schristos 
417bb16d227Schristos   if (length == size)
418bb16d227Schristos     {
419bb16d227Schristos       DI val = get_le (buf, length);
420bb16d227Schristos 
421bb16d227Schristos       switch (regno)
422bb16d227Schristos 	{
423bb16d227Schristos 	case m32c_sim_reg_r0_bank0:
424bb16d227Schristos 	  regs.r[0].r_r0 = val & 0xffff;
425bb16d227Schristos 	  break;
426bb16d227Schristos 	case m32c_sim_reg_r1_bank0:
427bb16d227Schristos 	  regs.r[0].r_r1 = val & 0xffff;
428bb16d227Schristos 	  break;
429bb16d227Schristos 	case m32c_sim_reg_r2_bank0:
430bb16d227Schristos 	  regs.r[0].r_r2 = val & 0xffff;
431bb16d227Schristos 	  break;
432bb16d227Schristos 	case m32c_sim_reg_r3_bank0:
433bb16d227Schristos 	  regs.r[0].r_r3 = val & 0xffff;
434bb16d227Schristos 	  break;
435bb16d227Schristos 	case m32c_sim_reg_a0_bank0:
436bb16d227Schristos 	  regs.r[0].r_a0 = val & addr_mask;
437bb16d227Schristos 	  break;
438bb16d227Schristos 	case m32c_sim_reg_a1_bank0:
439bb16d227Schristos 	  regs.r[0].r_a1 = val & addr_mask;
440bb16d227Schristos 	  break;
441bb16d227Schristos 	case m32c_sim_reg_fb_bank0:
442bb16d227Schristos 	  regs.r[0].r_fb = val & addr_mask;
443bb16d227Schristos 	  break;
444bb16d227Schristos 	case m32c_sim_reg_sb_bank0:
445bb16d227Schristos 	  regs.r[0].r_sb = val & addr_mask;
446bb16d227Schristos 	  break;
447bb16d227Schristos 	case m32c_sim_reg_r0_bank1:
448bb16d227Schristos 	  regs.r[1].r_r0 = val & 0xffff;
449bb16d227Schristos 	  break;
450bb16d227Schristos 	case m32c_sim_reg_r1_bank1:
451bb16d227Schristos 	  regs.r[1].r_r1 = val & 0xffff;
452bb16d227Schristos 	  break;
453bb16d227Schristos 	case m32c_sim_reg_r2_bank1:
454bb16d227Schristos 	  regs.r[1].r_r2 = val & 0xffff;
455bb16d227Schristos 	  break;
456bb16d227Schristos 	case m32c_sim_reg_r3_bank1:
457bb16d227Schristos 	  regs.r[1].r_r3 = val & 0xffff;
458bb16d227Schristos 	  break;
459bb16d227Schristos 	case m32c_sim_reg_a0_bank1:
460bb16d227Schristos 	  regs.r[1].r_a0 = val & addr_mask;
461bb16d227Schristos 	  break;
462bb16d227Schristos 	case m32c_sim_reg_a1_bank1:
463bb16d227Schristos 	  regs.r[1].r_a1 = val & addr_mask;
464bb16d227Schristos 	  break;
465bb16d227Schristos 	case m32c_sim_reg_fb_bank1:
466bb16d227Schristos 	  regs.r[1].r_fb = val & addr_mask;
467bb16d227Schristos 	  break;
468bb16d227Schristos 	case m32c_sim_reg_sb_bank1:
469bb16d227Schristos 	  regs.r[1].r_sb = val & addr_mask;
470bb16d227Schristos 	  break;
471bb16d227Schristos 
472bb16d227Schristos 	case m32c_sim_reg_usp:
473bb16d227Schristos 	  regs.r_usp = val & addr_mask;
474bb16d227Schristos 	  break;
475bb16d227Schristos 	case m32c_sim_reg_isp:
476bb16d227Schristos 	  regs.r_isp = val & addr_mask;
477bb16d227Schristos 	  break;
478bb16d227Schristos 	case m32c_sim_reg_pc:
479bb16d227Schristos 	  regs.r_pc = val & membus_mask;
480bb16d227Schristos 	  break;
481bb16d227Schristos 	case m32c_sim_reg_intb:
482bb16d227Schristos 	  regs.r_intbl = (val & membus_mask) & 0xffff;
483bb16d227Schristos 	  regs.r_intbh = (val & membus_mask) >> 16;
484bb16d227Schristos 	  break;
485bb16d227Schristos 	case m32c_sim_reg_flg:
486bb16d227Schristos 	  regs.r_flags = val & 0xffff;
487bb16d227Schristos 	  break;
488bb16d227Schristos 
489bb16d227Schristos 	  /* These registers aren't implemented by the minisim.  */
490bb16d227Schristos 	case m32c_sim_reg_svf:
491bb16d227Schristos 	case m32c_sim_reg_svp:
492bb16d227Schristos 	case m32c_sim_reg_vct:
493bb16d227Schristos 	case m32c_sim_reg_dmd0:
494bb16d227Schristos 	case m32c_sim_reg_dmd1:
495bb16d227Schristos 	case m32c_sim_reg_dct0:
496bb16d227Schristos 	case m32c_sim_reg_dct1:
497bb16d227Schristos 	case m32c_sim_reg_drc0:
498bb16d227Schristos 	case m32c_sim_reg_drc1:
499bb16d227Schristos 	case m32c_sim_reg_dma0:
500bb16d227Schristos 	case m32c_sim_reg_dma1:
501bb16d227Schristos 	case m32c_sim_reg_dsa0:
502bb16d227Schristos 	case m32c_sim_reg_dsa1:
503bb16d227Schristos 	case m32c_sim_reg_dra0:
504bb16d227Schristos 	case m32c_sim_reg_dra1:
505bb16d227Schristos 	  return 0;
506bb16d227Schristos 
507bb16d227Schristos 	default:
508bb16d227Schristos 	  fprintf (stderr, "m32c minisim: unrecognized register number: %d\n",
509bb16d227Schristos 		   regno);
510bb16d227Schristos 	  return 0;
511bb16d227Schristos 	}
512bb16d227Schristos     }
513bb16d227Schristos 
514bb16d227Schristos   return size;
515bb16d227Schristos }
516bb16d227Schristos 
517bb16d227Schristos static volatile int stop;
518bb16d227Schristos static enum sim_stop reason;
519bb16d227Schristos static int siggnal;
520bb16d227Schristos 
521bb16d227Schristos 
522bb16d227Schristos /* Given a signal number used by the M32C bsp (that is, newlib),
523bb16d227Schristos    return a target signal number used by GDB.  */
524bb16d227Schristos static int
525bb16d227Schristos m32c_signal_to_target (int m32c)
526bb16d227Schristos {
527bb16d227Schristos   switch (m32c)
528bb16d227Schristos     {
529bb16d227Schristos     case 4:
530bb16d227Schristos       return GDB_SIGNAL_ILL;
531bb16d227Schristos 
532bb16d227Schristos     case 5:
533bb16d227Schristos       return GDB_SIGNAL_TRAP;
534bb16d227Schristos 
535bb16d227Schristos     case 10:
536bb16d227Schristos       return GDB_SIGNAL_BUS;
537bb16d227Schristos 
538bb16d227Schristos     case 11:
539bb16d227Schristos       return GDB_SIGNAL_SEGV;
540bb16d227Schristos 
541bb16d227Schristos     case 24:
542bb16d227Schristos       return GDB_SIGNAL_XCPU;
543bb16d227Schristos 
544bb16d227Schristos     case 2:
545bb16d227Schristos       return GDB_SIGNAL_INT;
546bb16d227Schristos 
547bb16d227Schristos     case 8:
548bb16d227Schristos       return GDB_SIGNAL_FPE;
549bb16d227Schristos 
550bb16d227Schristos     case 6:
551bb16d227Schristos       return GDB_SIGNAL_ABRT;
552bb16d227Schristos     }
553bb16d227Schristos 
554bb16d227Schristos   return 0;
555bb16d227Schristos }
556bb16d227Schristos 
557bb16d227Schristos 
558bb16d227Schristos /* Take a step return code RC and set up the variables consulted by
559bb16d227Schristos    sim_stop_reason appropriately.  */
560bb16d227Schristos static void
561bb16d227Schristos handle_step (int rc)
562bb16d227Schristos {
563bb16d227Schristos   if (M32C_STEPPED (rc) || M32C_HIT_BREAK (rc))
564bb16d227Schristos     {
565bb16d227Schristos       reason = sim_stopped;
566bb16d227Schristos       siggnal = GDB_SIGNAL_TRAP;
567bb16d227Schristos     }
568bb16d227Schristos   else if (M32C_STOPPED (rc))
569bb16d227Schristos     {
570bb16d227Schristos       reason = sim_stopped;
571bb16d227Schristos       siggnal = m32c_signal_to_target (M32C_STOP_SIG (rc));
572bb16d227Schristos     }
573bb16d227Schristos   else
574bb16d227Schristos     {
575bb16d227Schristos       assert (M32C_EXITED (rc));
576bb16d227Schristos       reason = sim_exited;
577bb16d227Schristos       siggnal = M32C_EXIT_STATUS (rc);
578bb16d227Schristos     }
579bb16d227Schristos }
580bb16d227Schristos 
581bb16d227Schristos 
582bb16d227Schristos void
583bb16d227Schristos sim_resume (SIM_DESC sd, int step, int sig_to_deliver)
584bb16d227Schristos {
585bb16d227Schristos   check_desc (sd);
586bb16d227Schristos 
587bb16d227Schristos   if (sig_to_deliver != 0)
588bb16d227Schristos     {
589bb16d227Schristos       fprintf (stderr,
590bb16d227Schristos 	       "Warning: the m32c minisim does not implement "
591bb16d227Schristos 	       "signal delivery yet.\n" "Resuming with no signal.\n");
592bb16d227Schristos     }
593bb16d227Schristos 
594bb16d227Schristos   if (step)
595bb16d227Schristos     {
596bb16d227Schristos       handle_step (decode_opcode ());
597bb16d227Schristos #ifdef TIMER_A
598bb16d227Schristos       update_timer_a ();
599bb16d227Schristos #endif
600bb16d227Schristos     }
601bb16d227Schristos   else
602bb16d227Schristos     {
603bb16d227Schristos       /* We don't clear 'stop' here, because then we would miss
604bb16d227Schristos          interrupts that arrived on the way here.  Instead, we clear
605bb16d227Schristos          the flag in sim_stop_reason, after GDB has disabled the
606bb16d227Schristos          interrupt signal handler.  */
607bb16d227Schristos       for (;;)
608bb16d227Schristos 	{
609bb16d227Schristos 	  int rc;
610bb16d227Schristos 
611bb16d227Schristos 	  if (stop)
612bb16d227Schristos 	    {
613bb16d227Schristos 	      stop = 0;
614bb16d227Schristos 	      reason = sim_stopped;
615bb16d227Schristos 	      siggnal = GDB_SIGNAL_INT;
616bb16d227Schristos 	      break;
617bb16d227Schristos 	    }
618bb16d227Schristos 
619bb16d227Schristos 	  rc = decode_opcode ();
620bb16d227Schristos #ifdef TIMER_A
621bb16d227Schristos 	  update_timer_a ();
622bb16d227Schristos #endif
623bb16d227Schristos 
624bb16d227Schristos 	  if (!M32C_STEPPED (rc))
625bb16d227Schristos 	    {
626bb16d227Schristos 	      handle_step (rc);
627bb16d227Schristos 	      break;
628bb16d227Schristos 	    }
629bb16d227Schristos 	}
630bb16d227Schristos     }
631bb16d227Schristos   m32c_sim_restore_console ();
632bb16d227Schristos }
633bb16d227Schristos 
634bb16d227Schristos int
635bb16d227Schristos sim_stop (SIM_DESC sd)
636bb16d227Schristos {
637bb16d227Schristos   stop = 1;
638bb16d227Schristos 
639bb16d227Schristos   return 1;
640bb16d227Schristos }
641bb16d227Schristos 
642bb16d227Schristos void
643bb16d227Schristos sim_stop_reason (SIM_DESC sd, enum sim_stop *reason_p, int *sigrc_p)
644bb16d227Schristos {
645bb16d227Schristos   check_desc (sd);
646bb16d227Schristos 
647bb16d227Schristos   *reason_p = reason;
648bb16d227Schristos   *sigrc_p = siggnal;
649bb16d227Schristos }
650bb16d227Schristos 
651bb16d227Schristos void
652bb16d227Schristos sim_do_command (SIM_DESC sd, const char *cmd)
653bb16d227Schristos {
654*8b657b07Schristos   const char *arg;
655*8b657b07Schristos   char **argv = buildargv (cmd);
656bb16d227Schristos 
657bb16d227Schristos   check_desc (sd);
658bb16d227Schristos 
659*8b657b07Schristos   cmd = arg = "";
660*8b657b07Schristos   if (argv != NULL)
661bb16d227Schristos     {
662*8b657b07Schristos       if (argv[0] != NULL)
663*8b657b07Schristos 	cmd = argv[0];
664*8b657b07Schristos       if (argv[1] != NULL)
665*8b657b07Schristos 	arg = argv[1];
666bb16d227Schristos     }
667bb16d227Schristos 
668bb16d227Schristos   if (strcmp (cmd, "trace") == 0)
669bb16d227Schristos     {
670*8b657b07Schristos       if (strcmp (arg, "on") == 0)
671bb16d227Schristos 	trace = 1;
672*8b657b07Schristos       else if (strcmp (arg, "off") == 0)
673bb16d227Schristos 	trace = 0;
674bb16d227Schristos       else
675bb16d227Schristos 	printf ("The 'sim trace' command expects 'on' or 'off' "
676bb16d227Schristos 		"as an argument.\n");
677bb16d227Schristos     }
678bb16d227Schristos   else if (strcmp (cmd, "verbose") == 0)
679bb16d227Schristos     {
680*8b657b07Schristos       if (strcmp (arg, "on") == 0)
681bb16d227Schristos 	verbose = 1;
682*8b657b07Schristos       else if (strcmp (arg, "off") == 0)
683bb16d227Schristos 	verbose = 0;
684bb16d227Schristos       else
685bb16d227Schristos 	printf ("The 'sim verbose' command expects 'on' or 'off'"
686bb16d227Schristos 		" as an argument.\n");
687bb16d227Schristos     }
688bb16d227Schristos   else
689bb16d227Schristos     printf ("The 'sim' command expects either 'trace' or 'verbose'"
690bb16d227Schristos 	    " as a subcommand.\n");
691bb16d227Schristos 
692*8b657b07Schristos   freeargv (argv);
693bb16d227Schristos }
694bb16d227Schristos 
695bb16d227Schristos char **
696bb16d227Schristos sim_complete_command (SIM_DESC sd, const char *text, const char *word)
697bb16d227Schristos {
698bb16d227Schristos   return NULL;
699bb16d227Schristos }
700e5cb852cSchristos 
701*8b657b07Schristos char *
702*8b657b07Schristos sim_memory_map (SIM_DESC sd)
703*8b657b07Schristos {
704*8b657b07Schristos   return NULL;
705*8b657b07Schristos }
706*8b657b07Schristos 
707e5cb852cSchristos void
708e5cb852cSchristos sim_info (SIM_DESC sd, int verbose)
709e5cb852cSchristos {
710e5cb852cSchristos   printf ("The m32c minisim doesn't collect any statistics.\n");
711e5cb852cSchristos }
712