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