1 /* This must come before any other includes. */
7 #include "sim/callback.h"
11 #include "sim-options.h"
12 #include "sim-signal.h"
14 #include "sim/sim-d10v.h"
15 #include "gdb/signals.h"
23 #include "target-newlib-syscall.h"
25 enum _leftright
{ LEFT_FIRST
, RIGHT_FIRST
};
31 /* Set this to true to get the previous segment layout. */
33 int old_segment_mapping
;
35 unsigned long ins_type_counters
[ (int)INS_MAX
];
39 static long hash (long insn
, int format
);
40 static struct hash_entry
*lookup_hash (SIM_DESC
, SIM_CPU
*, uint32_t ins
, int size
);
41 static void get_operands (struct simops
*s
, uint32_t ins
);
42 static void do_long (SIM_DESC
, SIM_CPU
*, uint32_t ins
);
43 static void do_2_short (SIM_DESC
, SIM_CPU
*, uint16_t ins1
, uint16_t ins2
, enum _leftright leftright
);
44 static void do_parallel (SIM_DESC
, SIM_CPU
*, uint16_t ins1
, uint16_t ins2
);
45 static char *add_commas (char *buf
, int sizeof_buf
, unsigned long value
);
46 static INLINE
uint8_t *map_memory (SIM_DESC
, SIM_CPU
*, unsigned phys_addr
);
51 struct hash_entry
*next
;
58 struct hash_entry hash_table
[MAX_HASH
+1];
61 hash (long insn
, int format
)
63 if (format
& LONG_OPCODE
)
64 return ((insn
& 0x3F000000) >> 24);
66 return((insn
& 0x7E00) >> 9);
69 INLINE
static struct hash_entry
*
70 lookup_hash (SIM_DESC sd
, SIM_CPU
*cpu
, uint32_t ins
, int size
)
75 h
= &hash_table
[(ins
& 0x3F000000) >> 24];
77 h
= &hash_table
[(ins
& 0x7E00) >> 9];
79 while ((ins
& h
->mask
) != h
->opcode
|| h
->size
!= size
)
82 sim_engine_halt (sd
, cpu
, NULL
, PC
, sim_stopped
, SIM_SIGILL
);
89 get_operands (struct simops
*s
, uint32_t ins
)
93 for (i
=0; i
< s
->numops
; i
++)
95 shift
= s
->operands
[3*i
];
96 bits
= s
->operands
[3*i
+1];
97 /* flags = s->operands[3*i+2]; */
98 mask
= 0x7FFFFFFF >> (31 - bits
);
99 OP
[i
] = (ins
>> shift
) & mask
;
101 /* FIXME: for tracing, update values that need to be updated each
102 instruction decode cycle */
103 State
.trace
.psw
= PSW
;
107 do_long (SIM_DESC sd
, SIM_CPU
*cpu
, uint32_t ins
)
109 struct hash_entry
*h
;
111 if ((d10v_debug
& DEBUG_INSTRUCTION
) != 0)
112 sim_io_printf (sd
, "do_long 0x%x\n", ins
);
114 h
= lookup_hash (sd
, cpu
, ins
, 1);
117 get_operands (h
->ops
, ins
);
118 State
.ins_type
= INS_LONG
;
119 ins_type_counters
[ (int)State
.ins_type
]++;
120 (h
->ops
->func
) (sd
, cpu
);
124 do_2_short (SIM_DESC sd
, SIM_CPU
*cpu
, uint16_t ins1
, uint16_t ins2
, enum _leftright leftright
)
126 struct hash_entry
*h
;
127 enum _ins_type first
, second
;
130 if ((d10v_debug
& DEBUG_INSTRUCTION
) != 0)
131 sim_io_printf (sd
, "do_2_short 0x%x (%s) -> 0x%x\n", ins1
,
132 leftright
? "left" : "right", ins2
);
135 if (leftright
== LEFT_FIRST
)
139 ins_type_counters
[ (int)INS_LEFTRIGHT
]++;
145 ins_type_counters
[ (int)INS_RIGHTLEFT
]++;
148 /* Issue the first instruction */
149 h
= lookup_hash (sd
, cpu
, ins1
, 0);
152 get_operands (h
->ops
, ins1
);
153 State
.ins_type
= first
;
154 ins_type_counters
[ (int)State
.ins_type
]++;
155 (h
->ops
->func
) (sd
, cpu
);
157 /* Issue the second instruction (if the PC hasn't changed) */
158 if (!State
.pc_changed
)
160 /* finish any existing instructions */
162 h
= lookup_hash (sd
, cpu
, ins2
, 0);
165 get_operands (h
->ops
, ins2
);
166 State
.ins_type
= second
;
167 ins_type_counters
[ (int)State
.ins_type
]++;
168 ins_type_counters
[ (int)INS_CYCLES
]++;
169 (h
->ops
->func
) (sd
, cpu
);
172 ins_type_counters
[ (int)INS_COND_JUMP
]++;
176 do_parallel (SIM_DESC sd
, SIM_CPU
*cpu
, uint16_t ins1
, uint16_t ins2
)
178 struct hash_entry
*h1
, *h2
;
180 if ((d10v_debug
& DEBUG_INSTRUCTION
) != 0)
181 sim_io_printf (sd
, "do_parallel 0x%x || 0x%x\n", ins1
, ins2
);
183 ins_type_counters
[ (int)INS_PARALLEL
]++;
184 h1
= lookup_hash (sd
, cpu
, ins1
, 0);
187 h2
= lookup_hash (sd
, cpu
, ins2
, 0);
191 if (h1
->ops
->exec_type
== PARONLY
)
193 get_operands (h1
->ops
, ins1
);
194 State
.ins_type
= INS_LEFT_COND_TEST
;
195 ins_type_counters
[ (int)State
.ins_type
]++;
196 (h1
->ops
->func
) (sd
, cpu
);
199 ins_type_counters
[ (int)INS_COND_TRUE
]++;
200 get_operands (h2
->ops
, ins2
);
201 State
.ins_type
= INS_RIGHT_COND_EXE
;
202 ins_type_counters
[ (int)State
.ins_type
]++;
203 (h2
->ops
->func
) (sd
, cpu
);
206 ins_type_counters
[ (int)INS_COND_FALSE
]++;
208 else if (h2
->ops
->exec_type
== PARONLY
)
210 get_operands (h2
->ops
, ins2
);
211 State
.ins_type
= INS_RIGHT_COND_TEST
;
212 ins_type_counters
[ (int)State
.ins_type
]++;
213 (h2
->ops
->func
) (sd
, cpu
);
216 ins_type_counters
[ (int)INS_COND_TRUE
]++;
217 get_operands (h1
->ops
, ins1
);
218 State
.ins_type
= INS_LEFT_COND_EXE
;
219 ins_type_counters
[ (int)State
.ins_type
]++;
220 (h1
->ops
->func
) (sd
, cpu
);
223 ins_type_counters
[ (int)INS_COND_FALSE
]++;
227 get_operands (h1
->ops
, ins1
);
228 State
.ins_type
= INS_LEFT_PARALLEL
;
229 ins_type_counters
[ (int)State
.ins_type
]++;
230 (h1
->ops
->func
) (sd
, cpu
);
231 get_operands (h2
->ops
, ins2
);
232 State
.ins_type
= INS_RIGHT_PARALLEL
;
233 ins_type_counters
[ (int)State
.ins_type
]++;
234 (h2
->ops
->func
) (sd
, cpu
);
239 add_commas (char *buf
, int sizeof_buf
, unsigned long value
)
242 char *endbuf
= buf
+ sizeof_buf
- 1;
252 *--endbuf
= (value
% 10) + '0';
253 } while ((value
/= 10) != 0);
262 for (i
= 0; i
< IMEM_SEGMENTS
; i
++)
264 if (State
.mem
.insn
[i
])
265 free (State
.mem
.insn
[i
]);
267 for (i
= 0; i
< DMEM_SEGMENTS
; i
++)
269 if (State
.mem
.data
[i
])
270 free (State
.mem
.data
[i
]);
272 for (i
= 0; i
< UMEM_SEGMENTS
; i
++)
274 if (State
.mem
.unif
[i
])
275 free (State
.mem
.unif
[i
]);
277 /* Always allocate dmem segment 0. This contains the IMAP and DMAP
279 State
.mem
.data
[0] = calloc (1, SEGMENT_SIZE
);
282 /* For tracing - leave info on last access around. */
283 static char *last_segname
= "invalid";
284 static char *last_from
= "invalid";
285 static char *last_to
= "invalid";
289 IMAP0_OFFSET
= 0xff00,
290 DMAP0_OFFSET
= 0xff08,
291 DMAP2_SHADDOW
= 0xff04,
292 DMAP2_OFFSET
= 0xff0c
296 set_dmap_register (SIM_DESC sd
, int reg_nr
, unsigned long value
)
298 uint8_t *raw
= map_memory (sd
, NULL
, SIM_D10V_MEMORY_DATA
299 + DMAP0_OFFSET
+ 2 * reg_nr
);
300 WRITE_16 (raw
, value
);
302 if ((d10v_debug
& DEBUG_MEMORY
))
304 sim_io_printf (sd
, "mem: dmap%d=0x%04lx\n", reg_nr
, value
);
310 dmap_register (SIM_DESC sd
, SIM_CPU
*cpu
, void *regcache
, int reg_nr
)
312 uint8_t *raw
= map_memory (sd
, cpu
, SIM_D10V_MEMORY_DATA
313 + DMAP0_OFFSET
+ 2 * reg_nr
);
314 return READ_16 (raw
);
318 set_imap_register (SIM_DESC sd
, int reg_nr
, unsigned long value
)
320 uint8_t *raw
= map_memory (sd
, NULL
, SIM_D10V_MEMORY_DATA
321 + IMAP0_OFFSET
+ 2 * reg_nr
);
322 WRITE_16 (raw
, value
);
324 if ((d10v_debug
& DEBUG_MEMORY
))
326 sim_io_printf (sd
, "mem: imap%d=0x%04lx\n", reg_nr
, value
);
332 imap_register (SIM_DESC sd
, SIM_CPU
*cpu
, void *regcache
, int reg_nr
)
334 uint8_t *raw
= map_memory (sd
, cpu
, SIM_D10V_MEMORY_DATA
335 + IMAP0_OFFSET
+ 2 * reg_nr
);
336 return READ_16 (raw
);
351 return HELD_SP (HELD_SPU_IDX
);
360 return HELD_SP (HELD_SPI_IDX
);
364 set_spi_register (unsigned long value
)
367 SET_GPR (SP_IDX
, value
);
368 SET_HELD_SP (HELD_SPI_IDX
, value
);
372 set_spu_register (unsigned long value
)
375 SET_GPR (SP_IDX
, value
);
376 SET_HELD_SP (HELD_SPU_IDX
, value
);
379 /* Given a virtual address in the DMAP address space, translate it
380 into a physical address. */
383 sim_d10v_translate_dmap_addr (SIM_DESC sd
,
385 unsigned long offset
,
389 unsigned long (*dmap_register
) (SIM_DESC
,
396 last_from
= "logical-data";
397 if (offset
>= DMAP_BLOCK_SIZE
* SIM_D10V_NR_DMAP_REGS
)
399 /* Logical address out side of data segments, not supported */
402 regno
= (offset
/ DMAP_BLOCK_SIZE
);
403 offset
= (offset
% DMAP_BLOCK_SIZE
);
404 if ((offset
% DMAP_BLOCK_SIZE
) + nr_bytes
> DMAP_BLOCK_SIZE
)
406 /* Don't cross a BLOCK boundary */
407 nr_bytes
= DMAP_BLOCK_SIZE
- (offset
% DMAP_BLOCK_SIZE
);
409 map
= dmap_register (sd
, cpu
, regcache
, regno
);
412 /* Always maps to data memory */
413 int iospi
= (offset
/ 0x1000) % 4;
414 int iosp
= (map
>> (4 * (3 - iospi
))) % 0x10;
415 last_to
= "io-space";
416 *phys
= (SIM_D10V_MEMORY_DATA
+ (iosp
* 0x10000) + 0xc000 + offset
);
420 int sp
= ((map
& 0x3000) >> 12);
421 int segno
= (map
& 0x3ff);
424 case 0: /* 00: Unified memory */
425 *phys
= SIM_D10V_MEMORY_UNIFIED
+ (segno
* DMAP_BLOCK_SIZE
) + offset
;
428 case 1: /* 01: Instruction Memory */
429 *phys
= SIM_D10V_MEMORY_INSN
+ (segno
* DMAP_BLOCK_SIZE
) + offset
;
430 last_to
= "chip-insn";
432 case 2: /* 10: Internal data memory */
433 *phys
= SIM_D10V_MEMORY_DATA
+ (segno
<< 16) + (regno
* DMAP_BLOCK_SIZE
) + offset
;
434 last_to
= "chip-data";
436 case 3: /* 11: Reserved */
443 /* Given a virtual address in the IMAP address space, translate it
444 into a physical address. */
447 sim_d10v_translate_imap_addr (SIM_DESC sd
,
449 unsigned long offset
,
453 unsigned long (*imap_register
) (SIM_DESC
,
462 last_from
= "logical-insn";
463 if (offset
>= (IMAP_BLOCK_SIZE
* SIM_D10V_NR_IMAP_REGS
))
465 /* Logical address outside of IMAP segments, not supported */
468 regno
= (offset
/ IMAP_BLOCK_SIZE
);
469 offset
= (offset
% IMAP_BLOCK_SIZE
);
470 if (offset
+ nr_bytes
> IMAP_BLOCK_SIZE
)
472 /* Don't cross a BLOCK boundary */
473 nr_bytes
= IMAP_BLOCK_SIZE
- offset
;
475 map
= imap_register (sd
, cpu
, regcache
, regno
);
476 sp
= (map
& 0x3000) >> 12;
477 segno
= (map
& 0x007f);
480 case 0: /* 00: unified memory */
481 *phys
= SIM_D10V_MEMORY_UNIFIED
+ (segno
<< 17) + offset
;
484 case 1: /* 01: instruction memory */
485 *phys
= SIM_D10V_MEMORY_INSN
+ (IMAP_BLOCK_SIZE
* regno
) + offset
;
486 last_to
= "chip-insn";
491 case 3: /* 11: for testing - instruction memory */
492 offset
= (offset
% 0x800);
493 *phys
= SIM_D10V_MEMORY_INSN
+ offset
;
494 if (offset
+ nr_bytes
> 0x800)
495 /* don't cross VM boundary */
496 nr_bytes
= 0x800 - offset
;
497 last_to
= "test-insn";
504 sim_d10v_translate_addr (SIM_DESC sd
,
506 unsigned long memaddr
,
508 unsigned long *targ_addr
,
510 unsigned long (*dmap_register
) (SIM_DESC
,
514 unsigned long (*imap_register
) (SIM_DESC
,
523 last_from
= "unknown";
526 seg
= (memaddr
>> 24);
527 off
= (memaddr
& 0xffffffL
);
529 /* However, if we've asked to use the previous generation of segment
530 mapping, rearrange the segments as follows. */
532 if (old_segment_mapping
)
536 case 0x00: /* DMAP translated memory */
539 case 0x01: /* IMAP translated memory */
542 case 0x10: /* On-chip data memory */
545 case 0x11: /* On-chip insn memory */
548 case 0x12: /* Unified memory */
556 case 0x00: /* Physical unified memory */
557 last_from
= "phys-unified";
559 phys
= SIM_D10V_MEMORY_UNIFIED
+ off
;
560 if ((off
% SEGMENT_SIZE
) + nr_bytes
> SEGMENT_SIZE
)
561 nr_bytes
= SEGMENT_SIZE
- (off
% SEGMENT_SIZE
);
564 case 0x01: /* Physical instruction memory */
565 last_from
= "phys-insn";
566 last_to
= "chip-insn";
567 phys
= SIM_D10V_MEMORY_INSN
+ off
;
568 if ((off
% SEGMENT_SIZE
) + nr_bytes
> SEGMENT_SIZE
)
569 nr_bytes
= SEGMENT_SIZE
- (off
% SEGMENT_SIZE
);
572 case 0x02: /* Physical data memory segment */
573 last_from
= "phys-data";
574 last_to
= "chip-data";
575 phys
= SIM_D10V_MEMORY_DATA
+ off
;
576 if ((off
% SEGMENT_SIZE
) + nr_bytes
> SEGMENT_SIZE
)
577 nr_bytes
= SEGMENT_SIZE
- (off
% SEGMENT_SIZE
);
580 case 0x10: /* in logical data address segment */
581 nr_bytes
= sim_d10v_translate_dmap_addr (sd
, cpu
, off
, nr_bytes
, &phys
,
582 regcache
, dmap_register
);
585 case 0x11: /* in logical instruction address segment */
586 nr_bytes
= sim_d10v_translate_imap_addr (sd
, cpu
, off
, nr_bytes
, &phys
,
587 regcache
, imap_register
);
598 /* Return a pointer into the raw buffer designated by phys_addr. It
599 is assumed that the client has already ensured that the access
600 isn't going to cross a segment boundary. */
603 map_memory (SIM_DESC sd
, SIM_CPU
*cpu
, unsigned phys_addr
)
608 int segment
= ((phys_addr
>> 24) & 0xff);
613 case 0x00: /* Unified memory */
615 memory
= &State
.mem
.unif
[(phys_addr
/ SEGMENT_SIZE
) % UMEM_SEGMENTS
];
616 last_segname
= "umem";
620 case 0x01: /* On-chip insn memory */
622 memory
= &State
.mem
.insn
[(phys_addr
/ SEGMENT_SIZE
) % IMEM_SEGMENTS
];
623 last_segname
= "imem";
627 case 0x02: /* On-chip data memory */
629 if ((phys_addr
& 0xff00) == 0xff00)
631 phys_addr
= (phys_addr
& 0xffff);
632 if (phys_addr
== DMAP2_SHADDOW
)
634 phys_addr
= DMAP2_OFFSET
;
635 last_segname
= "dmap";
638 last_segname
= "reg";
641 last_segname
= "dmem";
642 memory
= &State
.mem
.data
[(phys_addr
/ SEGMENT_SIZE
) % DMEM_SEGMENTS
];
648 last_segname
= "scrap";
649 sim_engine_halt (sd
, cpu
, NULL
, PC
, sim_stopped
, SIM_SIGBUS
);
653 *memory
= xcalloc (1, SEGMENT_SIZE
);
655 offset
= (phys_addr
% SEGMENT_SIZE
);
656 raw
= *memory
+ offset
;
660 /* Transfer data to/from simulated memory. Since a bug in either the
661 simulated program or in gdb or the simulator itself may cause a
662 bogus address to be passed in, we need to do some sanity checking
663 on addresses to make sure they are within bounds. When an address
664 fails the bounds check, treat it as a zero length read/write rather
665 than aborting the entire run. */
668 xfer_mem (SIM_DESC sd
,
670 unsigned char *buffer
,
677 phys_size
= sim_d10v_translate_addr (sd
, NULL
, virt
, size
, &phys
, NULL
,
678 dmap_register
, imap_register
);
682 memory
= map_memory (sd
, NULL
, phys
);
685 if ((d10v_debug
& DEBUG_INSTRUCTION
) != 0)
689 "sim_%s %d bytes: 0x%08" PRIxTA
" (%s) -> 0x%08lx (%s) -> %p (%s)\n",
690 write_p
? "write" : "read",
691 phys_size
, virt
, last_from
,
693 memory
, last_segname
);
699 memcpy (memory
, buffer
, phys_size
);
703 memcpy (buffer
, memory
, phys_size
);
711 sim_write (SIM_DESC sd
, uint64_t addr
, const void *buffer
, uint64_t size
)
713 /* FIXME: this should be performing a virtual transfer */
714 /* FIXME: We cast the const away, but it's safe because xfer_mem only reads
715 when write_p==1. This is still ugly. */
716 return xfer_mem (sd
, addr
, (void *) buffer
, size
, 1);
720 sim_read (SIM_DESC sd
, uint64_t addr
, void *buffer
, uint64_t size
)
722 /* FIXME: this should be performing a virtual transfer */
723 return xfer_mem (sd
, addr
, buffer
, size
, 0);
727 d10v_pc_get (sim_cpu
*cpu
)
733 d10v_pc_set (sim_cpu
*cpu
, sim_cia pc
)
735 SIM_DESC sd
= CPU_STATE (cpu
);
740 free_state (SIM_DESC sd
)
742 if (STATE_MODULES (sd
) != NULL
)
743 sim_module_uninstall (sd
);
744 sim_cpu_free_all (sd
);
748 static int d10v_reg_fetch (SIM_CPU
*, int, void *, int);
749 static int d10v_reg_store (SIM_CPU
*, int, const void *, int);
752 sim_open (SIM_OPEN_KIND kind
, host_callback
*cb
,
753 struct bfd
*abfd
, char * const *argv
)
756 struct hash_entry
*h
;
757 static int init_p
= 0;
760 SIM_DESC sd
= sim_state_alloc (kind
, cb
);
761 SIM_ASSERT (STATE_MAGIC (sd
) == SIM_MAGIC_NUMBER
);
763 /* Set default options before parsing user options. */
764 current_alignment
= STRICT_ALIGNMENT
;
765 cb
->syscall_map
= cb_d10v_syscall_map
;
767 /* The cpu data is kept in a separately allocated chunk of memory. */
768 if (sim_cpu_alloc_all (sd
, 0) != SIM_RC_OK
)
774 if (sim_pre_argv_init (sd
, argv
[0]) != SIM_RC_OK
)
780 /* The parser will print an error message for us, so we silently return. */
781 if (sim_parse_args (sd
, argv
) != SIM_RC_OK
)
787 /* Check for/establish the a reference program image. */
788 if (sim_analyze_program (sd
, STATE_PROG_FILE (sd
), abfd
) != SIM_RC_OK
)
794 /* Configure/verify the target byte order and other runtime
795 configuration options. */
796 if (sim_config (sd
) != SIM_RC_OK
)
798 sim_module_uninstall (sd
);
802 if (sim_post_argv_init (sd
) != SIM_RC_OK
)
804 /* Uninstall the modules to avoid memory leaks,
805 file descriptor leaks, etc. */
806 sim_module_uninstall (sd
);
810 /* CPU specific initialization. */
811 for (i
= 0; i
< MAX_NR_PROCESSORS
; ++i
)
813 SIM_CPU
*cpu
= STATE_CPU (sd
, i
);
815 CPU_REG_FETCH (cpu
) = d10v_reg_fetch
;
816 CPU_REG_STORE (cpu
) = d10v_reg_store
;
817 CPU_PC_FETCH (cpu
) = d10v_pc_get
;
818 CPU_PC_STORE (cpu
) = d10v_pc_set
;
821 old_segment_mapping
= 0;
823 /* NOTE: This argument parsing is only effective when this function
824 is called by GDB. Standalone argument parsing is handled by
826 for (p
= argv
+ 1; *p
; ++p
)
828 if (strcmp (*p
, "-oldseg") == 0)
829 old_segment_mapping
= 1;
831 else if (strcmp (*p
, "-t") == 0)
833 else if (strncmp (*p
, "-t", 2) == 0)
834 d10v_debug
= atoi (*p
+ 2);
838 /* put all the opcodes in the hash table */
841 for (s
= Simops
; s
->func
; s
++)
843 h
= &hash_table
[hash(s
->opcode
,s
->format
)];
845 /* go to the last entry in the chain */
851 h
->next
= (struct hash_entry
*) calloc(1,sizeof(struct hash_entry
));
853 perror ("malloc failure");
859 h
->opcode
= s
->opcode
;
860 h
->size
= s
->is_long
;
864 /* reset the processor state */
865 if (!State
.mem
.data
[0])
872 dmem_addr (SIM_DESC sd
, SIM_CPU
*cpu
, uint16_t offset
)
878 /* Note: DMEM address range is 0..0x10000. Calling code can compute
879 things like ``0xfffe + 0x0e60 == 0x10e5d''. Since offset's type
880 is uint16_t this is modulo'ed onto 0x0e5d. */
882 phys_size
= sim_d10v_translate_dmap_addr (sd
, cpu
, offset
, 1, &phys
, NULL
,
885 sim_engine_halt (sd
, cpu
, NULL
, PC
, sim_stopped
, SIM_SIGBUS
);
886 mem
= map_memory (sd
, cpu
, phys
);
888 if ((d10v_debug
& DEBUG_MEMORY
))
892 "mem: 0x%08x (%s) -> 0x%08lx %d (%s) -> %p (%s)\n",
894 phys
, phys_size
, last_to
,
902 imem_addr (SIM_DESC sd
, SIM_CPU
*cpu
, uint32_t offset
)
906 int phys_size
= sim_d10v_translate_imap_addr (sd
, cpu
, offset
, 1, &phys
, NULL
,
909 sim_engine_halt (sd
, cpu
, NULL
, PC
, sim_stopped
, SIM_SIGBUS
);
910 mem
= map_memory (sd
, cpu
, phys
);
912 if ((d10v_debug
& DEBUG_MEMORY
))
916 "mem: 0x%08x (%s) -> 0x%08lx %d (%s) -> %p (%s)\n",
918 phys
, phys_size
, last_to
,
926 step_once (SIM_DESC sd
, SIM_CPU
*cpu
)
931 /* TODO: Unindent this block. */
933 iaddr
= imem_addr (sd
, cpu
, (uint32_t)PC
<< 2);
935 inst
= get_longword( iaddr
);
937 State
.pc_changed
= 0;
938 ins_type_counters
[ (int)INS_CYCLES
]++;
940 switch (inst
& 0xC0000000)
943 /* long instruction */
944 do_long (sd
, cpu
, inst
& 0x3FFFFFFF);
948 do_2_short (sd
, cpu
, inst
& 0x7FFF, (inst
& 0x3FFF8000) >> 15, RIGHT_FIRST
);
952 do_2_short (sd
, cpu
, (inst
& 0x3FFF8000) >> 15, inst
& 0x7FFF, LEFT_FIRST
);
955 do_parallel (sd
, cpu
, (inst
& 0x3FFF8000) >> 15, inst
& 0x7FFF);
959 /* If the PC of the current instruction matches RPT_E then
960 schedule a branch to the loop start. If one of those
961 instructions happens to be a branch, than that instruction
963 if (!State
.pc_changed
)
965 if (PSW_RP
&& PC
== RPT_E
)
967 /* Note: The behavior of a branch instruction at RPT_E
968 is implementation dependant, this simulator takes the
969 branch. Branching to RPT_E is valid, the instruction
970 must be executed before the loop is taken. */
979 SET_RPT_C (RPT_C
- 1);
987 /* Check for a breakpoint trap on this instruction. This
988 overrides any pending branches or loops */
989 if (PSW_DB
&& PC
== IBA
)
993 SET_PSW (PSW
& PSW_SM_BIT
);
994 SET_PC (SDBT_VECTOR_START
);
997 /* Writeback all the DATA / PC changes */
1003 sim_engine_run (SIM_DESC sd
,
1004 int next_cpu_nr
, /* ignore */
1005 int nr_cpus
, /* ignore */
1010 SIM_ASSERT (STATE_MAGIC (sd
) == SIM_MAGIC_NUMBER
);
1012 cpu
= STATE_CPU (sd
, 0);
1018 case GDB_SIGNAL_BUS
:
1021 SET_HW_PSW ((PSW
& (PSW_F0_BIT
| PSW_F1_BIT
| PSW_C_BIT
)));
1022 JMP (AE_VECTOR_START
);
1025 case GDB_SIGNAL_ILL
:
1028 SET_HW_PSW ((PSW
& (PSW_F0_BIT
| PSW_F1_BIT
| PSW_C_BIT
)));
1029 JMP (RIE_VECTOR_START
);
1033 /* just ignore it */
1039 step_once (sd
, cpu
);
1040 if (sim_events_tick (sd
))
1041 sim_events_process (sd
);
1046 sim_info (SIM_DESC sd
, bool verbose
)
1053 unsigned long left
= ins_type_counters
[ (int)INS_LEFT
] + ins_type_counters
[ (int)INS_LEFT_COND_EXE
];
1054 unsigned long left_nops
= ins_type_counters
[ (int)INS_LEFT_NOPS
];
1055 unsigned long left_parallel
= ins_type_counters
[ (int)INS_LEFT_PARALLEL
];
1056 unsigned long left_cond
= ins_type_counters
[ (int)INS_LEFT_COND_TEST
];
1057 unsigned long left_total
= left
+ left_parallel
+ left_cond
+ left_nops
;
1059 unsigned long right
= ins_type_counters
[ (int)INS_RIGHT
] + ins_type_counters
[ (int)INS_RIGHT_COND_EXE
];
1060 unsigned long right_nops
= ins_type_counters
[ (int)INS_RIGHT_NOPS
];
1061 unsigned long right_parallel
= ins_type_counters
[ (int)INS_RIGHT_PARALLEL
];
1062 unsigned long right_cond
= ins_type_counters
[ (int)INS_RIGHT_COND_TEST
];
1063 unsigned long right_total
= right
+ right_parallel
+ right_cond
+ right_nops
;
1065 unsigned long unknown
= ins_type_counters
[ (int)INS_UNKNOWN
];
1066 unsigned long ins_long
= ins_type_counters
[ (int)INS_LONG
];
1067 unsigned long parallel
= ins_type_counters
[ (int)INS_PARALLEL
];
1068 unsigned long leftright
= ins_type_counters
[ (int)INS_LEFTRIGHT
];
1069 unsigned long rightleft
= ins_type_counters
[ (int)INS_RIGHTLEFT
];
1070 unsigned long cond_true
= ins_type_counters
[ (int)INS_COND_TRUE
];
1071 unsigned long cond_false
= ins_type_counters
[ (int)INS_COND_FALSE
];
1072 unsigned long cond_jump
= ins_type_counters
[ (int)INS_COND_JUMP
];
1073 unsigned long cycles
= ins_type_counters
[ (int)INS_CYCLES
];
1074 unsigned long total
= (unknown
+ left_total
+ right_total
+ ins_long
);
1076 int size
= strlen (add_commas (buf1
, sizeof (buf1
), total
));
1077 int parallel_size
= strlen (add_commas (buf1
, sizeof (buf1
),
1078 (left_parallel
> right_parallel
) ? left_parallel
: right_parallel
));
1079 int cond_size
= strlen (add_commas (buf1
, sizeof (buf1
), (left_cond
> right_cond
) ? left_cond
: right_cond
));
1080 int nop_size
= strlen (add_commas (buf1
, sizeof (buf1
), (left_nops
> right_nops
) ? left_nops
: right_nops
));
1081 int normal_size
= strlen (add_commas (buf1
, sizeof (buf1
), (left
> right
) ? left
: right
));
1084 "executed %*s left instruction(s), %*s normal, %*s parallel, %*s EXExxx, %*s nops\n",
1085 size
, add_commas (buf1
, sizeof (buf1
), left_total
),
1086 normal_size
, add_commas (buf2
, sizeof (buf2
), left
),
1087 parallel_size
, add_commas (buf3
, sizeof (buf3
), left_parallel
),
1088 cond_size
, add_commas (buf4
, sizeof (buf4
), left_cond
),
1089 nop_size
, add_commas (buf5
, sizeof (buf5
), left_nops
));
1092 "executed %*s right instruction(s), %*s normal, %*s parallel, %*s EXExxx, %*s nops\n",
1093 size
, add_commas (buf1
, sizeof (buf1
), right_total
),
1094 normal_size
, add_commas (buf2
, sizeof (buf2
), right
),
1095 parallel_size
, add_commas (buf3
, sizeof (buf3
), right_parallel
),
1096 cond_size
, add_commas (buf4
, sizeof (buf4
), right_cond
),
1097 nop_size
, add_commas (buf5
, sizeof (buf5
), right_nops
));
1101 "executed %*s long instruction(s)\n",
1102 size
, add_commas (buf1
, sizeof (buf1
), ins_long
));
1106 "executed %*s parallel instruction(s)\n",
1107 size
, add_commas (buf1
, sizeof (buf1
), parallel
));
1111 "executed %*s instruction(s) encoded L->R\n",
1112 size
, add_commas (buf1
, sizeof (buf1
), leftright
));
1116 "executed %*s instruction(s) encoded R->L\n",
1117 size
, add_commas (buf1
, sizeof (buf1
), rightleft
));
1121 "executed %*s unknown instruction(s)\n",
1122 size
, add_commas (buf1
, sizeof (buf1
), unknown
));
1126 "executed %*s instruction(s) due to EXExxx condition being true\n",
1127 size
, add_commas (buf1
, sizeof (buf1
), cond_true
));
1131 "skipped %*s instruction(s) due to EXExxx condition being false\n",
1132 size
, add_commas (buf1
, sizeof (buf1
), cond_false
));
1136 "skipped %*s instruction(s) due to conditional branch succeeding\n",
1137 size
, add_commas (buf1
, sizeof (buf1
), cond_jump
));
1140 "executed %*s cycle(s)\n",
1141 size
, add_commas (buf1
, sizeof (buf1
), cycles
));
1144 "executed %*s total instructions\n",
1145 size
, add_commas (buf1
, sizeof (buf1
), total
));
1149 sim_create_inferior (SIM_DESC sd
, struct bfd
*abfd
,
1150 char * const *argv
, char * const *env
)
1152 bfd_vma start_address
;
1154 /* Make sure we have the right structure for the following memset. */
1155 static_assert (offsetof (struct _state
, regs
) == 0,
1156 "State.regs is not at offset 0");
1158 /* Reset state from the regs field until the mem field. */
1159 memset (&State
, 0, (uintptr_t) &State
.mem
- (uintptr_t) &State
.regs
);
1161 /* There was a hack here to copy the values of argc and argv into r0
1162 and r1. The values were also saved into some high memory that
1163 won't be overwritten by the stack (0x7C00). The reason for doing
1164 this was to allow the 'run' program to accept arguments. Without
1165 the hack, this is not possible anymore. If the simulator is run
1166 from the debugger, arguments cannot be passed in, so this makes
1171 start_address
= bfd_get_start_address (abfd
);
1173 start_address
= 0xffc0 << 2;
1176 sim_io_printf (sd
, "sim_create_inferior: PC=0x%" PRIx64
"\n",
1177 (uint64_t) start_address
);
1180 SIM_CPU
*cpu
= STATE_CPU (sd
, 0);
1181 SET_CREG (PC_CR
, start_address
>> 2);
1184 /* cpu resets imap0 to 0 and imap1 to 0x7f, but D10V-EVA board
1185 initializes imap0 and imap1 to 0x1000 as part of its ROM
1187 if (old_segment_mapping
)
1189 /* External memory startup. This is the HARD reset state. */
1190 set_imap_register (sd
, 0, 0x0000);
1191 set_imap_register (sd
, 1, 0x007f);
1192 set_dmap_register (sd
, 0, 0x2000);
1193 set_dmap_register (sd
, 1, 0x2000);
1194 set_dmap_register (sd
, 2, 0x0000); /* Old DMAP */
1195 set_dmap_register (sd
, 3, 0x0000);
1199 /* Internal memory startup. This is the ROM intialized state. */
1200 set_imap_register (sd
, 0, 0x1000);
1201 set_imap_register (sd
, 1, 0x1000);
1202 set_dmap_register (sd
, 0, 0x2000);
1203 set_dmap_register (sd
, 1, 0x2000);
1204 set_dmap_register (sd
, 2, 0x2000); /* DMAP2 initial internal value is
1205 0x2000 on the new board. */
1206 set_dmap_register (sd
, 3, 0x0000);
1214 d10v_reg_fetch (SIM_CPU
*cpu
, int rn
, void *memory
, int length
)
1216 SIM_DESC sd
= CPU_STATE (cpu
);
1218 switch ((enum sim_d10v_regs
) rn
)
1220 case SIM_D10V_R0_REGNUM
:
1221 case SIM_D10V_R1_REGNUM
:
1222 case SIM_D10V_R2_REGNUM
:
1223 case SIM_D10V_R3_REGNUM
:
1224 case SIM_D10V_R4_REGNUM
:
1225 case SIM_D10V_R5_REGNUM
:
1226 case SIM_D10V_R6_REGNUM
:
1227 case SIM_D10V_R7_REGNUM
:
1228 case SIM_D10V_R8_REGNUM
:
1229 case SIM_D10V_R9_REGNUM
:
1230 case SIM_D10V_R10_REGNUM
:
1231 case SIM_D10V_R11_REGNUM
:
1232 case SIM_D10V_R12_REGNUM
:
1233 case SIM_D10V_R13_REGNUM
:
1234 case SIM_D10V_R14_REGNUM
:
1235 case SIM_D10V_R15_REGNUM
:
1236 WRITE_16 (memory
, GPR (rn
- SIM_D10V_R0_REGNUM
));
1239 case SIM_D10V_CR0_REGNUM
:
1240 case SIM_D10V_CR1_REGNUM
:
1241 case SIM_D10V_CR2_REGNUM
:
1242 case SIM_D10V_CR3_REGNUM
:
1243 case SIM_D10V_CR4_REGNUM
:
1244 case SIM_D10V_CR5_REGNUM
:
1245 case SIM_D10V_CR6_REGNUM
:
1246 case SIM_D10V_CR7_REGNUM
:
1247 case SIM_D10V_CR8_REGNUM
:
1248 case SIM_D10V_CR9_REGNUM
:
1249 case SIM_D10V_CR10_REGNUM
:
1250 case SIM_D10V_CR11_REGNUM
:
1251 case SIM_D10V_CR12_REGNUM
:
1252 case SIM_D10V_CR13_REGNUM
:
1253 case SIM_D10V_CR14_REGNUM
:
1254 case SIM_D10V_CR15_REGNUM
:
1255 WRITE_16 (memory
, CREG (rn
- SIM_D10V_CR0_REGNUM
));
1258 case SIM_D10V_A0_REGNUM
:
1259 case SIM_D10V_A1_REGNUM
:
1260 WRITE_64 (memory
, ACC (rn
- SIM_D10V_A0_REGNUM
));
1263 case SIM_D10V_SPI_REGNUM
:
1264 /* PSW_SM indicates that the current SP is the USER
1266 WRITE_16 (memory
, spi_register ());
1269 case SIM_D10V_SPU_REGNUM
:
1270 /* PSW_SM indicates that the current SP is the USER
1272 WRITE_16 (memory
, spu_register ());
1275 case SIM_D10V_IMAP0_REGNUM
:
1276 case SIM_D10V_IMAP1_REGNUM
:
1277 WRITE_16 (memory
, imap_register (sd
, cpu
, NULL
, rn
- SIM_D10V_IMAP0_REGNUM
));
1280 case SIM_D10V_DMAP0_REGNUM
:
1281 case SIM_D10V_DMAP1_REGNUM
:
1282 case SIM_D10V_DMAP2_REGNUM
:
1283 case SIM_D10V_DMAP3_REGNUM
:
1284 WRITE_16 (memory
, dmap_register (sd
, cpu
, NULL
, rn
- SIM_D10V_DMAP0_REGNUM
));
1287 case SIM_D10V_TS2_DMAP_REGNUM
:
1298 d10v_reg_store (SIM_CPU
*cpu
, int rn
, const void *memory
, int length
)
1300 SIM_DESC sd
= CPU_STATE (cpu
);
1302 switch ((enum sim_d10v_regs
) rn
)
1304 case SIM_D10V_R0_REGNUM
:
1305 case SIM_D10V_R1_REGNUM
:
1306 case SIM_D10V_R2_REGNUM
:
1307 case SIM_D10V_R3_REGNUM
:
1308 case SIM_D10V_R4_REGNUM
:
1309 case SIM_D10V_R5_REGNUM
:
1310 case SIM_D10V_R6_REGNUM
:
1311 case SIM_D10V_R7_REGNUM
:
1312 case SIM_D10V_R8_REGNUM
:
1313 case SIM_D10V_R9_REGNUM
:
1314 case SIM_D10V_R10_REGNUM
:
1315 case SIM_D10V_R11_REGNUM
:
1316 case SIM_D10V_R12_REGNUM
:
1317 case SIM_D10V_R13_REGNUM
:
1318 case SIM_D10V_R14_REGNUM
:
1319 case SIM_D10V_R15_REGNUM
:
1320 SET_GPR (rn
- SIM_D10V_R0_REGNUM
, READ_16 (memory
));
1323 case SIM_D10V_CR0_REGNUM
:
1324 case SIM_D10V_CR1_REGNUM
:
1325 case SIM_D10V_CR2_REGNUM
:
1326 case SIM_D10V_CR3_REGNUM
:
1327 case SIM_D10V_CR4_REGNUM
:
1328 case SIM_D10V_CR5_REGNUM
:
1329 case SIM_D10V_CR6_REGNUM
:
1330 case SIM_D10V_CR7_REGNUM
:
1331 case SIM_D10V_CR8_REGNUM
:
1332 case SIM_D10V_CR9_REGNUM
:
1333 case SIM_D10V_CR10_REGNUM
:
1334 case SIM_D10V_CR11_REGNUM
:
1335 case SIM_D10V_CR12_REGNUM
:
1336 case SIM_D10V_CR13_REGNUM
:
1337 case SIM_D10V_CR14_REGNUM
:
1338 case SIM_D10V_CR15_REGNUM
:
1339 SET_CREG (rn
- SIM_D10V_CR0_REGNUM
, READ_16 (memory
));
1342 case SIM_D10V_A0_REGNUM
:
1343 case SIM_D10V_A1_REGNUM
:
1344 SET_ACC (rn
- SIM_D10V_A0_REGNUM
, READ_64 (memory
) & MASK40
);
1347 case SIM_D10V_SPI_REGNUM
:
1348 /* PSW_SM indicates that the current SP is the USER
1350 set_spi_register (READ_16 (memory
));
1353 case SIM_D10V_SPU_REGNUM
:
1354 set_spu_register (READ_16 (memory
));
1357 case SIM_D10V_IMAP0_REGNUM
:
1358 case SIM_D10V_IMAP1_REGNUM
:
1359 set_imap_register (sd
, rn
- SIM_D10V_IMAP0_REGNUM
, READ_16(memory
));
1362 case SIM_D10V_DMAP0_REGNUM
:
1363 case SIM_D10V_DMAP1_REGNUM
:
1364 case SIM_D10V_DMAP2_REGNUM
:
1365 case SIM_D10V_DMAP3_REGNUM
:
1366 set_dmap_register (sd
, rn
- SIM_D10V_DMAP0_REGNUM
, READ_16(memory
));
1369 case SIM_D10V_TS2_DMAP_REGNUM
: