fc8afd06050941faefd03b2623b039f356fe2d9b
1 /* Simulation code for the CR16 processor.
2 Copyright (C) 2008-2015 Free Software Foundation, Inc.
3 Contributed by M Ranga Swami Reddy <MR.Swami.Reddy@nsc.com>
5 This file is part of GDB, the GNU debugger.
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)
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.
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/>. */
26 #include "gdb/callback.h"
27 #include "gdb/remote-sim.h"
30 #include "sim-options.h"
32 #include "gdb/sim-cr16.h"
33 #include "gdb/signals.h"
34 #include "opcode/cr16.h"
38 host_callback
*cr16_callback
;
43 static struct hash_entry
*lookup_hash (uint64 ins
, int size
);
44 static void get_operands (operand_desc
*s
, uint64 mcode
, int isize
, int nops
);
45 extern void sim_set_profile (int n
);
46 extern void sim_set_profile_size (int n
);
47 static INLINE uint8
*map_memory (unsigned phys_addr
);
53 struct hash_entry
*next
;
61 struct hash_entry hash_table
[MAX_HASH
+1];
64 hash(unsigned long long insn
, int format
)
66 unsigned int i
= 4, tmp
;
69 while ((insn
>> i
) != 0) i
+=4;
71 return ((insn
>> (i
-4)) & 0xf); /* Use last 4 bits as hask key. */
73 return ((insn
& 0xF)); /* Use last 4 bits as hask key. */
77 INLINE
static struct hash_entry
*
78 lookup_hash (uint64 ins
, int size
)
83 h
= &hash_table
[hash(ins
,1)];
86 mask
= (((1 << (32 - h
->mask
)) -1) << h
->mask
);
88 /* Adjuest mask for branch with 2 word instructions. */
89 if ((h
->ops
->mnimonic
!= NULL
) &&
90 ((streq(h
->ops
->mnimonic
,"b") && h
->size
== 2)))
94 while ((ins
& mask
) != (BIN(h
->opcode
, h
->mask
)))
98 State
.exception
= SIGILL
;
99 State
.pc_changed
= 1; /* Don't increment the PC. */
104 mask
= (((1 << (32 - h
->mask
)) -1) << h
->mask
);
105 /* Adjuest mask for branch with 2 word instructions. */
106 if ((streq(h
->ops
->mnimonic
,"b")) && h
->size
== 2)
114 get_operands (operand_desc
*s
, uint64 ins
, int isize
, int nops
)
116 uint32 i
, opn
= 0, start_bit
= 0, op_type
= 0;
117 int32 op_size
= 0, mask
= 0;
119 if (isize
== 1) /* Trunkcate the extra 16 bits of INS. */
122 for (i
=0; i
< 4; ++i
,++opn
)
124 if (s
[opn
].op_type
== dummy
) break;
126 op_type
= s
[opn
].op_type
;
127 start_bit
= s
[opn
].shift
;
128 op_size
= cr16_optab
[op_type
].bit_size
;
132 case imm3
: case imm4
: case imm5
: case imm6
:
135 OP
[i
] = ((ins
>> 4) & ((1 << op_size
) -1));
137 OP
[i
] = ((ins
>> (32 - start_bit
)) & ((1 << op_size
) -1));
139 if (OP
[i
] & ((long)1 << (op_size
-1)))
142 OP
[i
] = ~(OP
[i
]) + 1;
144 OP
[i
] = (unsigned long int)(OP
[i
] & (((long)1 << op_size
) -1));
148 case uimm3
: case uimm3_1
: case uimm4_1
:
152 OP
[i
] = ((ins
>> 4) & ((1 << op_size
) -1)); break;
154 OP
[i
] = ((ins
>> (32 - start_bit
)) & ((1 << op_size
) -1));break;
155 default: /* for case 3. */
156 OP
[i
] = ((ins
>> (16 + start_bit
)) & ((1 << op_size
) -1)); break;
166 OP
[i
] = ((ins
>> 4) & ((1 << op_size
) -1));
168 OP
[i
] = (ins
& ((1 << op_size
) -1));
171 OP
[i
] = ((ins
>> start_bit
) & ((1 << op_size
) -1));
174 OP
[i
] = ((ins
>> (start_bit
+ 16)) & ((1 << op_size
) -1));
177 OP
[i
] = ((ins
>> start_bit
) & ((1 << op_size
) -1));
182 case imm16
: case uimm16
:
183 OP
[i
] = ins
& 0xFFFF;
186 case uimm20
: case imm20
:
187 OP
[i
] = ins
& (((long)1 << op_size
) - 1);
190 case imm32
: case uimm32
:
191 OP
[i
] = ins
& 0xFFFFFFFF;
194 case uimm5
: break; /*NOT USED. */
195 OP
[i
] = ins
& ((1 << op_size
) - 1); break;
198 OP
[i
] = (ins
>> 4) & ((1 << 4) - 1);
199 OP
[i
] = (OP
[i
] * 2) + 2;
200 if (OP
[i
] & ((long)1 << 5))
203 OP
[i
] = ~(OP
[i
]) + 1;
204 OP
[i
] = (unsigned long int)(OP
[i
] & 0x1F);
209 OP
[i
] = ((((ins
>> 8) & 0xf) << 4) | (ins
& 0xf));
211 if (OP
[i
] & ((long)1 << 8))
214 OP
[i
] = ~(OP
[i
]) + 1;
215 OP
[i
] = (unsigned long int)(OP
[i
] & 0xFF);
220 OP
[i
] = (ins
& 0xFFFF);
223 OP
[i
] = (OP
[i
] & 0xFFFE);
225 OP
[i
] = ~(OP
[i
]) + 1;
226 OP
[i
] = (unsigned long int)(OP
[i
] & 0xFFFF);
232 OP
[i
] = (ins
& 0xFFFFFF);
234 OP
[i
] = (ins
& 0xFFFF) | (((ins
>> 24) & 0xf) << 16) |
235 (((ins
>> 16) & 0xf) << 20);
239 OP
[i
] = (OP
[i
] & 0xFFFFFE);
241 OP
[i
] = ~(OP
[i
]) + 1;
242 OP
[i
] = (unsigned long int)(OP
[i
] & 0xFFFFFF);
248 OP
[i
] = (ins
) & 0xFFFFF;
250 OP
[i
] = (ins
>> start_bit
) & 0xFFFFF;
254 OP
[i
] = ((ins
& 0xFFFF) | (((ins
>> 16) & 0xf) << 20)
255 | (((ins
>> 24) & 0xf) << 16));
257 OP
[i
] = (ins
>> 16) & 0xFFFFFF;
261 case rbase
: break; /* NOT USED. */
262 case rbase_disps20
: case rbase_dispe20
:
263 case rpbase_disps20
: case rpindex_disps20
:
264 OP
[i
] = ((((ins
>> 24)&0xf) << 16)|((ins
) & 0xFFFF));
265 OP
[++i
] = (ins
>> 16) & 0xF; /* get 4 bit for reg. */
268 OP
[i
] = 0; /* 4 bit disp const. */
269 OP
[++i
] = (ins
) & 0xF; /* get 4 bit for reg. */
272 OP
[i
] = ((ins
>> 8) & 0xF) * 2; /* 4 bit disp const. */
273 OP
[++i
] = (ins
) & 0xF; /* get 4 bit for reg. */
276 OP
[i
] = ((ins
>> 8) & 0xF); /* 4 bit disp const. */
277 OP
[++i
] = (ins
) & 0xF; /* get 4 bit for reg. */
280 OP
[i
] = (ins
) & 0xFFFF;
281 OP
[++i
] = (ins
>> 16) & 0xF; /* get 4 bit for reg. */
285 OP
[++i
] = (ins
>> 4) & 0xF; /* get 4 bit for reg. */
286 OP
[++i
] = (ins
>> 8) & 0x1; /* get 1 bit for index-reg. */
288 case rpindex_disps14
:
289 OP
[i
] = (ins
) & 0x3FFF;
290 OP
[++i
] = (ins
>> 14) & 0x1; /* get 1 bit for index-reg. */
291 OP
[++i
] = (ins
>> 16) & 0xF; /* get 4 bit for reg. */
294 OP
[i
] = (ins
) & 0xFFFFF;
295 OP
[++i
] = (ins
>> 24) & 0x1; /* get 1 bit for index-reg. */
296 OP
[++i
] = (ins
>> 20) & 0xF; /* get 4 bit for reg. */
298 case regr
: case regp
: case pregr
: case pregrp
:
302 if (start_bit
== 20) OP
[i
] = (ins
>> 4) & 0xF;
303 else if (start_bit
== 16) OP
[i
] = ins
& 0xF;
305 case 2: OP
[i
] = (ins
>> start_bit
) & 0xF; break;
306 case 3: OP
[i
] = (ins
>> (start_bit
+ 16)) & 0xF; break;
311 if (isize
== 1) OP
[i
] = (ins
>> 4) & 0xF;
312 else if (isize
== 2) OP
[i
] = (ins
>> start_bit
) & 0xF;
313 else OP
[i
] = (ins
>> (start_bit
+ 16)) & 0xF;
319 /* For ESC on uimm4_1 operand. */
320 if (op_type
== uimm4_1
)
324 /* For increment by 1. */
325 if ((op_type
== pregr
) || (op_type
== pregrp
))
328 /* FIXME: for tracing, update values that need to be updated each
329 instruction decode cycle */
330 State
.trace
.psw
= PSR
;
334 do_run (SIM_DESC sd
, uint64 mcode
)
336 host_callback
*cr16_callback
= STATE_CALLBACK (sd
);
337 struct simops
*s
= Simops
;
338 struct hash_entry
*h
;
342 if ((cr16_debug
& DEBUG_INSTRUCTION
) != 0)
343 (*cr16_callback
->printf_filtered
) (cr16_callback
, "do_long 0x%x\n", mcode
);
346 h
= lookup_hash(mcode
, 1);
348 if ((h
== NULL
) || (h
->opcode
== 0))
353 iaddr
= imem_addr ((uint32
)PC
+ 2);
354 mcode
= (mcode
<< 16) | get_longword( iaddr
);
357 /* Re-set OP list. */
358 OP
[0] = OP
[1] = OP
[2] = OP
[3] = sign_flag
= 0;
360 /* for push/pop/pushrtn with RA instructions. */
361 if ((h
->format
& REG_LIST
) && (mcode
& 0x800000))
362 OP
[2] = 1; /* Set 1 for RA operand. */
364 /* numops == 0 means, no operands. */
365 if (((h
->ops
) != NULL
) && (((h
->ops
)->numops
) != 0))
366 get_operands ((h
->ops
)->operands
, mcode
, h
->size
, (h
->ops
)->numops
);
368 //State.ins_type = h->flags;
379 for (i
= 0; i
< IMEM_SEGMENTS
; i
++)
381 if (State
.mem
.insn
[i
])
382 free (State
.mem
.insn
[i
]);
384 for (i
= 0; i
< DMEM_SEGMENTS
; i
++)
386 if (State
.mem
.data
[i
])
387 free (State
.mem
.data
[i
]);
389 for (i
= 0; i
< UMEM_SEGMENTS
; i
++)
391 if (State
.mem
.unif
[i
])
392 free (State
.mem
.unif
[i
]);
394 /* Always allocate dmem segment 0. This contains the IMAP and DMAP
396 State
.mem
.data
[0] = calloc (1, SEGMENT_SIZE
);
399 /* For tracing - leave info on last access around. */
400 static char *last_segname
= "invalid";
401 static char *last_from
= "invalid";
402 static char *last_to
= "invalid";
406 IMAP0_OFFSET
= 0xff00,
407 DMAP0_OFFSET
= 0xff08,
408 DMAP2_SHADDOW
= 0xff04,
409 DMAP2_OFFSET
= 0xff0c
413 dmap_register (void *regcache
, int reg_nr
)
415 uint8
*raw
= map_memory (SIM_CR16_MEMORY_DATA
416 + DMAP0_OFFSET
+ 2 * reg_nr
);
417 return READ_16 (raw
);
421 imap_register (void *regcache
, int reg_nr
)
423 uint8
*raw
= map_memory (SIM_CR16_MEMORY_DATA
424 + IMAP0_OFFSET
+ 2 * reg_nr
);
425 return READ_16 (raw
);
428 /* Given a virtual address in the DMAP address space, translate it
429 into a physical address. */
432 sim_cr16_translate_dmap_addr (unsigned long offset
,
436 unsigned long (*dmap_register
) (void *regcache
,
441 last_from
= "logical-data";
442 if (offset
>= DMAP_BLOCK_SIZE
* SIM_CR16_NR_DMAP_REGS
)
444 /* Logical address out side of data segments, not supported */
447 regno
= (offset
/ DMAP_BLOCK_SIZE
);
448 offset
= (offset
% DMAP_BLOCK_SIZE
);
451 if ((offset
% DMAP_BLOCK_SIZE
) + nr_bytes
> DMAP_BLOCK_SIZE
)
453 /* Don't cross a BLOCK boundary */
454 nr_bytes
= DMAP_BLOCK_SIZE
- (offset
% DMAP_BLOCK_SIZE
);
456 map
= dmap_register (regcache
, regno
);
459 /* Always maps to data memory */
460 int iospi
= (offset
/ 0x1000) % 4;
461 int iosp
= (map
>> (4 * (3 - iospi
))) % 0x10;
462 last_to
= "io-space";
463 *phys
= (SIM_CR16_MEMORY_DATA
+ (iosp
* 0x10000) + 0xc000 + offset
);
467 int sp
= ((map
& 0x3000) >> 12);
468 int segno
= (map
& 0x3ff);
471 case 0: /* 00: Unified memory */
472 *phys
= SIM_CR16_MEMORY_UNIFIED
+ (segno
* DMAP_BLOCK_SIZE
) + offset
;
475 case 1: /* 01: Instruction Memory */
476 *phys
= SIM_CR16_MEMORY_INSN
+ (segno
* DMAP_BLOCK_SIZE
) + offset
;
477 last_to
= "chip-insn";
479 case 2: /* 10: Internal data memory */
480 *phys
= SIM_CR16_MEMORY_DATA
+ (segno
<< 16) + (regno
* DMAP_BLOCK_SIZE
) + offset
;
481 last_to
= "chip-data";
483 case 3: /* 11: Reserved */
491 /* Given a virtual address in the IMAP address space, translate it
492 into a physical address. */
495 sim_cr16_translate_imap_addr (unsigned long offset
,
499 unsigned long (*imap_register
) (void *regcache
,
506 last_from
= "logical-insn";
507 if (offset
>= (IMAP_BLOCK_SIZE
* SIM_CR16_NR_IMAP_REGS
))
509 /* Logical address outside of IMAP segments, not supported */
512 regno
= (offset
/ IMAP_BLOCK_SIZE
);
513 offset
= (offset
% IMAP_BLOCK_SIZE
);
514 if (offset
+ nr_bytes
> IMAP_BLOCK_SIZE
)
516 /* Don't cross a BLOCK boundary */
517 nr_bytes
= IMAP_BLOCK_SIZE
- offset
;
519 map
= imap_register (regcache
, regno
);
520 sp
= (map
& 0x3000) >> 12;
521 segno
= (map
& 0x007f);
524 case 0: /* 00: unified memory */
525 *phys
= SIM_CR16_MEMORY_UNIFIED
+ (segno
<< 17) + offset
;
528 case 1: /* 01: instruction memory */
529 *phys
= SIM_CR16_MEMORY_INSN
+ (IMAP_BLOCK_SIZE
* regno
) + offset
;
530 last_to
= "chip-insn";
535 case 3: /* 11: for testing - instruction memory */
536 offset
= (offset
% 0x800);
537 *phys
= SIM_CR16_MEMORY_INSN
+ offset
;
538 if (offset
+ nr_bytes
> 0x800)
539 /* don't cross VM boundary */
540 nr_bytes
= 0x800 - offset
;
541 last_to
= "test-insn";
548 sim_cr16_translate_addr (unsigned long memaddr
, int nr_bytes
,
549 unsigned long *targ_addr
, void *regcache
,
550 unsigned long (*dmap_register
) (void *regcache
,
552 unsigned long (*imap_register
) (void *regcache
,
559 last_from
= "unknown";
562 seg
= (memaddr
>> 24);
563 off
= (memaddr
& 0xffffffL
);
567 case 0x00: /* Physical unified memory */
568 last_from
= "phys-unified";
570 phys
= SIM_CR16_MEMORY_UNIFIED
+ off
;
571 if ((off
% SEGMENT_SIZE
) + nr_bytes
> SEGMENT_SIZE
)
572 nr_bytes
= SEGMENT_SIZE
- (off
% SEGMENT_SIZE
);
575 case 0x01: /* Physical instruction memory */
576 last_from
= "phys-insn";
577 last_to
= "chip-insn";
578 phys
= SIM_CR16_MEMORY_INSN
+ off
;
579 if ((off
% SEGMENT_SIZE
) + nr_bytes
> SEGMENT_SIZE
)
580 nr_bytes
= SEGMENT_SIZE
- (off
% SEGMENT_SIZE
);
583 case 0x02: /* Physical data memory segment */
584 last_from
= "phys-data";
585 last_to
= "chip-data";
586 phys
= SIM_CR16_MEMORY_DATA
+ off
;
587 if ((off
% SEGMENT_SIZE
) + nr_bytes
> SEGMENT_SIZE
)
588 nr_bytes
= SEGMENT_SIZE
- (off
% SEGMENT_SIZE
);
591 case 0x10: /* in logical data address segment */
592 nr_bytes
= sim_cr16_translate_dmap_addr (off
, nr_bytes
, &phys
, regcache
,
596 case 0x11: /* in logical instruction address segment */
597 nr_bytes
= sim_cr16_translate_imap_addr (off
, nr_bytes
, &phys
, regcache
,
609 /* Return a pointer into the raw buffer designated by phys_addr. It
610 is assumed that the client has already ensured that the access
611 isn't going to cross a segment boundary. */
614 map_memory (unsigned phys_addr
)
619 int segment
= ((phys_addr
>> 24) & 0xff);
624 case 0x00: /* Unified memory */
626 memory
= &State
.mem
.unif
[(phys_addr
/ SEGMENT_SIZE
) % UMEM_SEGMENTS
];
627 last_segname
= "umem";
631 case 0x01: /* On-chip insn memory */
633 memory
= &State
.mem
.insn
[(phys_addr
/ SEGMENT_SIZE
) % IMEM_SEGMENTS
];
634 last_segname
= "imem";
638 case 0x02: /* On-chip data memory */
640 if ((phys_addr
& 0xff00) == 0xff00)
642 phys_addr
= (phys_addr
& 0xffff);
643 if (phys_addr
== DMAP2_SHADDOW
)
645 phys_addr
= DMAP2_OFFSET
;
646 last_segname
= "dmap";
649 last_segname
= "reg";
652 last_segname
= "dmem";
653 memory
= &State
.mem
.data
[(phys_addr
/ SEGMENT_SIZE
) % DMEM_SEGMENTS
];
659 last_segname
= "scrap";
660 return State
.mem
.fault
;
665 *memory
= calloc (1, SEGMENT_SIZE
);
668 (*cr16_callback
->printf_filtered
) (cr16_callback
, "Malloc failed.\n");
669 return State
.mem
.fault
;
673 offset
= (phys_addr
% SEGMENT_SIZE
);
674 raw
= *memory
+ offset
;
678 /* Transfer data to/from simulated memory. Since a bug in either the
679 simulated program or in gdb or the simulator itself may cause a
680 bogus address to be passed in, we need to do some sanity checking
681 on addresses to make sure they are within bounds. When an address
682 fails the bounds check, treat it as a zero length read/write rather
683 than aborting the entire run. */
686 xfer_mem (SIM_DESC sd
, SIM_ADDR virt
,
687 unsigned char *buffer
,
691 host_callback
*cr16_callback
= STATE_CALLBACK (sd
);
695 phys_size
= sim_cr16_translate_addr (virt
, size
, &phys
, NULL
,
696 dmap_register
, imap_register
);
700 memory
= map_memory (phys
);
703 if ((cr16_debug
& DEBUG_INSTRUCTION
) != 0)
705 (*cr16_callback
->printf_filtered
)
707 "sim_%s %d bytes: 0x%08lx (%s) -> 0x%08lx (%s) -> 0x%08lx (%s)\n",
708 (write_p
? "write" : "read"),
709 phys_size
, virt
, last_from
,
711 (long) memory
, last_segname
);
717 memcpy (memory
, buffer
, phys_size
);
721 memcpy (buffer
, memory
, phys_size
);
729 sim_write (SIM_DESC sd
, SIM_ADDR addr
, const unsigned char *buffer
, int size
)
731 /* FIXME: this should be performing a virtual transfer */
732 return xfer_mem (sd
, addr
, buffer
, size
, 1);
736 sim_read (SIM_DESC sd
, SIM_ADDR addr
, unsigned char *buffer
, int size
)
738 /* FIXME: this should be performing a virtual transfer */
739 return xfer_mem (sd
, addr
, buffer
, size
, 0);
743 free_state (SIM_DESC sd
)
745 if (STATE_MODULES (sd
) != NULL
)
746 sim_module_uninstall (sd
);
747 sim_cpu_free_all (sd
);
751 SIM_DESC trace_sd
= NULL
;
754 sim_open (SIM_OPEN_KIND kind
, struct host_callback_struct
*cb
, struct bfd
*abfd
, char **argv
)
757 struct hash_entry
*h
;
758 static int init_p
= 0;
761 SIM_DESC sd
= sim_state_alloc (kind
, cb
);
762 SIM_ASSERT (STATE_MAGIC (sd
) == SIM_MAGIC_NUMBER
);
764 /* The cpu data is kept in a separately allocated chunk of memory. */
765 if (sim_cpu_alloc_all (sd
, 1, /*cgen_cpu_max_extra_bytes ()*/0) != SIM_RC_OK
)
771 if (sim_pre_argv_init (sd
, argv
[0]) != SIM_RC_OK
)
777 /* getopt will print the error message so we just have to exit if this fails.
778 FIXME: Hmmm... in the case of gdb we need getopt to call
780 if (sim_parse_args (sd
, argv
) != SIM_RC_OK
)
786 /* Check for/establish the a reference program image. */
787 if (sim_analyze_program (sd
,
788 (STATE_PROG_ARGV (sd
) != NULL
789 ? *STATE_PROG_ARGV (sd
)
790 : NULL
), abfd
) != SIM_RC_OK
)
796 /* Configure/verify the target byte order and other runtime
797 configuration options. */
798 if (sim_config (sd
) != SIM_RC_OK
)
800 sim_module_uninstall (sd
);
804 if (sim_post_argv_init (sd
) != SIM_RC_OK
)
806 /* Uninstall the modules to avoid memory leaks,
807 file descriptor leaks, etc. */
808 sim_module_uninstall (sd
);
815 /* put all the opcodes in the hash table. */
818 for (s
= Simops
; s
->func
; s
++)
823 h
= &hash_table
[hash(s
->opcode
, 0)];
827 if (((s
->opcode
<< 1) >> 4) != 0)
828 h
= &hash_table
[hash((s
->opcode
<< 1) >> 4, 0)];
830 h
= &hash_table
[hash((s
->opcode
<< 1), 0)];
834 if ((s
->opcode
>> 4) != 0)
835 h
= &hash_table
[hash(s
->opcode
>> 4, 0)];
837 h
= &hash_table
[hash(s
->opcode
, 0)];
841 if (((s
->opcode
>> 1) >> 4) != 0)
842 h
= &hash_table
[hash((s
->opcode
>>1) >> 4, 0)];
844 h
= &hash_table
[hash((s
->opcode
>> 1), 0)];
848 if ((s
->opcode
>> 8) != 0)
849 h
= &hash_table
[hash(s
->opcode
>> 8, 0)];
850 else if ((s
->opcode
>> 4) != 0)
851 h
= &hash_table
[hash(s
->opcode
>> 4, 0)];
853 h
= &hash_table
[hash(s
->opcode
, 0)];
857 if ((s
->opcode
>> 8) != 0)
858 h
= &hash_table
[hash(s
->opcode
>> 8, 0)];
859 else if ((s
->opcode
>> 4) != 0)
860 h
= &hash_table
[hash(s
->opcode
>> 4, 0)];
862 h
= &hash_table
[hash(s
->opcode
, 0)];
866 if (((s
->opcode
>> 1) >> 8) != 0)
867 h
= &hash_table
[hash((s
->opcode
>>1) >> 8, 0)];
868 else if (((s
->opcode
>> 1) >> 4) != 0)
869 h
= &hash_table
[hash((s
->opcode
>>1) >> 4, 0)];
871 h
= &hash_table
[hash((s
->opcode
>>1), 0)];
875 if ((s
->opcode
>> 0xc) != 0)
876 h
= &hash_table
[hash(s
->opcode
>> 12, 0)];
877 else if ((s
->opcode
>> 8) != 0)
878 h
= &hash_table
[hash(s
->opcode
>> 8, 0)];
879 else if ((s
->opcode
>> 4) != 0)
880 h
= &hash_table
[hash(s
->opcode
>> 4, 0)];
882 h
= &hash_table
[hash(s
->opcode
, 0)];
886 if ((s
->opcode
>> 16) != 0)
887 h
= &hash_table
[hash(s
->opcode
>> 16, 0)];
888 else if ((s
->opcode
>> 12) != 0)
889 h
= &hash_table
[hash(s
->opcode
>> 12, 0)];
890 else if ((s
->opcode
>> 8) != 0)
891 h
= &hash_table
[hash(s
->opcode
>> 8, 0)];
892 else if ((s
->opcode
>> 4) != 0)
893 h
= &hash_table
[hash(s
->opcode
>> 4, 0)];
895 h
= &hash_table
[hash(s
->opcode
, 0)];
901 /* go to the last entry in the chain. */
907 h
->next
= (struct hash_entry
*) calloc(1,sizeof(struct hash_entry
));
909 perror ("malloc failure");
915 h
->opcode
= s
->opcode
;
916 h
->format
= s
->format
;
921 /* reset the processor state */
922 if (!State
.mem
.data
[0])
924 sim_create_inferior ((SIM_DESC
) 1, NULL
, NULL
, NULL
);
931 sim_close (SIM_DESC sd
, int quitting
)
937 dmem_addr (uint32 offset
)
943 /* Note: DMEM address range is 0..0x10000. Calling code can compute
944 things like ``0xfffe + 0x0e60 == 0x10e5d''. Since offset's type
945 is uint16 this is modulo'ed onto 0x0e5d. */
947 phys_size
= sim_cr16_translate_dmap_addr (offset
, 1, &phys
, NULL
,
951 mem
= State
.mem
.fault
;
954 mem
= map_memory (phys
);
956 if ((cr16_debug
& DEBUG_MEMORY
))
958 (*cr16_callback
->printf_filtered
)
960 "mem: 0x%08x (%s) -> 0x%08lx %d (%s) -> 0x%08lx (%s)\n",
962 phys
, phys_size
, last_to
,
963 (long) mem
, last_segname
);
970 imem_addr (uint32 offset
)
974 int phys_size
= sim_cr16_translate_imap_addr (offset
, 1, &phys
, NULL
,
978 return State
.mem
.fault
;
980 mem
= map_memory (phys
);
982 if ((cr16_debug
& DEBUG_MEMORY
))
984 (*cr16_callback
->printf_filtered
)
986 "mem: 0x%08x (%s) -> 0x%08lx %d (%s) -> 0x%08lx (%s)\n",
988 phys
, phys_size
, last_to
,
989 (long) mem
, last_segname
);
995 static int stop_simulator
= 0;
998 sim_stop (SIM_DESC sd
)
1005 /* Run (or resume) the program. */
1007 sim_resume (SIM_DESC sd
, int step
, int siggnal
)
1009 uint32 curr_ins_size
= 0;
1014 // (*cr16_callback->printf_filtered) (cr16_callback, "sim_resume (%d,%d) PC=0x%x\n",step,siggnal,PC);
1017 State
.exception
= 0;
1031 JMP (AE_VECTOR_START
);
1037 SET_HW_PSR ((PSR
& (PSR_C_BIT
)));
1038 JMP (RIE_VECTOR_START
);
1042 /* just ignore it */
1048 iaddr
= imem_addr ((uint32
)PC
);
1049 if (iaddr
== State
.mem
.fault
)
1052 State
.exception
= SIGBUS
;
1054 State
.exception
= SIGSEGV
;
1059 mcode
= get_longword( iaddr
);
1061 State
.pc_changed
= 0;
1063 curr_ins_size
= do_run(sd
, mcode
);
1066 (*cr16_callback
->printf_filtered
) (cr16_callback
, "INS: PC=0x%X, mcode=0x%X\n",PC
,mcode
);
1069 if (!State
.pc_changed
)
1071 if (curr_ins_size
== 0)
1073 State
.exception
= SIG_CR16_EXIT
; /* exit trap */
1077 SET_PC (PC
+ (curr_ins_size
* 2)); /* For word instructions. */
1081 /* Check for a breakpoint trap on this instruction. This
1082 overrides any pending branches or loops */
1083 if (PSR_DB
&& PC
== DBS
)
1087 SET_PC (SDBT_VECTOR_START
);
1091 /* Writeback all the DATA / PC changes */
1094 while ( !State
.exception
&& !stop_simulator
);
1096 if (step
&& !State
.exception
)
1097 State
.exception
= SIGTRAP
;
1101 sim_create_inferior (SIM_DESC sd
, struct bfd
*abfd
, char **argv
, char **env
)
1103 bfd_vma start_address
;
1105 /* reset all state information */
1106 memset (&State
.regs
, 0, (uintptr_t)&State
.mem
- (uintptr_t)&State
.regs
);
1108 /* There was a hack here to copy the values of argc and argv into r0
1109 and r1. The values were also saved into some high memory that
1110 won't be overwritten by the stack (0x7C00). The reason for doing
1111 this was to allow the 'run' program to accept arguments. Without
1112 the hack, this is not possible anymore. If the simulator is run
1113 from the debugger, arguments cannot be passed in, so this makes
1118 start_address
= bfd_get_start_address (abfd
);
1120 start_address
= 0x0;
1123 (*cr16_callback
->printf_filtered
) (cr16_callback
, "sim_create_inferior: PC=0x%lx\n", (long) start_address
);
1125 SET_CREG (PC_CR
, start_address
);
1132 sim_stop_reason (SIM_DESC sd
, enum sim_stop
*reason
, int *sigrc
)
1134 /* (*cr16_callback->printf_filtered) (cr16_callback, "sim_stop_reason: PC=0x%x\n",PC<<2); */
1136 switch (State
.exception
)
1138 case SIG_CR16_STOP
: /* stop instruction */
1139 *reason
= sim_stopped
;
1143 case SIG_CR16_EXIT
: /* exit trap */
1144 *reason
= sim_exited
;
1149 *reason
= sim_stopped
;
1150 *sigrc
= GDB_SIGNAL_BUS
;
1153 // case SIG_CR16_IAD:
1154 // *reason = sim_stopped;
1155 // *sigrc = GDB_SIGNAL_IAD;
1158 default: /* some signal */
1159 *reason
= sim_stopped
;
1160 if (stop_simulator
&& !State
.exception
)
1161 *sigrc
= GDB_SIGNAL_INT
;
1163 *sigrc
= State
.exception
;
1171 sim_fetch_register (SIM_DESC sd
, int rn
, unsigned char *memory
, int length
)
1174 switch ((enum sim_cr16_regs
) rn
)
1176 case SIM_CR16_R0_REGNUM
:
1177 case SIM_CR16_R1_REGNUM
:
1178 case SIM_CR16_R2_REGNUM
:
1179 case SIM_CR16_R3_REGNUM
:
1180 case SIM_CR16_R4_REGNUM
:
1181 case SIM_CR16_R5_REGNUM
:
1182 case SIM_CR16_R6_REGNUM
:
1183 case SIM_CR16_R7_REGNUM
:
1184 case SIM_CR16_R8_REGNUM
:
1185 case SIM_CR16_R9_REGNUM
:
1186 case SIM_CR16_R10_REGNUM
:
1187 case SIM_CR16_R11_REGNUM
:
1188 WRITE_16 (memory
, GPR (rn
- SIM_CR16_R0_REGNUM
));
1191 case SIM_CR16_R12_REGNUM
:
1192 case SIM_CR16_R13_REGNUM
:
1193 case SIM_CR16_R14_REGNUM
:
1194 case SIM_CR16_R15_REGNUM
:
1195 //WRITE_32 (memory, GPR (rn - SIM_CR16_R0_REGNUM));
1196 write_longword (memory
, GPR (rn
- SIM_CR16_R0_REGNUM
));
1199 case SIM_CR16_PC_REGNUM
:
1200 case SIM_CR16_ISP_REGNUM
:
1201 case SIM_CR16_USP_REGNUM
:
1202 case SIM_CR16_INTBASE_REGNUM
:
1203 case SIM_CR16_PSR_REGNUM
:
1204 case SIM_CR16_CFG_REGNUM
:
1205 case SIM_CR16_DBS_REGNUM
:
1206 case SIM_CR16_DCR_REGNUM
:
1207 case SIM_CR16_DSR_REGNUM
:
1208 case SIM_CR16_CAR0_REGNUM
:
1209 case SIM_CR16_CAR1_REGNUM
:
1210 //WRITE_32 (memory, CREG (rn - SIM_CR16_PC_REGNUM));
1211 write_longword (memory
, CREG (rn
- SIM_CR16_PC_REGNUM
));
1222 sim_store_register (SIM_DESC sd
, int rn
, unsigned char *memory
, int length
)
1225 switch ((enum sim_cr16_regs
) rn
)
1227 case SIM_CR16_R0_REGNUM
:
1228 case SIM_CR16_R1_REGNUM
:
1229 case SIM_CR16_R2_REGNUM
:
1230 case SIM_CR16_R3_REGNUM
:
1231 case SIM_CR16_R4_REGNUM
:
1232 case SIM_CR16_R5_REGNUM
:
1233 case SIM_CR16_R6_REGNUM
:
1234 case SIM_CR16_R7_REGNUM
:
1235 case SIM_CR16_R8_REGNUM
:
1236 case SIM_CR16_R9_REGNUM
:
1237 case SIM_CR16_R10_REGNUM
:
1238 case SIM_CR16_R11_REGNUM
:
1239 SET_GPR (rn
- SIM_CR16_R0_REGNUM
, READ_16 (memory
));
1242 case SIM_CR16_R12_REGNUM
:
1243 case SIM_CR16_R13_REGNUM
:
1244 case SIM_CR16_R14_REGNUM
:
1245 case SIM_CR16_R15_REGNUM
:
1246 SET_GPR32 (rn
- SIM_CR16_R0_REGNUM
, get_longword (memory
));
1249 case SIM_CR16_PC_REGNUM
:
1250 case SIM_CR16_ISP_REGNUM
:
1251 case SIM_CR16_USP_REGNUM
:
1252 case SIM_CR16_INTBASE_REGNUM
:
1253 case SIM_CR16_PSR_REGNUM
:
1254 case SIM_CR16_CFG_REGNUM
:
1255 case SIM_CR16_DBS_REGNUM
:
1256 case SIM_CR16_DCR_REGNUM
:
1257 case SIM_CR16_DSR_REGNUM
:
1258 case SIM_CR16_CAR0_REGNUM
:
1259 case SIM_CR16_CAR1_REGNUM
:
1260 SET_CREG (rn
- SIM_CR16_PC_REGNUM
, get_longword (memory
));
This page took 0.05658 seconds and 4 git commands to generate.