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