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;
172 static int maskl
= 0;
175 static SIM_OPEN_KIND sim_kind
;
179 /* Short hand definitions of the registers */
181 #define SBIT(x) ((x)&sbit)
182 #define R0 saved_state.asregs.regs[0]
183 #define Rn saved_state.asregs.regs[n]
184 #define Rm saved_state.asregs.regs[m]
185 #define UR0 (unsigned int)(saved_state.asregs.regs[0])
186 #define UR (unsigned int)R
187 #define UR (unsigned int)R
188 #define SR0 saved_state.asregs.regs[0]
189 #define CREG(n) (saved_state.asregs.cregs.i[(n)])
190 #define GBR saved_state.asregs.cregs.named.gbr
191 #define VBR saved_state.asregs.cregs.named.vbr
192 #define SSR saved_state.asregs.cregs.named.ssr
193 #define SPC saved_state.asregs.cregs.named.spc
194 #define SREG(n) (saved_state.asregs.sregs.i[(n)])
195 #define MACH saved_state.asregs.sregs.named.mach
196 #define MACL saved_state.asregs.sregs.named.macl
197 #define PR saved_state.asregs.sregs.named.pr
198 #define FPUL saved_state.asregs.sregs.named.fpul
204 /* Alternate bank of registers r0-r7 */
206 /* Note: code controling SR handles flips between BANK0 and BANK1 */
207 #define Rn_BANK(n) (saved_state.asregs.cregs.named.bank[(n)])
208 #define SET_Rn_BANK(n, EXP) do { saved_state.asregs.cregs.named.bank[(n)] = (EXP); } while (0)
213 #define SR_MASK_DMY (1 << 11)
214 #define SR_MASK_DMX (1 << 10)
215 #define SR_MASK_M (1 << 9)
216 #define SR_MASK_Q (1 << 8)
217 #define SR_MASK_I (0xf << 4)
218 #define SR_MASK_S (1 << 1)
219 #define SR_MASK_T (1 << 0)
221 #define SR_MASK_BL (1 << 28)
222 #define SR_MASK_RB (1 << 29)
223 #define SR_MASK_MD (1 << 30)
224 #define SR_MASK_RC 0x0fff0000
225 #define SR_RC_INCREMENT -0x00010000
227 #define M ((saved_state.asregs.cregs.named.sr & SR_MASK_M) != 0)
228 #define Q ((saved_state.asregs.cregs.named.sr & SR_MASK_Q) != 0)
229 #define S ((saved_state.asregs.cregs.named.sr & SR_MASK_S) != 0)
230 #define T ((saved_state.asregs.cregs.named.sr & SR_MASK_T) != 0)
232 #define SR_BL ((saved_state.asregs.cregs.named.sr & SR_MASK_BL) != 0)
233 #define SR_RB ((saved_state.asregs.cregs.named.sr & SR_MASK_RB) != 0)
234 #define SR_MD ((saved_state.asregs.cregs.named.sr & SR_MASK_MD) != 0)
235 #define SR_DMY ((saved_state.asregs.cregs.named.sr & SR_MASK_DMY) != 0)
236 #define SR_DMX ((saved_state.asregs.cregs.named.sr & SR_MASK_DMX) != 0)
237 #define SR_RC ((saved_state.asregs.cregs.named.sr & SR_MASK_RC))
239 /* Note: don't use this for privileged bits */
240 #define SET_SR_BIT(EXP, BIT) \
243 saved_state.asregs.cregs.named.sr |= (BIT); \
245 saved_state.asregs.cregs.named.sr &= ~(BIT); \
248 #define SET_SR_M(EXP) SET_SR_BIT ((EXP), SR_MASK_M)
249 #define SET_SR_Q(EXP) SET_SR_BIT ((EXP), SR_MASK_Q)
250 #define SET_SR_S(EXP) SET_SR_BIT ((EXP), SR_MASK_S)
251 #define SET_SR_T(EXP) SET_SR_BIT ((EXP), SR_MASK_T)
253 /* stc currently relies on being able to read SR without modifications. */
254 #define GET_SR() (saved_state.asregs.cregs.named.sr - 0)
256 #define SET_SR(x) set_sr (x)
259 (saved_state.asregs.cregs.named.sr \
260 = saved_state.asregs.cregs.named.sr & 0xf000ffff | ((x) & 0xfff) << 16)
262 /* Manipulate FPSCR */
264 #define FPSCR_MASK_FR (1 << 21)
265 #define FPSCR_MASK_SZ (1 << 20)
266 #define FPSCR_MASK_PR (1 << 19)
268 #define FPSCR_FR ((GET_FPSCR() & FPSCR_MASK_FR) != 0)
269 #define FPSCR_SZ ((GET_FPSCR() & FPSCR_MASK_SZ) != 0)
270 #define FPSCR_PR ((GET_FPSCR() & FPSCR_MASK_PR) != 0)
272 /* Count the number of arguments in an argv. */
274 count_argc (char **argv
)
281 for (i
= 0; argv
[i
] != NULL
; ++i
)
290 int old
= saved_state
.asregs
.sregs
.named
.fpscr
;
291 saved_state
.asregs
.sregs
.named
.fpscr
= (x
);
292 /* swap the floating point register banks */
293 if ((saved_state
.asregs
.sregs
.named
.fpscr
^ old
) & FPSCR_MASK_FR
294 /* Ignore bit change if simulating sh-dsp. */
297 union fregs_u tmpf
= saved_state
.asregs
.fregs
[0];
298 saved_state
.asregs
.fregs
[0] = saved_state
.asregs
.fregs
[1];
299 saved_state
.asregs
.fregs
[1] = tmpf
;
303 /* sts relies on being able to read fpscr directly. */
304 #define GET_FPSCR() (saved_state.asregs.sregs.named.fpscr)
305 #define SET_FPSCR(x) \
310 #define DSR (saved_state.asregs.sregs.named.fpscr)
318 #define RAISE_EXCEPTION(x) \
319 (saved_state.asregs.exception = x, saved_state.asregs.insn_end = 0)
321 /* This function exists mainly for the purpose of setting a breakpoint to
322 catch simulated bus errors when running the simulator under GDB. */
334 raise_exception (SIGBUS
);
337 #define PROCESS_SPECIAL_ADDRESS(addr, endian, ptr, bits_written, \
338 forbidden_addr_bits, data, retval) \
340 if (addr & forbidden_addr_bits) \
345 else if ((addr & saved_state.asregs.xyram_select) \
346 == saved_state.asregs.xram_start) \
347 ptr = (void *) &saved_state.asregs.xmem_offset[addr ^ endian]; \
348 else if ((addr & saved_state.asregs.xyram_select) \
349 == saved_state.asregs.yram_start) \
350 ptr = (void *) &saved_state.asregs.ymem_offset[addr ^ endian]; \
351 else if ((unsigned) addr >> 24 == 0xf0 \
352 && bits_written == 32 && (data & 1) == 0) \
353 /* This invalidates (if not associative) or might invalidate \
354 (if associative) an instruction cache line. This is used for \
355 trampolines. Since we don't simulate the cache, this is a no-op \
356 as far as the simulator is concerned. */ \
360 if (bits_written == 8 && addr > 0x5000000) \
361 IOMEM (addr, 1, data); \
362 /* We can't do anything useful with the other stuff, so fail. */ \
368 /* FIXME: sim_resume should be renamed to sim_engine_run. sim_resume
369 being implemented by ../common/sim_resume.c and the below should
370 make a call to sim_engine_halt */
372 #define BUSERROR(addr, mask) ((addr) & (mask))
374 #define WRITE_BUSERROR(addr, mask, data, addr_func) \
379 addr_func (addr, data); \
385 #define READ_BUSERROR(addr, mask, addr_func) \
389 return addr_func (addr); \
393 /* Define this to enable register lifetime checking.
394 The compiler generates "add #0,rn" insns to mark registers as invalid,
395 the simulator uses this info to call fail if it finds a ref to an invalid
396 register before a def
403 #define CREF(x) if(!valid[x]) fail();
404 #define CDEF(x) valid[x] = 1;
405 #define UNDEF(x) valid[x] = 0;
412 static void parse_and_set_memory_size
PARAMS ((char *str
));
413 static int IOMEM
PARAMS ((int addr
, int write
, int value
));
414 static struct loop_bounds get_loop_bounds
PARAMS((int, int, unsigned char *,
415 unsigned char *, int, int));
416 static void process_wlat_addr
PARAMS((int, int));
417 static void process_wwat_addr
PARAMS((int, int));
418 static void process_wbat_addr
PARAMS((int, int));
419 static int process_rlat_addr
PARAMS((int));
420 static int process_rwat_addr
PARAMS((int));
421 static int process_rbat_addr
PARAMS((int));
422 static void INLINE wlat_fast
PARAMS ((unsigned char *, int, int, int));
423 static void INLINE wwat_fast
PARAMS ((unsigned char *, int, int, int, int));
424 static void INLINE wbat_fast
PARAMS ((unsigned char *, int, int, int));
425 static int INLINE rlat_fast
PARAMS ((unsigned char *, int, int));
426 static int INLINE rwat_fast
PARAMS ((unsigned char *, int, int, int));
427 static int INLINE rbat_fast
PARAMS ((unsigned char *, int, int));
429 static host_callback
*callback
;
433 /* Floating point registers */
435 #define DR(n) (get_dr (n))
441 if (host_little_endian
)
448 dr
.i
[1] = saved_state
.asregs
.fregs
[0].i
[n
+ 0];
449 dr
.i
[0] = saved_state
.asregs
.fregs
[0].i
[n
+ 1];
453 return (saved_state
.asregs
.fregs
[0].d
[n
>> 1]);
456 #define SET_DR(n, EXP) set_dr ((n), (EXP))
463 if (host_little_endian
)
471 saved_state
.asregs
.fregs
[0].i
[n
+ 0] = dr
.i
[1];
472 saved_state
.asregs
.fregs
[0].i
[n
+ 1] = dr
.i
[0];
475 saved_state
.asregs
.fregs
[0].d
[n
>> 1] = exp
;
478 #define SET_FI(n,EXP) (saved_state.asregs.fregs[0].i[(n)] = (EXP))
479 #define FI(n) (saved_state.asregs.fregs[0].i[(n)])
481 #define FR(n) (saved_state.asregs.fregs[0].f[(n)])
482 #define SET_FR(n,EXP) (saved_state.asregs.fregs[0].f[(n)] = (EXP))
484 #define XD_TO_XF(n) ((((n) & 1) << 5) | ((n) & 0x1e))
485 #define XF(n) (saved_state.asregs.fregs[(n) >> 5].i[(n) & 0x1f])
486 #define SET_XF(n,EXP) (saved_state.asregs.fregs[(n) >> 5].i[(n) & 0x1f] = (EXP))
488 #define RS saved_state.asregs.cregs.named.rs
489 #define RE saved_state.asregs.cregs.named.re
490 #define MOD (saved_state.asregs.cregs.named.mod)
493 MOD_ME = (unsigned) MOD >> 16 | (SR_DMY ? ~0xffff : (SR_DMX ? 0 : 0x10000)), \
494 MOD_DELTA = (MOD & 0xffff) - ((unsigned) MOD >> 16))
496 #define DSP_R(n) saved_state.asregs.sregs.i[(n)]
497 #define DSP_GRD(n) DSP_R ((n) + 8)
498 #define GET_DSP_GRD(n) ((n | 2) == 7 ? SEXT (DSP_GRD (n)) : SIGN32 (DSP_R (n)))
503 #define Y0 DSP_R (10)
504 #define Y1 DSP_R (11)
505 #define M0 DSP_R (12)
506 #define A1G DSP_R (13)
507 #define M1 DSP_R (14)
508 #define A0G DSP_R (15)
509 /* DSP_R (16) / DSP_GRD (16) are used as a fake destination for pcmp. */
510 #define MOD_ME DSP_GRD (17)
511 #define MOD_DELTA DSP_GRD (18)
513 #define FP_OP(n, OP, m) \
517 if (((n) & 1) || ((m) & 1)) \
518 RAISE_EXCEPTION (SIGILL); \
520 SET_DR(n, (DR(n) OP DR(m))); \
523 SET_FR(n, (FR(n) OP FR(m))); \
526 #define FP_UNARY(n, OP) \
531 RAISE_EXCEPTION (SIGILL); \
533 SET_DR(n, (OP (DR(n)))); \
536 SET_FR(n, (OP (FR(n)))); \
539 #define FP_CMP(n, OP, m) \
543 if (((n) & 1) || ((m) & 1)) \
544 RAISE_EXCEPTION (SIGILL); \
546 SET_SR_T (DR(n) OP DR(m)); \
549 SET_SR_T (FR(n) OP FR(m)); \
556 /* do we need to swap banks */
557 int old_gpr
= SR_MD
&& SR_RB
;
558 int new_gpr
= (new_sr
& SR_MASK_MD
) && (new_sr
& SR_MASK_RB
);
559 if (old_gpr
!= new_gpr
)
562 for (i
= 0; i
< 8; i
++)
564 tmp
= saved_state
.asregs
.cregs
.named
.bank
[i
];
565 saved_state
.asregs
.cregs
.named
.bank
[i
] = saved_state
.asregs
.regs
[i
];
566 saved_state
.asregs
.regs
[i
] = tmp
;
569 saved_state
.asregs
.cregs
.named
.sr
= new_sr
;
574 wlat_fast (memory
, x
, value
, maskl
)
575 unsigned char *memory
;
578 unsigned int *p
= (unsigned int *)(memory
+ x
);
579 WRITE_BUSERROR (x
, maskl
, v
, process_wlat_addr
);
584 wwat_fast (memory
, x
, value
, maskw
, endianw
)
585 unsigned char *memory
;
588 unsigned short *p
= (unsigned short *)(memory
+ (x
^ endianw
));
589 WRITE_BUSERROR (x
, maskw
, v
, process_wwat_addr
);
594 wbat_fast (memory
, x
, value
, maskb
)
595 unsigned char *memory
;
597 unsigned char *p
= memory
+ (x
^ endianb
);
598 WRITE_BUSERROR (x
, maskb
, value
, process_wbat_addr
);
606 rlat_fast (memory
, x
, maskl
)
607 unsigned char *memory
;
609 unsigned int *p
= (unsigned int *)(memory
+ x
);
610 READ_BUSERROR (x
, maskl
, process_rlat_addr
);
616 rwat_fast (memory
, x
, maskw
, endianw
)
617 unsigned char *memory
;
618 int x
, maskw
, endianw
;
620 unsigned short *p
= (unsigned short *)(memory
+ (x
^ endianw
));
621 READ_BUSERROR (x
, maskw
, process_rwat_addr
);
627 riat_fast (insn_ptr
, endianw
)
628 unsigned char *insn_ptr
;
630 unsigned short *p
= (unsigned short *)((size_t) insn_ptr
^ endianw
);
636 rbat_fast (memory
, x
, maskb
)
637 unsigned char *memory
;
639 unsigned char *p
= memory
+ (x
^ endianb
);
640 READ_BUSERROR (x
, maskb
, process_rbat_addr
);
645 #define RWAT(x) (rwat_fast (memory, x, maskw, endianw))
646 #define RLAT(x) (rlat_fast (memory, x, maskl))
647 #define RBAT(x) (rbat_fast (memory, x, maskb))
648 #define RIAT(p) (riat_fast ((p), endianw))
649 #define WWAT(x,v) (wwat_fast (memory, x, v, maskw, endianw))
650 #define WLAT(x,v) (wlat_fast (memory, x, v, maskl))
651 #define WBAT(x,v) (wbat_fast (memory, x, v, maskb))
653 #define RUWAT(x) (RWAT(x) & 0xffff)
654 #define RSWAT(x) ((short)(RWAT(x)))
655 #define RSLAT(x) ((long)(RLAT(x)))
656 #define RSBAT(x) (SEXT(RBAT(x)))
658 #define RDAT(x, n) (do_rdat (memory, (x), (n), (maskl)))
660 do_rdat (memory
, x
, n
, maskl
)
670 f0
= rlat_fast (memory
, x
+ 0, maskl
);
671 f1
= rlat_fast (memory
, x
+ 4, maskl
);
672 saved_state
.asregs
.fregs
[i
].i
[(j
+ 0)] = f0
;
673 saved_state
.asregs
.fregs
[i
].i
[(j
+ 1)] = f1
;
677 #define WDAT(x, n) (do_wdat (memory, (x), (n), (maskl)))
679 do_wdat (memory
, x
, n
, maskl
)
689 f0
= saved_state
.asregs
.fregs
[i
].i
[(j
+ 0)];
690 f1
= saved_state
.asregs
.fregs
[i
].i
[(j
+ 1)];
691 wlat_fast (memory
, (x
+ 0), f0
, maskl
);
692 wlat_fast (memory
, (x
+ 4), f1
, maskl
);
697 process_wlat_addr (addr
, value
)
703 PROCESS_SPECIAL_ADDRESS (addr
, endianb
, ptr
, 32, 3, value
, );
708 process_wwat_addr (addr
, value
)
714 PROCESS_SPECIAL_ADDRESS (addr
, endianb
, ptr
, 16, 1, value
, );
719 process_wbat_addr (addr
, value
)
725 PROCESS_SPECIAL_ADDRESS (addr
, endianb
, ptr
, 8, 0, value
, );
730 process_rlat_addr (addr
)
735 PROCESS_SPECIAL_ADDRESS (addr
, endianb
, ptr
, -32, 3, -1, 0);
740 process_rwat_addr (addr
)
745 PROCESS_SPECIAL_ADDRESS (addr
, endianb
, ptr
, -16, 1, -1, 0);
750 process_rbat_addr (addr
)
755 PROCESS_SPECIAL_ADDRESS (addr
, endianb
, ptr
, -8, 0, -1, 0);
759 #define SEXT(x) (((x & 0xff) ^ (~0x7f))+0x80)
760 #define SEXT12(x) (((x & 0xfff) ^ 0x800) - 0x800)
761 #define SEXTW(y) ((int)((short)y))
763 #define SEXT32(x) ((int)((x & 0xffffffff) ^ 0x80000000U) - 0x7fffffff - 1)
765 #define SEXT32(x) ((int)(x))
767 #define SIGN32(x) (SEXT32 (x) >> 31)
769 /* convert pointer from target to host value. */
770 #define PT2H(x) ((x) + memory)
771 /* convert pointer from host to target value. */
772 #define PH2T(x) ((x) - memory)
774 #define SKIP_INSN(p) ((p) += ((RIAT (p) & 0xfc00) == 0xf800 ? 4 : 2))
776 #define SET_NIP(x) nip = (x); CHECK_INSN_PTR (nip);
778 #define Delay_Slot(TEMPPC) iword = RIAT (TEMPPC); goto top;
780 #define CHECK_INSN_PTR(p) \
782 if (saved_state.asregs.exception || PH2T (p) & maskw) \
783 saved_state.asregs.insn_end = 0; \
784 else if (p < loop.end) \
785 saved_state.asregs.insn_end = loop.end; \
787 saved_state.asregs.insn_end = mem_end; \
800 do { memstalls += ((((int) PC & 3) != 0) ? (n) : ((n) - 1)); } while (0)
802 #define L(x) thislock = x;
803 #define TL(x) if ((x) == prevlock) stalls++;
804 #define TB(x,y) if ((x) == prevlock || (y)==prevlock) stalls++;
808 #if defined(__GO32__) || defined(_WIN32)
809 int sim_memory_size
= 19;
811 int sim_memory_size
= 24;
814 static int sim_profile_size
= 17;
820 #define SMR1 (0x05FFFEC8) /* Channel 1 serial mode register */
821 #define BRR1 (0x05FFFEC9) /* Channel 1 bit rate register */
822 #define SCR1 (0x05FFFECA) /* Channel 1 serial control register */
823 #define TDR1 (0x05FFFECB) /* Channel 1 transmit data register */
824 #define SSR1 (0x05FFFECC) /* Channel 1 serial status register */
825 #define RDR1 (0x05FFFECD) /* Channel 1 receive data register */
827 #define SCI_RDRF 0x40 /* Recieve data register full */
828 #define SCI_TDRE 0x80 /* Transmit data register empty */
831 IOMEM (addr
, write
, value
)
863 return time ((long *) 0);
872 static FILE *profile_file
;
874 static unsigned INLINE
879 n
= (n
<< 24 | (n
& 0xff00) << 8
880 | (n
& 0xff0000) >> 8 | (n
& 0xff000000) >> 24);
884 static unsigned short INLINE
889 n
= n
<< 8 | (n
& 0xff00) >> 8;
899 union { char b
[4]; int n
; } u
;
901 fwrite (u
.b
, 4, 1, profile_file
);
909 union { char b
[4]; int n
; } u
;
911 fwrite (u
.b
, 2, 1, profile_file
);
914 /* Turn a pointer in a register into a pointer into real memory. */
920 return (char *) (x
+ saved_state
.asregs
.memory
);
927 unsigned char *memory
= saved_state
.asregs
.memory
;
929 int endian
= endianb
;
934 for (end
= str
; memory
[end
^ endian
]; end
++) ;
945 if (! endianb
|| ! len
)
947 start
= (int *) ptr (str
& ~3);
948 end
= (int *) ptr (str
+ len
);
952 *start
= (old
<< 24 | (old
& 0xff00) << 8
953 | (old
& 0xff0000) >> 8 | (old
& 0xff000000) >> 24);
959 /* Simulate a monitor trap, put the result into r0 and errno into r1
960 return offset by which to adjust pc. */
963 trap (i
, regs
, insn_ptr
, memory
, maskl
, maskw
, endianw
)
966 unsigned char *insn_ptr
;
967 unsigned char *memory
;
972 printf ("%c", regs
[0]);
975 raise_exception (SIGQUIT
);
977 case 3: /* FIXME: for backwards compat, should be removed */
980 unsigned int countp
= * (unsigned int *) (insn_ptr
+ 4);
982 WLAT (countp
, RLAT (countp
) + 1);
994 #if !defined(__GO32__) && !defined(_WIN32)
998 /* This would work only if endianness matched between host and target.
999 Besides, it's quite dangerous. */
1002 regs
[0] = execve (ptr (regs
[5]), (char **)ptr (regs
[6]), (char **)ptr (regs
[7]));
1005 regs
[0] = execve (ptr (regs
[5]),(char **) ptr (regs
[6]), 0);
1010 regs
[0] = (BUSERROR (regs
[5], maskl
)
1012 : pipe ((int *) ptr (regs
[5])));
1017 regs
[0] = wait (ptr (regs
[5]));
1019 #endif /* !defined(__GO32__) && !defined(_WIN32) */
1022 strnswap (regs
[6], regs
[7]);
1024 = callback
->read (callback
, regs
[5], ptr (regs
[6]), regs
[7]);
1025 strnswap (regs
[6], regs
[7]);
1028 strnswap (regs
[6], regs
[7]);
1030 regs
[0] = (int)callback
->write_stdout (callback
, ptr(regs
[6]), regs
[7]);
1032 regs
[0] = (int)callback
->write (callback
, regs
[5], ptr (regs
[6]), regs
[7]);
1033 strnswap (regs
[6], regs
[7]);
1036 regs
[0] = callback
->lseek (callback
,regs
[5], regs
[6], regs
[7]);
1039 regs
[0] = callback
->close (callback
,regs
[5]);
1043 int len
= strswaplen (regs
[5]);
1044 strnswap (regs
[5], len
);
1045 regs
[0] = callback
->open (callback
,ptr (regs
[5]), regs
[6]);
1046 strnswap (regs
[5], len
);
1050 /* EXIT - caller can look in r5 to work out the reason */
1051 raise_exception (SIGQUIT
);
1055 case SYS_stat
: /* added at hmsi */
1056 /* stat system call */
1058 struct stat host_stat
;
1060 int len
= strswaplen (regs
[5]);
1062 strnswap (regs
[5], len
);
1063 regs
[0] = stat (ptr (regs
[5]), &host_stat
);
1064 strnswap (regs
[5], len
);
1068 WWAT (buf
, host_stat
.st_dev
);
1070 WWAT (buf
, host_stat
.st_ino
);
1072 WLAT (buf
, host_stat
.st_mode
);
1074 WWAT (buf
, host_stat
.st_nlink
);
1076 WWAT (buf
, host_stat
.st_uid
);
1078 WWAT (buf
, host_stat
.st_gid
);
1080 WWAT (buf
, host_stat
.st_rdev
);
1082 WLAT (buf
, host_stat
.st_size
);
1084 WLAT (buf
, host_stat
.st_atime
);
1088 WLAT (buf
, host_stat
.st_mtime
);
1092 WLAT (buf
, host_stat
.st_ctime
);
1106 int len
= strswaplen (regs
[5]);
1108 strnswap (regs
[5], len
);
1109 regs
[0] = chown (ptr (regs
[5]), regs
[6], regs
[7]);
1110 strnswap (regs
[5], len
);
1116 int len
= strswaplen (regs
[5]);
1118 strnswap (regs
[5], len
);
1119 regs
[0] = chmod (ptr (regs
[5]), regs
[6]);
1120 strnswap (regs
[5], len
);
1125 /* Cast the second argument to void *, to avoid type mismatch
1126 if a prototype is present. */
1127 int len
= strswaplen (regs
[5]);
1129 strnswap (regs
[5], len
);
1130 regs
[0] = utime (ptr (regs
[5]), (void *) ptr (regs
[6]));
1131 strnswap (regs
[5], len
);
1135 regs
[0] = count_argc (prog_argv
);
1138 if (regs
[5] < count_argc (prog_argv
))
1139 regs
[0] = strlen (prog_argv
[regs
[5]]);
1144 if (regs
[5] < count_argc (prog_argv
))
1146 /* Include the termination byte. */
1147 int i
= strlen (prog_argv
[regs
[5]]) + 1;
1148 regs
[0] = sim_write (0, regs
[6], prog_argv
[regs
[5]], i
);
1154 regs
[0] = get_now ();
1160 regs
[1] = callback
->get_errno (callback
);
1167 raise_exception (SIGTRAP
);
1176 control_c (sig
, code
, scp
, addr
)
1182 raise_exception (SIGINT
);
1186 div1 (R
, iRn2
, iRn1
/*, T*/)
1193 unsigned char old_q
, tmp1
;
1196 SET_SR_Q ((unsigned char) ((0x80000000 & R
[iRn1
]) != 0));
1198 R
[iRn1
] |= (unsigned long) T
;
1208 tmp1
= (R
[iRn1
] > tmp0
);
1215 SET_SR_Q ((unsigned char) (tmp1
== 0));
1222 tmp1
= (R
[iRn1
] < tmp0
);
1226 SET_SR_Q ((unsigned char) (tmp1
== 0));
1241 tmp1
= (R
[iRn1
] < tmp0
);
1248 SET_SR_Q ((unsigned char) (tmp1
== 0));
1255 tmp1
= (R
[iRn1
] > tmp0
);
1259 SET_SR_Q ((unsigned char) (tmp1
== 0));
1280 unsigned long RnL
, RnH
;
1281 unsigned long RmL
, RmH
;
1282 unsigned long temp0
, temp1
, temp2
, temp3
;
1283 unsigned long Res2
, Res1
, Res0
;
1286 RnH
= (rn
>> 16) & 0xffff;
1288 RmH
= (rm
>> 16) & 0xffff;
1294 Res1
= temp1
+ temp2
;
1297 temp1
= (Res1
<< 16) & 0xffff0000;
1298 Res0
= temp0
+ temp1
;
1301 Res2
+= ((Res1
>> 16) & 0xffff) + temp3
;
1305 if (rn
& 0x80000000)
1307 if (rm
& 0x80000000)
1316 macw (regs
, memory
, n
, m
, endianw
)
1318 unsigned char *memory
;
1323 long prod
, macl
, sum
;
1325 tempm
=RSWAT(regs
[m
]); regs
[m
]+=2;
1326 tempn
=RSWAT(regs
[n
]); regs
[n
]+=2;
1329 prod
= (long)(short) tempm
* (long)(short) tempn
;
1333 if ((~(prod
^ macl
) & (sum
^ prod
)) < 0)
1335 /* MACH's lsb is a sticky overflow bit. */
1337 /* Store the smallest negative number in MACL if prod is
1338 negative, and the largest positive number otherwise. */
1339 sum
= 0x7fffffff + (prod
< 0);
1345 /* Add to MACH the sign extended product, and carry from low sum. */
1346 mach
= MACH
+ (-(prod
< 0)) + ((unsigned long) sum
< prod
);
1347 /* Sign extend at 10:th bit in MACH. */
1348 MACH
= (mach
& 0x1ff) | -(mach
& 0x200);
1354 macl (regs
, memory
, n
, m
)
1356 unsigned char *memory
;
1360 long prod
, macl
, mach
, sum
;
1361 long long ans
,ansl
,ansh
,t
;
1362 unsigned long long high
,low
,combine
;
1365 long m
[2]; /* mach and macl*/
1366 long long m64
; /* 64 bit MAC */
1369 tempm
= RSLAT(regs
[m
]);
1372 tempn
= RSLAT(regs
[n
]);
1381 ans
= (long long)tempm
* (long long)tempn
; /* Multiply 32bit * 32bit */
1383 mac64
.m64
+= ans
; /* Accumulate 64bit + 64 bit */
1388 if (S
) /* Store only 48 bits of the result */
1390 if (mach
< 0) /* Result is negative */
1392 mach
= mach
& 0x0000ffff; /* Mask higher 16 bits */
1393 mach
|= 0xffff8000; /* Sign extend higher 16 bits */
1396 mach
= mach
& 0x00007fff; /* Postive Result */
1403 static struct loop_bounds
1404 get_loop_bounds (rs
, re
, memory
, mem_end
, maskw
, endianw
)
1406 unsigned char *memory
, *mem_end
;
1409 struct loop_bounds loop
;
1415 loop
.start
= PT2H (RE
- 4);
1416 SKIP_INSN (loop
.start
);
1417 loop
.end
= loop
.start
;
1419 SKIP_INSN (loop
.end
);
1421 SKIP_INSN (loop
.end
);
1422 SKIP_INSN (loop
.end
);
1426 loop
.start
= PT2H (RS
);
1427 loop
.end
= PT2H (RE
- 4);
1428 SKIP_INSN (loop
.end
);
1429 SKIP_INSN (loop
.end
);
1430 SKIP_INSN (loop
.end
);
1431 SKIP_INSN (loop
.end
);
1433 if (loop
.end
>= mem_end
)
1434 loop
.end
= PT2H (0);
1437 loop
.end
= PT2H (0);
1447 /* Set the memory size to the power of two provided. */
1454 saved_state
.asregs
.msize
= 1 << power
;
1456 sim_memory_size
= power
;
1458 if (saved_state
.asregs
.memory
)
1460 free (saved_state
.asregs
.memory
);
1463 saved_state
.asregs
.memory
=
1464 (unsigned char *) calloc (64, saved_state
.asregs
.msize
/ 64);
1466 if (!saved_state
.asregs
.memory
)
1469 "Not enough VM for simulation of %d bytes of RAM\n",
1470 saved_state
.asregs
.msize
);
1472 saved_state
.asregs
.msize
= 1;
1473 saved_state
.asregs
.memory
= (unsigned char *) calloc (1, 1);
1481 int was_dsp
= target_dsp
;
1482 unsigned long mach
= bfd_get_mach (abfd
);
1484 if (mach
== bfd_mach_sh_dsp
|| mach
== bfd_mach_sh3_dsp
)
1486 int ram_area_size
, xram_start
, yram_start
;
1490 if (mach
== bfd_mach_sh_dsp
)
1492 /* SH7410 (orig. sh-sdp):
1493 4KB each for X & Y memory;
1494 On-chip X RAM 0x0800f000-0x0800ffff
1495 On-chip Y RAM 0x0801f000-0x0801ffff */
1496 xram_start
= 0x0800f000;
1497 ram_area_size
= 0x1000;
1499 if (mach
== bfd_mach_sh3_dsp
)
1502 8KB each for X & Y memory;
1503 On-chip X RAM 0x1000e000-0x1000ffff
1504 On-chip Y RAM 0x1001e000-0x1001ffff */
1505 xram_start
= 0x1000e000;
1506 ram_area_size
= 0x2000;
1508 yram_start
= xram_start
+ 0x10000;
1509 new_select
= ~(ram_area_size
- 1);
1510 if (saved_state
.asregs
.xyram_select
!= new_select
)
1512 saved_state
.asregs
.xyram_select
= new_select
;
1513 free (saved_state
.asregs
.xmem
);
1514 free (saved_state
.asregs
.ymem
);
1515 saved_state
.asregs
.xmem
= (unsigned char *) calloc (1, ram_area_size
);
1516 saved_state
.asregs
.ymem
= (unsigned char *) calloc (1, ram_area_size
);
1518 /* Disable use of X / Y mmeory if not allocated. */
1519 if (! saved_state
.asregs
.xmem
|| ! saved_state
.asregs
.ymem
)
1521 saved_state
.asregs
.xyram_select
= 0;
1522 if (saved_state
.asregs
.xmem
)
1523 free (saved_state
.asregs
.xmem
);
1524 if (saved_state
.asregs
.ymem
)
1525 free (saved_state
.asregs
.ymem
);
1528 saved_state
.asregs
.xram_start
= xram_start
;
1529 saved_state
.asregs
.yram_start
= yram_start
;
1530 saved_state
.asregs
.xmem_offset
= saved_state
.asregs
.xmem
- xram_start
;
1531 saved_state
.asregs
.ymem_offset
= saved_state
.asregs
.ymem
- yram_start
;
1536 if (saved_state
.asregs
.xyram_select
)
1538 saved_state
.asregs
.xyram_select
= 0;
1539 free (saved_state
.asregs
.xmem
);
1540 free (saved_state
.asregs
.ymem
);
1544 if (! saved_state
.asregs
.xyram_select
)
1546 saved_state
.asregs
.xram_start
= 1;
1547 saved_state
.asregs
.yram_start
= 1;
1550 if (target_dsp
!= was_dsp
)
1554 for (i
= sizeof sh_dsp_table
- 1; i
>= 0; i
--)
1556 tmp
= sh_jump_table
[0xf000 + i
];
1557 sh_jump_table
[0xf000 + i
] = sh_dsp_table
[i
];
1558 sh_dsp_table
[i
] = tmp
;
1566 host_little_endian
= 0;
1567 *(char*)&host_little_endian
= 1;
1568 host_little_endian
&= 1;
1570 if (saved_state
.asregs
.msize
!= 1 << sim_memory_size
)
1572 sim_size (sim_memory_size
);
1575 if (saved_state
.asregs
.profile
&& !profile_file
)
1577 profile_file
= fopen ("gmon.out", "wb");
1578 /* Seek to where to put the call arc data */
1579 nsamples
= (1 << sim_profile_size
);
1581 fseek (profile_file
, nsamples
* 2 + 12, 0);
1585 fprintf (stderr
, "Can't open gmon.out\n");
1589 saved_state
.asregs
.profile_hist
=
1590 (unsigned short *) calloc (64, (nsamples
* sizeof (short) / 64));
1603 p
= saved_state
.asregs
.profile_hist
;
1605 maxpc
= (1 << sim_profile_size
);
1607 fseek (profile_file
, 0L, 0);
1608 swapout (minpc
<< PROFILE_SHIFT
);
1609 swapout (maxpc
<< PROFILE_SHIFT
);
1610 swapout (nsamples
* 2 + 12);
1611 for (i
= 0; i
< nsamples
; i
++)
1612 swapout16 (saved_state
.asregs
.profile_hist
[i
]);
1626 #define MMASKB ((saved_state.asregs.msize -1) & ~0)
1632 raise_exception (SIGINT
);
1637 sim_resume (sd
, step
, siggnal
)
1641 register unsigned char *insn_ptr
;
1642 unsigned char *mem_end
;
1643 struct loop_bounds loop
;
1644 register int cycles
= 0;
1645 register int stalls
= 0;
1646 register int memstalls
= 0;
1647 register int insts
= 0;
1648 register int prevlock
;
1649 register int thislock
;
1650 register unsigned int doprofile
;
1651 register int pollcount
= 0;
1652 /* endianw is used for every insn fetch, hence it makes sense to cache it.
1653 endianb is used less often. */
1654 register int endianw
= global_endianw
;
1656 int tick_start
= get_now ();
1658 void (*prev_fpe
) ();
1660 register unsigned char *jump_table
= sh_jump_table
;
1662 register int *R
= &(saved_state
.asregs
.regs
[0]);
1668 register int maskb
= ~((saved_state
.asregs
.msize
- 1) & ~0);
1669 register int maskw
= ~((saved_state
.asregs
.msize
- 1) & ~1);
1670 register int maskl
= ~((saved_state
.asregs
.msize
- 1) & ~3);
1671 register unsigned char *memory
;
1672 register unsigned int sbit
= ((unsigned int) 1 << 31);
1674 prev
= signal (SIGINT
, control_c
);
1675 prev_fpe
= signal (SIGFPE
, SIG_IGN
);
1678 saved_state
.asregs
.exception
= 0;
1680 memory
= saved_state
.asregs
.memory
;
1681 mem_end
= memory
+ saved_state
.asregs
.msize
;
1683 loop
= get_loop_bounds (RS
, RE
, memory
, mem_end
, maskw
, endianw
);
1684 insn_ptr
= PT2H (saved_state
.asregs
.pc
);
1685 CHECK_INSN_PTR (insn_ptr
);
1688 PR
= saved_state
.asregs
.sregs
.named
.pr
;
1690 /*T = GET_SR () & SR_MASK_T;*/
1691 prevlock
= saved_state
.asregs
.prevlock
;
1692 thislock
= saved_state
.asregs
.thislock
;
1693 doprofile
= saved_state
.asregs
.profile
;
1695 /* If profiling not enabled, disable it by asking for
1696 profiles infrequently. */
1701 if (step
&& insn_ptr
< saved_state
.asregs
.insn_end
)
1703 if (saved_state
.asregs
.exception
)
1704 /* This can happen if we've already been single-stepping and
1705 encountered a loop end. */
1706 saved_state
.asregs
.insn_end
= insn_ptr
;
1709 saved_state
.asregs
.exception
= SIGTRAP
;
1710 saved_state
.asregs
.insn_end
= insn_ptr
+ 2;
1714 while (insn_ptr
< saved_state
.asregs
.insn_end
)
1716 register unsigned int iword
= RIAT (insn_ptr
);
1717 register unsigned int ult
;
1718 register unsigned char *nip
= insn_ptr
+ 2;
1730 if (--pollcount
< 0)
1732 pollcount
= POLL_QUIT_INTERVAL
;
1733 if ((*callback
->poll_quit
) != NULL
1734 && (*callback
->poll_quit
) (callback
))
1741 prevlock
= thislock
;
1745 if (cycles
>= doprofile
)
1748 saved_state
.asregs
.cycles
+= doprofile
;
1749 cycles
-= doprofile
;
1750 if (saved_state
.asregs
.profile_hist
)
1752 int n
= PH2T (insn_ptr
) >> PROFILE_SHIFT
;
1755 int i
= saved_state
.asregs
.profile_hist
[n
];
1757 saved_state
.asregs
.profile_hist
[n
] = i
+ 1;
1764 if (saved_state
.asregs
.insn_end
== loop
.end
)
1766 saved_state
.asregs
.cregs
.named
.sr
+= SR_RC_INCREMENT
;
1768 insn_ptr
= loop
.start
;
1771 saved_state
.asregs
.insn_end
= mem_end
;
1772 loop
.end
= PT2H (0);
1777 if (saved_state
.asregs
.exception
== SIGILL
1778 || saved_state
.asregs
.exception
== SIGBUS
)
1782 /* Check for SIGBUS due to insn fetch. */
1783 else if (! saved_state
.asregs
.exception
)
1784 saved_state
.asregs
.exception
= SIGBUS
;
1786 saved_state
.asregs
.ticks
+= get_now () - tick_start
;
1787 saved_state
.asregs
.cycles
+= cycles
;
1788 saved_state
.asregs
.stalls
+= stalls
;
1789 saved_state
.asregs
.memstalls
+= memstalls
;
1790 saved_state
.asregs
.insts
+= insts
;
1791 saved_state
.asregs
.pc
= PH2T (insn_ptr
);
1793 saved_state
.asregs
.sregs
.named
.pr
= PR
;
1796 saved_state
.asregs
.prevlock
= prevlock
;
1797 saved_state
.asregs
.thislock
= thislock
;
1804 signal (SIGFPE
, prev_fpe
);
1805 signal (SIGINT
, prev
);
1809 sim_write (sd
, addr
, buffer
, size
)
1812 unsigned char *buffer
;
1819 for (i
= 0; i
< size
; i
++)
1821 saved_state
.asregs
.memory
[(MMASKB
& (addr
+ i
)) ^ endianb
] = buffer
[i
];
1827 sim_read (sd
, addr
, buffer
, size
)
1830 unsigned char *buffer
;
1837 for (i
= 0; i
< size
; i
++)
1839 buffer
[i
] = saved_state
.asregs
.memory
[(MMASKB
& (addr
+ i
)) ^ endianb
];
1845 sim_store_register (sd
, rn
, memory
, length
)
1848 unsigned char *memory
;
1854 val
= swap (* (int *)memory
);
1857 case SIM_SH_R0_REGNUM
: case SIM_SH_R1_REGNUM
: case SIM_SH_R2_REGNUM
:
1858 case SIM_SH_R3_REGNUM
: case SIM_SH_R4_REGNUM
: case SIM_SH_R5_REGNUM
:
1859 case SIM_SH_R6_REGNUM
: case SIM_SH_R7_REGNUM
: case SIM_SH_R8_REGNUM
:
1860 case SIM_SH_R9_REGNUM
: case SIM_SH_R10_REGNUM
: case SIM_SH_R11_REGNUM
:
1861 case SIM_SH_R12_REGNUM
: case SIM_SH_R13_REGNUM
: case SIM_SH_R14_REGNUM
:
1862 case SIM_SH_R15_REGNUM
:
1863 saved_state
.asregs
.regs
[rn
] = val
;
1865 case SIM_SH_PC_REGNUM
:
1866 saved_state
.asregs
.pc
= val
;
1868 case SIM_SH_PR_REGNUM
:
1871 case SIM_SH_GBR_REGNUM
:
1874 case SIM_SH_VBR_REGNUM
:
1877 case SIM_SH_MACH_REGNUM
:
1880 case SIM_SH_MACL_REGNUM
:
1883 case SIM_SH_SR_REGNUM
:
1886 case SIM_SH_FPUL_REGNUM
:
1889 case SIM_SH_FPSCR_REGNUM
:
1892 case SIM_SH_FR0_REGNUM
: case SIM_SH_FR1_REGNUM
: case SIM_SH_FR2_REGNUM
:
1893 case SIM_SH_FR3_REGNUM
: case SIM_SH_FR4_REGNUM
: case SIM_SH_FR5_REGNUM
:
1894 case SIM_SH_FR6_REGNUM
: case SIM_SH_FR7_REGNUM
: case SIM_SH_FR8_REGNUM
:
1895 case SIM_SH_FR9_REGNUM
: case SIM_SH_FR10_REGNUM
: case SIM_SH_FR11_REGNUM
:
1896 case SIM_SH_FR12_REGNUM
: case SIM_SH_FR13_REGNUM
: case SIM_SH_FR14_REGNUM
:
1897 case SIM_SH_FR15_REGNUM
:
1898 SET_FI (rn
- SIM_SH_FR0_REGNUM
, val
);
1900 case SIM_SH_DSR_REGNUM
:
1903 case SIM_SH_A0G_REGNUM
:
1906 case SIM_SH_A0_REGNUM
:
1909 case SIM_SH_A1G_REGNUM
:
1912 case SIM_SH_A1_REGNUM
:
1915 case SIM_SH_M0_REGNUM
:
1918 case SIM_SH_M1_REGNUM
:
1921 case SIM_SH_X0_REGNUM
:
1924 case SIM_SH_X1_REGNUM
:
1927 case SIM_SH_Y0_REGNUM
:
1930 case SIM_SH_Y1_REGNUM
:
1933 case SIM_SH_MOD_REGNUM
:
1936 case SIM_SH_RS_REGNUM
:
1939 case SIM_SH_RE_REGNUM
:
1942 case SIM_SH_SSR_REGNUM
:
1945 case SIM_SH_SPC_REGNUM
:
1948 /* The rn_bank idiosyncracies are not due to hardware differences, but to
1949 a weird aliasing naming scheme for sh3 / sh3e / sh4. */
1950 case SIM_SH_R0_BANK0_REGNUM
: case SIM_SH_R1_BANK0_REGNUM
:
1951 case SIM_SH_R2_BANK0_REGNUM
: case SIM_SH_R3_BANK0_REGNUM
:
1952 case SIM_SH_R4_BANK0_REGNUM
: case SIM_SH_R5_BANK0_REGNUM
:
1953 case SIM_SH_R6_BANK0_REGNUM
: case SIM_SH_R7_BANK0_REGNUM
:
1955 Rn_BANK (rn
- SIM_SH_R0_BANK0_REGNUM
) = val
;
1957 saved_state
.asregs
.regs
[rn
- SIM_SH_R0_BANK0_REGNUM
] = val
;
1959 case SIM_SH_R0_BANK1_REGNUM
: case SIM_SH_R1_BANK1_REGNUM
:
1960 case SIM_SH_R2_BANK1_REGNUM
: case SIM_SH_R3_BANK1_REGNUM
:
1961 case SIM_SH_R4_BANK1_REGNUM
: case SIM_SH_R5_BANK1_REGNUM
:
1962 case SIM_SH_R6_BANK1_REGNUM
: case SIM_SH_R7_BANK1_REGNUM
:
1964 saved_state
.asregs
.regs
[rn
- SIM_SH_R0_BANK1_REGNUM
] = val
;
1966 Rn_BANK (rn
- SIM_SH_R0_BANK1_REGNUM
) = val
;
1968 case SIM_SH_R0_BANK_REGNUM
: case SIM_SH_R1_BANK_REGNUM
:
1969 case SIM_SH_R2_BANK_REGNUM
: case SIM_SH_R3_BANK_REGNUM
:
1970 case SIM_SH_R4_BANK_REGNUM
: case SIM_SH_R5_BANK_REGNUM
:
1971 case SIM_SH_R6_BANK_REGNUM
: case SIM_SH_R7_BANK_REGNUM
:
1972 SET_Rn_BANK (rn
- SIM_SH_R0_BANK_REGNUM
, val
);
1981 sim_fetch_register (sd
, rn
, memory
, length
)
1984 unsigned char *memory
;
1992 case SIM_SH_R0_REGNUM
: case SIM_SH_R1_REGNUM
: case SIM_SH_R2_REGNUM
:
1993 case SIM_SH_R3_REGNUM
: case SIM_SH_R4_REGNUM
: case SIM_SH_R5_REGNUM
:
1994 case SIM_SH_R6_REGNUM
: case SIM_SH_R7_REGNUM
: case SIM_SH_R8_REGNUM
:
1995 case SIM_SH_R9_REGNUM
: case SIM_SH_R10_REGNUM
: case SIM_SH_R11_REGNUM
:
1996 case SIM_SH_R12_REGNUM
: case SIM_SH_R13_REGNUM
: case SIM_SH_R14_REGNUM
:
1997 case SIM_SH_R15_REGNUM
:
1998 val
= saved_state
.asregs
.regs
[rn
];
2000 case SIM_SH_PC_REGNUM
:
2001 val
= saved_state
.asregs
.pc
;
2003 case SIM_SH_PR_REGNUM
:
2006 case SIM_SH_GBR_REGNUM
:
2009 case SIM_SH_VBR_REGNUM
:
2012 case SIM_SH_MACH_REGNUM
:
2015 case SIM_SH_MACL_REGNUM
:
2018 case SIM_SH_SR_REGNUM
:
2021 case SIM_SH_FPUL_REGNUM
:
2024 case SIM_SH_FPSCR_REGNUM
:
2027 case SIM_SH_FR0_REGNUM
: case SIM_SH_FR1_REGNUM
: case SIM_SH_FR2_REGNUM
:
2028 case SIM_SH_FR3_REGNUM
: case SIM_SH_FR4_REGNUM
: case SIM_SH_FR5_REGNUM
:
2029 case SIM_SH_FR6_REGNUM
: case SIM_SH_FR7_REGNUM
: case SIM_SH_FR8_REGNUM
:
2030 case SIM_SH_FR9_REGNUM
: case SIM_SH_FR10_REGNUM
: case SIM_SH_FR11_REGNUM
:
2031 case SIM_SH_FR12_REGNUM
: case SIM_SH_FR13_REGNUM
: case SIM_SH_FR14_REGNUM
:
2032 case SIM_SH_FR15_REGNUM
:
2033 val
= FI (rn
- SIM_SH_FR0_REGNUM
);
2035 case SIM_SH_DSR_REGNUM
:
2038 case SIM_SH_A0G_REGNUM
:
2041 case SIM_SH_A0_REGNUM
:
2044 case SIM_SH_A1G_REGNUM
:
2047 case SIM_SH_A1_REGNUM
:
2050 case SIM_SH_M0_REGNUM
:
2053 case SIM_SH_M1_REGNUM
:
2056 case SIM_SH_X0_REGNUM
:
2059 case SIM_SH_X1_REGNUM
:
2062 case SIM_SH_Y0_REGNUM
:
2065 case SIM_SH_Y1_REGNUM
:
2068 case SIM_SH_MOD_REGNUM
:
2071 case SIM_SH_RS_REGNUM
:
2074 case SIM_SH_RE_REGNUM
:
2077 case SIM_SH_SSR_REGNUM
:
2080 case SIM_SH_SPC_REGNUM
:
2083 /* The rn_bank idiosyncracies are not due to hardware differences, but to
2084 a weird aliasing naming scheme for sh3 / sh3e / sh4. */
2085 case SIM_SH_R0_BANK0_REGNUM
: case SIM_SH_R1_BANK0_REGNUM
:
2086 case SIM_SH_R2_BANK0_REGNUM
: case SIM_SH_R3_BANK0_REGNUM
:
2087 case SIM_SH_R4_BANK0_REGNUM
: case SIM_SH_R5_BANK0_REGNUM
:
2088 case SIM_SH_R6_BANK0_REGNUM
: case SIM_SH_R7_BANK0_REGNUM
:
2089 val
= (SR_MD
&& SR_RB
2090 ? Rn_BANK (rn
- SIM_SH_R0_BANK0_REGNUM
)
2091 : saved_state
.asregs
.regs
[rn
- SIM_SH_R0_BANK0_REGNUM
]);
2093 case SIM_SH_R0_BANK1_REGNUM
: case SIM_SH_R1_BANK1_REGNUM
:
2094 case SIM_SH_R2_BANK1_REGNUM
: case SIM_SH_R3_BANK1_REGNUM
:
2095 case SIM_SH_R4_BANK1_REGNUM
: case SIM_SH_R5_BANK1_REGNUM
:
2096 case SIM_SH_R6_BANK1_REGNUM
: case SIM_SH_R7_BANK1_REGNUM
:
2097 val
= (! SR_MD
|| ! SR_RB
2098 ? Rn_BANK (rn
- SIM_SH_R0_BANK1_REGNUM
)
2099 : saved_state
.asregs
.regs
[rn
- SIM_SH_R0_BANK1_REGNUM
]);
2101 case SIM_SH_R0_BANK_REGNUM
: case SIM_SH_R1_BANK_REGNUM
:
2102 case SIM_SH_R2_BANK_REGNUM
: case SIM_SH_R3_BANK_REGNUM
:
2103 case SIM_SH_R4_BANK_REGNUM
: case SIM_SH_R5_BANK_REGNUM
:
2104 case SIM_SH_R6_BANK_REGNUM
: case SIM_SH_R7_BANK_REGNUM
:
2105 val
= Rn_BANK (rn
- SIM_SH_R0_BANK_REGNUM
);
2110 * (int *) memory
= swap (val
);
2122 sim_stop_reason (sd
, reason
, sigrc
)
2124 enum sim_stop
*reason
;
2127 /* The SH simulator uses SIGQUIT to indicate that the program has
2128 exited, so we must check for it here and translate it to exit. */
2129 if (saved_state
.asregs
.exception
== SIGQUIT
)
2131 *reason
= sim_exited
;
2132 *sigrc
= saved_state
.asregs
.regs
[5];
2136 *reason
= sim_stopped
;
2137 *sigrc
= saved_state
.asregs
.exception
;
2142 sim_info (sd
, verbose
)
2146 double timetaken
= (double) saved_state
.asregs
.ticks
/ (double) now_persec ();
2147 double virttime
= saved_state
.asregs
.cycles
/ 36.0e6
;
2149 callback
->printf_filtered (callback
, "\n\n# instructions executed %10d\n",
2150 saved_state
.asregs
.insts
);
2151 callback
->printf_filtered (callback
, "# cycles %10d\n",
2152 saved_state
.asregs
.cycles
);
2153 callback
->printf_filtered (callback
, "# pipeline stalls %10d\n",
2154 saved_state
.asregs
.stalls
);
2155 callback
->printf_filtered (callback
, "# misaligned load/store %10d\n",
2156 saved_state
.asregs
.memstalls
);
2157 callback
->printf_filtered (callback
, "# real time taken %10.4f\n",
2159 callback
->printf_filtered (callback
, "# virtual time taken %10.4f\n",
2161 callback
->printf_filtered (callback
, "# profiling size %10d\n",
2163 callback
->printf_filtered (callback
, "# profiling frequency %10d\n",
2164 saved_state
.asregs
.profile
);
2165 callback
->printf_filtered (callback
, "# profile maxpc %10x\n",
2166 (1 << sim_profile_size
) << PROFILE_SHIFT
);
2170 callback
->printf_filtered (callback
, "# cycles/second %10d\n",
2171 (int) (saved_state
.asregs
.cycles
/ timetaken
));
2172 callback
->printf_filtered (callback
, "# simulation ratio %10.4f\n",
2173 virttime
/ timetaken
);
2181 saved_state
.asregs
.profile
= n
;
2185 sim_set_profile_size (n
)
2188 sim_profile_size
= n
;
2192 sim_open (kind
, cb
, abfd
, argv
)
2213 for (p
= argv
+ 1; *p
!= NULL
; ++p
)
2215 if (strcmp (*p
, "-E") == 0)
2220 /* FIXME: This doesn't use stderr, but then the rest of the
2221 file doesn't either. */
2222 callback
->printf_filtered (callback
, "Missing argument to `-E'.\n");
2225 target_little_endian
= strcmp (*p
, "big") != 0;
2228 else if (isdigit (**p
))
2229 parse_and_set_memory_size (*p
);
2232 if (abfd
!= NULL
&& ! endian_set
)
2233 target_little_endian
= ! bfd_big_endian (abfd
);
2238 for (i
= 4; (i
-= 2) >= 0; )
2239 mem_word
.s
[i
>> 1] = i
;
2240 global_endianw
= mem_word
.i
>> (target_little_endian
? 0 : 16) & 0xffff;
2242 for (i
= 4; --i
>= 0; )
2244 endianb
= mem_word
.i
>> (target_little_endian
? 0 : 24) & 0xff;
2246 /* fudge our descriptor for now */
2247 return (SIM_DESC
) 1;
2251 parse_and_set_memory_size (str
)
2256 n
= strtol (str
, NULL
, 10);
2257 if (n
> 0 && n
<= 24)
2258 sim_memory_size
= n
;
2260 callback
->printf_filtered (callback
, "Bad memory size %d; must be 1 to 24, inclusive\n", n
);
2264 sim_close (sd
, quitting
)
2272 sim_load (sd
, prog
, abfd
, from_tty
)
2278 extern bfd
*sim_load_file (); /* ??? Don't know where this should live. */
2281 prog_bfd
= sim_load_file (sd
, myname
, callback
, prog
, abfd
,
2282 sim_kind
== SIM_OPEN_DEBUG
,
2284 if (prog_bfd
== NULL
)
2287 bfd_close (prog_bfd
);
2292 sim_create_inferior (sd
, prog_bfd
, argv
, env
)
2294 struct bfd
*prog_bfd
;
2298 /* Clear the registers. */
2299 memset (&saved_state
, 0,
2300 (char*)&saved_state
.asregs
.end_of_registers
- (char*)&saved_state
);
2303 if (prog_bfd
!= NULL
)
2304 saved_state
.asregs
.pc
= bfd_get_start_address (prog_bfd
);
2306 /* Record the program's arguments. */
2313 sim_do_command (sd
, cmd
)
2317 char *sms_cmd
= "set-memory-size";
2320 if (cmd
== NULL
|| *cmd
== '\0')
2325 cmdsize
= strlen (sms_cmd
);
2326 if (strncmp (cmd
, sms_cmd
, cmdsize
) == 0 && strchr (" \t", cmd
[cmdsize
]) != NULL
)
2328 parse_and_set_memory_size (cmd
+ cmdsize
+ 1);
2330 else if (strcmp (cmd
, "help") == 0)
2332 (callback
->printf_filtered
) (callback
, "List of SH simulator commands:\n\n");
2333 (callback
->printf_filtered
) (callback
, "set-memory-size <n> -- Set the number of address bits to use\n");
2334 (callback
->printf_filtered
) (callback
, "\n");
2338 (callback
->printf_filtered
) (callback
, "Error: \"%s\" is not a valid SH simulator command.\n", cmd
);
2343 sim_set_callbacks (p
)