1 /* Simulator for the Renesas (formerly Hitachi) / SuperH Inc. SH architecture.
3 Written by Steve Chamberlain of Cygnus Support.
6 This file is part of SH sim
9 THIS SOFTWARE IS NOT COPYRIGHTED
11 Cygnus offers the following for use in the public domain. Cygnus
12 makes no warranty with regard to the software or it's performance
13 and the user accepts the software "AS IS" with all faults.
15 CYGNUS DISCLAIMS ANY WARRANTIES, EXPRESS OR IMPLIED, WITH REGARD TO
16 THIS SOFTWARE INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17 MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
30 #include "gdb/callback.h"
31 #include "gdb/remote-sim.h"
32 #include "gdb/sim-sh.h"
34 /* This file is local - if newlib changes, then so should this. */
40 #include <float.h> /* Needed for _isnan() */
45 #define SIGBUS SIGSEGV
49 #define SIGQUIT SIGTERM
56 extern unsigned short sh_jump_table
[], sh_dsp_table
[0x1000], ppi_table
[];
58 int sim_write (SIM_DESC sd
, SIM_ADDR addr
, unsigned char *buffer
, int size
);
60 #define O_RECOMPILE 85
62 #define DISASSEMBLER_TABLE
64 /* Define the rate at which the simulator should poll the host
66 #define POLL_QUIT_INTERVAL 0x60000
81 /* System registers. For sh-dsp this also includes A0 / X0 / X1 / Y0 / Y1
82 which are located in fregs, i.e. strictly speaking, these are
83 out-of-bounds accesses of sregs.i . This wart of the code could be
84 fixed by making fregs part of sregs, and including pc too - to avoid
85 alignment repercussions - but this would cause very onerous union /
86 structure nesting, which would only be managable with anonymous
87 unions and structs. */
96 int fpul
; /* A1 for sh-dsp - but only for movs etc. */
97 int fpscr
; /* dsr for sh-dsp */
111 /* Control registers; on the SH4, ldc / stc is privileged, except when
128 int dbr
; /* debug base register */
129 int sgr
; /* saved gr15 */
130 int ldst
; /* load/store flag (boolean) */
132 int ibcr
; /* sh2a bank control register */
133 int ibnr
; /* sh2a bank number register */
138 unsigned char *insn_end
;
150 int end_of_registers
;
153 #define PROFILE_FREQ 1
154 #define PROFILE_SHIFT 2
156 unsigned short *profile_hist
;
157 unsigned char *memory
;
158 int xyram_select
, xram_start
, yram_start
;
161 unsigned char *xmem_offset
;
162 unsigned char *ymem_offset
;
163 unsigned long bfd_mach
;
164 regstacktype
*regstack
;
170 saved_state_type saved_state
;
172 struct loop_bounds
{ unsigned char *start
, *end
; };
174 /* These variables are at file scope so that functions other than
175 sim_resume can use the fetch/store macros */
177 static int target_little_endian
;
178 static int global_endianw
, endianb
;
179 static int target_dsp
;
180 static int host_little_endian
;
181 static char **prog_argv
;
183 static int maskw
= 0;
184 static int maskl
= 0;
186 static SIM_OPEN_KIND sim_kind
;
188 static int tracing
= 0;
191 /* Short hand definitions of the registers */
193 #define SBIT(x) ((x)&sbit)
194 #define R0 saved_state.asregs.regs[0]
195 #define Rn saved_state.asregs.regs[n]
196 #define Rm saved_state.asregs.regs[m]
197 #define UR0 (unsigned int) (saved_state.asregs.regs[0])
198 #define UR (unsigned int) R
199 #define UR (unsigned int) R
200 #define SR0 saved_state.asregs.regs[0]
201 #define CREG(n) (saved_state.asregs.cregs.i[(n)])
202 #define GBR saved_state.asregs.cregs.named.gbr
203 #define VBR saved_state.asregs.cregs.named.vbr
204 #define DBR saved_state.asregs.cregs.named.dbr
205 #define TBR saved_state.asregs.cregs.named.tbr
206 #define IBCR saved_state.asregs.cregs.named.ibcr
207 #define IBNR saved_state.asregs.cregs.named.ibnr
208 #define BANKN (saved_state.asregs.cregs.named.ibnr & 0x1ff)
209 #define ME ((saved_state.asregs.cregs.named.ibnr >> 14) & 0x3)
210 #define SSR saved_state.asregs.cregs.named.ssr
211 #define SPC saved_state.asregs.cregs.named.spc
212 #define SGR saved_state.asregs.cregs.named.sgr
213 #define SREG(n) (saved_state.asregs.sregs.i[(n)])
214 #define MACH saved_state.asregs.sregs.named.mach
215 #define MACL saved_state.asregs.sregs.named.macl
216 #define PR saved_state.asregs.sregs.named.pr
217 #define FPUL saved_state.asregs.sregs.named.fpul
223 /* Alternate bank of registers r0-r7 */
225 /* Note: code controling SR handles flips between BANK0 and BANK1 */
226 #define Rn_BANK(n) (saved_state.asregs.cregs.named.bank[(n)])
227 #define SET_Rn_BANK(n, EXP) do { saved_state.asregs.cregs.named.bank[(n)] = (EXP); } while (0)
232 #define SR_MASK_BO (1 << 14)
233 #define SR_MASK_CS (1 << 13)
234 #define SR_MASK_DMY (1 << 11)
235 #define SR_MASK_DMX (1 << 10)
236 #define SR_MASK_M (1 << 9)
237 #define SR_MASK_Q (1 << 8)
238 #define SR_MASK_I (0xf << 4)
239 #define SR_MASK_S (1 << 1)
240 #define SR_MASK_T (1 << 0)
242 #define SR_MASK_BL (1 << 28)
243 #define SR_MASK_RB (1 << 29)
244 #define SR_MASK_MD (1 << 30)
245 #define SR_MASK_RC 0x0fff0000
246 #define SR_RC_INCREMENT -0x00010000
248 #define BO ((saved_state.asregs.cregs.named.sr & SR_MASK_BO) != 0)
249 #define CS ((saved_state.asregs.cregs.named.sr & SR_MASK_CS) != 0)
250 #define M ((saved_state.asregs.cregs.named.sr & SR_MASK_M) != 0)
251 #define Q ((saved_state.asregs.cregs.named.sr & SR_MASK_Q) != 0)
252 #define S ((saved_state.asregs.cregs.named.sr & SR_MASK_S) != 0)
253 #define T ((saved_state.asregs.cregs.named.sr & SR_MASK_T) != 0)
254 #define LDST ((saved_state.asregs.cregs.named.ldst) != 0)
256 #define SR_BL ((saved_state.asregs.cregs.named.sr & SR_MASK_BL) != 0)
257 #define SR_RB ((saved_state.asregs.cregs.named.sr & SR_MASK_RB) != 0)
258 #define SR_MD ((saved_state.asregs.cregs.named.sr & SR_MASK_MD) != 0)
259 #define SR_DMY ((saved_state.asregs.cregs.named.sr & SR_MASK_DMY) != 0)
260 #define SR_DMX ((saved_state.asregs.cregs.named.sr & SR_MASK_DMX) != 0)
261 #define SR_RC ((saved_state.asregs.cregs.named.sr & SR_MASK_RC))
263 /* Note: don't use this for privileged bits */
264 #define SET_SR_BIT(EXP, BIT) \
267 saved_state.asregs.cregs.named.sr |= (BIT); \
269 saved_state.asregs.cregs.named.sr &= ~(BIT); \
272 #define SET_SR_BO(EXP) SET_SR_BIT ((EXP), SR_MASK_BO)
273 #define SET_SR_CS(EXP) SET_SR_BIT ((EXP), SR_MASK_CS)
274 #define SET_BANKN(EXP) \
276 IBNR = (IBNR & 0xfe00) | (EXP & 0x1f); \
278 #define SET_ME(EXP) \
280 IBNR = (IBNR & 0x3fff) | ((EXP & 0x3) << 14); \
282 #define SET_SR_M(EXP) SET_SR_BIT ((EXP), SR_MASK_M)
283 #define SET_SR_Q(EXP) SET_SR_BIT ((EXP), SR_MASK_Q)
284 #define SET_SR_S(EXP) SET_SR_BIT ((EXP), SR_MASK_S)
285 #define SET_SR_T(EXP) SET_SR_BIT ((EXP), SR_MASK_T)
286 #define SET_LDST(EXP) (saved_state.asregs.cregs.named.ldst = ((EXP) != 0))
288 /* stc currently relies on being able to read SR without modifications. */
289 #define GET_SR() (saved_state.asregs.cregs.named.sr - 0)
291 #define SET_SR(x) set_sr (x)
294 (saved_state.asregs.cregs.named.sr \
295 = saved_state.asregs.cregs.named.sr & 0xf000ffff | ((x) & 0xfff) << 16)
297 /* Manipulate FPSCR */
299 #define FPSCR_MASK_FR (1 << 21)
300 #define FPSCR_MASK_SZ (1 << 20)
301 #define FPSCR_MASK_PR (1 << 19)
303 #define FPSCR_FR ((GET_FPSCR () & FPSCR_MASK_FR) != 0)
304 #define FPSCR_SZ ((GET_FPSCR () & FPSCR_MASK_SZ) != 0)
305 #define FPSCR_PR ((GET_FPSCR () & FPSCR_MASK_PR) != 0)
307 /* Count the number of arguments in an argv. */
309 count_argc (char **argv
)
316 for (i
= 0; argv
[i
] != NULL
; ++i
)
325 int old
= saved_state
.asregs
.sregs
.named
.fpscr
;
326 saved_state
.asregs
.sregs
.named
.fpscr
= (x
);
327 /* swap the floating point register banks */
328 if ((saved_state
.asregs
.sregs
.named
.fpscr
^ old
) & FPSCR_MASK_FR
329 /* Ignore bit change if simulating sh-dsp. */
332 union fregs_u tmpf
= saved_state
.asregs
.fregs
[0];
333 saved_state
.asregs
.fregs
[0] = saved_state
.asregs
.fregs
[1];
334 saved_state
.asregs
.fregs
[1] = tmpf
;
338 /* sts relies on being able to read fpscr directly. */
339 #define GET_FPSCR() (saved_state.asregs.sregs.named.fpscr)
340 #define SET_FPSCR(x) \
345 #define DSR (saved_state.asregs.sregs.named.fpscr)
353 #define RAISE_EXCEPTION(x) \
354 (saved_state.asregs.exception = x, saved_state.asregs.insn_end = 0)
356 #define RAISE_EXCEPTION_IF_IN_DELAY_SLOT() \
357 if (in_delay_slot) RAISE_EXCEPTION (SIGILL)
359 /* This function exists mainly for the purpose of setting a breakpoint to
360 catch simulated bus errors when running the simulator under GDB. */
372 raise_exception (SIGBUS
);
375 #define PROCESS_SPECIAL_ADDRESS(addr, endian, ptr, bits_written, \
376 forbidden_addr_bits, data, retval) \
378 if (addr & forbidden_addr_bits) \
383 else if ((addr & saved_state.asregs.xyram_select) \
384 == saved_state.asregs.xram_start) \
385 ptr = (void *) &saved_state.asregs.xmem_offset[addr ^ endian]; \
386 else if ((addr & saved_state.asregs.xyram_select) \
387 == saved_state.asregs.yram_start) \
388 ptr = (void *) &saved_state.asregs.ymem_offset[addr ^ endian]; \
389 else if ((unsigned) addr >> 24 == 0xf0 \
390 && bits_written == 32 && (data & 1) == 0) \
391 /* This invalidates (if not associative) or might invalidate \
392 (if associative) an instruction cache line. This is used for \
393 trampolines. Since we don't simulate the cache, this is a no-op \
394 as far as the simulator is concerned. */ \
398 if (bits_written == 8 && addr > 0x5000000) \
399 IOMEM (addr, 1, data); \
400 /* We can't do anything useful with the other stuff, so fail. */ \
406 /* FIXME: sim_resume should be renamed to sim_engine_run. sim_resume
407 being implemented by ../common/sim_resume.c and the below should
408 make a call to sim_engine_halt */
410 #define BUSERROR(addr, mask) ((addr) & (mask))
412 #define WRITE_BUSERROR(addr, mask, data, addr_func) \
417 addr_func (addr, data); \
423 #define READ_BUSERROR(addr, mask, addr_func) \
427 return addr_func (addr); \
431 /* Define this to enable register lifetime checking.
432 The compiler generates "add #0,rn" insns to mark registers as invalid,
433 the simulator uses this info to call fail if it finds a ref to an invalid
434 register before a def
441 #define CREF(x) if (!valid[x]) fail ();
442 #define CDEF(x) valid[x] = 1;
443 #define UNDEF(x) valid[x] = 0;
450 static void parse_and_set_memory_size
PARAMS ((char *str
));
451 static int IOMEM
PARAMS ((int addr
, int write
, int value
));
452 static struct loop_bounds get_loop_bounds
PARAMS ((int, int, unsigned char *,
453 unsigned char *, int, int));
454 static void process_wlat_addr
PARAMS ((int, int));
455 static void process_wwat_addr
PARAMS ((int, int));
456 static void process_wbat_addr
PARAMS ((int, int));
457 static int process_rlat_addr
PARAMS ((int));
458 static int process_rwat_addr
PARAMS ((int));
459 static int process_rbat_addr
PARAMS ((int));
460 static void INLINE wlat_fast
PARAMS ((unsigned char *, int, int, int));
461 static void INLINE wwat_fast
PARAMS ((unsigned char *, int, int, int, int));
462 static void INLINE wbat_fast
PARAMS ((unsigned char *, int, int, int));
463 static int INLINE rlat_fast
PARAMS ((unsigned char *, int, int));
464 static int INLINE rwat_fast
PARAMS ((unsigned char *, int, int, int));
465 static int INLINE rbat_fast
PARAMS ((unsigned char *, int, int));
467 static host_callback
*callback
;
471 /* Floating point registers */
473 #define DR(n) (get_dr (n))
479 if (host_little_endian
)
486 dr
.i
[1] = saved_state
.asregs
.fregs
[0].i
[n
+ 0];
487 dr
.i
[0] = saved_state
.asregs
.fregs
[0].i
[n
+ 1];
491 return (saved_state
.asregs
.fregs
[0].d
[n
>> 1]);
494 #define SET_DR(n, EXP) set_dr ((n), (EXP))
501 if (host_little_endian
)
509 saved_state
.asregs
.fregs
[0].i
[n
+ 0] = dr
.i
[1];
510 saved_state
.asregs
.fregs
[0].i
[n
+ 1] = dr
.i
[0];
513 saved_state
.asregs
.fregs
[0].d
[n
>> 1] = exp
;
516 #define SET_FI(n,EXP) (saved_state.asregs.fregs[0].i[(n)] = (EXP))
517 #define FI(n) (saved_state.asregs.fregs[0].i[(n)])
519 #define FR(n) (saved_state.asregs.fregs[0].f[(n)])
520 #define SET_FR(n,EXP) (saved_state.asregs.fregs[0].f[(n)] = (EXP))
522 #define XD_TO_XF(n) ((((n) & 1) << 5) | ((n) & 0x1e))
523 #define XF(n) (saved_state.asregs.fregs[(n) >> 5].i[(n) & 0x1f])
524 #define SET_XF(n,EXP) (saved_state.asregs.fregs[(n) >> 5].i[(n) & 0x1f] = (EXP))
526 #define RS saved_state.asregs.cregs.named.rs
527 #define RE saved_state.asregs.cregs.named.re
528 #define MOD (saved_state.asregs.cregs.named.mod)
531 MOD_ME = (unsigned) MOD >> 16 | (SR_DMY ? ~0xffff : (SR_DMX ? 0 : 0x10000)), \
532 MOD_DELTA = (MOD & 0xffff) - ((unsigned) MOD >> 16))
534 #define DSP_R(n) saved_state.asregs.sregs.i[(n)]
535 #define DSP_GRD(n) DSP_R ((n) + 8)
536 #define GET_DSP_GRD(n) ((n | 2) == 7 ? SEXT (DSP_GRD (n)) : SIGN32 (DSP_R (n)))
541 #define Y0 DSP_R (10)
542 #define Y1 DSP_R (11)
543 #define M0 DSP_R (12)
544 #define A1G DSP_R (13)
545 #define M1 DSP_R (14)
546 #define A0G DSP_R (15)
547 /* DSP_R (16) / DSP_GRD (16) are used as a fake destination for pcmp. */
548 #define MOD_ME DSP_GRD (17)
549 #define MOD_DELTA DSP_GRD (18)
551 #define FP_OP(n, OP, m) \
555 if (((n) & 1) || ((m) & 1)) \
556 RAISE_EXCEPTION (SIGILL); \
558 SET_DR (n, (DR (n) OP DR (m))); \
561 SET_FR (n, (FR (n) OP FR (m))); \
564 #define FP_UNARY(n, OP) \
569 RAISE_EXCEPTION (SIGILL); \
571 SET_DR (n, (OP (DR (n)))); \
574 SET_FR (n, (OP (FR (n)))); \
577 #define FP_CMP(n, OP, m) \
581 if (((n) & 1) || ((m) & 1)) \
582 RAISE_EXCEPTION (SIGILL); \
584 SET_SR_T (DR (n) OP DR (m)); \
587 SET_SR_T (FR (n) OP FR (m)); \
594 /* do we need to swap banks */
595 int old_gpr
= SR_MD
&& SR_RB
;
596 int new_gpr
= (new_sr
& SR_MASK_MD
) && (new_sr
& SR_MASK_RB
);
597 if (old_gpr
!= new_gpr
)
600 for (i
= 0; i
< 8; i
++)
602 tmp
= saved_state
.asregs
.cregs
.named
.bank
[i
];
603 saved_state
.asregs
.cregs
.named
.bank
[i
] = saved_state
.asregs
.regs
[i
];
604 saved_state
.asregs
.regs
[i
] = tmp
;
607 saved_state
.asregs
.cregs
.named
.sr
= new_sr
;
612 wlat_fast (memory
, x
, value
, maskl
)
613 unsigned char *memory
;
616 unsigned int *p
= (unsigned int *) (memory
+ x
);
617 WRITE_BUSERROR (x
, maskl
, v
, process_wlat_addr
);
622 wwat_fast (memory
, x
, value
, maskw
, endianw
)
623 unsigned char *memory
;
626 unsigned short *p
= (unsigned short *) (memory
+ (x
^ endianw
));
627 WRITE_BUSERROR (x
, maskw
, v
, process_wwat_addr
);
632 wbat_fast (memory
, x
, value
, maskb
)
633 unsigned char *memory
;
635 unsigned char *p
= memory
+ (x
^ endianb
);
636 WRITE_BUSERROR (x
, maskb
, value
, process_wbat_addr
);
644 rlat_fast (memory
, x
, maskl
)
645 unsigned char *memory
;
647 unsigned int *p
= (unsigned int *) (memory
+ x
);
648 READ_BUSERROR (x
, maskl
, process_rlat_addr
);
654 rwat_fast (memory
, x
, maskw
, endianw
)
655 unsigned char *memory
;
656 int x
, maskw
, endianw
;
658 unsigned short *p
= (unsigned short *) (memory
+ (x
^ endianw
));
659 READ_BUSERROR (x
, maskw
, process_rwat_addr
);
665 riat_fast (insn_ptr
, endianw
)
666 unsigned char *insn_ptr
;
668 unsigned short *p
= (unsigned short *) ((size_t) insn_ptr
^ endianw
);
674 rbat_fast (memory
, x
, maskb
)
675 unsigned char *memory
;
677 unsigned char *p
= memory
+ (x
^ endianb
);
678 READ_BUSERROR (x
, maskb
, process_rbat_addr
);
683 #define RWAT(x) (rwat_fast (memory, x, maskw, endianw))
684 #define RLAT(x) (rlat_fast (memory, x, maskl))
685 #define RBAT(x) (rbat_fast (memory, x, maskb))
686 #define RIAT(p) (riat_fast ((p), endianw))
687 #define WWAT(x,v) (wwat_fast (memory, x, v, maskw, endianw))
688 #define WLAT(x,v) (wlat_fast (memory, x, v, maskl))
689 #define WBAT(x,v) (wbat_fast (memory, x, v, maskb))
691 #define RUWAT(x) (RWAT (x) & 0xffff)
692 #define RSWAT(x) ((short) (RWAT (x)))
693 #define RSLAT(x) ((long) (RLAT (x)))
694 #define RSBAT(x) (SEXT (RBAT (x)))
696 #define RDAT(x, n) (do_rdat (memory, (x), (n), (maskl)))
698 do_rdat (memory
, x
, n
, maskl
)
708 f0
= rlat_fast (memory
, x
+ 0, maskl
);
709 f1
= rlat_fast (memory
, x
+ 4, maskl
);
710 saved_state
.asregs
.fregs
[i
].i
[(j
+ 0)] = f0
;
711 saved_state
.asregs
.fregs
[i
].i
[(j
+ 1)] = f1
;
715 #define WDAT(x, n) (do_wdat (memory, (x), (n), (maskl)))
717 do_wdat (memory
, x
, n
, maskl
)
727 f0
= saved_state
.asregs
.fregs
[i
].i
[(j
+ 0)];
728 f1
= saved_state
.asregs
.fregs
[i
].i
[(j
+ 1)];
729 wlat_fast (memory
, (x
+ 0), f0
, maskl
);
730 wlat_fast (memory
, (x
+ 4), f1
, maskl
);
735 process_wlat_addr (addr
, value
)
741 PROCESS_SPECIAL_ADDRESS (addr
, endianb
, ptr
, 32, 3, value
, );
746 process_wwat_addr (addr
, value
)
752 PROCESS_SPECIAL_ADDRESS (addr
, endianb
, ptr
, 16, 1, value
, );
757 process_wbat_addr (addr
, value
)
763 PROCESS_SPECIAL_ADDRESS (addr
, endianb
, ptr
, 8, 0, value
, );
768 process_rlat_addr (addr
)
773 PROCESS_SPECIAL_ADDRESS (addr
, endianb
, ptr
, -32, 3, -1, 0);
778 process_rwat_addr (addr
)
783 PROCESS_SPECIAL_ADDRESS (addr
, endianb
, ptr
, -16, 1, -1, 0);
788 process_rbat_addr (addr
)
793 PROCESS_SPECIAL_ADDRESS (addr
, endianb
, ptr
, -8, 0, -1, 0);
797 #define SEXT(x) (((x & 0xff) ^ (~0x7f))+0x80)
798 #define SEXT12(x) (((x & 0xfff) ^ 0x800) - 0x800)
799 #define SEXTW(y) ((int) ((short) y))
801 #define SEXT32(x) ((int) ((x & 0xffffffff) ^ 0x80000000U) - 0x7fffffff - 1)
803 #define SEXT32(x) ((int) (x))
805 #define SIGN32(x) (SEXT32 (x) >> 31)
807 /* convert pointer from target to host value. */
808 #define PT2H(x) ((x) + memory)
809 /* convert pointer from host to target value. */
810 #define PH2T(x) ((x) - memory)
812 #define SKIP_INSN(p) ((p) += ((RIAT (p) & 0xfc00) == 0xf800 ? 4 : 2))
814 #define SET_NIP(x) nip = (x); CHECK_INSN_PTR (nip);
816 static int in_delay_slot
= 0;
817 #define Delay_Slot(TEMPPC) iword = RIAT (TEMPPC); in_delay_slot = 1; goto top;
819 #define CHECK_INSN_PTR(p) \
821 if (saved_state.asregs.exception || PH2T (p) & maskw) \
822 saved_state.asregs.insn_end = 0; \
823 else if (p < loop.end) \
824 saved_state.asregs.insn_end = loop.end; \
826 saved_state.asregs.insn_end = mem_end; \
839 do { memstalls += ((((int) PC & 3) != 0) ? (n) : ((n) - 1)); } while (0)
841 #define L(x) thislock = x;
842 #define TL(x) if ((x) == prevlock) stalls++;
843 #define TB(x,y) if ((x) == prevlock || (y) == prevlock) stalls++;
847 #if defined(__GO32__) || defined(_WIN32)
848 int sim_memory_size
= 19;
850 int sim_memory_size
= 24;
853 static int sim_profile_size
= 17;
859 #define SMR1 (0x05FFFEC8) /* Channel 1 serial mode register */
860 #define BRR1 (0x05FFFEC9) /* Channel 1 bit rate register */
861 #define SCR1 (0x05FFFECA) /* Channel 1 serial control register */
862 #define TDR1 (0x05FFFECB) /* Channel 1 transmit data register */
863 #define SSR1 (0x05FFFECC) /* Channel 1 serial status register */
864 #define RDR1 (0x05FFFECD) /* Channel 1 receive data register */
866 #define SCI_RDRF 0x40 /* Recieve data register full */
867 #define SCI_TDRE 0x80 /* Transmit data register empty */
870 IOMEM (addr
, write
, value
)
902 return time ((long *) 0);
911 static FILE *profile_file
;
913 static unsigned INLINE
918 n
= (n
<< 24 | (n
& 0xff00) << 8
919 | (n
& 0xff0000) >> 8 | (n
& 0xff000000) >> 24);
923 static unsigned short INLINE
928 n
= n
<< 8 | (n
& 0xff00) >> 8;
938 union { char b
[4]; int n
; } u
;
940 fwrite (u
.b
, 4, 1, profile_file
);
948 union { char b
[4]; int n
; } u
;
950 fwrite (u
.b
, 2, 1, profile_file
);
953 /* Turn a pointer in a register into a pointer into real memory. */
959 return (char *) (x
+ saved_state
.asregs
.memory
);
966 unsigned char *memory
= saved_state
.asregs
.memory
;
968 int endian
= endianb
;
973 for (end
= str
; memory
[end
^ endian
]; end
++) ;
984 if (! endianb
|| ! len
)
986 start
= (int *) ptr (str
& ~3);
987 end
= (int *) ptr (str
+ len
);
991 *start
= (old
<< 24 | (old
& 0xff00) << 8
992 | (old
& 0xff0000) >> 8 | (old
& 0xff000000) >> 24);
998 /* Simulate a monitor trap, put the result into r0 and errno into r1
999 return offset by which to adjust pc. */
1002 trap (i
, regs
, insn_ptr
, memory
, maskl
, maskw
, endianw
)
1005 unsigned char *insn_ptr
;
1006 unsigned char *memory
;
1011 printf ("%c", regs
[0]);
1014 raise_exception (SIGQUIT
);
1016 case 3: /* FIXME: for backwards compat, should be removed */
1019 unsigned int countp
= * (unsigned int *) (insn_ptr
+ 4);
1021 WLAT (countp
, RLAT (countp
) + 1);
1033 #if !defined(__GO32__) && !defined(_WIN32)
1037 /* This would work only if endianness matched between host and target.
1038 Besides, it's quite dangerous. */
1041 regs
[0] = execve (ptr (regs
[5]), (char **) ptr (regs
[6]),
1042 (char **) ptr (regs
[7]));
1045 regs
[0] = execve (ptr (regs
[5]), (char **) ptr (regs
[6]), 0);
1050 regs
[0] = (BUSERROR (regs
[5], maskl
)
1052 : pipe ((int *) ptr (regs
[5])));
1057 regs
[0] = wait (ptr (regs
[5]));
1059 #endif /* !defined(__GO32__) && !defined(_WIN32) */
1062 strnswap (regs
[6], regs
[7]);
1064 = callback
->read (callback
, regs
[5], ptr (regs
[6]), regs
[7]);
1065 strnswap (regs
[6], regs
[7]);
1068 strnswap (regs
[6], regs
[7]);
1070 regs
[0] = (int) callback
->write_stdout (callback
,
1071 ptr (regs
[6]), regs
[7]);
1073 regs
[0] = (int) callback
->write (callback
, regs
[5],
1074 ptr (regs
[6]), regs
[7]);
1075 strnswap (regs
[6], regs
[7]);
1078 regs
[0] = callback
->lseek (callback
,regs
[5], regs
[6], regs
[7]);
1081 regs
[0] = callback
->close (callback
,regs
[5]);
1085 int len
= strswaplen (regs
[5]);
1086 strnswap (regs
[5], len
);
1087 regs
[0] = callback
->open (callback
, ptr (regs
[5]), regs
[6]);
1088 strnswap (regs
[5], len
);
1092 /* EXIT - caller can look in r5 to work out the reason */
1093 raise_exception (SIGQUIT
);
1097 case SYS_stat
: /* added at hmsi */
1098 /* stat system call */
1100 struct stat host_stat
;
1102 int len
= strswaplen (regs
[5]);
1104 strnswap (regs
[5], len
);
1105 regs
[0] = stat (ptr (regs
[5]), &host_stat
);
1106 strnswap (regs
[5], len
);
1110 WWAT (buf
, host_stat
.st_dev
);
1112 WWAT (buf
, host_stat
.st_ino
);
1114 WLAT (buf
, host_stat
.st_mode
);
1116 WWAT (buf
, host_stat
.st_nlink
);
1118 WWAT (buf
, host_stat
.st_uid
);
1120 WWAT (buf
, host_stat
.st_gid
);
1122 WWAT (buf
, host_stat
.st_rdev
);
1124 WLAT (buf
, host_stat
.st_size
);
1126 WLAT (buf
, host_stat
.st_atime
);
1130 WLAT (buf
, host_stat
.st_mtime
);
1134 WLAT (buf
, host_stat
.st_ctime
);
1148 int len
= strswaplen (regs
[5]);
1150 strnswap (regs
[5], len
);
1151 regs
[0] = chown (ptr (regs
[5]), regs
[6], regs
[7]);
1152 strnswap (regs
[5], len
);
1158 int len
= strswaplen (regs
[5]);
1160 strnswap (regs
[5], len
);
1161 regs
[0] = chmod (ptr (regs
[5]), regs
[6]);
1162 strnswap (regs
[5], len
);
1167 /* Cast the second argument to void *, to avoid type mismatch
1168 if a prototype is present. */
1169 int len
= strswaplen (regs
[5]);
1171 strnswap (regs
[5], len
);
1172 regs
[0] = utime (ptr (regs
[5]), (void *) ptr (regs
[6]));
1173 strnswap (regs
[5], len
);
1177 regs
[0] = count_argc (prog_argv
);
1180 if (regs
[5] < count_argc (prog_argv
))
1181 regs
[0] = strlen (prog_argv
[regs
[5]]);
1186 if (regs
[5] < count_argc (prog_argv
))
1188 /* Include the termination byte. */
1189 int i
= strlen (prog_argv
[regs
[5]]) + 1;
1190 regs
[0] = sim_write (0, regs
[6], prog_argv
[regs
[5]], i
);
1196 regs
[0] = get_now ();
1199 regs
[0] = callback
->ftruncate (callback
, regs
[5], regs
[6]);
1203 int len
= strswaplen (regs
[5]);
1204 strnswap (regs
[5], len
);
1205 regs
[0] = callback
->truncate (callback
, ptr (regs
[5]), regs
[6]);
1206 strnswap (regs
[5], len
);
1213 regs
[1] = callback
->get_errno (callback
);
1218 case 13: /* Set IBNR */
1219 IBNR
= regs
[0] & 0xffff;
1221 case 14: /* Set IBCR */
1222 IBCR
= regs
[0] & 0xffff;
1226 raise_exception (SIGTRAP
);
1235 control_c (sig
, code
, scp
, addr
)
1241 raise_exception (SIGINT
);
1245 div1 (R
, iRn2
, iRn1
/*, T*/)
1252 unsigned char old_q
, tmp1
;
1255 SET_SR_Q ((unsigned char) ((0x80000000 & R
[iRn1
]) != 0));
1257 R
[iRn1
] |= (unsigned long) T
;
1267 tmp1
= (R
[iRn1
] > tmp0
);
1274 SET_SR_Q ((unsigned char) (tmp1
== 0));
1281 tmp1
= (R
[iRn1
] < tmp0
);
1285 SET_SR_Q ((unsigned char) (tmp1
== 0));
1300 tmp1
= (R
[iRn1
] < tmp0
);
1307 SET_SR_Q ((unsigned char) (tmp1
== 0));
1314 tmp1
= (R
[iRn1
] > tmp0
);
1318 SET_SR_Q ((unsigned char) (tmp1
== 0));
1339 unsigned long RnL
, RnH
;
1340 unsigned long RmL
, RmH
;
1341 unsigned long temp0
, temp1
, temp2
, temp3
;
1342 unsigned long Res2
, Res1
, Res0
;
1345 RnH
= (rn
>> 16) & 0xffff;
1347 RmH
= (rm
>> 16) & 0xffff;
1353 Res1
= temp1
+ temp2
;
1356 temp1
= (Res1
<< 16) & 0xffff0000;
1357 Res0
= temp0
+ temp1
;
1360 Res2
+= ((Res1
>> 16) & 0xffff) + temp3
;
1364 if (rn
& 0x80000000)
1366 if (rm
& 0x80000000)
1375 macw (regs
, memory
, n
, m
, endianw
)
1377 unsigned char *memory
;
1382 long prod
, macl
, sum
;
1384 tempm
=RSWAT (regs
[m
]); regs
[m
]+=2;
1385 tempn
=RSWAT (regs
[n
]); regs
[n
]+=2;
1388 prod
= (long) (short) tempm
* (long) (short) tempn
;
1392 if ((~(prod
^ macl
) & (sum
^ prod
)) < 0)
1394 /* MACH's lsb is a sticky overflow bit. */
1396 /* Store the smallest negative number in MACL if prod is
1397 negative, and the largest positive number otherwise. */
1398 sum
= 0x7fffffff + (prod
< 0);
1404 /* Add to MACH the sign extended product, and carry from low sum. */
1405 mach
= MACH
+ (-(prod
< 0)) + ((unsigned long) sum
< prod
);
1406 /* Sign extend at 10:th bit in MACH. */
1407 MACH
= (mach
& 0x1ff) | -(mach
& 0x200);
1413 macl (regs
, memory
, n
, m
)
1415 unsigned char *memory
;
1419 long prod
, macl
, mach
, sum
;
1420 long long ans
,ansl
,ansh
,t
;
1421 unsigned long long high
,low
,combine
;
1424 long m
[2]; /* mach and macl*/
1425 long long m64
; /* 64 bit MAC */
1428 tempm
= RSLAT (regs
[m
]);
1431 tempn
= RSLAT (regs
[n
]);
1440 ans
= (long long) tempm
* (long long) tempn
; /* Multiply 32bit * 32bit */
1442 mac64
.m64
+= ans
; /* Accumulate 64bit + 64 bit */
1447 if (S
) /* Store only 48 bits of the result */
1449 if (mach
< 0) /* Result is negative */
1451 mach
= mach
& 0x0000ffff; /* Mask higher 16 bits */
1452 mach
|= 0xffff8000; /* Sign extend higher 16 bits */
1455 mach
= mach
& 0x00007fff; /* Postive Result */
1486 /* Do extended displacement move instructions. */
1488 do_long_move_insn (int op
, int disp12
, int m
, int n
, int *thatlock
)
1491 int thislock
= *thatlock
;
1492 int endianw
= global_endianw
;
1493 int *R
= &(saved_state
.asregs
.regs
[0]);
1494 unsigned char *memory
= saved_state
.asregs
.memory
;
1495 int maskb
= ~((saved_state
.asregs
.msize
- 1) & ~0);
1496 unsigned char *insn_ptr
= PT2H (saved_state
.asregs
.pc
);
1499 case MOVB_RM
: /* signed */
1500 WBAT (disp12
* 1 + R
[n
], R
[m
]);
1503 WWAT (disp12
* 2 + R
[n
], R
[m
]);
1506 WLAT (disp12
* 4 + R
[n
], R
[m
]);
1508 case FMOV_RM
: /* floating point */
1512 WDAT (R
[n
] + 8 * disp12
, m
);
1515 WLAT (R
[n
] + 4 * disp12
, FI (m
));
1518 R
[n
] = RSBAT (disp12
* 1 + R
[m
]);
1522 R
[n
] = RSWAT (disp12
* 2 + R
[m
]);
1526 R
[n
] = RLAT (disp12
* 4 + R
[m
]);
1532 RDAT (R
[m
] + 8 * disp12
, n
);
1535 SET_FI (n
, RLAT (R
[m
] + 4 * disp12
));
1537 case MOVU_BMR
: /* unsigned */
1538 R
[n
] = RBAT (disp12
* 1 + R
[m
]);
1542 R
[n
] = RWAT (disp12
* 2 + R
[m
]);
1546 RAISE_EXCEPTION (SIGINT
);
1549 saved_state
.asregs
.memstalls
+= memstalls
;
1550 *thatlock
= thislock
;
1553 /* Do binary logical bit-manipulation insns. */
1555 do_blog_insn (int imm
, int addr
, int binop
,
1556 unsigned char *memory
, int maskb
)
1558 int oldval
= RBAT (addr
);
1561 case B_BCLR
: /* bclr.b */
1562 WBAT (addr
, oldval
& ~imm
);
1564 case B_BSET
: /* bset.b */
1565 WBAT (addr
, oldval
| imm
);
1567 case B_BST
: /* bst.b */
1569 WBAT (addr
, oldval
| imm
);
1571 WBAT (addr
, oldval
& ~imm
);
1573 case B_BLD
: /* bld.b */
1574 SET_SR_T ((oldval
& imm
) != 0);
1576 case B_BAND
: /* band.b */
1577 SET_SR_T (T
&& ((oldval
& imm
) != 0));
1579 case B_BOR
: /* bor.b */
1580 SET_SR_T (T
|| ((oldval
& imm
) != 0));
1582 case B_BXOR
: /* bxor.b */
1583 SET_SR_T (T
^ ((oldval
& imm
) != 0));
1585 case B_BLDNOT
: /* bldnot.b */
1586 SET_SR_T ((oldval
& imm
) == 0);
1588 case B_BANDNOT
: /* bandnot.b */
1589 SET_SR_T (T
&& ((oldval
& imm
) == 0));
1591 case B_BORNOT
: /* bornot.b */
1592 SET_SR_T (T
|| ((oldval
& imm
) == 0));
1597 fsca_s (int in
, double (*f
) (double))
1599 double rad
= ldexp ((in
& 0xffff), -15) * 3.141592653589793238462643383;
1600 double result
= (*f
) (rad
);
1601 double error
, upper
, lower
, frac
;
1604 /* Search the value with the maximum error that is still within the
1605 architectural spec. */
1606 error
= ldexp (1., -21);
1607 /* compensate for calculation inaccuracy by reducing error. */
1608 error
= error
- ldexp (1., -50);
1609 upper
= result
+ error
;
1610 frac
= frexp (upper
, &exp
);
1611 upper
= ldexp (floor (ldexp (frac
, 24)), exp
- 24);
1612 lower
= result
- error
;
1613 frac
= frexp (lower
, &exp
);
1614 lower
= ldexp (ceil (ldexp (frac
, 24)), exp
- 24);
1615 return abs (upper
- result
) >= abs (lower
- result
) ? upper
: lower
;
1621 double result
= 1. / sqrt (in
);
1623 double frac
, upper
, lower
, error
, eps
;
1626 result
= result
- (result
* result
* in
- 1) * 0.5 * result
;
1627 /* Search the value with the maximum error that is still within the
1628 architectural spec. */
1629 frac
= frexp (result
, &exp
);
1630 frac
= ldexp (frac
, 24);
1631 error
= 4.0; /* 1 << 24-1-21 */
1632 /* use eps to compensate for possible 1 ulp error in our 'exact' result. */
1633 eps
= ldexp (1., -29);
1634 upper
= floor (frac
+ error
- eps
);
1635 if (upper
> 16777216.)
1636 upper
= floor ((frac
+ error
- eps
) * 0.5) * 2.;
1637 lower
= ceil ((frac
- error
+ eps
) * 2) * .5;
1638 if (lower
> 8388608.)
1639 lower
= ceil (frac
- error
+ eps
);
1640 upper
= ldexp (upper
, exp
- 24);
1641 lower
= ldexp (lower
, exp
- 24);
1642 return upper
- result
>= result
- lower
? upper
: lower
;
1646 /* GET_LOOP_BOUNDS {EXTENDED}
1647 These two functions compute the actual starting and ending point
1648 of the repeat loop, based on the RS and RE registers (repeat start,
1649 repeat stop). The extended version is called for LDRC, and the
1650 regular version is called for SETRC. The difference is that for
1651 LDRC, the loop start and end instructions are literally the ones
1652 pointed to by RS and RE -- for SETRC, they're not (see docs). */
1654 static struct loop_bounds
1655 get_loop_bounds_ext (rs
, re
, memory
, mem_end
, maskw
, endianw
)
1657 unsigned char *memory
, *mem_end
;
1660 struct loop_bounds loop
;
1662 /* FIXME: should I verify RS < RE? */
1663 loop
.start
= PT2H (RS
); /* FIXME not using the params? */
1664 loop
.end
= PT2H (RE
& ~1); /* Ignore bit 0 of RE. */
1665 SKIP_INSN (loop
.end
);
1666 if (loop
.end
>= mem_end
)
1667 loop
.end
= PT2H (0);
1671 static struct loop_bounds
1672 get_loop_bounds (rs
, re
, memory
, mem_end
, maskw
, endianw
)
1674 unsigned char *memory
, *mem_end
;
1677 struct loop_bounds loop
;
1683 loop
.start
= PT2H (RE
- 4);
1684 SKIP_INSN (loop
.start
);
1685 loop
.end
= loop
.start
;
1687 SKIP_INSN (loop
.end
);
1689 SKIP_INSN (loop
.end
);
1690 SKIP_INSN (loop
.end
);
1694 loop
.start
= PT2H (RS
);
1695 loop
.end
= PT2H (RE
- 4);
1696 SKIP_INSN (loop
.end
);
1697 SKIP_INSN (loop
.end
);
1698 SKIP_INSN (loop
.end
);
1699 SKIP_INSN (loop
.end
);
1701 if (loop
.end
>= mem_end
)
1702 loop
.end
= PT2H (0);
1705 loop
.end
= PT2H (0);
1710 static void ppi_insn ();
1714 /* Set the memory size to the power of two provided. */
1721 saved_state
.asregs
.msize
= 1 << power
;
1723 sim_memory_size
= power
;
1725 if (saved_state
.asregs
.memory
)
1727 free (saved_state
.asregs
.memory
);
1730 saved_state
.asregs
.memory
=
1731 (unsigned char *) calloc (64, saved_state
.asregs
.msize
/ 64);
1733 if (!saved_state
.asregs
.memory
)
1736 "Not enough VM for simulation of %d bytes of RAM\n",
1737 saved_state
.asregs
.msize
);
1739 saved_state
.asregs
.msize
= 1;
1740 saved_state
.asregs
.memory
= (unsigned char *) calloc (1, 1);
1748 int was_dsp
= target_dsp
;
1749 unsigned long mach
= bfd_get_mach (abfd
);
1751 if (mach
== bfd_mach_sh_dsp
||
1752 mach
== bfd_mach_sh4al_dsp
||
1753 mach
== bfd_mach_sh3_dsp
)
1755 int ram_area_size
, xram_start
, yram_start
;
1759 if (mach
== bfd_mach_sh_dsp
)
1761 /* SH7410 (orig. sh-sdp):
1762 4KB each for X & Y memory;
1763 On-chip X RAM 0x0800f000-0x0800ffff
1764 On-chip Y RAM 0x0801f000-0x0801ffff */
1765 xram_start
= 0x0800f000;
1766 ram_area_size
= 0x1000;
1768 if (mach
== bfd_mach_sh3_dsp
|| mach
== bfd_mach_sh4al_dsp
)
1771 8KB each for X & Y memory;
1772 On-chip X RAM 0x1000e000-0x1000ffff
1773 On-chip Y RAM 0x1001e000-0x1001ffff */
1774 xram_start
= 0x1000e000;
1775 ram_area_size
= 0x2000;
1777 yram_start
= xram_start
+ 0x10000;
1778 new_select
= ~(ram_area_size
- 1);
1779 if (saved_state
.asregs
.xyram_select
!= new_select
)
1781 saved_state
.asregs
.xyram_select
= new_select
;
1782 free (saved_state
.asregs
.xmem
);
1783 free (saved_state
.asregs
.ymem
);
1784 saved_state
.asregs
.xmem
=
1785 (unsigned char *) calloc (1, ram_area_size
);
1786 saved_state
.asregs
.ymem
=
1787 (unsigned char *) calloc (1, ram_area_size
);
1789 /* Disable use of X / Y mmeory if not allocated. */
1790 if (! saved_state
.asregs
.xmem
|| ! saved_state
.asregs
.ymem
)
1792 saved_state
.asregs
.xyram_select
= 0;
1793 if (saved_state
.asregs
.xmem
)
1794 free (saved_state
.asregs
.xmem
);
1795 if (saved_state
.asregs
.ymem
)
1796 free (saved_state
.asregs
.ymem
);
1799 saved_state
.asregs
.xram_start
= xram_start
;
1800 saved_state
.asregs
.yram_start
= yram_start
;
1801 saved_state
.asregs
.xmem_offset
= saved_state
.asregs
.xmem
- xram_start
;
1802 saved_state
.asregs
.ymem_offset
= saved_state
.asregs
.ymem
- yram_start
;
1807 if (saved_state
.asregs
.xyram_select
)
1809 saved_state
.asregs
.xyram_select
= 0;
1810 free (saved_state
.asregs
.xmem
);
1811 free (saved_state
.asregs
.ymem
);
1815 if (! saved_state
.asregs
.xyram_select
)
1817 saved_state
.asregs
.xram_start
= 1;
1818 saved_state
.asregs
.yram_start
= 1;
1821 if (saved_state
.asregs
.regstack
== NULL
)
1822 saved_state
.asregs
.regstack
=
1823 calloc (512, sizeof *saved_state
.asregs
.regstack
);
1825 if (target_dsp
!= was_dsp
)
1829 for (i
= (sizeof sh_dsp_table
/ sizeof sh_dsp_table
[0]) - 1; i
>= 0; i
--)
1831 tmp
= sh_jump_table
[0xf000 + i
];
1832 sh_jump_table
[0xf000 + i
] = sh_dsp_table
[i
];
1833 sh_dsp_table
[i
] = tmp
;
1841 host_little_endian
= 0;
1842 * (char*) &host_little_endian
= 1;
1843 host_little_endian
&= 1;
1845 if (saved_state
.asregs
.msize
!= 1 << sim_memory_size
)
1847 sim_size (sim_memory_size
);
1850 if (saved_state
.asregs
.profile
&& !profile_file
)
1852 profile_file
= fopen ("gmon.out", "wb");
1853 /* Seek to where to put the call arc data */
1854 nsamples
= (1 << sim_profile_size
);
1856 fseek (profile_file
, nsamples
* 2 + 12, 0);
1860 fprintf (stderr
, "Can't open gmon.out\n");
1864 saved_state
.asregs
.profile_hist
=
1865 (unsigned short *) calloc (64, (nsamples
* sizeof (short) / 64));
1878 p
= saved_state
.asregs
.profile_hist
;
1880 maxpc
= (1 << sim_profile_size
);
1882 fseek (profile_file
, 0L, 0);
1883 swapout (minpc
<< PROFILE_SHIFT
);
1884 swapout (maxpc
<< PROFILE_SHIFT
);
1885 swapout (nsamples
* 2 + 12);
1886 for (i
= 0; i
< nsamples
; i
++)
1887 swapout16 (saved_state
.asregs
.profile_hist
[i
]);
1901 #define MMASKB ((saved_state.asregs.msize -1) & ~0)
1907 raise_exception (SIGINT
);
1912 sim_resume (sd
, step
, siggnal
)
1916 register unsigned char *insn_ptr
;
1917 unsigned char *mem_end
;
1918 struct loop_bounds loop
;
1919 register int cycles
= 0;
1920 register int stalls
= 0;
1921 register int memstalls
= 0;
1922 register int insts
= 0;
1923 register int prevlock
;
1927 register int thislock
;
1929 register unsigned int doprofile
;
1930 register int pollcount
= 0;
1931 /* endianw is used for every insn fetch, hence it makes sense to cache it.
1932 endianb is used less often. */
1933 register int endianw
= global_endianw
;
1935 int tick_start
= get_now ();
1937 void (*prev_fpe
) ();
1939 register unsigned short *jump_table
= sh_jump_table
;
1941 register int *R
= &(saved_state
.asregs
.regs
[0]);
1947 register int maskb
= ~((saved_state
.asregs
.msize
- 1) & ~0);
1948 register int maskw
= ~((saved_state
.asregs
.msize
- 1) & ~1);
1949 register int maskl
= ~((saved_state
.asregs
.msize
- 1) & ~3);
1950 register unsigned char *memory
;
1951 register unsigned int sbit
= ((unsigned int) 1 << 31);
1953 prev
= signal (SIGINT
, control_c
);
1954 prev_fpe
= signal (SIGFPE
, SIG_IGN
);
1957 saved_state
.asregs
.exception
= 0;
1959 memory
= saved_state
.asregs
.memory
;
1960 mem_end
= memory
+ saved_state
.asregs
.msize
;
1963 loop
= get_loop_bounds_ext (RS
, RE
, memory
, mem_end
, maskw
, endianw
);
1965 loop
= get_loop_bounds (RS
, RE
, memory
, mem_end
, maskw
, endianw
);
1967 insn_ptr
= PT2H (saved_state
.asregs
.pc
);
1968 CHECK_INSN_PTR (insn_ptr
);
1971 PR
= saved_state
.asregs
.sregs
.named
.pr
;
1973 /*T = GET_SR () & SR_MASK_T;*/
1974 prevlock
= saved_state
.asregs
.prevlock
;
1975 thislock
= saved_state
.asregs
.thislock
;
1976 doprofile
= saved_state
.asregs
.profile
;
1978 /* If profiling not enabled, disable it by asking for
1979 profiles infrequently. */
1984 if (step
&& insn_ptr
< saved_state
.asregs
.insn_end
)
1986 if (saved_state
.asregs
.exception
)
1987 /* This can happen if we've already been single-stepping and
1988 encountered a loop end. */
1989 saved_state
.asregs
.insn_end
= insn_ptr
;
1992 saved_state
.asregs
.exception
= SIGTRAP
;
1993 saved_state
.asregs
.insn_end
= insn_ptr
+ 2;
1997 while (insn_ptr
< saved_state
.asregs
.insn_end
)
1999 register unsigned int iword
= RIAT (insn_ptr
);
2000 register unsigned int ult
;
2001 register unsigned char *nip
= insn_ptr
+ 2;
2008 fprintf (stderr
, "PC: %08x, insn: %04x\n", PH2T (insn_ptr
), iword
);
2016 if (--pollcount
< 0)
2018 pollcount
= POLL_QUIT_INTERVAL
;
2019 if ((*callback
->poll_quit
) != NULL
2020 && (*callback
->poll_quit
) (callback
))
2027 prevlock
= thislock
;
2031 if (cycles
>= doprofile
)
2034 saved_state
.asregs
.cycles
+= doprofile
;
2035 cycles
-= doprofile
;
2036 if (saved_state
.asregs
.profile_hist
)
2038 int n
= PH2T (insn_ptr
) >> PROFILE_SHIFT
;
2041 int i
= saved_state
.asregs
.profile_hist
[n
];
2043 saved_state
.asregs
.profile_hist
[n
] = i
+ 1;
2050 if (saved_state
.asregs
.insn_end
== loop
.end
)
2052 saved_state
.asregs
.cregs
.named
.sr
+= SR_RC_INCREMENT
;
2054 insn_ptr
= loop
.start
;
2057 saved_state
.asregs
.insn_end
= mem_end
;
2058 loop
.end
= PT2H (0);
2063 if (saved_state
.asregs
.exception
== SIGILL
2064 || saved_state
.asregs
.exception
== SIGBUS
)
2068 /* Check for SIGBUS due to insn fetch. */
2069 else if (! saved_state
.asregs
.exception
)
2070 saved_state
.asregs
.exception
= SIGBUS
;
2072 saved_state
.asregs
.ticks
+= get_now () - tick_start
;
2073 saved_state
.asregs
.cycles
+= cycles
;
2074 saved_state
.asregs
.stalls
+= stalls
;
2075 saved_state
.asregs
.memstalls
+= memstalls
;
2076 saved_state
.asregs
.insts
+= insts
;
2077 saved_state
.asregs
.pc
= PH2T (insn_ptr
);
2079 saved_state
.asregs
.sregs
.named
.pr
= PR
;
2082 saved_state
.asregs
.prevlock
= prevlock
;
2083 saved_state
.asregs
.thislock
= thislock
;
2090 signal (SIGFPE
, prev_fpe
);
2091 signal (SIGINT
, prev
);
2095 sim_write (sd
, addr
, buffer
, size
)
2098 unsigned char *buffer
;
2105 for (i
= 0; i
< size
; i
++)
2107 saved_state
.asregs
.memory
[(MMASKB
& (addr
+ i
)) ^ endianb
] = buffer
[i
];
2113 sim_read (sd
, addr
, buffer
, size
)
2116 unsigned char *buffer
;
2123 for (i
= 0; i
< size
; i
++)
2125 buffer
[i
] = saved_state
.asregs
.memory
[(MMASKB
& (addr
+ i
)) ^ endianb
];
2130 static int gdb_bank_number
;
2140 sim_store_register (sd
, rn
, memory
, length
)
2143 unsigned char *memory
;
2149 val
= swap (* (int *) memory
);
2152 case SIM_SH_R0_REGNUM
: case SIM_SH_R1_REGNUM
: case SIM_SH_R2_REGNUM
:
2153 case SIM_SH_R3_REGNUM
: case SIM_SH_R4_REGNUM
: case SIM_SH_R5_REGNUM
:
2154 case SIM_SH_R6_REGNUM
: case SIM_SH_R7_REGNUM
: case SIM_SH_R8_REGNUM
:
2155 case SIM_SH_R9_REGNUM
: case SIM_SH_R10_REGNUM
: case SIM_SH_R11_REGNUM
:
2156 case SIM_SH_R12_REGNUM
: case SIM_SH_R13_REGNUM
: case SIM_SH_R14_REGNUM
:
2157 case SIM_SH_R15_REGNUM
:
2158 saved_state
.asregs
.regs
[rn
] = val
;
2160 case SIM_SH_PC_REGNUM
:
2161 saved_state
.asregs
.pc
= val
;
2163 case SIM_SH_PR_REGNUM
:
2166 case SIM_SH_GBR_REGNUM
:
2169 case SIM_SH_VBR_REGNUM
:
2172 case SIM_SH_MACH_REGNUM
:
2175 case SIM_SH_MACL_REGNUM
:
2178 case SIM_SH_SR_REGNUM
:
2181 case SIM_SH_FPUL_REGNUM
:
2184 case SIM_SH_FPSCR_REGNUM
:
2187 case SIM_SH_FR0_REGNUM
: case SIM_SH_FR1_REGNUM
: case SIM_SH_FR2_REGNUM
:
2188 case SIM_SH_FR3_REGNUM
: case SIM_SH_FR4_REGNUM
: case SIM_SH_FR5_REGNUM
:
2189 case SIM_SH_FR6_REGNUM
: case SIM_SH_FR7_REGNUM
: case SIM_SH_FR8_REGNUM
:
2190 case SIM_SH_FR9_REGNUM
: case SIM_SH_FR10_REGNUM
: case SIM_SH_FR11_REGNUM
:
2191 case SIM_SH_FR12_REGNUM
: case SIM_SH_FR13_REGNUM
: case SIM_SH_FR14_REGNUM
:
2192 case SIM_SH_FR15_REGNUM
:
2193 SET_FI (rn
- SIM_SH_FR0_REGNUM
, val
);
2195 case SIM_SH_DSR_REGNUM
:
2198 case SIM_SH_A0G_REGNUM
:
2201 case SIM_SH_A0_REGNUM
:
2204 case SIM_SH_A1G_REGNUM
:
2207 case SIM_SH_A1_REGNUM
:
2210 case SIM_SH_M0_REGNUM
:
2213 case SIM_SH_M1_REGNUM
:
2216 case SIM_SH_X0_REGNUM
:
2219 case SIM_SH_X1_REGNUM
:
2222 case SIM_SH_Y0_REGNUM
:
2225 case SIM_SH_Y1_REGNUM
:
2228 case SIM_SH_MOD_REGNUM
:
2231 case SIM_SH_RS_REGNUM
:
2234 case SIM_SH_RE_REGNUM
:
2237 case SIM_SH_SSR_REGNUM
:
2240 case SIM_SH_SPC_REGNUM
:
2243 /* The rn_bank idiosyncracies are not due to hardware differences, but to
2244 a weird aliasing naming scheme for sh3 / sh3e / sh4. */
2245 case SIM_SH_R0_BANK0_REGNUM
: case SIM_SH_R1_BANK0_REGNUM
:
2246 case SIM_SH_R2_BANK0_REGNUM
: case SIM_SH_R3_BANK0_REGNUM
:
2247 case SIM_SH_R4_BANK0_REGNUM
: case SIM_SH_R5_BANK0_REGNUM
:
2248 case SIM_SH_R6_BANK0_REGNUM
: case SIM_SH_R7_BANK0_REGNUM
:
2249 if (saved_state
.asregs
.bfd_mach
== bfd_mach_sh2a
)
2251 rn
-= SIM_SH_R0_BANK0_REGNUM
;
2252 saved_state
.asregs
.regstack
[gdb_bank_number
].regs
[rn
] = val
;
2256 Rn_BANK (rn
- SIM_SH_R0_BANK0_REGNUM
) = val
;
2258 saved_state
.asregs
.regs
[rn
- SIM_SH_R0_BANK0_REGNUM
] = val
;
2260 case SIM_SH_R0_BANK1_REGNUM
: case SIM_SH_R1_BANK1_REGNUM
:
2261 case SIM_SH_R2_BANK1_REGNUM
: case SIM_SH_R3_BANK1_REGNUM
:
2262 case SIM_SH_R4_BANK1_REGNUM
: case SIM_SH_R5_BANK1_REGNUM
:
2263 case SIM_SH_R6_BANK1_REGNUM
: case SIM_SH_R7_BANK1_REGNUM
:
2264 if (saved_state
.asregs
.bfd_mach
== bfd_mach_sh2a
)
2266 rn
-= SIM_SH_R0_BANK1_REGNUM
;
2267 saved_state
.asregs
.regstack
[gdb_bank_number
].regs
[rn
+ 8] = val
;
2271 saved_state
.asregs
.regs
[rn
- SIM_SH_R0_BANK1_REGNUM
] = val
;
2273 Rn_BANK (rn
- SIM_SH_R0_BANK1_REGNUM
) = val
;
2275 case SIM_SH_R0_BANK_REGNUM
: case SIM_SH_R1_BANK_REGNUM
:
2276 case SIM_SH_R2_BANK_REGNUM
: case SIM_SH_R3_BANK_REGNUM
:
2277 case SIM_SH_R4_BANK_REGNUM
: case SIM_SH_R5_BANK_REGNUM
:
2278 case SIM_SH_R6_BANK_REGNUM
: case SIM_SH_R7_BANK_REGNUM
:
2279 SET_Rn_BANK (rn
- SIM_SH_R0_BANK_REGNUM
, val
);
2281 case SIM_SH_TBR_REGNUM
:
2284 case SIM_SH_IBNR_REGNUM
:
2287 case SIM_SH_IBCR_REGNUM
:
2290 case SIM_SH_BANK_REGNUM
:
2291 /* This is a pseudo-register maintained just for gdb.
2292 It tells us what register bank gdb would like to read/write. */
2293 gdb_bank_number
= val
;
2295 case SIM_SH_BANK_MACL_REGNUM
:
2296 saved_state
.asregs
.regstack
[gdb_bank_number
].regs
[REGBANK_MACL
] = val
;
2298 case SIM_SH_BANK_GBR_REGNUM
:
2299 saved_state
.asregs
.regstack
[gdb_bank_number
].regs
[REGBANK_GBR
] = val
;
2301 case SIM_SH_BANK_PR_REGNUM
:
2302 saved_state
.asregs
.regstack
[gdb_bank_number
].regs
[REGBANK_PR
] = val
;
2304 case SIM_SH_BANK_IVN_REGNUM
:
2305 saved_state
.asregs
.regstack
[gdb_bank_number
].regs
[REGBANK_IVN
] = val
;
2307 case SIM_SH_BANK_MACH_REGNUM
:
2308 saved_state
.asregs
.regstack
[gdb_bank_number
].regs
[REGBANK_MACH
] = val
;
2317 sim_fetch_register (sd
, rn
, memory
, length
)
2320 unsigned char *memory
;
2328 case SIM_SH_R0_REGNUM
: case SIM_SH_R1_REGNUM
: case SIM_SH_R2_REGNUM
:
2329 case SIM_SH_R3_REGNUM
: case SIM_SH_R4_REGNUM
: case SIM_SH_R5_REGNUM
:
2330 case SIM_SH_R6_REGNUM
: case SIM_SH_R7_REGNUM
: case SIM_SH_R8_REGNUM
:
2331 case SIM_SH_R9_REGNUM
: case SIM_SH_R10_REGNUM
: case SIM_SH_R11_REGNUM
:
2332 case SIM_SH_R12_REGNUM
: case SIM_SH_R13_REGNUM
: case SIM_SH_R14_REGNUM
:
2333 case SIM_SH_R15_REGNUM
:
2334 val
= saved_state
.asregs
.regs
[rn
];
2336 case SIM_SH_PC_REGNUM
:
2337 val
= saved_state
.asregs
.pc
;
2339 case SIM_SH_PR_REGNUM
:
2342 case SIM_SH_GBR_REGNUM
:
2345 case SIM_SH_VBR_REGNUM
:
2348 case SIM_SH_MACH_REGNUM
:
2351 case SIM_SH_MACL_REGNUM
:
2354 case SIM_SH_SR_REGNUM
:
2357 case SIM_SH_FPUL_REGNUM
:
2360 case SIM_SH_FPSCR_REGNUM
:
2363 case SIM_SH_FR0_REGNUM
: case SIM_SH_FR1_REGNUM
: case SIM_SH_FR2_REGNUM
:
2364 case SIM_SH_FR3_REGNUM
: case SIM_SH_FR4_REGNUM
: case SIM_SH_FR5_REGNUM
:
2365 case SIM_SH_FR6_REGNUM
: case SIM_SH_FR7_REGNUM
: case SIM_SH_FR8_REGNUM
:
2366 case SIM_SH_FR9_REGNUM
: case SIM_SH_FR10_REGNUM
: case SIM_SH_FR11_REGNUM
:
2367 case SIM_SH_FR12_REGNUM
: case SIM_SH_FR13_REGNUM
: case SIM_SH_FR14_REGNUM
:
2368 case SIM_SH_FR15_REGNUM
:
2369 val
= FI (rn
- SIM_SH_FR0_REGNUM
);
2371 case SIM_SH_DSR_REGNUM
:
2374 case SIM_SH_A0G_REGNUM
:
2377 case SIM_SH_A0_REGNUM
:
2380 case SIM_SH_A1G_REGNUM
:
2383 case SIM_SH_A1_REGNUM
:
2386 case SIM_SH_M0_REGNUM
:
2389 case SIM_SH_M1_REGNUM
:
2392 case SIM_SH_X0_REGNUM
:
2395 case SIM_SH_X1_REGNUM
:
2398 case SIM_SH_Y0_REGNUM
:
2401 case SIM_SH_Y1_REGNUM
:
2404 case SIM_SH_MOD_REGNUM
:
2407 case SIM_SH_RS_REGNUM
:
2410 case SIM_SH_RE_REGNUM
:
2413 case SIM_SH_SSR_REGNUM
:
2416 case SIM_SH_SPC_REGNUM
:
2419 /* The rn_bank idiosyncracies are not due to hardware differences, but to
2420 a weird aliasing naming scheme for sh3 / sh3e / sh4. */
2421 case SIM_SH_R0_BANK0_REGNUM
: case SIM_SH_R1_BANK0_REGNUM
:
2422 case SIM_SH_R2_BANK0_REGNUM
: case SIM_SH_R3_BANK0_REGNUM
:
2423 case SIM_SH_R4_BANK0_REGNUM
: case SIM_SH_R5_BANK0_REGNUM
:
2424 case SIM_SH_R6_BANK0_REGNUM
: case SIM_SH_R7_BANK0_REGNUM
:
2425 if (saved_state
.asregs
.bfd_mach
== bfd_mach_sh2a
)
2427 rn
-= SIM_SH_R0_BANK0_REGNUM
;
2428 val
= saved_state
.asregs
.regstack
[gdb_bank_number
].regs
[rn
];
2431 val
= (SR_MD
&& SR_RB
2432 ? Rn_BANK (rn
- SIM_SH_R0_BANK0_REGNUM
)
2433 : saved_state
.asregs
.regs
[rn
- SIM_SH_R0_BANK0_REGNUM
]);
2435 case SIM_SH_R0_BANK1_REGNUM
: case SIM_SH_R1_BANK1_REGNUM
:
2436 case SIM_SH_R2_BANK1_REGNUM
: case SIM_SH_R3_BANK1_REGNUM
:
2437 case SIM_SH_R4_BANK1_REGNUM
: case SIM_SH_R5_BANK1_REGNUM
:
2438 case SIM_SH_R6_BANK1_REGNUM
: case SIM_SH_R7_BANK1_REGNUM
:
2439 if (saved_state
.asregs
.bfd_mach
== bfd_mach_sh2a
)
2441 rn
-= SIM_SH_R0_BANK1_REGNUM
;
2442 val
= saved_state
.asregs
.regstack
[gdb_bank_number
].regs
[rn
+ 8];
2445 val
= (! SR_MD
|| ! SR_RB
2446 ? Rn_BANK (rn
- SIM_SH_R0_BANK1_REGNUM
)
2447 : saved_state
.asregs
.regs
[rn
- SIM_SH_R0_BANK1_REGNUM
]);
2449 case SIM_SH_R0_BANK_REGNUM
: case SIM_SH_R1_BANK_REGNUM
:
2450 case SIM_SH_R2_BANK_REGNUM
: case SIM_SH_R3_BANK_REGNUM
:
2451 case SIM_SH_R4_BANK_REGNUM
: case SIM_SH_R5_BANK_REGNUM
:
2452 case SIM_SH_R6_BANK_REGNUM
: case SIM_SH_R7_BANK_REGNUM
:
2453 val
= Rn_BANK (rn
- SIM_SH_R0_BANK_REGNUM
);
2455 case SIM_SH_TBR_REGNUM
:
2458 case SIM_SH_IBNR_REGNUM
:
2461 case SIM_SH_IBCR_REGNUM
:
2464 case SIM_SH_BANK_REGNUM
:
2465 /* This is a pseudo-register maintained just for gdb.
2466 It tells us what register bank gdb would like to read/write. */
2467 val
= gdb_bank_number
;
2469 case SIM_SH_BANK_MACL_REGNUM
:
2470 val
= saved_state
.asregs
.regstack
[gdb_bank_number
].regs
[REGBANK_MACL
];
2472 case SIM_SH_BANK_GBR_REGNUM
:
2473 val
= saved_state
.asregs
.regstack
[gdb_bank_number
].regs
[REGBANK_GBR
];
2475 case SIM_SH_BANK_PR_REGNUM
:
2476 val
= saved_state
.asregs
.regstack
[gdb_bank_number
].regs
[REGBANK_PR
];
2478 case SIM_SH_BANK_IVN_REGNUM
:
2479 val
= saved_state
.asregs
.regstack
[gdb_bank_number
].regs
[REGBANK_IVN
];
2481 case SIM_SH_BANK_MACH_REGNUM
:
2482 val
= saved_state
.asregs
.regstack
[gdb_bank_number
].regs
[REGBANK_MACH
];
2487 * (int *) memory
= swap (val
);
2496 sim_resume (sd
, 0, 0);
2502 sim_stop_reason (sd
, reason
, sigrc
)
2504 enum sim_stop
*reason
;
2507 /* The SH simulator uses SIGQUIT to indicate that the program has
2508 exited, so we must check for it here and translate it to exit. */
2509 if (saved_state
.asregs
.exception
== SIGQUIT
)
2511 *reason
= sim_exited
;
2512 *sigrc
= saved_state
.asregs
.regs
[5];
2516 *reason
= sim_stopped
;
2517 *sigrc
= saved_state
.asregs
.exception
;
2522 sim_info (sd
, verbose
)
2527 (double) saved_state
.asregs
.ticks
/ (double) now_persec ();
2528 double virttime
= saved_state
.asregs
.cycles
/ 36.0e6
;
2530 callback
->printf_filtered (callback
, "\n\n# instructions executed %10d\n",
2531 saved_state
.asregs
.insts
);
2532 callback
->printf_filtered (callback
, "# cycles %10d\n",
2533 saved_state
.asregs
.cycles
);
2534 callback
->printf_filtered (callback
, "# pipeline stalls %10d\n",
2535 saved_state
.asregs
.stalls
);
2536 callback
->printf_filtered (callback
, "# misaligned load/store %10d\n",
2537 saved_state
.asregs
.memstalls
);
2538 callback
->printf_filtered (callback
, "# real time taken %10.4f\n",
2540 callback
->printf_filtered (callback
, "# virtual time taken %10.4f\n",
2542 callback
->printf_filtered (callback
, "# profiling size %10d\n",
2544 callback
->printf_filtered (callback
, "# profiling frequency %10d\n",
2545 saved_state
.asregs
.profile
);
2546 callback
->printf_filtered (callback
, "# profile maxpc %10x\n",
2547 (1 << sim_profile_size
) << PROFILE_SHIFT
);
2551 callback
->printf_filtered (callback
, "# cycles/second %10d\n",
2552 (int) (saved_state
.asregs
.cycles
/ timetaken
));
2553 callback
->printf_filtered (callback
, "# simulation ratio %10.4f\n",
2554 virttime
/ timetaken
);
2562 saved_state
.asregs
.profile
= n
;
2566 sim_set_profile_size (n
)
2569 sim_profile_size
= n
;
2573 sim_open (kind
, cb
, abfd
, argv
)
2594 for (p
= argv
+ 1; *p
!= NULL
; ++p
)
2596 if (strcmp (*p
, "-E") == 0)
2601 /* FIXME: This doesn't use stderr, but then the rest of the
2602 file doesn't either. */
2603 callback
->printf_filtered (callback
, "Missing argument to `-E'.\n");
2606 target_little_endian
= strcmp (*p
, "big") != 0;
2609 else if (isdigit (**p
))
2610 parse_and_set_memory_size (*p
);
2613 if (abfd
!= NULL
&& ! endian_set
)
2614 target_little_endian
= ! bfd_big_endian (abfd
);
2619 for (i
= 4; (i
-= 2) >= 0; )
2620 mem_word
.s
[i
>> 1] = i
;
2621 global_endianw
= mem_word
.i
>> (target_little_endian
? 0 : 16) & 0xffff;
2623 for (i
= 4; --i
>= 0; )
2625 endianb
= mem_word
.i
>> (target_little_endian
? 0 : 24) & 0xff;
2627 /* fudge our descriptor for now */
2628 return (SIM_DESC
) 1;
2632 parse_and_set_memory_size (str
)
2637 n
= strtol (str
, NULL
, 10);
2638 if (n
> 0 && n
<= 24)
2639 sim_memory_size
= n
;
2641 callback
->printf_filtered (callback
, "Bad memory size %d; must be 1 to 24, inclusive\n", n
);
2645 sim_close (sd
, quitting
)
2653 sim_load (sd
, prog
, abfd
, from_tty
)
2659 extern bfd
*sim_load_file (); /* ??? Don't know where this should live. */
2662 prog_bfd
= sim_load_file (sd
, myname
, callback
, prog
, abfd
,
2663 sim_kind
== SIM_OPEN_DEBUG
,
2666 /* Set the bfd machine type. */
2668 saved_state
.asregs
.bfd_mach
= bfd_get_mach (prog_bfd
);
2670 saved_state
.asregs
.bfd_mach
= bfd_get_mach (abfd
);
2672 saved_state
.asregs
.bfd_mach
= 0;
2674 if (prog_bfd
== NULL
)
2677 bfd_close (prog_bfd
);
2682 sim_create_inferior (sd
, prog_bfd
, argv
, env
)
2684 struct bfd
*prog_bfd
;
2688 /* Clear the registers. */
2689 memset (&saved_state
, 0,
2690 (char*) &saved_state
.asregs
.end_of_registers
- (char*) &saved_state
);
2693 if (prog_bfd
!= NULL
)
2694 saved_state
.asregs
.pc
= bfd_get_start_address (prog_bfd
);
2696 /* Set the bfd machine type. */
2697 if (prog_bfd
!= NULL
)
2698 saved_state
.asregs
.bfd_mach
= bfd_get_mach (prog_bfd
);
2700 /* Record the program's arguments. */
2707 sim_do_command (sd
, cmd
)
2711 char *sms_cmd
= "set-memory-size";
2714 if (cmd
== NULL
|| *cmd
== '\0')
2719 cmdsize
= strlen (sms_cmd
);
2720 if (strncmp (cmd
, sms_cmd
, cmdsize
) == 0
2721 && strchr (" \t", cmd
[cmdsize
]) != NULL
)
2723 parse_and_set_memory_size (cmd
+ cmdsize
+ 1);
2725 else if (strcmp (cmd
, "help") == 0)
2727 (callback
->printf_filtered
) (callback
,
2728 "List of SH simulator commands:\n\n");
2729 (callback
->printf_filtered
) (callback
, "set-memory-size <n> -- Set the number of address bits to use\n");
2730 (callback
->printf_filtered
) (callback
, "\n");
2734 (callback
->printf_filtered
) (callback
, "Error: \"%s\" is not a valid SH simulator command.\n", cmd
);
2739 sim_set_callbacks (p
)