xref: /netbsd-src/external/gpl3/gdb/dist/sim/d10v/interp.c (revision b7b7574d3bf8eeb51a1fa3977b59142ec6434a55)
1 #include "config.h"
2 #include <signal.h>
3 #include "bfd.h"
4 #include "gdb/callback.h"
5 #include "gdb/remote-sim.h"
6 
7 #include "d10v_sim.h"
8 #include "gdb/sim-d10v.h"
9 #include "gdb/signals.h"
10 
11 #ifdef HAVE_STRING_H
12 #include <string.h>
13 #else
14 #ifdef HAVE_STRINGS_H
15 #include <strings.h>
16 #endif /* HAVE_STRING_H */
17 #endif /* HAVE_STRINGS_H */
18 
19 #ifdef HAVE_STDLIB_H
20 #include <stdlib.h>
21 #endif
22 
23 enum _leftright { LEFT_FIRST, RIGHT_FIRST };
24 
25 static char *myname;
26 static SIM_OPEN_KIND sim_kind;
27 int d10v_debug;
28 
29 /* Set this to true to get the previous segment layout. */
30 
31 int old_segment_mapping;
32 
33 host_callback *d10v_callback;
34 unsigned long ins_type_counters[ (int)INS_MAX ];
35 
36 uint16 OP[4];
37 
38 static int init_text_p = 0;
39 /* non-zero if we opened prog_bfd */
40 static int prog_bfd_was_opened_p;
41 bfd *prog_bfd;
42 asection *text;
43 bfd_vma text_start;
44 bfd_vma text_end;
45 
46 static long hash (long insn, int format);
47 static struct hash_entry *lookup_hash (uint32 ins, int size);
48 static void get_operands (struct simops *s, uint32 ins);
49 static void do_long (uint32 ins);
50 static void do_2_short (uint16 ins1, uint16 ins2, enum _leftright leftright);
51 static void do_parallel (uint16 ins1, uint16 ins2);
52 static char *add_commas (char *buf, int sizeof_buf, unsigned long value);
53 extern void sim_set_profile (int n);
54 extern void sim_set_profile_size (int n);
55 static INLINE uint8 *map_memory (unsigned phys_addr);
56 
57 #ifdef NEED_UI_LOOP_HOOK
58 /* How often to run the ui_loop update, when in use */
59 #define UI_LOOP_POLL_INTERVAL 0x14000
60 
61 /* Counter for the ui_loop_hook update */
62 static long ui_loop_hook_counter = UI_LOOP_POLL_INTERVAL;
63 
64 /* Actual hook to call to run through gdb's gui event loop */
65 extern int (*deprecated_ui_loop_hook) (int signo);
66 #endif /* NEED_UI_LOOP_HOOK */
67 
68 #ifndef INLINE
69 #if defined(__GNUC__) && defined(__OPTIMIZE__)
70 #define INLINE __inline__
71 #else
72 #define INLINE
73 #endif
74 #endif
75 
76 #define MAX_HASH  63
77 struct hash_entry
78 {
79   struct hash_entry *next;
80   uint32 opcode;
81   uint32 mask;
82   int size;
83   struct simops *ops;
84 };
85 
86 struct hash_entry hash_table[MAX_HASH+1];
87 
88 INLINE static long
89 hash(insn, format)
90      long insn;
91      int format;
92 {
93   if (format & LONG_OPCODE)
94     return ((insn & 0x3F000000) >> 24);
95   else
96     return((insn & 0x7E00) >> 9);
97 }
98 
99 INLINE static struct hash_entry *
100 lookup_hash (ins, size)
101      uint32 ins;
102      int size;
103 {
104   struct hash_entry *h;
105 
106   if (size)
107     h = &hash_table[(ins & 0x3F000000) >> 24];
108   else
109     h = &hash_table[(ins & 0x7E00) >> 9];
110 
111   while ((ins & h->mask) != h->opcode || h->size != size)
112     {
113       if (h->next == NULL)
114 	{
115 	  State.exception = SIGILL;
116 	  State.pc_changed = 1; /* Don't increment the PC. */
117 	  return NULL;
118 	}
119       h = h->next;
120     }
121   return (h);
122 }
123 
124 INLINE static void
125 get_operands (struct simops *s, uint32 ins)
126 {
127   int i, shift, bits, flags;
128   uint32 mask;
129   for (i=0; i < s->numops; i++)
130     {
131       shift = s->operands[3*i];
132       bits = s->operands[3*i+1];
133       flags = s->operands[3*i+2];
134       mask = 0x7FFFFFFF >> (31 - bits);
135       OP[i] = (ins >> shift) & mask;
136     }
137   /* FIXME: for tracing, update values that need to be updated each
138      instruction decode cycle */
139   State.trace.psw = PSW;
140 }
141 
142 bfd_vma
143 decode_pc ()
144 {
145   asection *s;
146   if (!init_text_p && prog_bfd != NULL)
147     {
148       init_text_p = 1;
149       for (s = prog_bfd->sections; s; s = s->next)
150 	if (strcmp (bfd_get_section_name (prog_bfd, s), ".text") == 0)
151 	  {
152 	    text = s;
153 	    text_start = bfd_get_section_vma (prog_bfd, s);
154 	    text_end = text_start + bfd_section_size (prog_bfd, s);
155 	    break;
156 	  }
157     }
158 
159   return (PC << 2) + text_start;
160 }
161 
162 static void
163 do_long (ins)
164      uint32 ins;
165 {
166   struct hash_entry *h;
167 #ifdef DEBUG
168   if ((d10v_debug & DEBUG_INSTRUCTION) != 0)
169     (*d10v_callback->printf_filtered) (d10v_callback, "do_long 0x%x\n", ins);
170 #endif
171   h = lookup_hash (ins, 1);
172   if (h == NULL)
173     return;
174   get_operands (h->ops, ins);
175   State.ins_type = INS_LONG;
176   ins_type_counters[ (int)State.ins_type ]++;
177   (h->ops->func)();
178 }
179 
180 static void
181 do_2_short (ins1, ins2, leftright)
182      uint16 ins1, ins2;
183      enum _leftright leftright;
184 {
185   struct hash_entry *h;
186   enum _ins_type first, second;
187 
188 #ifdef DEBUG
189   if ((d10v_debug & DEBUG_INSTRUCTION) != 0)
190     (*d10v_callback->printf_filtered) (d10v_callback, "do_2_short 0x%x (%s) -> 0x%x\n",
191 				       ins1, (leftright) ? "left" : "right", ins2);
192 #endif
193 
194   if (leftright == LEFT_FIRST)
195     {
196       first = INS_LEFT;
197       second = INS_RIGHT;
198       ins_type_counters[ (int)INS_LEFTRIGHT ]++;
199     }
200   else
201     {
202       first = INS_RIGHT;
203       second = INS_LEFT;
204       ins_type_counters[ (int)INS_RIGHTLEFT ]++;
205     }
206 
207   /* Issue the first instruction */
208   h = lookup_hash (ins1, 0);
209   if (h == NULL)
210     return;
211   get_operands (h->ops, ins1);
212   State.ins_type = first;
213   ins_type_counters[ (int)State.ins_type ]++;
214   (h->ops->func)();
215 
216   /* Issue the second instruction (if the PC hasn't changed) */
217   if (!State.pc_changed && !State.exception)
218     {
219       /* finish any existing instructions */
220       SLOT_FLUSH ();
221       h = lookup_hash (ins2, 0);
222       if (h == NULL)
223 	return;
224       get_operands (h->ops, ins2);
225       State.ins_type = second;
226       ins_type_counters[ (int)State.ins_type ]++;
227       ins_type_counters[ (int)INS_CYCLES ]++;
228       (h->ops->func)();
229     }
230   else if (!State.exception)
231     ins_type_counters[ (int)INS_COND_JUMP ]++;
232 }
233 
234 static void
235 do_parallel (ins1, ins2)
236      uint16 ins1, ins2;
237 {
238   struct hash_entry *h1, *h2;
239 #ifdef DEBUG
240   if ((d10v_debug & DEBUG_INSTRUCTION) != 0)
241     (*d10v_callback->printf_filtered) (d10v_callback, "do_parallel 0x%x || 0x%x\n", ins1, ins2);
242 #endif
243   ins_type_counters[ (int)INS_PARALLEL ]++;
244   h1 = lookup_hash (ins1, 0);
245   if (h1 == NULL)
246     return;
247   h2 = lookup_hash (ins2, 0);
248   if (h2 == NULL)
249     return;
250 
251   if (h1->ops->exec_type == PARONLY)
252     {
253       get_operands (h1->ops, ins1);
254       State.ins_type = INS_LEFT_COND_TEST;
255       ins_type_counters[ (int)State.ins_type ]++;
256       (h1->ops->func)();
257       if (State.exe)
258 	{
259 	  ins_type_counters[ (int)INS_COND_TRUE ]++;
260 	  get_operands (h2->ops, ins2);
261 	  State.ins_type = INS_RIGHT_COND_EXE;
262 	  ins_type_counters[ (int)State.ins_type ]++;
263 	  (h2->ops->func)();
264 	}
265       else
266 	ins_type_counters[ (int)INS_COND_FALSE ]++;
267     }
268   else if (h2->ops->exec_type == PARONLY)
269     {
270       get_operands (h2->ops, ins2);
271       State.ins_type = INS_RIGHT_COND_TEST;
272       ins_type_counters[ (int)State.ins_type ]++;
273       (h2->ops->func)();
274       if (State.exe)
275 	{
276 	  ins_type_counters[ (int)INS_COND_TRUE ]++;
277 	  get_operands (h1->ops, ins1);
278 	  State.ins_type = INS_LEFT_COND_EXE;
279 	  ins_type_counters[ (int)State.ins_type ]++;
280 	  (h1->ops->func)();
281 	}
282       else
283 	ins_type_counters[ (int)INS_COND_FALSE ]++;
284     }
285   else
286     {
287       get_operands (h1->ops, ins1);
288       State.ins_type = INS_LEFT_PARALLEL;
289       ins_type_counters[ (int)State.ins_type ]++;
290       (h1->ops->func)();
291       if (!State.exception)
292 	{
293 	  get_operands (h2->ops, ins2);
294 	  State.ins_type = INS_RIGHT_PARALLEL;
295 	  ins_type_counters[ (int)State.ins_type ]++;
296 	  (h2->ops->func)();
297 	}
298     }
299 }
300 
301 static char *
302 add_commas(buf, sizeof_buf, value)
303      char *buf;
304      int sizeof_buf;
305      unsigned long value;
306 {
307   int comma = 3;
308   char *endbuf = buf + sizeof_buf - 1;
309 
310   *--endbuf = '\0';
311   do {
312     if (comma-- == 0)
313       {
314 	*--endbuf = ',';
315 	comma = 2;
316       }
317 
318     *--endbuf = (value % 10) + '0';
319   } while ((value /= 10) != 0);
320 
321   return endbuf;
322 }
323 
324 void
325 sim_size (power)
326      int power;
327 
328 {
329   int i;
330   for (i = 0; i < IMEM_SEGMENTS; i++)
331     {
332       if (State.mem.insn[i])
333 	free (State.mem.insn[i]);
334     }
335   for (i = 0; i < DMEM_SEGMENTS; i++)
336     {
337       if (State.mem.data[i])
338 	free (State.mem.data[i]);
339     }
340   for (i = 0; i < UMEM_SEGMENTS; i++)
341     {
342       if (State.mem.unif[i])
343 	free (State.mem.unif[i]);
344     }
345   /* Always allocate dmem segment 0.  This contains the IMAP and DMAP
346      registers. */
347   State.mem.data[0] = calloc (1, SEGMENT_SIZE);
348 }
349 
350 /* For tracing - leave info on last access around. */
351 static char *last_segname = "invalid";
352 static char *last_from = "invalid";
353 static char *last_to = "invalid";
354 
355 enum
356   {
357     IMAP0_OFFSET = 0xff00,
358     DMAP0_OFFSET = 0xff08,
359     DMAP2_SHADDOW = 0xff04,
360     DMAP2_OFFSET = 0xff0c
361   };
362 
363 static void
364 set_dmap_register (int reg_nr, unsigned long value)
365 {
366   uint8 *raw = map_memory (SIM_D10V_MEMORY_DATA
367 			   + DMAP0_OFFSET + 2 * reg_nr);
368   WRITE_16 (raw, value);
369 #ifdef DEBUG
370   if ((d10v_debug & DEBUG_MEMORY))
371     {
372       (*d10v_callback->printf_filtered)
373 	(d10v_callback, "mem: dmap%d=0x%04lx\n", reg_nr, value);
374     }
375 #endif
376 }
377 
378 static unsigned long
379 dmap_register (void *regcache, int reg_nr)
380 {
381   uint8 *raw = map_memory (SIM_D10V_MEMORY_DATA
382 			   + DMAP0_OFFSET + 2 * reg_nr);
383   return READ_16 (raw);
384 }
385 
386 static void
387 set_imap_register (int reg_nr, unsigned long value)
388 {
389   uint8 *raw = map_memory (SIM_D10V_MEMORY_DATA
390 			   + IMAP0_OFFSET + 2 * reg_nr);
391   WRITE_16 (raw, value);
392 #ifdef DEBUG
393   if ((d10v_debug & DEBUG_MEMORY))
394     {
395       (*d10v_callback->printf_filtered)
396 	(d10v_callback, "mem: imap%d=0x%04lx\n", reg_nr, value);
397     }
398 #endif
399 }
400 
401 static unsigned long
402 imap_register (void *regcache, int reg_nr)
403 {
404   uint8 *raw = map_memory (SIM_D10V_MEMORY_DATA
405 			   + IMAP0_OFFSET + 2 * reg_nr);
406   return READ_16 (raw);
407 }
408 
409 enum
410   {
411     HELD_SPI_IDX = 0,
412     HELD_SPU_IDX = 1
413   };
414 
415 static unsigned long
416 spu_register (void)
417 {
418   if (PSW_SM)
419     return GPR (SP_IDX);
420   else
421     return HELD_SP (HELD_SPU_IDX);
422 }
423 
424 static unsigned long
425 spi_register (void)
426 {
427   if (!PSW_SM)
428     return GPR (SP_IDX);
429   else
430     return HELD_SP (HELD_SPI_IDX);
431 }
432 
433 static void
434 set_spi_register (unsigned long value)
435 {
436   if (!PSW_SM)
437     SET_GPR (SP_IDX, value);
438   SET_HELD_SP (HELD_SPI_IDX, value);
439 }
440 
441 static void
442 set_spu_register  (unsigned long value)
443 {
444   if (PSW_SM)
445     SET_GPR (SP_IDX, value);
446   SET_HELD_SP (HELD_SPU_IDX, value);
447 }
448 
449 /* Given a virtual address in the DMAP address space, translate it
450    into a physical address. */
451 
452 unsigned long
453 sim_d10v_translate_dmap_addr (unsigned long offset,
454 			      int nr_bytes,
455 			      unsigned long *phys,
456 			      void *regcache,
457 			      unsigned long (*dmap_register) (void *regcache,
458 							      int reg_nr))
459 {
460   short map;
461   int regno;
462   last_from = "logical-data";
463   if (offset >= DMAP_BLOCK_SIZE * SIM_D10V_NR_DMAP_REGS)
464     {
465       /* Logical address out side of data segments, not supported */
466       return 0;
467     }
468   regno = (offset / DMAP_BLOCK_SIZE);
469   offset = (offset % DMAP_BLOCK_SIZE);
470   if ((offset % DMAP_BLOCK_SIZE) + nr_bytes > DMAP_BLOCK_SIZE)
471     {
472       /* Don't cross a BLOCK boundary */
473       nr_bytes = DMAP_BLOCK_SIZE - (offset % DMAP_BLOCK_SIZE);
474     }
475   map = dmap_register (regcache, regno);
476   if (regno == 3)
477     {
478       /* Always maps to data memory */
479       int iospi = (offset / 0x1000) % 4;
480       int iosp = (map >> (4 * (3 - iospi))) % 0x10;
481       last_to = "io-space";
482       *phys = (SIM_D10V_MEMORY_DATA + (iosp * 0x10000) + 0xc000 + offset);
483     }
484   else
485     {
486       int sp = ((map & 0x3000) >> 12);
487       int segno = (map & 0x3ff);
488       switch (sp)
489 	{
490 	case 0: /* 00: Unified memory */
491 	  *phys = SIM_D10V_MEMORY_UNIFIED + (segno * DMAP_BLOCK_SIZE) + offset;
492 	  last_to = "unified";
493 	  break;
494 	case 1: /* 01: Instruction Memory */
495 	  *phys = SIM_D10V_MEMORY_INSN + (segno * DMAP_BLOCK_SIZE) + offset;
496 	  last_to = "chip-insn";
497 	  break;
498 	case 2: /* 10: Internal data memory */
499 	  *phys = SIM_D10V_MEMORY_DATA + (segno << 16) + (regno * DMAP_BLOCK_SIZE) + offset;
500 	  last_to = "chip-data";
501 	  break;
502 	case 3: /* 11: Reserved */
503 	  return 0;
504 	}
505     }
506   return nr_bytes;
507 }
508 
509 /* Given a virtual address in the IMAP address space, translate it
510    into a physical address. */
511 
512 unsigned long
513 sim_d10v_translate_imap_addr (unsigned long offset,
514 			      int nr_bytes,
515 			      unsigned long *phys,
516 			      void *regcache,
517 			      unsigned long (*imap_register) (void *regcache,
518 							      int reg_nr))
519 {
520   short map;
521   int regno;
522   int sp;
523   int segno;
524   last_from = "logical-insn";
525   if (offset >= (IMAP_BLOCK_SIZE * SIM_D10V_NR_IMAP_REGS))
526     {
527       /* Logical address outside of IMAP segments, not supported */
528       return 0;
529     }
530   regno = (offset / IMAP_BLOCK_SIZE);
531   offset = (offset % IMAP_BLOCK_SIZE);
532   if (offset + nr_bytes > IMAP_BLOCK_SIZE)
533     {
534       /* Don't cross a BLOCK boundary */
535       nr_bytes = IMAP_BLOCK_SIZE - offset;
536     }
537   map = imap_register (regcache, regno);
538   sp = (map & 0x3000) >> 12;
539   segno = (map & 0x007f);
540   switch (sp)
541     {
542     case 0: /* 00: unified memory */
543       *phys = SIM_D10V_MEMORY_UNIFIED + (segno << 17) + offset;
544       last_to = "unified";
545       break;
546     case 1: /* 01: instruction memory */
547       *phys = SIM_D10V_MEMORY_INSN + (IMAP_BLOCK_SIZE * regno) + offset;
548       last_to = "chip-insn";
549       break;
550     case 2: /*10*/
551       /* Reserved. */
552       return 0;
553     case 3: /* 11: for testing  - instruction memory */
554       offset = (offset % 0x800);
555       *phys = SIM_D10V_MEMORY_INSN + offset;
556       if (offset + nr_bytes > 0x800)
557 	/* don't cross VM boundary */
558 	nr_bytes = 0x800 - offset;
559       last_to = "test-insn";
560       break;
561     }
562   return nr_bytes;
563 }
564 
565 unsigned long
566 sim_d10v_translate_addr (unsigned long memaddr,
567 			 int nr_bytes,
568 			 unsigned long *targ_addr,
569 			 void *regcache,
570 			 unsigned long (*dmap_register) (void *regcache,
571 							 int reg_nr),
572 			 unsigned long (*imap_register) (void *regcache,
573 							 int reg_nr))
574 {
575   unsigned long phys;
576   unsigned long seg;
577   unsigned long off;
578 
579   last_from = "unknown";
580   last_to = "unknown";
581 
582   seg = (memaddr >> 24);
583   off = (memaddr & 0xffffffL);
584 
585   /* However, if we've asked to use the previous generation of segment
586      mapping, rearrange the segments as follows. */
587 
588   if (old_segment_mapping)
589     {
590       switch (seg)
591 	{
592 	case 0x00: /* DMAP translated memory */
593 	  seg = 0x10;
594 	  break;
595 	case 0x01: /* IMAP translated memory */
596 	  seg = 0x11;
597 	  break;
598 	case 0x10: /* On-chip data memory */
599 	  seg = 0x02;
600 	  break;
601 	case 0x11: /* On-chip insn memory */
602 	  seg = 0x01;
603 	  break;
604 	case 0x12: /* Unified memory */
605 	  seg = 0x00;
606 	  break;
607 	}
608     }
609 
610   switch (seg)
611     {
612     case 0x00:			/* Physical unified memory */
613       last_from = "phys-unified";
614       last_to = "unified";
615       phys = SIM_D10V_MEMORY_UNIFIED + off;
616       if ((off % SEGMENT_SIZE) + nr_bytes > SEGMENT_SIZE)
617 	nr_bytes = SEGMENT_SIZE - (off % SEGMENT_SIZE);
618       break;
619 
620     case 0x01:			/* Physical instruction memory */
621       last_from = "phys-insn";
622       last_to = "chip-insn";
623       phys = SIM_D10V_MEMORY_INSN + off;
624       if ((off % SEGMENT_SIZE) + nr_bytes > SEGMENT_SIZE)
625 	nr_bytes = SEGMENT_SIZE - (off % SEGMENT_SIZE);
626       break;
627 
628     case 0x02:			/* Physical data memory segment */
629       last_from = "phys-data";
630       last_to = "chip-data";
631       phys = SIM_D10V_MEMORY_DATA + off;
632       if ((off % SEGMENT_SIZE) + nr_bytes > SEGMENT_SIZE)
633 	nr_bytes = SEGMENT_SIZE - (off % SEGMENT_SIZE);
634       break;
635 
636     case 0x10:			/* in logical data address segment */
637       nr_bytes = sim_d10v_translate_dmap_addr (off, nr_bytes, &phys, regcache,
638 					       dmap_register);
639       break;
640 
641     case 0x11:			/* in logical instruction address segment */
642       nr_bytes = sim_d10v_translate_imap_addr (off, nr_bytes, &phys, regcache,
643 					       imap_register);
644       break;
645 
646     default:
647       return 0;
648     }
649 
650   *targ_addr = phys;
651   return nr_bytes;
652 }
653 
654 /* Return a pointer into the raw buffer designated by phys_addr.  It
655    is assumed that the client has already ensured that the access
656    isn't going to cross a segment boundary. */
657 
658 uint8 *
659 map_memory (unsigned phys_addr)
660 {
661   uint8 **memory;
662   uint8 *raw;
663   unsigned offset;
664   int segment = ((phys_addr >> 24) & 0xff);
665 
666   switch (segment)
667     {
668 
669     case 0x00: /* Unified memory */
670       {
671 	memory = &State.mem.unif[(phys_addr / SEGMENT_SIZE) % UMEM_SEGMENTS];
672 	last_segname = "umem";
673 	break;
674       }
675 
676     case 0x01: /* On-chip insn memory */
677       {
678 	memory = &State.mem.insn[(phys_addr / SEGMENT_SIZE) % IMEM_SEGMENTS];
679 	last_segname = "imem";
680 	break;
681       }
682 
683     case 0x02: /* On-chip data memory */
684       {
685 	if ((phys_addr & 0xff00) == 0xff00)
686 	  {
687 	    phys_addr = (phys_addr & 0xffff);
688 	    if (phys_addr == DMAP2_SHADDOW)
689 	      {
690 		phys_addr = DMAP2_OFFSET;
691 		last_segname = "dmap";
692 	      }
693 	    else
694 	      last_segname = "reg";
695 	  }
696 	else
697 	  last_segname = "dmem";
698 	memory = &State.mem.data[(phys_addr / SEGMENT_SIZE) % DMEM_SEGMENTS];
699 	break;
700       }
701 
702     default:
703       /* OOPS! */
704       last_segname = "scrap";
705       return State.mem.fault;
706     }
707 
708   if (*memory == NULL)
709     {
710       *memory = calloc (1, SEGMENT_SIZE);
711       if (*memory == NULL)
712 	{
713 	  (*d10v_callback->printf_filtered) (d10v_callback, "Malloc failed.\n");
714 	  return State.mem.fault;
715 	}
716     }
717 
718   offset = (phys_addr % SEGMENT_SIZE);
719   raw = *memory + offset;
720   return raw;
721 }
722 
723 /* Transfer data to/from simulated memory.  Since a bug in either the
724    simulated program or in gdb or the simulator itself may cause a
725    bogus address to be passed in, we need to do some sanity checking
726    on addresses to make sure they are within bounds.  When an address
727    fails the bounds check, treat it as a zero length read/write rather
728    than aborting the entire run. */
729 
730 static int
731 xfer_mem (SIM_ADDR virt,
732 	  unsigned char *buffer,
733 	  int size,
734 	  int write_p)
735 {
736   uint8 *memory;
737   unsigned long phys;
738   int phys_size;
739   phys_size = sim_d10v_translate_addr (virt, size, &phys, NULL,
740 				       dmap_register, imap_register);
741   if (phys_size == 0)
742     return 0;
743 
744   memory = map_memory (phys);
745 
746 #ifdef DEBUG
747   if ((d10v_debug & DEBUG_INSTRUCTION) != 0)
748     {
749       (*d10v_callback->printf_filtered)
750 	(d10v_callback,
751 	 "sim_%s %d bytes: 0x%08lx (%s) -> 0x%08lx (%s) -> 0x%08lx (%s)\n",
752 	     (write_p ? "write" : "read"),
753 	 phys_size, virt, last_from,
754 	 phys, last_to,
755 	 (long) memory, last_segname);
756     }
757 #endif
758 
759   if (write_p)
760     {
761       memcpy (memory, buffer, phys_size);
762     }
763   else
764     {
765       memcpy (buffer, memory, phys_size);
766     }
767 
768   return phys_size;
769 }
770 
771 
772 int
773 sim_write (sd, addr, buffer, size)
774      SIM_DESC sd;
775      SIM_ADDR addr;
776      const unsigned char *buffer;
777      int size;
778 {
779   /* FIXME: this should be performing a virtual transfer */
780   return xfer_mem( addr, buffer, size, 1);
781 }
782 
783 int
784 sim_read (sd, addr, buffer, size)
785      SIM_DESC sd;
786      SIM_ADDR addr;
787      unsigned char *buffer;
788      int size;
789 {
790   /* FIXME: this should be performing a virtual transfer */
791   return xfer_mem( addr, buffer, size, 0);
792 }
793 
794 
795 SIM_DESC
796 sim_open (kind, callback, abfd, argv)
797      SIM_OPEN_KIND kind;
798      host_callback *callback;
799      struct bfd *abfd;
800      char **argv;
801 {
802   struct simops *s;
803   struct hash_entry *h;
804   static int init_p = 0;
805   char **p;
806 
807   sim_kind = kind;
808   d10v_callback = callback;
809   myname = argv[0];
810   old_segment_mapping = 0;
811 
812   /* NOTE: This argument parsing is only effective when this function
813      is called by GDB. Standalone argument parsing is handled by
814      sim/common/run.c. */
815   for (p = argv + 1; *p; ++p)
816     {
817       if (strcmp (*p, "-oldseg") == 0)
818 	old_segment_mapping = 1;
819 #ifdef DEBUG
820       else if (strcmp (*p, "-t") == 0)
821 	d10v_debug = DEBUG;
822       else if (strncmp (*p, "-t", 2) == 0)
823 	d10v_debug = atoi (*p + 2);
824 #endif
825       else
826 	(*d10v_callback->printf_filtered) (d10v_callback, "ERROR: unsupported option(s): %s\n",*p);
827     }
828 
829   /* put all the opcodes in the hash table */
830   if (!init_p++)
831     {
832       for (s = Simops; s->func; s++)
833 	{
834 	  h = &hash_table[hash(s->opcode,s->format)];
835 
836 	  /* go to the last entry in the chain */
837 	  while (h->next)
838 	    h = h->next;
839 
840 	  if (h->ops)
841 	    {
842 	      h->next = (struct hash_entry *) calloc(1,sizeof(struct hash_entry));
843 	      if (!h->next)
844 		perror ("malloc failure");
845 
846 	      h = h->next;
847 	    }
848 	  h->ops = s;
849 	  h->mask = s->mask;
850 	  h->opcode = s->opcode;
851 	  h->size = s->is_long;
852 	}
853     }
854 
855   /* reset the processor state */
856   if (!State.mem.data[0])
857     sim_size (1);
858   sim_create_inferior ((SIM_DESC) 1, NULL, NULL, NULL);
859 
860   /* Fudge our descriptor.  */
861   return (SIM_DESC) 1;
862 }
863 
864 
865 void
866 sim_close (sd, quitting)
867      SIM_DESC sd;
868      int quitting;
869 {
870   if (prog_bfd != NULL && prog_bfd_was_opened_p)
871     {
872       bfd_close (prog_bfd);
873       prog_bfd = NULL;
874       prog_bfd_was_opened_p = 0;
875     }
876 }
877 
878 void
879 sim_set_profile (n)
880      int n;
881 {
882   (*d10v_callback->printf_filtered) (d10v_callback, "sim_set_profile %d\n",n);
883 }
884 
885 void
886 sim_set_profile_size (n)
887      int n;
888 {
889   (*d10v_callback->printf_filtered) (d10v_callback, "sim_set_profile_size %d\n",n);
890 }
891 
892 uint8 *
893 dmem_addr (uint16 offset)
894 {
895   unsigned long phys;
896   uint8 *mem;
897   int phys_size;
898 
899   /* Note: DMEM address range is 0..0x10000. Calling code can compute
900      things like ``0xfffe + 0x0e60 == 0x10e5d''.  Since offset's type
901      is uint16 this is modulo'ed onto 0x0e5d. */
902 
903   phys_size = sim_d10v_translate_dmap_addr (offset, 1, &phys, NULL,
904 					    dmap_register);
905   if (phys_size == 0)
906     {
907       mem = State.mem.fault;
908     }
909   else
910     mem = map_memory (phys);
911 #ifdef DEBUG
912   if ((d10v_debug & DEBUG_MEMORY))
913     {
914       (*d10v_callback->printf_filtered)
915 	(d10v_callback,
916 	 "mem: 0x%08x (%s) -> 0x%08lx %d (%s) -> 0x%08lx (%s)\n",
917 	 offset, last_from,
918 	 phys, phys_size, last_to,
919 	 (long) mem, last_segname);
920     }
921 #endif
922   return mem;
923 }
924 
925 uint8 *
926 imem_addr (uint32 offset)
927 {
928   unsigned long phys;
929   uint8 *mem;
930   int phys_size = sim_d10v_translate_imap_addr (offset, 1, &phys, NULL,
931 						imap_register);
932   if (phys_size == 0)
933     {
934       return State.mem.fault;
935     }
936   mem = map_memory (phys);
937 #ifdef DEBUG
938   if ((d10v_debug & DEBUG_MEMORY))
939     {
940       (*d10v_callback->printf_filtered)
941 	(d10v_callback,
942 	 "mem: 0x%08x (%s) -> 0x%08lx %d (%s) -> 0x%08lx (%s)\n",
943 	 offset, last_from,
944 	 phys, phys_size, last_to,
945 	 (long) mem, last_segname);
946     }
947 #endif
948   return mem;
949 }
950 
951 static int stop_simulator = 0;
952 
953 int
954 sim_stop (sd)
955      SIM_DESC sd;
956 {
957   stop_simulator = 1;
958   return 1;
959 }
960 
961 
962 /* Run (or resume) the program.  */
963 void
964 sim_resume (sd, step, siggnal)
965      SIM_DESC sd;
966      int step, siggnal;
967 {
968   uint32 inst;
969   uint8 *iaddr;
970 
971 /*   (*d10v_callback->printf_filtered) (d10v_callback, "sim_resume (%d,%d)  PC=0x%x\n",step,siggnal,PC); */
972   State.exception = 0;
973   if (step)
974     sim_stop (sd);
975 
976   switch (siggnal)
977     {
978     case 0:
979       break;
980 #ifdef SIGBUS
981     case SIGBUS:
982 #endif
983     case SIGSEGV:
984       SET_BPC (PC);
985       SET_BPSW (PSW);
986       SET_HW_PSW ((PSW & (PSW_F0_BIT | PSW_F1_BIT | PSW_C_BIT)));
987       JMP (AE_VECTOR_START);
988       SLOT_FLUSH ();
989       break;
990     case SIGILL:
991       SET_BPC (PC);
992       SET_BPSW (PSW);
993       SET_HW_PSW ((PSW & (PSW_F0_BIT | PSW_F1_BIT | PSW_C_BIT)));
994       JMP (RIE_VECTOR_START);
995       SLOT_FLUSH ();
996       break;
997     default:
998       /* just ignore it */
999       break;
1000     }
1001 
1002   do
1003     {
1004       iaddr = imem_addr ((uint32)PC << 2);
1005       if (iaddr == State.mem.fault)
1006  	{
1007  	  State.exception = SIGBUS;
1008  	  break;
1009  	}
1010 
1011       inst = get_longword( iaddr );
1012 
1013       State.pc_changed = 0;
1014       ins_type_counters[ (int)INS_CYCLES ]++;
1015 
1016       switch (inst & 0xC0000000)
1017 	{
1018 	case 0xC0000000:
1019 	  /* long instruction */
1020 	  do_long (inst & 0x3FFFFFFF);
1021 	  break;
1022 	case 0x80000000:
1023 	  /* R -> L */
1024 	  do_2_short ( inst & 0x7FFF, (inst & 0x3FFF8000) >> 15, RIGHT_FIRST);
1025 	  break;
1026 	case 0x40000000:
1027 	  /* L -> R */
1028 	  do_2_short ((inst & 0x3FFF8000) >> 15, inst & 0x7FFF, LEFT_FIRST);
1029 	  break;
1030 	case 0:
1031 	  do_parallel ((inst & 0x3FFF8000) >> 15, inst & 0x7FFF);
1032 	  break;
1033 	}
1034 
1035       /* If the PC of the current instruction matches RPT_E then
1036 	 schedule a branch to the loop start.  If one of those
1037 	 instructions happens to be a branch, than that instruction
1038 	 will be ignored */
1039       if (!State.pc_changed)
1040 	{
1041 	  if (PSW_RP && PC == RPT_E)
1042 	    {
1043 	      /* Note: The behavour of a branch instruction at RPT_E
1044 		 is implementation dependant, this simulator takes the
1045 		 branch.  Branching to RPT_E is valid, the instruction
1046 		 must be executed before the loop is taken.  */
1047 	      if (RPT_C == 1)
1048 		{
1049 		  SET_PSW_RP (0);
1050 		  SET_RPT_C (0);
1051 		  SET_PC (PC + 1);
1052 		}
1053 	      else
1054 		{
1055 		  SET_RPT_C (RPT_C - 1);
1056 		  SET_PC (RPT_S);
1057 		}
1058 	    }
1059 	  else
1060 	    SET_PC (PC + 1);
1061 	}
1062 
1063       /* Check for a breakpoint trap on this instruction.  This
1064 	 overrides any pending branches or loops */
1065       if (PSW_DB && PC == IBA)
1066 	{
1067 	  SET_BPC (PC);
1068 	  SET_BPSW (PSW);
1069 	  SET_PSW (PSW & PSW_SM_BIT);
1070 	  SET_PC (SDBT_VECTOR_START);
1071 	}
1072 
1073       /* Writeback all the DATA / PC changes */
1074       SLOT_FLUSH ();
1075 
1076 #ifdef NEED_UI_LOOP_HOOK
1077       if (deprecated_ui_loop_hook != NULL && ui_loop_hook_counter-- < 0)
1078 	{
1079 	  ui_loop_hook_counter = UI_LOOP_POLL_INTERVAL;
1080 	  deprecated_ui_loop_hook (0);
1081 	}
1082 #endif /* NEED_UI_LOOP_HOOK */
1083     }
1084   while ( !State.exception && !stop_simulator);
1085 
1086   if (step && !State.exception)
1087     State.exception = SIGTRAP;
1088 }
1089 
1090 void
1091 sim_set_trace (void)
1092 {
1093 #ifdef DEBUG
1094   d10v_debug = DEBUG;
1095 #endif
1096 }
1097 
1098 void
1099 sim_info (sd, verbose)
1100      SIM_DESC sd;
1101      int verbose;
1102 {
1103   char buf1[40];
1104   char buf2[40];
1105   char buf3[40];
1106   char buf4[40];
1107   char buf5[40];
1108   unsigned long left		= ins_type_counters[ (int)INS_LEFT ] + ins_type_counters[ (int)INS_LEFT_COND_EXE ];
1109   unsigned long left_nops	= ins_type_counters[ (int)INS_LEFT_NOPS ];
1110   unsigned long left_parallel	= ins_type_counters[ (int)INS_LEFT_PARALLEL ];
1111   unsigned long left_cond	= ins_type_counters[ (int)INS_LEFT_COND_TEST ];
1112   unsigned long left_total	= left + left_parallel + left_cond + left_nops;
1113 
1114   unsigned long right		= ins_type_counters[ (int)INS_RIGHT ] + ins_type_counters[ (int)INS_RIGHT_COND_EXE ];
1115   unsigned long right_nops	= ins_type_counters[ (int)INS_RIGHT_NOPS ];
1116   unsigned long right_parallel	= ins_type_counters[ (int)INS_RIGHT_PARALLEL ];
1117   unsigned long right_cond	= ins_type_counters[ (int)INS_RIGHT_COND_TEST ];
1118   unsigned long right_total	= right + right_parallel + right_cond + right_nops;
1119 
1120   unsigned long unknown		= ins_type_counters[ (int)INS_UNKNOWN ];
1121   unsigned long ins_long	= ins_type_counters[ (int)INS_LONG ];
1122   unsigned long parallel	= ins_type_counters[ (int)INS_PARALLEL ];
1123   unsigned long leftright	= ins_type_counters[ (int)INS_LEFTRIGHT ];
1124   unsigned long rightleft	= ins_type_counters[ (int)INS_RIGHTLEFT ];
1125   unsigned long cond_true	= ins_type_counters[ (int)INS_COND_TRUE ];
1126   unsigned long cond_false	= ins_type_counters[ (int)INS_COND_FALSE ];
1127   unsigned long cond_jump	= ins_type_counters[ (int)INS_COND_JUMP ];
1128   unsigned long cycles		= ins_type_counters[ (int)INS_CYCLES ];
1129   unsigned long total		= (unknown + left_total + right_total + ins_long);
1130 
1131   int size			= strlen (add_commas (buf1, sizeof (buf1), total));
1132   int parallel_size		= strlen (add_commas (buf1, sizeof (buf1),
1133 						      (left_parallel > right_parallel) ? left_parallel : right_parallel));
1134   int cond_size			= strlen (add_commas (buf1, sizeof (buf1), (left_cond > right_cond) ? left_cond : right_cond));
1135   int nop_size			= strlen (add_commas (buf1, sizeof (buf1), (left_nops > right_nops) ? left_nops : right_nops));
1136   int normal_size		= strlen (add_commas (buf1, sizeof (buf1), (left > right) ? left : right));
1137 
1138   (*d10v_callback->printf_filtered) (d10v_callback,
1139 				     "executed %*s left  instruction(s), %*s normal, %*s parallel, %*s EXExxx, %*s nops\n",
1140 				     size, add_commas (buf1, sizeof (buf1), left_total),
1141 				     normal_size, add_commas (buf2, sizeof (buf2), left),
1142 				     parallel_size, add_commas (buf3, sizeof (buf3), left_parallel),
1143 				     cond_size, add_commas (buf4, sizeof (buf4), left_cond),
1144 				     nop_size, add_commas (buf5, sizeof (buf5), left_nops));
1145 
1146   (*d10v_callback->printf_filtered) (d10v_callback,
1147 				     "executed %*s right instruction(s), %*s normal, %*s parallel, %*s EXExxx, %*s nops\n",
1148 				     size, add_commas (buf1, sizeof (buf1), right_total),
1149 				     normal_size, add_commas (buf2, sizeof (buf2), right),
1150 				     parallel_size, add_commas (buf3, sizeof (buf3), right_parallel),
1151 				     cond_size, add_commas (buf4, sizeof (buf4), right_cond),
1152 				     nop_size, add_commas (buf5, sizeof (buf5), right_nops));
1153 
1154   if (ins_long)
1155     (*d10v_callback->printf_filtered) (d10v_callback,
1156 				       "executed %*s long instruction(s)\n",
1157 				       size, add_commas (buf1, sizeof (buf1), ins_long));
1158 
1159   if (parallel)
1160     (*d10v_callback->printf_filtered) (d10v_callback,
1161 				       "executed %*s parallel instruction(s)\n",
1162 				       size, add_commas (buf1, sizeof (buf1), parallel));
1163 
1164   if (leftright)
1165     (*d10v_callback->printf_filtered) (d10v_callback,
1166 				       "executed %*s instruction(s) encoded L->R\n",
1167 				       size, add_commas (buf1, sizeof (buf1), leftright));
1168 
1169   if (rightleft)
1170     (*d10v_callback->printf_filtered) (d10v_callback,
1171 				       "executed %*s instruction(s) encoded R->L\n",
1172 				       size, add_commas (buf1, sizeof (buf1), rightleft));
1173 
1174   if (unknown)
1175     (*d10v_callback->printf_filtered) (d10v_callback,
1176 				       "executed %*s unknown instruction(s)\n",
1177 				       size, add_commas (buf1, sizeof (buf1), unknown));
1178 
1179   if (cond_true)
1180     (*d10v_callback->printf_filtered) (d10v_callback,
1181 				       "executed %*s instruction(s) due to EXExxx condition being true\n",
1182 				       size, add_commas (buf1, sizeof (buf1), cond_true));
1183 
1184   if (cond_false)
1185     (*d10v_callback->printf_filtered) (d10v_callback,
1186 				       "skipped  %*s instruction(s) due to EXExxx condition being false\n",
1187 				       size, add_commas (buf1, sizeof (buf1), cond_false));
1188 
1189   if (cond_jump)
1190     (*d10v_callback->printf_filtered) (d10v_callback,
1191 				       "skipped  %*s instruction(s) due to conditional branch succeeding\n",
1192 				       size, add_commas (buf1, sizeof (buf1), cond_jump));
1193 
1194   (*d10v_callback->printf_filtered) (d10v_callback,
1195 				     "executed %*s cycle(s)\n",
1196 				     size, add_commas (buf1, sizeof (buf1), cycles));
1197 
1198   (*d10v_callback->printf_filtered) (d10v_callback,
1199 				     "executed %*s total instructions\n",
1200 				     size, add_commas (buf1, sizeof (buf1), total));
1201 }
1202 
1203 SIM_RC
1204 sim_create_inferior (sd, abfd, argv, env)
1205      SIM_DESC sd;
1206      struct bfd *abfd;
1207      char **argv;
1208      char **env;
1209 {
1210   bfd_vma start_address;
1211 
1212   /* reset all state information */
1213   memset (&State.regs, 0, (int)&State.mem - (int)&State.regs);
1214 
1215   /* There was a hack here to copy the values of argc and argv into r0
1216      and r1.  The values were also saved into some high memory that
1217      won't be overwritten by the stack (0x7C00).  The reason for doing
1218      this was to allow the 'run' program to accept arguments.  Without
1219      the hack, this is not possible anymore.  If the simulator is run
1220      from the debugger, arguments cannot be passed in, so this makes
1221      no difference.  */
1222 
1223   /* set PC */
1224   if (abfd != NULL)
1225     start_address = bfd_get_start_address (abfd);
1226   else
1227     start_address = 0xffc0 << 2;
1228 #ifdef DEBUG
1229   if (d10v_debug)
1230     (*d10v_callback->printf_filtered) (d10v_callback, "sim_create_inferior:  PC=0x%lx\n", (long) start_address);
1231 #endif
1232   SET_CREG (PC_CR, start_address >> 2);
1233 
1234   /* cpu resets imap0 to 0 and imap1 to 0x7f, but D10V-EVA board
1235      initializes imap0 and imap1 to 0x1000 as part of its ROM
1236      initialization. */
1237   if (old_segment_mapping)
1238     {
1239       /* External memory startup.  This is the HARD reset state. */
1240       set_imap_register (0, 0x0000);
1241       set_imap_register (1, 0x007f);
1242       set_dmap_register (0, 0x2000);
1243       set_dmap_register (1, 0x2000);
1244       set_dmap_register (2, 0x0000); /* Old DMAP */
1245       set_dmap_register (3, 0x0000);
1246     }
1247   else
1248     {
1249       /* Internal memory startup. This is the ROM intialized state. */
1250       set_imap_register (0, 0x1000);
1251       set_imap_register (1, 0x1000);
1252       set_dmap_register (0, 0x2000);
1253       set_dmap_register (1, 0x2000);
1254       set_dmap_register (2, 0x2000); /* DMAP2 initial internal value is
1255 					0x2000 on the new board. */
1256       set_dmap_register (3, 0x0000);
1257     }
1258 
1259   SLOT_FLUSH ();
1260   return SIM_RC_OK;
1261 }
1262 
1263 
1264 void
1265 sim_set_callbacks (p)
1266      host_callback *p;
1267 {
1268   d10v_callback = p;
1269 }
1270 
1271 void
1272 sim_stop_reason (sd, reason, sigrc)
1273      SIM_DESC sd;
1274      enum sim_stop *reason;
1275      int *sigrc;
1276 {
1277 /*   (*d10v_callback->printf_filtered) (d10v_callback, "sim_stop_reason:  PC=0x%x\n",PC<<2); */
1278 
1279   switch (State.exception)
1280     {
1281     case SIG_D10V_STOP:			/* stop instruction */
1282       *reason = sim_exited;
1283       *sigrc = 0;
1284       break;
1285 
1286     case SIG_D10V_EXIT:			/* exit trap */
1287       *reason = sim_exited;
1288       *sigrc = GPR (0);
1289       break;
1290 
1291     case SIG_D10V_BUS:
1292       *reason = sim_stopped;
1293       *sigrc = GDB_SIGNAL_BUS;
1294       break;
1295 
1296     default:				/* some signal */
1297       *reason = sim_stopped;
1298       if (stop_simulator && !State.exception)
1299 	*sigrc = GDB_SIGNAL_INT;
1300       else
1301 	*sigrc = State.exception;
1302       break;
1303     }
1304 
1305   stop_simulator = 0;
1306 }
1307 
1308 int
1309 sim_fetch_register (sd, rn, memory, length)
1310      SIM_DESC sd;
1311      int rn;
1312      unsigned char *memory;
1313      int length;
1314 {
1315   int size;
1316   switch ((enum sim_d10v_regs) rn)
1317     {
1318     case SIM_D10V_R0_REGNUM:
1319     case SIM_D10V_R1_REGNUM:
1320     case SIM_D10V_R2_REGNUM:
1321     case SIM_D10V_R3_REGNUM:
1322     case SIM_D10V_R4_REGNUM:
1323     case SIM_D10V_R5_REGNUM:
1324     case SIM_D10V_R6_REGNUM:
1325     case SIM_D10V_R7_REGNUM:
1326     case SIM_D10V_R8_REGNUM:
1327     case SIM_D10V_R9_REGNUM:
1328     case SIM_D10V_R10_REGNUM:
1329     case SIM_D10V_R11_REGNUM:
1330     case SIM_D10V_R12_REGNUM:
1331     case SIM_D10V_R13_REGNUM:
1332     case SIM_D10V_R14_REGNUM:
1333     case SIM_D10V_R15_REGNUM:
1334       WRITE_16 (memory, GPR (rn - SIM_D10V_R0_REGNUM));
1335       size = 2;
1336       break;
1337     case SIM_D10V_CR0_REGNUM:
1338     case SIM_D10V_CR1_REGNUM:
1339     case SIM_D10V_CR2_REGNUM:
1340     case SIM_D10V_CR3_REGNUM:
1341     case SIM_D10V_CR4_REGNUM:
1342     case SIM_D10V_CR5_REGNUM:
1343     case SIM_D10V_CR6_REGNUM:
1344     case SIM_D10V_CR7_REGNUM:
1345     case SIM_D10V_CR8_REGNUM:
1346     case SIM_D10V_CR9_REGNUM:
1347     case SIM_D10V_CR10_REGNUM:
1348     case SIM_D10V_CR11_REGNUM:
1349     case SIM_D10V_CR12_REGNUM:
1350     case SIM_D10V_CR13_REGNUM:
1351     case SIM_D10V_CR14_REGNUM:
1352     case SIM_D10V_CR15_REGNUM:
1353       WRITE_16 (memory, CREG (rn - SIM_D10V_CR0_REGNUM));
1354       size = 2;
1355       break;
1356     case SIM_D10V_A0_REGNUM:
1357     case SIM_D10V_A1_REGNUM:
1358       WRITE_64 (memory, ACC (rn - SIM_D10V_A0_REGNUM));
1359       size = 8;
1360       break;
1361     case SIM_D10V_SPI_REGNUM:
1362       /* PSW_SM indicates that the current SP is the USER
1363          stack-pointer. */
1364       WRITE_16 (memory, spi_register ());
1365       size = 2;
1366       break;
1367     case SIM_D10V_SPU_REGNUM:
1368       /* PSW_SM indicates that the current SP is the USER
1369          stack-pointer. */
1370       WRITE_16 (memory, spu_register ());
1371       size = 2;
1372       break;
1373     case SIM_D10V_IMAP0_REGNUM:
1374     case SIM_D10V_IMAP1_REGNUM:
1375       WRITE_16 (memory, imap_register (NULL, rn - SIM_D10V_IMAP0_REGNUM));
1376       size = 2;
1377       break;
1378     case SIM_D10V_DMAP0_REGNUM:
1379     case SIM_D10V_DMAP1_REGNUM:
1380     case SIM_D10V_DMAP2_REGNUM:
1381     case SIM_D10V_DMAP3_REGNUM:
1382       WRITE_16 (memory, dmap_register (NULL, rn - SIM_D10V_DMAP0_REGNUM));
1383       size = 2;
1384       break;
1385     case SIM_D10V_TS2_DMAP_REGNUM:
1386       size = 0;
1387       break;
1388     default:
1389       size = 0;
1390       break;
1391     }
1392   return size;
1393 }
1394 
1395 int
1396 sim_store_register (sd, rn, memory, length)
1397      SIM_DESC sd;
1398      int rn;
1399      unsigned char *memory;
1400      int length;
1401 {
1402   int size;
1403   switch ((enum sim_d10v_regs) rn)
1404     {
1405     case SIM_D10V_R0_REGNUM:
1406     case SIM_D10V_R1_REGNUM:
1407     case SIM_D10V_R2_REGNUM:
1408     case SIM_D10V_R3_REGNUM:
1409     case SIM_D10V_R4_REGNUM:
1410     case SIM_D10V_R5_REGNUM:
1411     case SIM_D10V_R6_REGNUM:
1412     case SIM_D10V_R7_REGNUM:
1413     case SIM_D10V_R8_REGNUM:
1414     case SIM_D10V_R9_REGNUM:
1415     case SIM_D10V_R10_REGNUM:
1416     case SIM_D10V_R11_REGNUM:
1417     case SIM_D10V_R12_REGNUM:
1418     case SIM_D10V_R13_REGNUM:
1419     case SIM_D10V_R14_REGNUM:
1420     case SIM_D10V_R15_REGNUM:
1421       SET_GPR (rn - SIM_D10V_R0_REGNUM, READ_16 (memory));
1422       size = 2;
1423       break;
1424     case SIM_D10V_CR0_REGNUM:
1425     case SIM_D10V_CR1_REGNUM:
1426     case SIM_D10V_CR2_REGNUM:
1427     case SIM_D10V_CR3_REGNUM:
1428     case SIM_D10V_CR4_REGNUM:
1429     case SIM_D10V_CR5_REGNUM:
1430     case SIM_D10V_CR6_REGNUM:
1431     case SIM_D10V_CR7_REGNUM:
1432     case SIM_D10V_CR8_REGNUM:
1433     case SIM_D10V_CR9_REGNUM:
1434     case SIM_D10V_CR10_REGNUM:
1435     case SIM_D10V_CR11_REGNUM:
1436     case SIM_D10V_CR12_REGNUM:
1437     case SIM_D10V_CR13_REGNUM:
1438     case SIM_D10V_CR14_REGNUM:
1439     case SIM_D10V_CR15_REGNUM:
1440       SET_CREG (rn - SIM_D10V_CR0_REGNUM, READ_16 (memory));
1441       size = 2;
1442       break;
1443     case SIM_D10V_A0_REGNUM:
1444     case SIM_D10V_A1_REGNUM:
1445       SET_ACC (rn - SIM_D10V_A0_REGNUM, READ_64 (memory) & MASK40);
1446       size = 8;
1447       break;
1448     case SIM_D10V_SPI_REGNUM:
1449       /* PSW_SM indicates that the current SP is the USER
1450          stack-pointer. */
1451       set_spi_register (READ_16 (memory));
1452       size = 2;
1453       break;
1454     case SIM_D10V_SPU_REGNUM:
1455       set_spu_register (READ_16 (memory));
1456       size = 2;
1457       break;
1458     case SIM_D10V_IMAP0_REGNUM:
1459     case SIM_D10V_IMAP1_REGNUM:
1460       set_imap_register (rn - SIM_D10V_IMAP0_REGNUM, READ_16(memory));
1461       size = 2;
1462       break;
1463     case SIM_D10V_DMAP0_REGNUM:
1464     case SIM_D10V_DMAP1_REGNUM:
1465     case SIM_D10V_DMAP2_REGNUM:
1466     case SIM_D10V_DMAP3_REGNUM:
1467       set_dmap_register (rn - SIM_D10V_DMAP0_REGNUM, READ_16(memory));
1468       size = 2;
1469       break;
1470     case SIM_D10V_TS2_DMAP_REGNUM:
1471       size = 0;
1472       break;
1473     default:
1474       size = 0;
1475       break;
1476     }
1477   SLOT_FLUSH ();
1478   return size;
1479 }
1480 
1481 
1482 void
1483 sim_do_command (sd, cmd)
1484      SIM_DESC sd;
1485      char *cmd;
1486 {
1487   (*d10v_callback->printf_filtered) (d10v_callback, "sim_do_command: %s\n",cmd);
1488 }
1489 
1490 SIM_RC
1491 sim_load (sd, prog, abfd, from_tty)
1492      SIM_DESC sd;
1493      char *prog;
1494      bfd *abfd;
1495      int from_tty;
1496 {
1497   extern bfd *sim_load_file (); /* ??? Don't know where this should live.  */
1498 
1499   if (prog_bfd != NULL && prog_bfd_was_opened_p)
1500     {
1501       bfd_close (prog_bfd);
1502       prog_bfd_was_opened_p = 0;
1503     }
1504   prog_bfd = sim_load_file (sd, myname, d10v_callback, prog, abfd,
1505 			    sim_kind == SIM_OPEN_DEBUG,
1506 			    1/*LMA*/, sim_write);
1507   if (prog_bfd == NULL)
1508     return SIM_RC_FAIL;
1509   prog_bfd_was_opened_p = abfd == NULL;
1510   return SIM_RC_OK;
1511 }
1512