1 /* Simulator for the Hitachi 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 char 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
76 /* System registers. For sh-dsp this also includes A0 / X0 / X1 / Y0 / Y1
77 which are located in fregs, i.e. strictly speaking, these are
78 out-of-bounds accesses of sregs.i . This wart of the code could be
79 fixed by making fregs part of sregs, and including pc too - to avoid
80 alignment repercussions - but this would cause very onerous union /
81 structure nesting, which would only be managable with anonymous
82 unions and structs. */
91 int fpul
; /* A1 for sh-dsp - but only for movs etc. */
92 int fpscr
; /* dsr for sh-dsp */
106 /* Control registers; on the SH4, ldc / stc is privileged, except when
127 unsigned char *insn_end
;
139 int end_of_registers
;
142 #define PROFILE_FREQ 1
143 #define PROFILE_SHIFT 2
145 unsigned short *profile_hist
;
146 unsigned char *memory
;
147 int xyram_select
, xram_start
, yram_start
;
150 unsigned char *xmem_offset
;
151 unsigned char *ymem_offset
;
157 saved_state_type saved_state
;
159 struct loop_bounds
{ unsigned char *start
, *end
; };
161 /* These variables are at file scope so that functions other than
162 sim_resume can use the fetch/store macros */
164 static int target_little_endian
;
165 static int global_endianw
, endianb
;
166 static int target_dsp
;
167 static int host_little_endian
;
168 static char **prog_argv
;
171 static int maskw
= 0;
174 static SIM_OPEN_KIND sim_kind
;
178 /* Short hand definitions of the registers */
180 #define SBIT(x) ((x)&sbit)
181 #define R0 saved_state.asregs.regs[0]
182 #define Rn saved_state.asregs.regs[n]
183 #define Rm saved_state.asregs.regs[m]
184 #define UR0 (unsigned int)(saved_state.asregs.regs[0])
185 #define UR (unsigned int)R
186 #define UR (unsigned int)R
187 #define SR0 saved_state.asregs.regs[0]
188 #define CREG(n) (saved_state.asregs.cregs.i[(n)])
189 #define GBR saved_state.asregs.cregs.named.gbr
190 #define VBR saved_state.asregs.cregs.named.vbr
191 #define SSR saved_state.asregs.cregs.named.ssr
192 #define SPC saved_state.asregs.cregs.named.spc
193 #define SREG(n) (saved_state.asregs.sregs.i[(n)])
194 #define MACH saved_state.asregs.sregs.named.mach
195 #define MACL saved_state.asregs.sregs.named.macl
196 #define PR saved_state.asregs.sregs.named.pr
197 #define FPUL saved_state.asregs.sregs.named.fpul
203 /* Alternate bank of registers r0-r7 */
205 /* Note: code controling SR handles flips between BANK0 and BANK1 */
206 #define Rn_BANK(n) (saved_state.asregs.cregs.named.bank[(n)])
207 #define SET_Rn_BANK(n, EXP) do { saved_state.asregs.cregs.named.bank[(n)] = (EXP); } while (0)
212 #define SR_MASK_DMY (1 << 11)
213 #define SR_MASK_DMX (1 << 10)
214 #define SR_MASK_M (1 << 9)
215 #define SR_MASK_Q (1 << 8)
216 #define SR_MASK_I (0xf << 4)
217 #define SR_MASK_S (1 << 1)
218 #define SR_MASK_T (1 << 0)
220 #define SR_MASK_BL (1 << 28)
221 #define SR_MASK_RB (1 << 29)
222 #define SR_MASK_MD (1 << 30)
223 #define SR_MASK_RC 0x0fff0000
224 #define SR_RC_INCREMENT -0x00010000
226 #define M ((saved_state.asregs.cregs.named.sr & SR_MASK_M) != 0)
227 #define Q ((saved_state.asregs.cregs.named.sr & SR_MASK_Q) != 0)
228 #define S ((saved_state.asregs.cregs.named.sr & SR_MASK_S) != 0)
229 #define T ((saved_state.asregs.cregs.named.sr & SR_MASK_T) != 0)
231 #define SR_BL ((saved_state.asregs.cregs.named.sr & SR_MASK_BL) != 0)
232 #define SR_RB ((saved_state.asregs.cregs.named.sr & SR_MASK_RB) != 0)
233 #define SR_MD ((saved_state.asregs.cregs.named.sr & SR_MASK_MD) != 0)
234 #define SR_DMY ((saved_state.asregs.cregs.named.sr & SR_MASK_DMY) != 0)
235 #define SR_DMX ((saved_state.asregs.cregs.named.sr & SR_MASK_DMX) != 0)
236 #define SR_RC ((saved_state.asregs.cregs.named.sr & SR_MASK_RC))
238 /* Note: don't use this for privileged bits */
239 #define SET_SR_BIT(EXP, BIT) \
242 saved_state.asregs.cregs.named.sr |= (BIT); \
244 saved_state.asregs.cregs.named.sr &= ~(BIT); \
247 #define SET_SR_M(EXP) SET_SR_BIT ((EXP), SR_MASK_M)
248 #define SET_SR_Q(EXP) SET_SR_BIT ((EXP), SR_MASK_Q)
249 #define SET_SR_S(EXP) SET_SR_BIT ((EXP), SR_MASK_S)
250 #define SET_SR_T(EXP) SET_SR_BIT ((EXP), SR_MASK_T)
252 /* stc currently relies on being able to read SR without modifications. */
253 #define GET_SR() (saved_state.asregs.cregs.named.sr - 0)
255 #define SET_SR(x) set_sr (x)
258 (saved_state.asregs.cregs.named.sr \
259 = saved_state.asregs.cregs.named.sr & 0xf000ffff | ((x) & 0xfff) << 16)
261 /* Manipulate FPSCR */
263 #define FPSCR_MASK_FR (1 << 21)
264 #define FPSCR_MASK_SZ (1 << 20)
265 #define FPSCR_MASK_PR (1 << 19)
267 #define FPSCR_FR ((GET_FPSCR() & FPSCR_MASK_FR) != 0)
268 #define FPSCR_SZ ((GET_FPSCR() & FPSCR_MASK_SZ) != 0)
269 #define FPSCR_PR ((GET_FPSCR() & FPSCR_MASK_PR) != 0)
271 /* Count the number of arguments in an argv. */
273 count_argc (char **argv
)
280 for (i
= 0; argv
[i
] != NULL
; ++i
)
289 int old
= saved_state
.asregs
.sregs
.named
.fpscr
;
290 saved_state
.asregs
.sregs
.named
.fpscr
= (x
);
291 /* swap the floating point register banks */
292 if ((saved_state
.asregs
.sregs
.named
.fpscr
^ old
) & FPSCR_MASK_FR
293 /* Ignore bit change if simulating sh-dsp. */
296 union fregs_u tmpf
= saved_state
.asregs
.fregs
[0];
297 saved_state
.asregs
.fregs
[0] = saved_state
.asregs
.fregs
[1];
298 saved_state
.asregs
.fregs
[1] = tmpf
;
302 /* sts relies on being able to read fpscr directly. */
303 #define GET_FPSCR() (saved_state.asregs.sregs.named.fpscr)
304 #define SET_FPSCR(x) \
309 #define DSR (saved_state.asregs.sregs.named.fpscr)
317 #define RAISE_EXCEPTION(x) \
318 (saved_state.asregs.exception = x, saved_state.asregs.insn_end = 0)
320 /* This function exists mainly for the purpose of setting a breakpoint to
321 catch simulated bus errors when running the simulator under GDB. */
333 raise_exception (SIGBUS
);
336 #define PROCESS_SPECIAL_ADDRESS(addr, endian, ptr, bits_written, \
337 forbidden_addr_bits, data, retval) \
339 if (addr & forbidden_addr_bits) \
344 else if ((addr & saved_state.asregs.xyram_select) \
345 == saved_state.asregs.xram_start) \
346 ptr = (void *) &saved_state.asregs.xmem_offset[addr ^ endian]; \
347 else if ((addr & saved_state.asregs.xyram_select) \
348 == saved_state.asregs.yram_start) \
349 ptr = (void *) &saved_state.asregs.ymem_offset[addr ^ endian]; \
350 else if ((unsigned) addr >> 24 == 0xf0 \
351 && bits_written == 32 && (data & 1) == 0) \
352 /* This invalidates (if not associative) or might invalidate \
353 (if associative) an instruction cache line. This is used for \
354 trampolines. Since we don't simulate the cache, this is a no-op \
355 as far as the simulator is concerned. */ \
359 if (bits_written == 8 && addr > 0x5000000) \
360 IOMEM (addr, 1, data); \
361 /* We can't do anything useful with the other stuff, so fail. */ \
367 /* FIXME: sim_resume should be renamed to sim_engine_run. sim_resume
368 being implemented by ../common/sim_resume.c and the below should
369 make a call to sim_engine_halt */
371 #define BUSERROR(addr, mask) ((addr) & (mask))
373 #define WRITE_BUSERROR(addr, mask, data, addr_func) \
378 addr_func (addr, data); \
384 #define READ_BUSERROR(addr, mask, addr_func) \
388 return addr_func (addr); \
392 /* Define this to enable register lifetime checking.
393 The compiler generates "add #0,rn" insns to mark registers as invalid,
394 the simulator uses this info to call fail if it finds a ref to an invalid
395 register before a def
402 #define CREF(x) if(!valid[x]) fail();
403 #define CDEF(x) valid[x] = 1;
404 #define UNDEF(x) valid[x] = 0;
411 static void parse_and_set_memory_size
PARAMS ((char *str
));
412 static int IOMEM
PARAMS ((int addr
, int write
, int value
));
413 static struct loop_bounds get_loop_bounds
PARAMS((int, int, unsigned char *,
414 unsigned char *, int, int));
415 static void process_wlat_addr
PARAMS((int, int));
416 static void process_wwat_addr
PARAMS((int, int));
417 static void process_wbat_addr
PARAMS((int, int));
418 static int process_rlat_addr
PARAMS((int));
419 static int process_rwat_addr
PARAMS((int));
420 static int process_rbat_addr
PARAMS((int));
421 static void INLINE wlat_fast
PARAMS ((unsigned char *, int, int, int));
422 static void INLINE wwat_fast
PARAMS ((unsigned char *, int, int, int, int));
423 static void INLINE wbat_fast
PARAMS ((unsigned char *, int, int, int));
424 static int INLINE rlat_fast
PARAMS ((unsigned char *, int, int));
425 static int INLINE rwat_fast
PARAMS ((unsigned char *, int, int, int));
426 static int INLINE rbat_fast
PARAMS ((unsigned char *, int, int));
428 static host_callback
*callback
;
432 /* Floating point registers */
434 #define DR(n) (get_dr (n))
440 if (host_little_endian
)
447 dr
.i
[1] = saved_state
.asregs
.fregs
[0].i
[n
+ 0];
448 dr
.i
[0] = saved_state
.asregs
.fregs
[0].i
[n
+ 1];
452 return (saved_state
.asregs
.fregs
[0].d
[n
>> 1]);
455 #define SET_DR(n, EXP) set_dr ((n), (EXP))
462 if (host_little_endian
)
470 saved_state
.asregs
.fregs
[0].i
[n
+ 0] = dr
.i
[1];
471 saved_state
.asregs
.fregs
[0].i
[n
+ 1] = dr
.i
[0];
474 saved_state
.asregs
.fregs
[0].d
[n
>> 1] = exp
;
477 #define SET_FI(n,EXP) (saved_state.asregs.fregs[0].i[(n)] = (EXP))
478 #define FI(n) (saved_state.asregs.fregs[0].i[(n)])
480 #define FR(n) (saved_state.asregs.fregs[0].f[(n)])
481 #define SET_FR(n,EXP) (saved_state.asregs.fregs[0].f[(n)] = (EXP))
483 #define XD_TO_XF(n) ((((n) & 1) << 5) | ((n) & 0x1e))
484 #define XF(n) (saved_state.asregs.fregs[(n) >> 5].i[(n) & 0x1f])
485 #define SET_XF(n,EXP) (saved_state.asregs.fregs[(n) >> 5].i[(n) & 0x1f] = (EXP))
487 #define RS saved_state.asregs.cregs.named.rs
488 #define RE saved_state.asregs.cregs.named.re
489 #define MOD (saved_state.asregs.cregs.named.mod)
492 MOD_ME = (unsigned) MOD >> 16 | (SR_DMY ? ~0xffff : (SR_DMX ? 0 : 0x10000)), \
493 MOD_DELTA = (MOD & 0xffff) - ((unsigned) MOD >> 16))
495 #define DSP_R(n) saved_state.asregs.sregs.i[(n)]
496 #define DSP_GRD(n) DSP_R ((n) + 8)
497 #define GET_DSP_GRD(n) ((n | 2) == 7 ? SEXT (DSP_GRD (n)) : SIGN32 (DSP_R (n)))
502 #define Y0 DSP_R (10)
503 #define Y1 DSP_R (11)
504 #define M0 DSP_R (12)
505 #define A1G DSP_R (13)
506 #define M1 DSP_R (14)
507 #define A0G DSP_R (15)
508 /* DSP_R (16) / DSP_GRD (16) are used as a fake destination for pcmp. */
509 #define MOD_ME DSP_GRD (17)
510 #define MOD_DELTA DSP_GRD (18)
512 #define FP_OP(n, OP, m) \
516 if (((n) & 1) || ((m) & 1)) \
517 RAISE_EXCEPTION (SIGILL); \
519 SET_DR(n, (DR(n) OP DR(m))); \
522 SET_FR(n, (FR(n) OP FR(m))); \
525 #define FP_UNARY(n, OP) \
530 RAISE_EXCEPTION (SIGILL); \
532 SET_DR(n, (OP (DR(n)))); \
535 SET_FR(n, (OP (FR(n)))); \
538 #define FP_CMP(n, OP, m) \
542 if (((n) & 1) || ((m) & 1)) \
543 RAISE_EXCEPTION (SIGILL); \
545 SET_SR_T (DR(n) OP DR(m)); \
548 SET_SR_T (FR(n) OP FR(m)); \
555 /* do we need to swap banks */
556 int old_gpr
= SR_MD
&& SR_RB
;
557 int new_gpr
= (new_sr
& SR_MASK_MD
) && (new_sr
& SR_MASK_RB
);
558 if (old_gpr
!= new_gpr
)
561 for (i
= 0; i
< 8; i
++)
563 tmp
= saved_state
.asregs
.cregs
.named
.bank
[i
];
564 saved_state
.asregs
.cregs
.named
.bank
[i
] = saved_state
.asregs
.regs
[i
];
565 saved_state
.asregs
.regs
[i
] = tmp
;
568 saved_state
.asregs
.cregs
.named
.sr
= new_sr
;
573 wlat_fast (memory
, x
, value
, maskl
)
574 unsigned char *memory
;
577 unsigned int *p
= (unsigned int *)(memory
+ x
);
578 WRITE_BUSERROR (x
, maskl
, v
, process_wlat_addr
);
583 wwat_fast (memory
, x
, value
, maskw
, endianw
)
584 unsigned char *memory
;
587 unsigned short *p
= (unsigned short *)(memory
+ (x
^ endianw
));
588 WRITE_BUSERROR (x
, maskw
, v
, process_wwat_addr
);
593 wbat_fast (memory
, x
, value
, maskb
)
594 unsigned char *memory
;
596 unsigned char *p
= memory
+ (x
^ endianb
);
597 WRITE_BUSERROR (x
, maskb
, value
, process_wbat_addr
);
605 rlat_fast (memory
, x
, maskl
)
606 unsigned char *memory
;
608 unsigned int *p
= (unsigned int *)(memory
+ x
);
609 READ_BUSERROR (x
, maskl
, process_rlat_addr
);
615 rwat_fast (memory
, x
, maskw
, endianw
)
616 unsigned char *memory
;
617 int x
, maskw
, endianw
;
619 unsigned short *p
= (unsigned short *)(memory
+ (x
^ endianw
));
620 READ_BUSERROR (x
, maskw
, process_rwat_addr
);
626 riat_fast (insn_ptr
, endianw
)
627 unsigned char *insn_ptr
;
629 unsigned short *p
= (unsigned short *)((size_t) insn_ptr
^ endianw
);
635 rbat_fast (memory
, x
, maskb
)
636 unsigned char *memory
;
638 unsigned char *p
= memory
+ (x
^ endianb
);
639 READ_BUSERROR (x
, maskb
, process_rbat_addr
);
644 #define RWAT(x) (rwat_fast (memory, x, maskw, endianw))
645 #define RLAT(x) (rlat_fast (memory, x, maskl))
646 #define RBAT(x) (rbat_fast (memory, x, maskb))
647 #define RIAT(p) (riat_fast ((p), endianw))
648 #define WWAT(x,v) (wwat_fast (memory, x, v, maskw, endianw))
649 #define WLAT(x,v) (wlat_fast (memory, x, v, maskl))
650 #define WBAT(x,v) (wbat_fast (memory, x, v, maskb))
652 #define RUWAT(x) (RWAT(x) & 0xffff)
653 #define RSWAT(x) ((short)(RWAT(x)))
654 #define RSBAT(x) (SEXT(RBAT(x)))
656 #define RDAT(x, n) (do_rdat (memory, (x), (n), (maskl)))
658 do_rdat (memory
, x
, n
, maskl
)
668 f0
= rlat_fast (memory
, x
+ 0, maskl
);
669 f1
= rlat_fast (memory
, x
+ 4, maskl
);
670 saved_state
.asregs
.fregs
[i
].i
[(j
+ 0)] = f0
;
671 saved_state
.asregs
.fregs
[i
].i
[(j
+ 1)] = f1
;
675 #define WDAT(x, n) (do_wdat (memory, (x), (n), (maskl)))
677 do_wdat (memory
, x
, n
, maskl
)
687 f0
= saved_state
.asregs
.fregs
[i
].i
[(j
+ 0)];
688 f1
= saved_state
.asregs
.fregs
[i
].i
[(j
+ 1)];
689 wlat_fast (memory
, (x
+ 0), f0
, maskl
);
690 wlat_fast (memory
, (x
+ 4), f1
, maskl
);
695 process_wlat_addr (addr
, value
)
701 PROCESS_SPECIAL_ADDRESS (addr
, endianb
, ptr
, 32, 3, value
, );
706 process_wwat_addr (addr
, value
)
712 PROCESS_SPECIAL_ADDRESS (addr
, endianb
, ptr
, 16, 1, value
, );
717 process_wbat_addr (addr
, value
)
723 PROCESS_SPECIAL_ADDRESS (addr
, endianb
, ptr
, 8, 0, value
, );
728 process_rlat_addr (addr
)
733 PROCESS_SPECIAL_ADDRESS (addr
, endianb
, ptr
, -32, 3, -1, 0);
738 process_rwat_addr (addr
)
743 PROCESS_SPECIAL_ADDRESS (addr
, endianb
, ptr
, -16, 1, -1, 0);
748 process_rbat_addr (addr
)
753 PROCESS_SPECIAL_ADDRESS (addr
, endianb
, ptr
, -8, 0, -1, 0);
757 #define SEXT(x) (((x & 0xff) ^ (~0x7f))+0x80)
758 #define SEXT12(x) (((x & 0xfff) ^ 0x800) - 0x800)
759 #define SEXTW(y) ((int)((short)y))
761 #define SEXT32(x) ((int)((x & 0xffffffff) ^ 0x80000000U) - 0x7fffffff - 1)
763 #define SEXT32(x) ((int)(x))
765 #define SIGN32(x) (SEXT32 (x) >> 31)
767 /* convert pointer from target to host value. */
768 #define PT2H(x) ((x) + memory)
769 /* convert pointer from host to target value. */
770 #define PH2T(x) ((x) - memory)
772 #define SKIP_INSN(p) ((p) += ((RIAT (p) & 0xfc00) == 0xf800 ? 4 : 2))
774 #define SET_NIP(x) nip = (x); CHECK_INSN_PTR (nip);
776 #define Delay_Slot(TEMPPC) iword = RIAT (TEMPPC); goto top;
778 #define CHECK_INSN_PTR(p) \
780 if (saved_state.asregs.exception || PH2T (p) & maskw) \
781 saved_state.asregs.insn_end = 0; \
782 else if (p < loop.end) \
783 saved_state.asregs.insn_end = loop.end; \
785 saved_state.asregs.insn_end = mem_end; \
798 do { memstalls += ((((int) PC & 3) != 0) ? (n) : ((n) - 1)); } while (0)
800 #define L(x) thislock = x;
801 #define TL(x) if ((x) == prevlock) stalls++;
802 #define TB(x,y) if ((x) == prevlock || (y)==prevlock) stalls++;
806 #if defined(__GO32__) || defined(_WIN32)
807 int sim_memory_size
= 19;
809 int sim_memory_size
= 24;
812 static int sim_profile_size
= 17;
818 #define SMR1 (0x05FFFEC8) /* Channel 1 serial mode register */
819 #define BRR1 (0x05FFFEC9) /* Channel 1 bit rate register */
820 #define SCR1 (0x05FFFECA) /* Channel 1 serial control register */
821 #define TDR1 (0x05FFFECB) /* Channel 1 transmit data register */
822 #define SSR1 (0x05FFFECC) /* Channel 1 serial status register */
823 #define RDR1 (0x05FFFECD) /* Channel 1 receive data register */
825 #define SCI_RDRF 0x40 /* Recieve data register full */
826 #define SCI_TDRE 0x80 /* Transmit data register empty */
829 IOMEM (addr
, write
, value
)
861 return time ((long *) 0);
870 static FILE *profile_file
;
872 static unsigned INLINE
877 n
= (n
<< 24 | (n
& 0xff00) << 8
878 | (n
& 0xff0000) >> 8 | (n
& 0xff000000) >> 24);
882 static unsigned short INLINE
887 n
= n
<< 8 | (n
& 0xff00) >> 8;
897 union { char b
[4]; int n
; } u
;
899 fwrite (u
.b
, 4, 1, profile_file
);
907 union { char b
[4]; int n
; } u
;
909 fwrite (u
.b
, 2, 1, profile_file
);
912 /* Turn a pointer in a register into a pointer into real memory. */
918 return (char *) (x
+ saved_state
.asregs
.memory
);
925 unsigned char *memory
= saved_state
.asregs
.memory
;
927 int endian
= endianb
;
932 for (end
= str
; memory
[end
^ endian
]; end
++) ;
943 if (! endianb
|| ! len
)
945 start
= (int *) ptr (str
& ~3);
946 end
= (int *) ptr (str
+ len
);
950 *start
= (old
<< 24 | (old
& 0xff00) << 8
951 | (old
& 0xff0000) >> 8 | (old
& 0xff000000) >> 24);
957 /* Simulate a monitor trap, put the result into r0 and errno into r1 */
960 trap (i
, regs
, memory
, maskl
, maskw
, endianw
)
963 unsigned char *memory
;
968 printf ("%c", regs
[0]);
971 raise_exception (SIGQUIT
);
973 case 3: /* FIXME: for backwards compat, should be removed */
983 #if !defined(__GO32__) && !defined(_WIN32)
987 /* This would work only if endianness matched between host and target.
988 Besides, it's quite dangerous. */
991 regs
[0] = execve (ptr (regs
[5]), (char **)ptr (regs
[6]), (char **)ptr (regs
[7]));
994 regs
[0] = execve (ptr (regs
[5]),(char **) ptr (regs
[6]), 0);
999 regs
[0] = (BUSERROR (regs
[5], maskl
)
1001 : pipe ((int *) ptr (regs
[5])));
1006 regs
[0] = wait (ptr (regs
[5]));
1008 #endif /* !defined(__GO32__) && !defined(_WIN32) */
1011 strnswap (regs
[6], regs
[7]);
1013 = callback
->read (callback
, regs
[5], ptr (regs
[6]), regs
[7]);
1014 strnswap (regs
[6], regs
[7]);
1017 strnswap (regs
[6], regs
[7]);
1019 regs
[0] = (int)callback
->write_stdout (callback
, ptr(regs
[6]), regs
[7]);
1021 regs
[0] = (int)callback
->write (callback
, regs
[5], ptr (regs
[6]), regs
[7]);
1022 strnswap (regs
[6], regs
[7]);
1025 regs
[0] = callback
->lseek (callback
,regs
[5], regs
[6], regs
[7]);
1028 regs
[0] = callback
->close (callback
,regs
[5]);
1032 int len
= strswaplen (regs
[5]);
1033 strnswap (regs
[5], len
);
1034 regs
[0] = callback
->open (callback
,ptr (regs
[5]), regs
[6]);
1035 strnswap (regs
[5], len
);
1039 /* EXIT - caller can look in r5 to work out the reason */
1040 raise_exception (SIGQUIT
);
1044 case SYS_stat
: /* added at hmsi */
1045 /* stat system call */
1047 struct stat host_stat
;
1049 int len
= strswaplen (regs
[5]);
1051 strnswap (regs
[5], len
);
1052 regs
[0] = stat (ptr (regs
[5]), &host_stat
);
1053 strnswap (regs
[5], len
);
1057 WWAT (buf
, host_stat
.st_dev
);
1059 WWAT (buf
, host_stat
.st_ino
);
1061 WLAT (buf
, host_stat
.st_mode
);
1063 WWAT (buf
, host_stat
.st_nlink
);
1065 WWAT (buf
, host_stat
.st_uid
);
1067 WWAT (buf
, host_stat
.st_gid
);
1069 WWAT (buf
, host_stat
.st_rdev
);
1071 WLAT (buf
, host_stat
.st_size
);
1073 WLAT (buf
, host_stat
.st_atime
);
1077 WLAT (buf
, host_stat
.st_mtime
);
1081 WLAT (buf
, host_stat
.st_ctime
);
1095 int len
= strswaplen (regs
[5]);
1097 strnswap (regs
[5], len
);
1098 regs
[0] = chown (ptr (regs
[5]), regs
[6], regs
[7]);
1099 strnswap (regs
[5], len
);
1105 int len
= strswaplen (regs
[5]);
1107 strnswap (regs
[5], len
);
1108 regs
[0] = chmod (ptr (regs
[5]), regs
[6]);
1109 strnswap (regs
[5], len
);
1114 /* Cast the second argument to void *, to avoid type mismatch
1115 if a prototype is present. */
1116 int len
= strswaplen (regs
[5]);
1118 strnswap (regs
[5], len
);
1119 regs
[0] = utime (ptr (regs
[5]), (void *) ptr (regs
[6]));
1120 strnswap (regs
[5], len
);
1124 regs
[0] = count_argc (prog_argv
);
1127 if (regs
[5] < count_argc (prog_argv
))
1128 regs
[0] = strlen (prog_argv
[regs
[5]]);
1133 if (regs
[5] < count_argc (prog_argv
))
1135 /* Include the termination byte. */
1136 int i
= strlen (prog_argv
[regs
[5]]) + 1;
1137 regs
[0] = sim_write (0, regs
[6], prog_argv
[regs
[5]], i
);
1143 regs
[0] = get_now ();
1149 regs
[1] = callback
->get_errno (callback
);
1156 raise_exception (SIGTRAP
);
1163 control_c (sig
, code
, scp
, addr
)
1169 raise_exception (SIGINT
);
1173 div1 (R
, iRn2
, iRn1
/*, T*/)
1180 unsigned char old_q
, tmp1
;
1183 SET_SR_Q ((unsigned char) ((0x80000000 & R
[iRn1
]) != 0));
1185 R
[iRn1
] |= (unsigned long) T
;
1195 tmp1
= (R
[iRn1
] > tmp0
);
1202 SET_SR_Q ((unsigned char) (tmp1
== 0));
1209 tmp1
= (R
[iRn1
] < tmp0
);
1213 SET_SR_Q ((unsigned char) (tmp1
== 0));
1228 tmp1
= (R
[iRn1
] < tmp0
);
1235 SET_SR_Q ((unsigned char) (tmp1
== 0));
1242 tmp1
= (R
[iRn1
] > tmp0
);
1246 SET_SR_Q ((unsigned char) (tmp1
== 0));
1267 unsigned long RnL
, RnH
;
1268 unsigned long RmL
, RmH
;
1269 unsigned long temp0
, temp1
, temp2
, temp3
;
1270 unsigned long Res2
, Res1
, Res0
;
1273 RnH
= (rn
>> 16) & 0xffff;
1275 RmH
= (rm
>> 16) & 0xffff;
1281 Res1
= temp1
+ temp2
;
1284 temp1
= (Res1
<< 16) & 0xffff0000;
1285 Res0
= temp0
+ temp1
;
1288 Res2
+= ((Res1
>> 16) & 0xffff) + temp3
;
1292 if (rn
& 0x80000000)
1294 if (rm
& 0x80000000)
1303 macw (regs
, memory
, n
, m
, endianw
)
1305 unsigned char *memory
;
1310 long prod
, macl
, sum
;
1312 tempm
=RSWAT(regs
[m
]); regs
[m
]+=2;
1313 tempn
=RSWAT(regs
[n
]); regs
[n
]+=2;
1316 prod
= (long)(short) tempm
* (long)(short) tempn
;
1320 if ((~(prod
^ macl
) & (sum
^ prod
)) < 0)
1322 /* MACH's lsb is a sticky overflow bit. */
1324 /* Store the smallest negative number in MACL if prod is
1325 negative, and the largest positive number otherwise. */
1326 sum
= 0x7fffffff + (prod
< 0);
1332 /* Add to MACH the sign extended product, and carry from low sum. */
1333 mach
= MACH
+ (-(prod
< 0)) + ((unsigned long) sum
< prod
);
1334 /* Sign extend at 10:th bit in MACH. */
1335 MACH
= (mach
& 0x1ff) | -(mach
& 0x200);
1340 static struct loop_bounds
1341 get_loop_bounds (rs
, re
, memory
, mem_end
, maskw
, endianw
)
1343 unsigned char *memory
, *mem_end
;
1346 struct loop_bounds loop
;
1352 loop
.start
= PT2H (RE
- 4);
1353 SKIP_INSN (loop
.start
);
1354 loop
.end
= loop
.start
;
1356 SKIP_INSN (loop
.end
);
1358 SKIP_INSN (loop
.end
);
1359 SKIP_INSN (loop
.end
);
1363 loop
.start
= PT2H (RS
);
1364 loop
.end
= PT2H (RE
- 4);
1365 SKIP_INSN (loop
.end
);
1366 SKIP_INSN (loop
.end
);
1367 SKIP_INSN (loop
.end
);
1368 SKIP_INSN (loop
.end
);
1370 if (loop
.end
>= mem_end
)
1371 loop
.end
= PT2H (0);
1374 loop
.end
= PT2H (0);
1384 /* Set the memory size to the power of two provided. */
1391 saved_state
.asregs
.msize
= 1 << power
;
1393 sim_memory_size
= power
;
1395 if (saved_state
.asregs
.memory
)
1397 free (saved_state
.asregs
.memory
);
1400 saved_state
.asregs
.memory
=
1401 (unsigned char *) calloc (64, saved_state
.asregs
.msize
/ 64);
1403 if (!saved_state
.asregs
.memory
)
1406 "Not enough VM for simulation of %d bytes of RAM\n",
1407 saved_state
.asregs
.msize
);
1409 saved_state
.asregs
.msize
= 1;
1410 saved_state
.asregs
.memory
= (unsigned char *) calloc (1, 1);
1418 int was_dsp
= target_dsp
;
1419 unsigned long mach
= bfd_get_mach (abfd
);
1421 if (mach
== bfd_mach_sh_dsp
|| mach
== bfd_mach_sh3_dsp
)
1423 int ram_area_size
, xram_start
, yram_start
;
1427 if (mach
== bfd_mach_sh_dsp
)
1429 /* SH7410 (orig. sh-sdp):
1430 4KB each for X & Y memory;
1431 On-chip X RAM 0x0800f000-0x0800ffff
1432 On-chip Y RAM 0x0801f000-0x0801ffff */
1433 xram_start
= 0x0800f000;
1434 ram_area_size
= 0x1000;
1436 if (mach
== bfd_mach_sh3_dsp
)
1439 8KB each for X & Y memory;
1440 On-chip X RAM 0x1000e000-0x1000ffff
1441 On-chip Y RAM 0x1001e000-0x1001ffff */
1442 xram_start
= 0x1000e000;
1443 ram_area_size
= 0x2000;
1445 yram_start
= xram_start
+ 0x10000;
1446 new_select
= ~(ram_area_size
- 1);
1447 if (saved_state
.asregs
.xyram_select
!= new_select
)
1449 saved_state
.asregs
.xyram_select
= new_select
;
1450 free (saved_state
.asregs
.xmem
);
1451 free (saved_state
.asregs
.ymem
);
1452 saved_state
.asregs
.xmem
= (unsigned char *) calloc (1, ram_area_size
);
1453 saved_state
.asregs
.ymem
= (unsigned char *) calloc (1, ram_area_size
);
1455 /* Disable use of X / Y mmeory if not allocated. */
1456 if (! saved_state
.asregs
.xmem
|| ! saved_state
.asregs
.ymem
)
1458 saved_state
.asregs
.xyram_select
= 0;
1459 if (saved_state
.asregs
.xmem
)
1460 free (saved_state
.asregs
.xmem
);
1461 if (saved_state
.asregs
.ymem
)
1462 free (saved_state
.asregs
.ymem
);
1465 saved_state
.asregs
.xram_start
= xram_start
;
1466 saved_state
.asregs
.yram_start
= yram_start
;
1467 saved_state
.asregs
.xmem_offset
= saved_state
.asregs
.xmem
- xram_start
;
1468 saved_state
.asregs
.ymem_offset
= saved_state
.asregs
.ymem
- yram_start
;
1473 if (saved_state
.asregs
.xyram_select
)
1475 saved_state
.asregs
.xyram_select
= 0;
1476 free (saved_state
.asregs
.xmem
);
1477 free (saved_state
.asregs
.ymem
);
1481 if (! saved_state
.asregs
.xyram_select
)
1483 saved_state
.asregs
.xram_start
= 1;
1484 saved_state
.asregs
.yram_start
= 1;
1487 if (target_dsp
!= was_dsp
)
1491 for (i
= sizeof sh_dsp_table
- 1; i
>= 0; i
--)
1493 tmp
= sh_jump_table
[0xf000 + i
];
1494 sh_jump_table
[0xf000 + i
] = sh_dsp_table
[i
];
1495 sh_dsp_table
[i
] = tmp
;
1503 host_little_endian
= 0;
1504 *(char*)&host_little_endian
= 1;
1505 host_little_endian
&= 1;
1507 if (saved_state
.asregs
.msize
!= 1 << sim_memory_size
)
1509 sim_size (sim_memory_size
);
1512 if (saved_state
.asregs
.profile
&& !profile_file
)
1514 profile_file
= fopen ("gmon.out", "wb");
1515 /* Seek to where to put the call arc data */
1516 nsamples
= (1 << sim_profile_size
);
1518 fseek (profile_file
, nsamples
* 2 + 12, 0);
1522 fprintf (stderr
, "Can't open gmon.out\n");
1526 saved_state
.asregs
.profile_hist
=
1527 (unsigned short *) calloc (64, (nsamples
* sizeof (short) / 64));
1540 p
= saved_state
.asregs
.profile_hist
;
1542 maxpc
= (1 << sim_profile_size
);
1544 fseek (profile_file
, 0L, 0);
1545 swapout (minpc
<< PROFILE_SHIFT
);
1546 swapout (maxpc
<< PROFILE_SHIFT
);
1547 swapout (nsamples
* 2 + 12);
1548 for (i
= 0; i
< nsamples
; i
++)
1549 swapout16 (saved_state
.asregs
.profile_hist
[i
]);
1563 #define MMASKB ((saved_state.asregs.msize -1) & ~0)
1569 raise_exception (SIGINT
);
1574 sim_resume (sd
, step
, siggnal
)
1578 register unsigned char *insn_ptr
;
1579 unsigned char *mem_end
;
1580 struct loop_bounds loop
;
1581 register int cycles
= 0;
1582 register int stalls
= 0;
1583 register int memstalls
= 0;
1584 register int insts
= 0;
1585 register int prevlock
;
1586 register int thislock
;
1587 register unsigned int doprofile
;
1588 register int pollcount
= 0;
1589 /* endianw is used for every insn fetch, hence it makes sense to cache it.
1590 endianb is used less often. */
1591 register int endianw
= global_endianw
;
1593 int tick_start
= get_now ();
1595 void (*prev_fpe
) ();
1597 register unsigned char *jump_table
= sh_jump_table
;
1599 register int *R
= &(saved_state
.asregs
.regs
[0]);
1605 register int maskb
= ~((saved_state
.asregs
.msize
- 1) & ~0);
1606 register int maskw
= ~((saved_state
.asregs
.msize
- 1) & ~1);
1607 register int maskl
= ~((saved_state
.asregs
.msize
- 1) & ~3);
1608 register unsigned char *memory
;
1609 register unsigned int sbit
= ((unsigned int) 1 << 31);
1611 prev
= signal (SIGINT
, control_c
);
1612 prev_fpe
= signal (SIGFPE
, SIG_IGN
);
1615 saved_state
.asregs
.exception
= 0;
1617 memory
= saved_state
.asregs
.memory
;
1618 mem_end
= memory
+ saved_state
.asregs
.msize
;
1620 loop
= get_loop_bounds (RS
, RE
, memory
, mem_end
, maskw
, endianw
);
1621 insn_ptr
= PT2H (saved_state
.asregs
.pc
);
1622 CHECK_INSN_PTR (insn_ptr
);
1625 PR
= saved_state
.asregs
.sregs
.named
.pr
;
1627 /*T = GET_SR () & SR_MASK_T;*/
1628 prevlock
= saved_state
.asregs
.prevlock
;
1629 thislock
= saved_state
.asregs
.thislock
;
1630 doprofile
= saved_state
.asregs
.profile
;
1632 /* If profiling not enabled, disable it by asking for
1633 profiles infrequently. */
1638 if (step
&& insn_ptr
< saved_state
.asregs
.insn_end
)
1640 if (saved_state
.asregs
.exception
)
1641 /* This can happen if we've already been single-stepping and
1642 encountered a loop end. */
1643 saved_state
.asregs
.insn_end
= insn_ptr
;
1646 saved_state
.asregs
.exception
= SIGTRAP
;
1647 saved_state
.asregs
.insn_end
= insn_ptr
+ 2;
1651 while (insn_ptr
< saved_state
.asregs
.insn_end
)
1653 register unsigned int iword
= RIAT (insn_ptr
);
1654 register unsigned int ult
;
1655 register unsigned char *nip
= insn_ptr
+ 2;
1667 if (--pollcount
< 0)
1669 pollcount
= POLL_QUIT_INTERVAL
;
1670 if ((*callback
->poll_quit
) != NULL
1671 && (*callback
->poll_quit
) (callback
))
1678 prevlock
= thislock
;
1682 if (cycles
>= doprofile
)
1685 saved_state
.asregs
.cycles
+= doprofile
;
1686 cycles
-= doprofile
;
1687 if (saved_state
.asregs
.profile_hist
)
1689 int n
= PH2T (insn_ptr
) >> PROFILE_SHIFT
;
1692 int i
= saved_state
.asregs
.profile_hist
[n
];
1694 saved_state
.asregs
.profile_hist
[n
] = i
+ 1;
1701 if (saved_state
.asregs
.insn_end
== loop
.end
)
1703 saved_state
.asregs
.cregs
.named
.sr
+= SR_RC_INCREMENT
;
1705 insn_ptr
= loop
.start
;
1708 saved_state
.asregs
.insn_end
= mem_end
;
1709 loop
.end
= PT2H (0);
1714 if (saved_state
.asregs
.exception
== SIGILL
1715 || saved_state
.asregs
.exception
== SIGBUS
)
1719 /* Check for SIGBUS due to insn fetch. */
1720 else if (! saved_state
.asregs
.exception
)
1721 saved_state
.asregs
.exception
= SIGBUS
;
1723 saved_state
.asregs
.ticks
+= get_now () - tick_start
;
1724 saved_state
.asregs
.cycles
+= cycles
;
1725 saved_state
.asregs
.stalls
+= stalls
;
1726 saved_state
.asregs
.memstalls
+= memstalls
;
1727 saved_state
.asregs
.insts
+= insts
;
1728 saved_state
.asregs
.pc
= PH2T (insn_ptr
);
1730 saved_state
.asregs
.sregs
.named
.pr
= PR
;
1733 saved_state
.asregs
.prevlock
= prevlock
;
1734 saved_state
.asregs
.thislock
= thislock
;
1741 signal (SIGFPE
, prev_fpe
);
1742 signal (SIGINT
, prev
);
1746 sim_write (sd
, addr
, buffer
, size
)
1749 unsigned char *buffer
;
1756 for (i
= 0; i
< size
; i
++)
1758 saved_state
.asregs
.memory
[(MMASKB
& (addr
+ i
)) ^ endianb
] = buffer
[i
];
1764 sim_read (sd
, addr
, buffer
, size
)
1767 unsigned char *buffer
;
1774 for (i
= 0; i
< size
; i
++)
1776 buffer
[i
] = saved_state
.asregs
.memory
[(MMASKB
& (addr
+ i
)) ^ endianb
];
1782 sim_store_register (sd
, rn
, memory
, length
)
1785 unsigned char *memory
;
1791 val
= swap (* (int *)memory
);
1794 case SIM_SH_R0_REGNUM
: case SIM_SH_R1_REGNUM
: case SIM_SH_R2_REGNUM
:
1795 case SIM_SH_R3_REGNUM
: case SIM_SH_R4_REGNUM
: case SIM_SH_R5_REGNUM
:
1796 case SIM_SH_R6_REGNUM
: case SIM_SH_R7_REGNUM
: case SIM_SH_R8_REGNUM
:
1797 case SIM_SH_R9_REGNUM
: case SIM_SH_R10_REGNUM
: case SIM_SH_R11_REGNUM
:
1798 case SIM_SH_R12_REGNUM
: case SIM_SH_R13_REGNUM
: case SIM_SH_R14_REGNUM
:
1799 case SIM_SH_R15_REGNUM
:
1800 saved_state
.asregs
.regs
[rn
] = val
;
1802 case SIM_SH_PC_REGNUM
:
1803 saved_state
.asregs
.pc
= val
;
1805 case SIM_SH_PR_REGNUM
:
1808 case SIM_SH_GBR_REGNUM
:
1811 case SIM_SH_VBR_REGNUM
:
1814 case SIM_SH_MACH_REGNUM
:
1817 case SIM_SH_MACL_REGNUM
:
1820 case SIM_SH_SR_REGNUM
:
1823 case SIM_SH_FPUL_REGNUM
:
1826 case SIM_SH_FPSCR_REGNUM
:
1829 case SIM_SH_FR0_REGNUM
: case SIM_SH_FR1_REGNUM
: case SIM_SH_FR2_REGNUM
:
1830 case SIM_SH_FR3_REGNUM
: case SIM_SH_FR4_REGNUM
: case SIM_SH_FR5_REGNUM
:
1831 case SIM_SH_FR6_REGNUM
: case SIM_SH_FR7_REGNUM
: case SIM_SH_FR8_REGNUM
:
1832 case SIM_SH_FR9_REGNUM
: case SIM_SH_FR10_REGNUM
: case SIM_SH_FR11_REGNUM
:
1833 case SIM_SH_FR12_REGNUM
: case SIM_SH_FR13_REGNUM
: case SIM_SH_FR14_REGNUM
:
1834 case SIM_SH_FR15_REGNUM
:
1835 SET_FI (rn
- SIM_SH_FR0_REGNUM
, val
);
1837 case SIM_SH_DSR_REGNUM
:
1840 case SIM_SH_A0G_REGNUM
:
1843 case SIM_SH_A0_REGNUM
:
1846 case SIM_SH_A1G_REGNUM
:
1849 case SIM_SH_A1_REGNUM
:
1852 case SIM_SH_M0_REGNUM
:
1855 case SIM_SH_M1_REGNUM
:
1858 case SIM_SH_X0_REGNUM
:
1861 case SIM_SH_X1_REGNUM
:
1864 case SIM_SH_Y0_REGNUM
:
1867 case SIM_SH_Y1_REGNUM
:
1870 case SIM_SH_MOD_REGNUM
:
1873 case SIM_SH_RS_REGNUM
:
1876 case SIM_SH_RE_REGNUM
:
1879 case SIM_SH_SSR_REGNUM
:
1882 case SIM_SH_SPC_REGNUM
:
1885 /* The rn_bank idiosyncracies are not due to hardware differences, but to
1886 a weird aliasing naming scheme for sh3 / sh3e / sh4. */
1887 case SIM_SH_R0_BANK0_REGNUM
: case SIM_SH_R1_BANK0_REGNUM
:
1888 case SIM_SH_R2_BANK0_REGNUM
: case SIM_SH_R3_BANK0_REGNUM
:
1889 case SIM_SH_R4_BANK0_REGNUM
: case SIM_SH_R5_BANK0_REGNUM
:
1890 case SIM_SH_R6_BANK0_REGNUM
: case SIM_SH_R7_BANK0_REGNUM
:
1892 Rn_BANK (rn
- SIM_SH_R0_BANK0_REGNUM
) = val
;
1894 saved_state
.asregs
.regs
[rn
- SIM_SH_R0_BANK0_REGNUM
] = val
;
1896 case SIM_SH_R0_BANK1_REGNUM
: case SIM_SH_R1_BANK1_REGNUM
:
1897 case SIM_SH_R2_BANK1_REGNUM
: case SIM_SH_R3_BANK1_REGNUM
:
1898 case SIM_SH_R4_BANK1_REGNUM
: case SIM_SH_R5_BANK1_REGNUM
:
1899 case SIM_SH_R6_BANK1_REGNUM
: case SIM_SH_R7_BANK1_REGNUM
:
1901 saved_state
.asregs
.regs
[rn
- SIM_SH_R0_BANK1_REGNUM
] = val
;
1903 Rn_BANK (rn
- SIM_SH_R0_BANK1_REGNUM
) = val
;
1905 case SIM_SH_R0_BANK_REGNUM
: case SIM_SH_R1_BANK_REGNUM
:
1906 case SIM_SH_R2_BANK_REGNUM
: case SIM_SH_R3_BANK_REGNUM
:
1907 case SIM_SH_R4_BANK_REGNUM
: case SIM_SH_R5_BANK_REGNUM
:
1908 case SIM_SH_R6_BANK_REGNUM
: case SIM_SH_R7_BANK_REGNUM
:
1909 SET_Rn_BANK (rn
- SIM_SH_R0_BANK_REGNUM
, val
);
1918 sim_fetch_register (sd
, rn
, memory
, length
)
1921 unsigned char *memory
;
1929 case SIM_SH_R0_REGNUM
: case SIM_SH_R1_REGNUM
: case SIM_SH_R2_REGNUM
:
1930 case SIM_SH_R3_REGNUM
: case SIM_SH_R4_REGNUM
: case SIM_SH_R5_REGNUM
:
1931 case SIM_SH_R6_REGNUM
: case SIM_SH_R7_REGNUM
: case SIM_SH_R8_REGNUM
:
1932 case SIM_SH_R9_REGNUM
: case SIM_SH_R10_REGNUM
: case SIM_SH_R11_REGNUM
:
1933 case SIM_SH_R12_REGNUM
: case SIM_SH_R13_REGNUM
: case SIM_SH_R14_REGNUM
:
1934 case SIM_SH_R15_REGNUM
:
1935 val
= saved_state
.asregs
.regs
[rn
];
1937 case SIM_SH_PC_REGNUM
:
1938 val
= saved_state
.asregs
.pc
;
1940 case SIM_SH_PR_REGNUM
:
1943 case SIM_SH_GBR_REGNUM
:
1946 case SIM_SH_VBR_REGNUM
:
1949 case SIM_SH_MACH_REGNUM
:
1952 case SIM_SH_MACL_REGNUM
:
1955 case SIM_SH_SR_REGNUM
:
1958 case SIM_SH_FPUL_REGNUM
:
1961 case SIM_SH_FPSCR_REGNUM
:
1964 case SIM_SH_FR0_REGNUM
: case SIM_SH_FR1_REGNUM
: case SIM_SH_FR2_REGNUM
:
1965 case SIM_SH_FR3_REGNUM
: case SIM_SH_FR4_REGNUM
: case SIM_SH_FR5_REGNUM
:
1966 case SIM_SH_FR6_REGNUM
: case SIM_SH_FR7_REGNUM
: case SIM_SH_FR8_REGNUM
:
1967 case SIM_SH_FR9_REGNUM
: case SIM_SH_FR10_REGNUM
: case SIM_SH_FR11_REGNUM
:
1968 case SIM_SH_FR12_REGNUM
: case SIM_SH_FR13_REGNUM
: case SIM_SH_FR14_REGNUM
:
1969 case SIM_SH_FR15_REGNUM
:
1970 val
= FI (rn
- SIM_SH_FR0_REGNUM
);
1972 case SIM_SH_DSR_REGNUM
:
1975 case SIM_SH_A0G_REGNUM
:
1978 case SIM_SH_A0_REGNUM
:
1981 case SIM_SH_A1G_REGNUM
:
1984 case SIM_SH_A1_REGNUM
:
1987 case SIM_SH_M0_REGNUM
:
1990 case SIM_SH_M1_REGNUM
:
1993 case SIM_SH_X0_REGNUM
:
1996 case SIM_SH_X1_REGNUM
:
1999 case SIM_SH_Y0_REGNUM
:
2002 case SIM_SH_Y1_REGNUM
:
2005 case SIM_SH_MOD_REGNUM
:
2008 case SIM_SH_RS_REGNUM
:
2011 case SIM_SH_RE_REGNUM
:
2014 case SIM_SH_SSR_REGNUM
:
2017 case SIM_SH_SPC_REGNUM
:
2020 /* The rn_bank idiosyncracies are not due to hardware differences, but to
2021 a weird aliasing naming scheme for sh3 / sh3e / sh4. */
2022 case SIM_SH_R0_BANK0_REGNUM
: case SIM_SH_R1_BANK0_REGNUM
:
2023 case SIM_SH_R2_BANK0_REGNUM
: case SIM_SH_R3_BANK0_REGNUM
:
2024 case SIM_SH_R4_BANK0_REGNUM
: case SIM_SH_R5_BANK0_REGNUM
:
2025 case SIM_SH_R6_BANK0_REGNUM
: case SIM_SH_R7_BANK0_REGNUM
:
2026 val
= (SR_MD
&& SR_RB
2027 ? Rn_BANK (rn
- SIM_SH_R0_BANK0_REGNUM
)
2028 : saved_state
.asregs
.regs
[rn
- SIM_SH_R0_BANK0_REGNUM
]);
2030 case SIM_SH_R0_BANK1_REGNUM
: case SIM_SH_R1_BANK1_REGNUM
:
2031 case SIM_SH_R2_BANK1_REGNUM
: case SIM_SH_R3_BANK1_REGNUM
:
2032 case SIM_SH_R4_BANK1_REGNUM
: case SIM_SH_R5_BANK1_REGNUM
:
2033 case SIM_SH_R6_BANK1_REGNUM
: case SIM_SH_R7_BANK1_REGNUM
:
2034 val
= (! SR_MD
|| ! SR_RB
2035 ? Rn_BANK (rn
- SIM_SH_R0_BANK1_REGNUM
)
2036 : saved_state
.asregs
.regs
[rn
- SIM_SH_R0_BANK1_REGNUM
]);
2038 case SIM_SH_R0_BANK_REGNUM
: case SIM_SH_R1_BANK_REGNUM
:
2039 case SIM_SH_R2_BANK_REGNUM
: case SIM_SH_R3_BANK_REGNUM
:
2040 case SIM_SH_R4_BANK_REGNUM
: case SIM_SH_R5_BANK_REGNUM
:
2041 case SIM_SH_R6_BANK_REGNUM
: case SIM_SH_R7_BANK_REGNUM
:
2042 val
= Rn_BANK (rn
- SIM_SH_R0_BANK_REGNUM
);
2047 * (int *) memory
= swap (val
);
2059 sim_stop_reason (sd
, reason
, sigrc
)
2061 enum sim_stop
*reason
;
2064 /* The SH simulator uses SIGQUIT to indicate that the program has
2065 exited, so we must check for it here and translate it to exit. */
2066 if (saved_state
.asregs
.exception
== SIGQUIT
)
2068 *reason
= sim_exited
;
2069 *sigrc
= saved_state
.asregs
.regs
[5];
2073 *reason
= sim_stopped
;
2074 *sigrc
= saved_state
.asregs
.exception
;
2079 sim_info (sd
, verbose
)
2083 double timetaken
= (double) saved_state
.asregs
.ticks
/ (double) now_persec ();
2084 double virttime
= saved_state
.asregs
.cycles
/ 36.0e6
;
2086 callback
->printf_filtered (callback
, "\n\n# instructions executed %10d\n",
2087 saved_state
.asregs
.insts
);
2088 callback
->printf_filtered (callback
, "# cycles %10d\n",
2089 saved_state
.asregs
.cycles
);
2090 callback
->printf_filtered (callback
, "# pipeline stalls %10d\n",
2091 saved_state
.asregs
.stalls
);
2092 callback
->printf_filtered (callback
, "# misaligned load/store %10d\n",
2093 saved_state
.asregs
.memstalls
);
2094 callback
->printf_filtered (callback
, "# real time taken %10.4f\n",
2096 callback
->printf_filtered (callback
, "# virtual time taken %10.4f\n",
2098 callback
->printf_filtered (callback
, "# profiling size %10d\n",
2100 callback
->printf_filtered (callback
, "# profiling frequency %10d\n",
2101 saved_state
.asregs
.profile
);
2102 callback
->printf_filtered (callback
, "# profile maxpc %10x\n",
2103 (1 << sim_profile_size
) << PROFILE_SHIFT
);
2107 callback
->printf_filtered (callback
, "# cycles/second %10d\n",
2108 (int) (saved_state
.asregs
.cycles
/ timetaken
));
2109 callback
->printf_filtered (callback
, "# simulation ratio %10.4f\n",
2110 virttime
/ timetaken
);
2118 saved_state
.asregs
.profile
= n
;
2122 sim_set_profile_size (n
)
2125 sim_profile_size
= n
;
2129 sim_open (kind
, cb
, abfd
, argv
)
2150 for (p
= argv
+ 1; *p
!= NULL
; ++p
)
2152 if (strcmp (*p
, "-E") == 0)
2157 /* FIXME: This doesn't use stderr, but then the rest of the
2158 file doesn't either. */
2159 callback
->printf_filtered (callback
, "Missing argument to `-E'.\n");
2162 target_little_endian
= strcmp (*p
, "big") != 0;
2165 else if (isdigit (**p
))
2166 parse_and_set_memory_size (*p
);
2169 if (abfd
!= NULL
&& ! endian_set
)
2170 target_little_endian
= ! bfd_big_endian (abfd
);
2175 for (i
= 4; (i
-= 2) >= 0; )
2176 mem_word
.s
[i
>> 1] = i
;
2177 global_endianw
= mem_word
.i
>> (target_little_endian
? 0 : 16) & 0xffff;
2179 for (i
= 4; --i
>= 0; )
2181 endianb
= mem_word
.i
>> (target_little_endian
? 0 : 24) & 0xff;
2183 /* fudge our descriptor for now */
2184 return (SIM_DESC
) 1;
2188 parse_and_set_memory_size (str
)
2193 n
= strtol (str
, NULL
, 10);
2194 if (n
> 0 && n
<= 24)
2195 sim_memory_size
= n
;
2197 callback
->printf_filtered (callback
, "Bad memory size %d; must be 1 to 24, inclusive\n", n
);
2201 sim_close (sd
, quitting
)
2209 sim_load (sd
, prog
, abfd
, from_tty
)
2215 extern bfd
*sim_load_file (); /* ??? Don't know where this should live. */
2218 prog_bfd
= sim_load_file (sd
, myname
, callback
, prog
, abfd
,
2219 sim_kind
== SIM_OPEN_DEBUG
,
2221 if (prog_bfd
== NULL
)
2224 bfd_close (prog_bfd
);
2229 sim_create_inferior (sd
, prog_bfd
, argv
, env
)
2231 struct _bfd
*prog_bfd
;
2235 /* Clear the registers. */
2236 memset (&saved_state
, 0,
2237 (char*)&saved_state
.asregs
.end_of_registers
- (char*)&saved_state
);
2240 if (prog_bfd
!= NULL
)
2241 saved_state
.asregs
.pc
= bfd_get_start_address (prog_bfd
);
2243 /* Record the program's arguments. */
2250 sim_do_command (sd
, cmd
)
2254 char *sms_cmd
= "set-memory-size";
2257 if (cmd
== NULL
|| *cmd
== '\0')
2262 cmdsize
= strlen (sms_cmd
);
2263 if (strncmp (cmd
, sms_cmd
, cmdsize
) == 0 && strchr (" \t", cmd
[cmdsize
]) != NULL
)
2265 parse_and_set_memory_size (cmd
+ cmdsize
+ 1);
2267 else if (strcmp (cmd
, "help") == 0)
2269 (callback
->printf_filtered
) (callback
, "List of SH simulator commands:\n\n");
2270 (callback
->printf_filtered
) (callback
, "set-memory-size <n> -- Set the number of address bits to use\n");
2271 (callback
->printf_filtered
) (callback
, "\n");
2275 (callback
->printf_filtered
) (callback
, "Error: \"%s\" is not a valid SH simulator command.\n", cmd
);
2280 sim_set_callbacks (p
)