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 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
123 int dbr
; /* debug base register */
124 int sgr
; /* saved gr15 */
125 int ldst
; /* load/store flag (boolean) */
130 unsigned char *insn_end
;
142 int end_of_registers
;
145 #define PROFILE_FREQ 1
146 #define PROFILE_SHIFT 2
148 unsigned short *profile_hist
;
149 unsigned char *memory
;
150 int xyram_select
, xram_start
, yram_start
;
153 unsigned char *xmem_offset
;
154 unsigned char *ymem_offset
;
160 saved_state_type saved_state
;
162 struct loop_bounds
{ unsigned char *start
, *end
; };
164 /* These variables are at file scope so that functions other than
165 sim_resume can use the fetch/store macros */
167 static int target_little_endian
;
168 static int global_endianw
, endianb
;
169 static int target_dsp
;
170 static int host_little_endian
;
171 static char **prog_argv
;
173 static int maskw
= 0;
174 static int maskl
= 0;
176 static SIM_OPEN_KIND sim_kind
;
180 /* Short hand definitions of the registers */
182 #define SBIT(x) ((x)&sbit)
183 #define R0 saved_state.asregs.regs[0]
184 #define Rn saved_state.asregs.regs[n]
185 #define Rm saved_state.asregs.regs[m]
186 #define UR0 (unsigned int) (saved_state.asregs.regs[0])
187 #define UR (unsigned int) R
188 #define UR (unsigned int) R
189 #define SR0 saved_state.asregs.regs[0]
190 #define CREG(n) (saved_state.asregs.cregs.i[(n)])
191 #define GBR saved_state.asregs.cregs.named.gbr
192 #define VBR saved_state.asregs.cregs.named.vbr
193 #define DBR saved_state.asregs.cregs.named.dbr
194 #define SSR saved_state.asregs.cregs.named.ssr
195 #define SPC saved_state.asregs.cregs.named.spc
196 #define SGR saved_state.asregs.cregs.named.sgr
197 #define SREG(n) (saved_state.asregs.sregs.i[(n)])
198 #define MACH saved_state.asregs.sregs.named.mach
199 #define MACL saved_state.asregs.sregs.named.macl
200 #define PR saved_state.asregs.sregs.named.pr
201 #define FPUL saved_state.asregs.sregs.named.fpul
207 /* Alternate bank of registers r0-r7 */
209 /* Note: code controling SR handles flips between BANK0 and BANK1 */
210 #define Rn_BANK(n) (saved_state.asregs.cregs.named.bank[(n)])
211 #define SET_Rn_BANK(n, EXP) do { saved_state.asregs.cregs.named.bank[(n)] = (EXP); } while (0)
216 #define SR_MASK_DMY (1 << 11)
217 #define SR_MASK_DMX (1 << 10)
218 #define SR_MASK_M (1 << 9)
219 #define SR_MASK_Q (1 << 8)
220 #define SR_MASK_I (0xf << 4)
221 #define SR_MASK_S (1 << 1)
222 #define SR_MASK_T (1 << 0)
224 #define SR_MASK_BL (1 << 28)
225 #define SR_MASK_RB (1 << 29)
226 #define SR_MASK_MD (1 << 30)
227 #define SR_MASK_RC 0x0fff0000
228 #define SR_RC_INCREMENT -0x00010000
230 #define M ((saved_state.asregs.cregs.named.sr & SR_MASK_M) != 0)
231 #define Q ((saved_state.asregs.cregs.named.sr & SR_MASK_Q) != 0)
232 #define S ((saved_state.asregs.cregs.named.sr & SR_MASK_S) != 0)
233 #define T ((saved_state.asregs.cregs.named.sr & SR_MASK_T) != 0)
234 #define LDST ((saved_state.asregs.cregs.named.ldst) != 0)
236 #define SR_BL ((saved_state.asregs.cregs.named.sr & SR_MASK_BL) != 0)
237 #define SR_RB ((saved_state.asregs.cregs.named.sr & SR_MASK_RB) != 0)
238 #define SR_MD ((saved_state.asregs.cregs.named.sr & SR_MASK_MD) != 0)
239 #define SR_DMY ((saved_state.asregs.cregs.named.sr & SR_MASK_DMY) != 0)
240 #define SR_DMX ((saved_state.asregs.cregs.named.sr & SR_MASK_DMX) != 0)
241 #define SR_RC ((saved_state.asregs.cregs.named.sr & SR_MASK_RC))
243 /* Note: don't use this for privileged bits */
244 #define SET_SR_BIT(EXP, BIT) \
247 saved_state.asregs.cregs.named.sr |= (BIT); \
249 saved_state.asregs.cregs.named.sr &= ~(BIT); \
252 #define SET_SR_M(EXP) SET_SR_BIT ((EXP), SR_MASK_M)
253 #define SET_SR_Q(EXP) SET_SR_BIT ((EXP), SR_MASK_Q)
254 #define SET_SR_S(EXP) SET_SR_BIT ((EXP), SR_MASK_S)
255 #define SET_SR_T(EXP) SET_SR_BIT ((EXP), SR_MASK_T)
256 #define SET_LDST(EXP) (saved_state.asregs.cregs.named.ldst = ((EXP) != 0))
258 /* stc currently relies on being able to read SR without modifications. */
259 #define GET_SR() (saved_state.asregs.cregs.named.sr - 0)
261 #define SET_SR(x) set_sr (x)
264 (saved_state.asregs.cregs.named.sr \
265 = saved_state.asregs.cregs.named.sr & 0xf000ffff | ((x) & 0xfff) << 16)
267 /* Manipulate FPSCR */
269 #define FPSCR_MASK_FR (1 << 21)
270 #define FPSCR_MASK_SZ (1 << 20)
271 #define FPSCR_MASK_PR (1 << 19)
273 #define FPSCR_FR ((GET_FPSCR () & FPSCR_MASK_FR) != 0)
274 #define FPSCR_SZ ((GET_FPSCR () & FPSCR_MASK_SZ) != 0)
275 #define FPSCR_PR ((GET_FPSCR () & FPSCR_MASK_PR) != 0)
277 /* Count the number of arguments in an argv. */
279 count_argc (char **argv
)
286 for (i
= 0; argv
[i
] != NULL
; ++i
)
295 int old
= saved_state
.asregs
.sregs
.named
.fpscr
;
296 saved_state
.asregs
.sregs
.named
.fpscr
= (x
);
297 /* swap the floating point register banks */
298 if ((saved_state
.asregs
.sregs
.named
.fpscr
^ old
) & FPSCR_MASK_FR
299 /* Ignore bit change if simulating sh-dsp. */
302 union fregs_u tmpf
= saved_state
.asregs
.fregs
[0];
303 saved_state
.asregs
.fregs
[0] = saved_state
.asregs
.fregs
[1];
304 saved_state
.asregs
.fregs
[1] = tmpf
;
308 /* sts relies on being able to read fpscr directly. */
309 #define GET_FPSCR() (saved_state.asregs.sregs.named.fpscr)
310 #define SET_FPSCR(x) \
315 #define DSR (saved_state.asregs.sregs.named.fpscr)
323 #define RAISE_EXCEPTION(x) \
324 (saved_state.asregs.exception = x, saved_state.asregs.insn_end = 0)
326 /* This function exists mainly for the purpose of setting a breakpoint to
327 catch simulated bus errors when running the simulator under GDB. */
339 raise_exception (SIGBUS
);
342 #define PROCESS_SPECIAL_ADDRESS(addr, endian, ptr, bits_written, \
343 forbidden_addr_bits, data, retval) \
345 if (addr & forbidden_addr_bits) \
350 else if ((addr & saved_state.asregs.xyram_select) \
351 == saved_state.asregs.xram_start) \
352 ptr = (void *) &saved_state.asregs.xmem_offset[addr ^ endian]; \
353 else if ((addr & saved_state.asregs.xyram_select) \
354 == saved_state.asregs.yram_start) \
355 ptr = (void *) &saved_state.asregs.ymem_offset[addr ^ endian]; \
356 else if ((unsigned) addr >> 24 == 0xf0 \
357 && bits_written == 32 && (data & 1) == 0) \
358 /* This invalidates (if not associative) or might invalidate \
359 (if associative) an instruction cache line. This is used for \
360 trampolines. Since we don't simulate the cache, this is a no-op \
361 as far as the simulator is concerned. */ \
365 if (bits_written == 8 && addr > 0x5000000) \
366 IOMEM (addr, 1, data); \
367 /* We can't do anything useful with the other stuff, so fail. */ \
373 /* FIXME: sim_resume should be renamed to sim_engine_run. sim_resume
374 being implemented by ../common/sim_resume.c and the below should
375 make a call to sim_engine_halt */
377 #define BUSERROR(addr, mask) ((addr) & (mask))
379 #define WRITE_BUSERROR(addr, mask, data, addr_func) \
384 addr_func (addr, data); \
390 #define READ_BUSERROR(addr, mask, addr_func) \
394 return addr_func (addr); \
398 /* Define this to enable register lifetime checking.
399 The compiler generates "add #0,rn" insns to mark registers as invalid,
400 the simulator uses this info to call fail if it finds a ref to an invalid
401 register before a def
408 #define CREF(x) if (!valid[x]) fail ();
409 #define CDEF(x) valid[x] = 1;
410 #define UNDEF(x) valid[x] = 0;
417 static void parse_and_set_memory_size
PARAMS ((char *str
));
418 static int IOMEM
PARAMS ((int addr
, int write
, int value
));
419 static struct loop_bounds get_loop_bounds
PARAMS ((int, int, unsigned char *,
420 unsigned char *, int, int));
421 static void process_wlat_addr
PARAMS ((int, int));
422 static void process_wwat_addr
PARAMS ((int, int));
423 static void process_wbat_addr
PARAMS ((int, int));
424 static int process_rlat_addr
PARAMS ((int));
425 static int process_rwat_addr
PARAMS ((int));
426 static int process_rbat_addr
PARAMS ((int));
427 static void INLINE wlat_fast
PARAMS ((unsigned char *, int, int, int));
428 static void INLINE wwat_fast
PARAMS ((unsigned char *, int, int, int, int));
429 static void INLINE wbat_fast
PARAMS ((unsigned char *, int, int, int));
430 static int INLINE rlat_fast
PARAMS ((unsigned char *, int, int));
431 static int INLINE rwat_fast
PARAMS ((unsigned char *, int, int, int));
432 static int INLINE rbat_fast
PARAMS ((unsigned char *, int, int));
434 static host_callback
*callback
;
438 /* Floating point registers */
440 #define DR(n) (get_dr (n))
446 if (host_little_endian
)
453 dr
.i
[1] = saved_state
.asregs
.fregs
[0].i
[n
+ 0];
454 dr
.i
[0] = saved_state
.asregs
.fregs
[0].i
[n
+ 1];
458 return (saved_state
.asregs
.fregs
[0].d
[n
>> 1]);
461 #define SET_DR(n, EXP) set_dr ((n), (EXP))
468 if (host_little_endian
)
476 saved_state
.asregs
.fregs
[0].i
[n
+ 0] = dr
.i
[1];
477 saved_state
.asregs
.fregs
[0].i
[n
+ 1] = dr
.i
[0];
480 saved_state
.asregs
.fregs
[0].d
[n
>> 1] = exp
;
483 #define SET_FI(n,EXP) (saved_state.asregs.fregs[0].i[(n)] = (EXP))
484 #define FI(n) (saved_state.asregs.fregs[0].i[(n)])
486 #define FR(n) (saved_state.asregs.fregs[0].f[(n)])
487 #define SET_FR(n,EXP) (saved_state.asregs.fregs[0].f[(n)] = (EXP))
489 #define XD_TO_XF(n) ((((n) & 1) << 5) | ((n) & 0x1e))
490 #define XF(n) (saved_state.asregs.fregs[(n) >> 5].i[(n) & 0x1f])
491 #define SET_XF(n,EXP) (saved_state.asregs.fregs[(n) >> 5].i[(n) & 0x1f] = (EXP))
493 #define RS saved_state.asregs.cregs.named.rs
494 #define RE saved_state.asregs.cregs.named.re
495 #define MOD (saved_state.asregs.cregs.named.mod)
498 MOD_ME = (unsigned) MOD >> 16 | (SR_DMY ? ~0xffff : (SR_DMX ? 0 : 0x10000)), \
499 MOD_DELTA = (MOD & 0xffff) - ((unsigned) MOD >> 16))
501 #define DSP_R(n) saved_state.asregs.sregs.i[(n)]
502 #define DSP_GRD(n) DSP_R ((n) + 8)
503 #define GET_DSP_GRD(n) ((n | 2) == 7 ? SEXT (DSP_GRD (n)) : SIGN32 (DSP_R (n)))
508 #define Y0 DSP_R (10)
509 #define Y1 DSP_R (11)
510 #define M0 DSP_R (12)
511 #define A1G DSP_R (13)
512 #define M1 DSP_R (14)
513 #define A0G DSP_R (15)
514 /* DSP_R (16) / DSP_GRD (16) are used as a fake destination for pcmp. */
515 #define MOD_ME DSP_GRD (17)
516 #define MOD_DELTA DSP_GRD (18)
518 #define FP_OP(n, OP, m) \
522 if (((n) & 1) || ((m) & 1)) \
523 RAISE_EXCEPTION (SIGILL); \
525 SET_DR (n, (DR (n) OP DR (m))); \
528 SET_FR (n, (FR (n) OP FR (m))); \
531 #define FP_UNARY(n, OP) \
536 RAISE_EXCEPTION (SIGILL); \
538 SET_DR (n, (OP (DR (n)))); \
541 SET_FR (n, (OP (FR (n)))); \
544 #define FP_CMP(n, OP, m) \
548 if (((n) & 1) || ((m) & 1)) \
549 RAISE_EXCEPTION (SIGILL); \
551 SET_SR_T (DR (n) OP DR (m)); \
554 SET_SR_T (FR (n) OP FR (m)); \
561 /* do we need to swap banks */
562 int old_gpr
= SR_MD
&& SR_RB
;
563 int new_gpr
= (new_sr
& SR_MASK_MD
) && (new_sr
& SR_MASK_RB
);
564 if (old_gpr
!= new_gpr
)
567 for (i
= 0; i
< 8; i
++)
569 tmp
= saved_state
.asregs
.cregs
.named
.bank
[i
];
570 saved_state
.asregs
.cregs
.named
.bank
[i
] = saved_state
.asregs
.regs
[i
];
571 saved_state
.asregs
.regs
[i
] = tmp
;
574 saved_state
.asregs
.cregs
.named
.sr
= new_sr
;
579 wlat_fast (memory
, x
, value
, maskl
)
580 unsigned char *memory
;
583 unsigned int *p
= (unsigned int *) (memory
+ x
);
584 WRITE_BUSERROR (x
, maskl
, v
, process_wlat_addr
);
589 wwat_fast (memory
, x
, value
, maskw
, endianw
)
590 unsigned char *memory
;
593 unsigned short *p
= (unsigned short *) (memory
+ (x
^ endianw
));
594 WRITE_BUSERROR (x
, maskw
, v
, process_wwat_addr
);
599 wbat_fast (memory
, x
, value
, maskb
)
600 unsigned char *memory
;
602 unsigned char *p
= memory
+ (x
^ endianb
);
603 WRITE_BUSERROR (x
, maskb
, value
, process_wbat_addr
);
611 rlat_fast (memory
, x
, maskl
)
612 unsigned char *memory
;
614 unsigned int *p
= (unsigned int *) (memory
+ x
);
615 READ_BUSERROR (x
, maskl
, process_rlat_addr
);
621 rwat_fast (memory
, x
, maskw
, endianw
)
622 unsigned char *memory
;
623 int x
, maskw
, endianw
;
625 unsigned short *p
= (unsigned short *) (memory
+ (x
^ endianw
));
626 READ_BUSERROR (x
, maskw
, process_rwat_addr
);
632 riat_fast (insn_ptr
, endianw
)
633 unsigned char *insn_ptr
;
635 unsigned short *p
= (unsigned short *) ((size_t) insn_ptr
^ endianw
);
641 rbat_fast (memory
, x
, maskb
)
642 unsigned char *memory
;
644 unsigned char *p
= memory
+ (x
^ endianb
);
645 READ_BUSERROR (x
, maskb
, process_rbat_addr
);
650 #define RWAT(x) (rwat_fast (memory, x, maskw, endianw))
651 #define RLAT(x) (rlat_fast (memory, x, maskl))
652 #define RBAT(x) (rbat_fast (memory, x, maskb))
653 #define RIAT(p) (riat_fast ((p), endianw))
654 #define WWAT(x,v) (wwat_fast (memory, x, v, maskw, endianw))
655 #define WLAT(x,v) (wlat_fast (memory, x, v, maskl))
656 #define WBAT(x,v) (wbat_fast (memory, x, v, maskb))
658 #define RUWAT(x) (RWAT (x) & 0xffff)
659 #define RSWAT(x) ((short) (RWAT (x)))
660 #define RSLAT(x) ((long) (RLAT (x)))
661 #define RSBAT(x) (SEXT (RBAT (x)))
663 #define RDAT(x, n) (do_rdat (memory, (x), (n), (maskl)))
665 do_rdat (memory
, x
, n
, maskl
)
675 f0
= rlat_fast (memory
, x
+ 0, maskl
);
676 f1
= rlat_fast (memory
, x
+ 4, maskl
);
677 saved_state
.asregs
.fregs
[i
].i
[(j
+ 0)] = f0
;
678 saved_state
.asregs
.fregs
[i
].i
[(j
+ 1)] = f1
;
682 #define WDAT(x, n) (do_wdat (memory, (x), (n), (maskl)))
684 do_wdat (memory
, x
, n
, maskl
)
694 f0
= saved_state
.asregs
.fregs
[i
].i
[(j
+ 0)];
695 f1
= saved_state
.asregs
.fregs
[i
].i
[(j
+ 1)];
696 wlat_fast (memory
, (x
+ 0), f0
, maskl
);
697 wlat_fast (memory
, (x
+ 4), f1
, maskl
);
702 process_wlat_addr (addr
, value
)
708 PROCESS_SPECIAL_ADDRESS (addr
, endianb
, ptr
, 32, 3, value
, );
713 process_wwat_addr (addr
, value
)
719 PROCESS_SPECIAL_ADDRESS (addr
, endianb
, ptr
, 16, 1, value
, );
724 process_wbat_addr (addr
, value
)
730 PROCESS_SPECIAL_ADDRESS (addr
, endianb
, ptr
, 8, 0, value
, );
735 process_rlat_addr (addr
)
740 PROCESS_SPECIAL_ADDRESS (addr
, endianb
, ptr
, -32, 3, -1, 0);
745 process_rwat_addr (addr
)
750 PROCESS_SPECIAL_ADDRESS (addr
, endianb
, ptr
, -16, 1, -1, 0);
755 process_rbat_addr (addr
)
760 PROCESS_SPECIAL_ADDRESS (addr
, endianb
, ptr
, -8, 0, -1, 0);
764 #define SEXT(x) (((x & 0xff) ^ (~0x7f))+0x80)
765 #define SEXT12(x) (((x & 0xfff) ^ 0x800) - 0x800)
766 #define SEXTW(y) ((int) ((short) y))
768 #define SEXT32(x) ((int) ((x & 0xffffffff) ^ 0x80000000U) - 0x7fffffff - 1)
770 #define SEXT32(x) ((int) (x))
772 #define SIGN32(x) (SEXT32 (x) >> 31)
774 /* convert pointer from target to host value. */
775 #define PT2H(x) ((x) + memory)
776 /* convert pointer from host to target value. */
777 #define PH2T(x) ((x) - memory)
779 #define SKIP_INSN(p) ((p) += ((RIAT (p) & 0xfc00) == 0xf800 ? 4 : 2))
781 #define SET_NIP(x) nip = (x); CHECK_INSN_PTR (nip);
783 #define Delay_Slot(TEMPPC) iword = RIAT (TEMPPC); goto top;
785 #define CHECK_INSN_PTR(p) \
787 if (saved_state.asregs.exception || PH2T (p) & maskw) \
788 saved_state.asregs.insn_end = 0; \
789 else if (p < loop.end) \
790 saved_state.asregs.insn_end = loop.end; \
792 saved_state.asregs.insn_end = mem_end; \
805 do { memstalls += ((((int) PC & 3) != 0) ? (n) : ((n) - 1)); } while (0)
807 #define L(x) thislock = x;
808 #define TL(x) if ((x) == prevlock) stalls++;
809 #define TB(x,y) if ((x) == prevlock || (y) == prevlock) stalls++;
813 #if defined(__GO32__) || defined(_WIN32)
814 int sim_memory_size
= 19;
816 int sim_memory_size
= 24;
819 static int sim_profile_size
= 17;
825 #define SMR1 (0x05FFFEC8) /* Channel 1 serial mode register */
826 #define BRR1 (0x05FFFEC9) /* Channel 1 bit rate register */
827 #define SCR1 (0x05FFFECA) /* Channel 1 serial control register */
828 #define TDR1 (0x05FFFECB) /* Channel 1 transmit data register */
829 #define SSR1 (0x05FFFECC) /* Channel 1 serial status register */
830 #define RDR1 (0x05FFFECD) /* Channel 1 receive data register */
832 #define SCI_RDRF 0x40 /* Recieve data register full */
833 #define SCI_TDRE 0x80 /* Transmit data register empty */
836 IOMEM (addr
, write
, value
)
868 return time ((long *) 0);
877 static FILE *profile_file
;
879 static unsigned INLINE
884 n
= (n
<< 24 | (n
& 0xff00) << 8
885 | (n
& 0xff0000) >> 8 | (n
& 0xff000000) >> 24);
889 static unsigned short INLINE
894 n
= n
<< 8 | (n
& 0xff00) >> 8;
904 union { char b
[4]; int n
; } u
;
906 fwrite (u
.b
, 4, 1, profile_file
);
914 union { char b
[4]; int n
; } u
;
916 fwrite (u
.b
, 2, 1, profile_file
);
919 /* Turn a pointer in a register into a pointer into real memory. */
925 return (char *) (x
+ saved_state
.asregs
.memory
);
932 unsigned char *memory
= saved_state
.asregs
.memory
;
934 int endian
= endianb
;
939 for (end
= str
; memory
[end
^ endian
]; end
++) ;
950 if (! endianb
|| ! len
)
952 start
= (int *) ptr (str
& ~3);
953 end
= (int *) ptr (str
+ len
);
957 *start
= (old
<< 24 | (old
& 0xff00) << 8
958 | (old
& 0xff0000) >> 8 | (old
& 0xff000000) >> 24);
964 /* Simulate a monitor trap, put the result into r0 and errno into r1
965 return offset by which to adjust pc. */
968 trap (i
, regs
, insn_ptr
, memory
, maskl
, maskw
, endianw
)
971 unsigned char *insn_ptr
;
972 unsigned char *memory
;
977 printf ("%c", regs
[0]);
980 raise_exception (SIGQUIT
);
982 case 3: /* FIXME: for backwards compat, should be removed */
985 unsigned int countp
= * (unsigned int *) (insn_ptr
+ 4);
987 WLAT (countp
, RLAT (countp
) + 1);
999 #if !defined(__GO32__) && !defined(_WIN32)
1003 /* This would work only if endianness matched between host and target.
1004 Besides, it's quite dangerous. */
1007 regs
[0] = execve (ptr (regs
[5]), (char **) ptr (regs
[6]),
1008 (char **) ptr (regs
[7]));
1011 regs
[0] = execve (ptr (regs
[5]), (char **) ptr (regs
[6]), 0);
1016 regs
[0] = (BUSERROR (regs
[5], maskl
)
1018 : pipe ((int *) ptr (regs
[5])));
1023 regs
[0] = wait (ptr (regs
[5]));
1025 #endif /* !defined(__GO32__) && !defined(_WIN32) */
1028 strnswap (regs
[6], regs
[7]);
1030 = callback
->read (callback
, regs
[5], ptr (regs
[6]), regs
[7]);
1031 strnswap (regs
[6], regs
[7]);
1034 strnswap (regs
[6], regs
[7]);
1036 regs
[0] = (int) callback
->write_stdout (callback
,
1037 ptr (regs
[6]), regs
[7]);
1039 regs
[0] = (int) callback
->write (callback
, regs
[5],
1040 ptr (regs
[6]), regs
[7]);
1041 strnswap (regs
[6], regs
[7]);
1044 regs
[0] = callback
->lseek (callback
,regs
[5], regs
[6], regs
[7]);
1047 regs
[0] = callback
->close (callback
,regs
[5]);
1051 int len
= strswaplen (regs
[5]);
1052 strnswap (regs
[5], len
);
1053 regs
[0] = callback
->open (callback
, ptr (regs
[5]), regs
[6]);
1054 strnswap (regs
[5], len
);
1058 /* EXIT - caller can look in r5 to work out the reason */
1059 raise_exception (SIGQUIT
);
1063 case SYS_stat
: /* added at hmsi */
1064 /* stat system call */
1066 struct stat host_stat
;
1068 int len
= strswaplen (regs
[5]);
1070 strnswap (regs
[5], len
);
1071 regs
[0] = stat (ptr (regs
[5]), &host_stat
);
1072 strnswap (regs
[5], len
);
1076 WWAT (buf
, host_stat
.st_dev
);
1078 WWAT (buf
, host_stat
.st_ino
);
1080 WLAT (buf
, host_stat
.st_mode
);
1082 WWAT (buf
, host_stat
.st_nlink
);
1084 WWAT (buf
, host_stat
.st_uid
);
1086 WWAT (buf
, host_stat
.st_gid
);
1088 WWAT (buf
, host_stat
.st_rdev
);
1090 WLAT (buf
, host_stat
.st_size
);
1092 WLAT (buf
, host_stat
.st_atime
);
1096 WLAT (buf
, host_stat
.st_mtime
);
1100 WLAT (buf
, host_stat
.st_ctime
);
1114 int len
= strswaplen (regs
[5]);
1116 strnswap (regs
[5], len
);
1117 regs
[0] = chown (ptr (regs
[5]), regs
[6], regs
[7]);
1118 strnswap (regs
[5], len
);
1124 int len
= strswaplen (regs
[5]);
1126 strnswap (regs
[5], len
);
1127 regs
[0] = chmod (ptr (regs
[5]), regs
[6]);
1128 strnswap (regs
[5], len
);
1133 /* Cast the second argument to void *, to avoid type mismatch
1134 if a prototype is present. */
1135 int len
= strswaplen (regs
[5]);
1137 strnswap (regs
[5], len
);
1138 regs
[0] = utime (ptr (regs
[5]), (void *) ptr (regs
[6]));
1139 strnswap (regs
[5], len
);
1143 regs
[0] = count_argc (prog_argv
);
1146 if (regs
[5] < count_argc (prog_argv
))
1147 regs
[0] = strlen (prog_argv
[regs
[5]]);
1152 if (regs
[5] < count_argc (prog_argv
))
1154 /* Include the termination byte. */
1155 int i
= strlen (prog_argv
[regs
[5]]) + 1;
1156 regs
[0] = sim_write (0, regs
[6], prog_argv
[regs
[5]], i
);
1162 regs
[0] = get_now ();
1165 regs
[0] = callback
->ftruncate (callback
, regs
[5], regs
[6]);
1169 int len
= strswaplen (regs
[5]);
1170 strnswap (regs
[5], len
);
1171 regs
[0] = callback
->truncate (callback
, ptr (regs
[5]), regs
[6]);
1172 strnswap (regs
[5], len
);
1179 regs
[1] = callback
->get_errno (callback
);
1186 raise_exception (SIGTRAP
);
1195 control_c (sig
, code
, scp
, addr
)
1201 raise_exception (SIGINT
);
1205 div1 (R
, iRn2
, iRn1
/*, T*/)
1212 unsigned char old_q
, tmp1
;
1215 SET_SR_Q ((unsigned char) ((0x80000000 & R
[iRn1
]) != 0));
1217 R
[iRn1
] |= (unsigned long) T
;
1227 tmp1
= (R
[iRn1
] > tmp0
);
1234 SET_SR_Q ((unsigned char) (tmp1
== 0));
1241 tmp1
= (R
[iRn1
] < tmp0
);
1245 SET_SR_Q ((unsigned char) (tmp1
== 0));
1260 tmp1
= (R
[iRn1
] < tmp0
);
1267 SET_SR_Q ((unsigned char) (tmp1
== 0));
1274 tmp1
= (R
[iRn1
] > tmp0
);
1278 SET_SR_Q ((unsigned char) (tmp1
== 0));
1299 unsigned long RnL
, RnH
;
1300 unsigned long RmL
, RmH
;
1301 unsigned long temp0
, temp1
, temp2
, temp3
;
1302 unsigned long Res2
, Res1
, Res0
;
1305 RnH
= (rn
>> 16) & 0xffff;
1307 RmH
= (rm
>> 16) & 0xffff;
1313 Res1
= temp1
+ temp2
;
1316 temp1
= (Res1
<< 16) & 0xffff0000;
1317 Res0
= temp0
+ temp1
;
1320 Res2
+= ((Res1
>> 16) & 0xffff) + temp3
;
1324 if (rn
& 0x80000000)
1326 if (rm
& 0x80000000)
1335 macw (regs
, memory
, n
, m
, endianw
)
1337 unsigned char *memory
;
1342 long prod
, macl
, sum
;
1344 tempm
=RSWAT (regs
[m
]); regs
[m
]+=2;
1345 tempn
=RSWAT (regs
[n
]); regs
[n
]+=2;
1348 prod
= (long) (short) tempm
* (long) (short) tempn
;
1352 if ((~(prod
^ macl
) & (sum
^ prod
)) < 0)
1354 /* MACH's lsb is a sticky overflow bit. */
1356 /* Store the smallest negative number in MACL if prod is
1357 negative, and the largest positive number otherwise. */
1358 sum
= 0x7fffffff + (prod
< 0);
1364 /* Add to MACH the sign extended product, and carry from low sum. */
1365 mach
= MACH
+ (-(prod
< 0)) + ((unsigned long) sum
< prod
);
1366 /* Sign extend at 10:th bit in MACH. */
1367 MACH
= (mach
& 0x1ff) | -(mach
& 0x200);
1373 macl (regs
, memory
, n
, m
)
1375 unsigned char *memory
;
1379 long prod
, macl
, mach
, sum
;
1380 long long ans
,ansl
,ansh
,t
;
1381 unsigned long long high
,low
,combine
;
1384 long m
[2]; /* mach and macl*/
1385 long long m64
; /* 64 bit MAC */
1388 tempm
= RSLAT (regs
[m
]);
1391 tempn
= RSLAT (regs
[n
]);
1400 ans
= (long long) tempm
* (long long) tempn
; /* Multiply 32bit * 32bit */
1402 mac64
.m64
+= ans
; /* Accumulate 64bit + 64 bit */
1407 if (S
) /* Store only 48 bits of the result */
1409 if (mach
< 0) /* Result is negative */
1411 mach
= mach
& 0x0000ffff; /* Mask higher 16 bits */
1412 mach
|= 0xffff8000; /* Sign extend higher 16 bits */
1415 mach
= mach
& 0x00007fff; /* Postive Result */
1423 /* GET_LOOP_BOUNDS {EXTENDED}
1424 These two functions compute the actual starting and ending point
1425 of the repeat loop, based on the RS and RE registers (repeat start,
1426 repeat stop). The extended version is called for LDRC, and the
1427 regular version is called for SETRC. The difference is that for
1428 LDRC, the loop start and end instructions are literally the ones
1429 pointed to by RS and RE -- for SETRC, they're not (see docs). */
1431 static struct loop_bounds
1432 get_loop_bounds_ext (rs
, re
, memory
, mem_end
, maskw
, endianw
)
1434 unsigned char *memory
, *mem_end
;
1437 struct loop_bounds loop
;
1439 /* FIXME: should I verify RS < RE? */
1440 loop
.start
= PT2H (RS
); /* FIXME not using the params? */
1441 loop
.end
= PT2H (RE
& ~1); /* Ignore bit 0 of RE. */
1442 SKIP_INSN (loop
.end
);
1443 if (loop
.end
>= mem_end
)
1444 loop
.end
= PT2H (0);
1449 fsca_s (int in
, double (*f
) (double))
1451 double rad
= ldexp ((in
& 0xffff), -15) * 3.141592653589793238462643383;
1452 double result
= (*f
) (rad
);
1453 double error
, upper
, lower
, frac
;
1456 /* Search the value with the maximum error that is still within the
1457 architectural spec. */
1458 error
= ldexp (1., -21);
1459 /* compensate for calculation inaccuracy by reducing error. */
1460 error
= error
- ldexp (1., -50);
1461 upper
= result
+ error
;
1462 frac
= frexp (upper
, &exp
);
1463 upper
= ldexp (floor (ldexp (frac
, 24)), exp
- 24);
1464 lower
= result
- error
;
1465 frac
= frexp (lower
, &exp
);
1466 lower
= ldexp (ceil (ldexp (frac
, 24)), exp
- 24);
1467 return abs (upper
- result
) >= abs (lower
- result
) ? upper
: lower
;
1473 double result
= 1. / sqrt (in
);
1475 double frac
, upper
, lower
, error
, eps
;
1478 result
= result
- (result
* result
* in
- 1) * 0.5 * result
;
1479 /* Search the value with the maximum error that is still within the
1480 architectural spec. */
1481 frac
= frexp (result
, &exp
);
1482 frac
= ldexp (frac
, 24);
1483 error
= 4.0; /* 1 << 24-1-21 */
1484 /* use eps to compensate for possible 1 ulp error in our 'exact' result. */
1485 eps
= ldexp (1., -29);
1486 upper
= floor (frac
+ error
- eps
);
1487 if (upper
> 16777216.)
1488 upper
= floor ((frac
+ error
- eps
) * 0.5) * 2.;
1489 lower
= ceil ((frac
- error
+ eps
) * 2) * .5;
1490 if (lower
> 8388608.)
1491 lower
= ceil (frac
- error
+ eps
);
1492 upper
= ldexp (upper
, exp
- 24);
1493 lower
= ldexp (lower
, exp
- 24);
1494 return upper
- result
>= result
- lower
? upper
: lower
;
1497 static struct loop_bounds
1498 get_loop_bounds (rs
, re
, memory
, mem_end
, maskw
, endianw
)
1500 unsigned char *memory
, *mem_end
;
1503 struct loop_bounds loop
;
1509 loop
.start
= PT2H (RE
- 4);
1510 SKIP_INSN (loop
.start
);
1511 loop
.end
= loop
.start
;
1513 SKIP_INSN (loop
.end
);
1515 SKIP_INSN (loop
.end
);
1516 SKIP_INSN (loop
.end
);
1520 loop
.start
= PT2H (RS
);
1521 loop
.end
= PT2H (RE
- 4);
1522 SKIP_INSN (loop
.end
);
1523 SKIP_INSN (loop
.end
);
1524 SKIP_INSN (loop
.end
);
1525 SKIP_INSN (loop
.end
);
1527 if (loop
.end
>= mem_end
)
1528 loop
.end
= PT2H (0);
1531 loop
.end
= PT2H (0);
1536 static void ppi_insn ();
1540 /* Set the memory size to the power of two provided. */
1547 saved_state
.asregs
.msize
= 1 << power
;
1549 sim_memory_size
= power
;
1551 if (saved_state
.asregs
.memory
)
1553 free (saved_state
.asregs
.memory
);
1556 saved_state
.asregs
.memory
=
1557 (unsigned char *) calloc (64, saved_state
.asregs
.msize
/ 64);
1559 if (!saved_state
.asregs
.memory
)
1562 "Not enough VM for simulation of %d bytes of RAM\n",
1563 saved_state
.asregs
.msize
);
1565 saved_state
.asregs
.msize
= 1;
1566 saved_state
.asregs
.memory
= (unsigned char *) calloc (1, 1);
1574 int was_dsp
= target_dsp
;
1575 unsigned long mach
= bfd_get_mach (abfd
);
1577 if (mach
== bfd_mach_sh_dsp
||
1578 mach
== bfd_mach_sh4al_dsp
||
1579 mach
== bfd_mach_sh3_dsp
)
1581 int ram_area_size
, xram_start
, yram_start
;
1585 if (mach
== bfd_mach_sh_dsp
)
1587 /* SH7410 (orig. sh-sdp):
1588 4KB each for X & Y memory;
1589 On-chip X RAM 0x0800f000-0x0800ffff
1590 On-chip Y RAM 0x0801f000-0x0801ffff */
1591 xram_start
= 0x0800f000;
1592 ram_area_size
= 0x1000;
1594 if (mach
== bfd_mach_sh3_dsp
|| mach
== bfd_mach_sh4al_dsp
)
1597 8KB each for X & Y memory;
1598 On-chip X RAM 0x1000e000-0x1000ffff
1599 On-chip Y RAM 0x1001e000-0x1001ffff */
1600 xram_start
= 0x1000e000;
1601 ram_area_size
= 0x2000;
1603 yram_start
= xram_start
+ 0x10000;
1604 new_select
= ~(ram_area_size
- 1);
1605 if (saved_state
.asregs
.xyram_select
!= new_select
)
1607 saved_state
.asregs
.xyram_select
= new_select
;
1608 free (saved_state
.asregs
.xmem
);
1609 free (saved_state
.asregs
.ymem
);
1610 saved_state
.asregs
.xmem
= (unsigned char *) calloc (1, ram_area_size
);
1611 saved_state
.asregs
.ymem
= (unsigned char *) calloc (1, ram_area_size
);
1613 /* Disable use of X / Y mmeory if not allocated. */
1614 if (! saved_state
.asregs
.xmem
|| ! saved_state
.asregs
.ymem
)
1616 saved_state
.asregs
.xyram_select
= 0;
1617 if (saved_state
.asregs
.xmem
)
1618 free (saved_state
.asregs
.xmem
);
1619 if (saved_state
.asregs
.ymem
)
1620 free (saved_state
.asregs
.ymem
);
1623 saved_state
.asregs
.xram_start
= xram_start
;
1624 saved_state
.asregs
.yram_start
= yram_start
;
1625 saved_state
.asregs
.xmem_offset
= saved_state
.asregs
.xmem
- xram_start
;
1626 saved_state
.asregs
.ymem_offset
= saved_state
.asregs
.ymem
- yram_start
;
1631 if (saved_state
.asregs
.xyram_select
)
1633 saved_state
.asregs
.xyram_select
= 0;
1634 free (saved_state
.asregs
.xmem
);
1635 free (saved_state
.asregs
.ymem
);
1639 if (! saved_state
.asregs
.xyram_select
)
1641 saved_state
.asregs
.xram_start
= 1;
1642 saved_state
.asregs
.yram_start
= 1;
1645 if (target_dsp
!= was_dsp
)
1649 for (i
= sizeof sh_dsp_table
- 1; i
>= 0; i
--)
1651 tmp
= sh_jump_table
[0xf000 + i
];
1652 sh_jump_table
[0xf000 + i
] = sh_dsp_table
[i
];
1653 sh_dsp_table
[i
] = tmp
;
1661 host_little_endian
= 0;
1662 * (char*) &host_little_endian
= 1;
1663 host_little_endian
&= 1;
1665 if (saved_state
.asregs
.msize
!= 1 << sim_memory_size
)
1667 sim_size (sim_memory_size
);
1670 if (saved_state
.asregs
.profile
&& !profile_file
)
1672 profile_file
= fopen ("gmon.out", "wb");
1673 /* Seek to where to put the call arc data */
1674 nsamples
= (1 << sim_profile_size
);
1676 fseek (profile_file
, nsamples
* 2 + 12, 0);
1680 fprintf (stderr
, "Can't open gmon.out\n");
1684 saved_state
.asregs
.profile_hist
=
1685 (unsigned short *) calloc (64, (nsamples
* sizeof (short) / 64));
1698 p
= saved_state
.asregs
.profile_hist
;
1700 maxpc
= (1 << sim_profile_size
);
1702 fseek (profile_file
, 0L, 0);
1703 swapout (minpc
<< PROFILE_SHIFT
);
1704 swapout (maxpc
<< PROFILE_SHIFT
);
1705 swapout (nsamples
* 2 + 12);
1706 for (i
= 0; i
< nsamples
; i
++)
1707 swapout16 (saved_state
.asregs
.profile_hist
[i
]);
1721 #define MMASKB ((saved_state.asregs.msize -1) & ~0)
1727 raise_exception (SIGINT
);
1732 sim_resume (sd
, step
, siggnal
)
1736 register unsigned char *insn_ptr
;
1737 unsigned char *mem_end
;
1738 struct loop_bounds loop
;
1739 register int cycles
= 0;
1740 register int stalls
= 0;
1741 register int memstalls
= 0;
1742 register int insts
= 0;
1743 register int prevlock
;
1744 register int thislock
;
1745 register unsigned int doprofile
;
1746 register int pollcount
= 0;
1747 /* endianw is used for every insn fetch, hence it makes sense to cache it.
1748 endianb is used less often. */
1749 register int endianw
= global_endianw
;
1751 int tick_start
= get_now ();
1753 void (*prev_fpe
) ();
1755 register unsigned char *jump_table
= sh_jump_table
;
1757 register int *R
= &(saved_state
.asregs
.regs
[0]);
1763 register int maskb
= ~((saved_state
.asregs
.msize
- 1) & ~0);
1764 register int maskw
= ~((saved_state
.asregs
.msize
- 1) & ~1);
1765 register int maskl
= ~((saved_state
.asregs
.msize
- 1) & ~3);
1766 register unsigned char *memory
;
1767 register unsigned int sbit
= ((unsigned int) 1 << 31);
1769 prev
= signal (SIGINT
, control_c
);
1770 prev_fpe
= signal (SIGFPE
, SIG_IGN
);
1773 saved_state
.asregs
.exception
= 0;
1775 memory
= saved_state
.asregs
.memory
;
1776 mem_end
= memory
+ saved_state
.asregs
.msize
;
1779 loop
= get_loop_bounds_ext (RS
, RE
, memory
, mem_end
, maskw
, endianw
);
1781 loop
= get_loop_bounds (RS
, RE
, memory
, mem_end
, maskw
, endianw
);
1783 insn_ptr
= PT2H (saved_state
.asregs
.pc
);
1784 CHECK_INSN_PTR (insn_ptr
);
1787 PR
= saved_state
.asregs
.sregs
.named
.pr
;
1789 /*T = GET_SR () & SR_MASK_T;*/
1790 prevlock
= saved_state
.asregs
.prevlock
;
1791 thislock
= saved_state
.asregs
.thislock
;
1792 doprofile
= saved_state
.asregs
.profile
;
1794 /* If profiling not enabled, disable it by asking for
1795 profiles infrequently. */
1800 if (step
&& insn_ptr
< saved_state
.asregs
.insn_end
)
1802 if (saved_state
.asregs
.exception
)
1803 /* This can happen if we've already been single-stepping and
1804 encountered a loop end. */
1805 saved_state
.asregs
.insn_end
= insn_ptr
;
1808 saved_state
.asregs
.exception
= SIGTRAP
;
1809 saved_state
.asregs
.insn_end
= insn_ptr
+ 2;
1813 while (insn_ptr
< saved_state
.asregs
.insn_end
)
1815 register unsigned int iword
= RIAT (insn_ptr
);
1816 register unsigned int ult
;
1817 register unsigned char *nip
= insn_ptr
+ 2;
1829 if (--pollcount
< 0)
1831 pollcount
= POLL_QUIT_INTERVAL
;
1832 if ((*callback
->poll_quit
) != NULL
1833 && (*callback
->poll_quit
) (callback
))
1840 prevlock
= thislock
;
1844 if (cycles
>= doprofile
)
1847 saved_state
.asregs
.cycles
+= doprofile
;
1848 cycles
-= doprofile
;
1849 if (saved_state
.asregs
.profile_hist
)
1851 int n
= PH2T (insn_ptr
) >> PROFILE_SHIFT
;
1854 int i
= saved_state
.asregs
.profile_hist
[n
];
1856 saved_state
.asregs
.profile_hist
[n
] = i
+ 1;
1863 if (saved_state
.asregs
.insn_end
== loop
.end
)
1865 saved_state
.asregs
.cregs
.named
.sr
+= SR_RC_INCREMENT
;
1867 insn_ptr
= loop
.start
;
1870 saved_state
.asregs
.insn_end
= mem_end
;
1871 loop
.end
= PT2H (0);
1876 if (saved_state
.asregs
.exception
== SIGILL
1877 || saved_state
.asregs
.exception
== SIGBUS
)
1881 /* Check for SIGBUS due to insn fetch. */
1882 else if (! saved_state
.asregs
.exception
)
1883 saved_state
.asregs
.exception
= SIGBUS
;
1885 saved_state
.asregs
.ticks
+= get_now () - tick_start
;
1886 saved_state
.asregs
.cycles
+= cycles
;
1887 saved_state
.asregs
.stalls
+= stalls
;
1888 saved_state
.asregs
.memstalls
+= memstalls
;
1889 saved_state
.asregs
.insts
+= insts
;
1890 saved_state
.asregs
.pc
= PH2T (insn_ptr
);
1892 saved_state
.asregs
.sregs
.named
.pr
= PR
;
1895 saved_state
.asregs
.prevlock
= prevlock
;
1896 saved_state
.asregs
.thislock
= thislock
;
1903 signal (SIGFPE
, prev_fpe
);
1904 signal (SIGINT
, prev
);
1908 sim_write (sd
, addr
, buffer
, size
)
1911 unsigned char *buffer
;
1918 for (i
= 0; i
< size
; i
++)
1920 saved_state
.asregs
.memory
[(MMASKB
& (addr
+ i
)) ^ endianb
] = buffer
[i
];
1926 sim_read (sd
, addr
, buffer
, size
)
1929 unsigned char *buffer
;
1936 for (i
= 0; i
< size
; i
++)
1938 buffer
[i
] = saved_state
.asregs
.memory
[(MMASKB
& (addr
+ i
)) ^ endianb
];
1944 sim_store_register (sd
, rn
, memory
, length
)
1947 unsigned char *memory
;
1953 val
= swap (* (int *) memory
);
1956 case SIM_SH_R0_REGNUM
: case SIM_SH_R1_REGNUM
: case SIM_SH_R2_REGNUM
:
1957 case SIM_SH_R3_REGNUM
: case SIM_SH_R4_REGNUM
: case SIM_SH_R5_REGNUM
:
1958 case SIM_SH_R6_REGNUM
: case SIM_SH_R7_REGNUM
: case SIM_SH_R8_REGNUM
:
1959 case SIM_SH_R9_REGNUM
: case SIM_SH_R10_REGNUM
: case SIM_SH_R11_REGNUM
:
1960 case SIM_SH_R12_REGNUM
: case SIM_SH_R13_REGNUM
: case SIM_SH_R14_REGNUM
:
1961 case SIM_SH_R15_REGNUM
:
1962 saved_state
.asregs
.regs
[rn
] = val
;
1964 case SIM_SH_PC_REGNUM
:
1965 saved_state
.asregs
.pc
= val
;
1967 case SIM_SH_PR_REGNUM
:
1970 case SIM_SH_GBR_REGNUM
:
1973 case SIM_SH_VBR_REGNUM
:
1976 case SIM_SH_MACH_REGNUM
:
1979 case SIM_SH_MACL_REGNUM
:
1982 case SIM_SH_SR_REGNUM
:
1985 case SIM_SH_FPUL_REGNUM
:
1988 case SIM_SH_FPSCR_REGNUM
:
1991 case SIM_SH_FR0_REGNUM
: case SIM_SH_FR1_REGNUM
: case SIM_SH_FR2_REGNUM
:
1992 case SIM_SH_FR3_REGNUM
: case SIM_SH_FR4_REGNUM
: case SIM_SH_FR5_REGNUM
:
1993 case SIM_SH_FR6_REGNUM
: case SIM_SH_FR7_REGNUM
: case SIM_SH_FR8_REGNUM
:
1994 case SIM_SH_FR9_REGNUM
: case SIM_SH_FR10_REGNUM
: case SIM_SH_FR11_REGNUM
:
1995 case SIM_SH_FR12_REGNUM
: case SIM_SH_FR13_REGNUM
: case SIM_SH_FR14_REGNUM
:
1996 case SIM_SH_FR15_REGNUM
:
1997 SET_FI (rn
- SIM_SH_FR0_REGNUM
, val
);
1999 case SIM_SH_DSR_REGNUM
:
2002 case SIM_SH_A0G_REGNUM
:
2005 case SIM_SH_A0_REGNUM
:
2008 case SIM_SH_A1G_REGNUM
:
2011 case SIM_SH_A1_REGNUM
:
2014 case SIM_SH_M0_REGNUM
:
2017 case SIM_SH_M1_REGNUM
:
2020 case SIM_SH_X0_REGNUM
:
2023 case SIM_SH_X1_REGNUM
:
2026 case SIM_SH_Y0_REGNUM
:
2029 case SIM_SH_Y1_REGNUM
:
2032 case SIM_SH_MOD_REGNUM
:
2035 case SIM_SH_RS_REGNUM
:
2038 case SIM_SH_RE_REGNUM
:
2041 case SIM_SH_SSR_REGNUM
:
2044 case SIM_SH_SPC_REGNUM
:
2047 /* The rn_bank idiosyncracies are not due to hardware differences, but to
2048 a weird aliasing naming scheme for sh3 / sh3e / sh4. */
2049 case SIM_SH_R0_BANK0_REGNUM
: case SIM_SH_R1_BANK0_REGNUM
:
2050 case SIM_SH_R2_BANK0_REGNUM
: case SIM_SH_R3_BANK0_REGNUM
:
2051 case SIM_SH_R4_BANK0_REGNUM
: case SIM_SH_R5_BANK0_REGNUM
:
2052 case SIM_SH_R6_BANK0_REGNUM
: case SIM_SH_R7_BANK0_REGNUM
:
2054 Rn_BANK (rn
- SIM_SH_R0_BANK0_REGNUM
) = val
;
2056 saved_state
.asregs
.regs
[rn
- SIM_SH_R0_BANK0_REGNUM
] = val
;
2058 case SIM_SH_R0_BANK1_REGNUM
: case SIM_SH_R1_BANK1_REGNUM
:
2059 case SIM_SH_R2_BANK1_REGNUM
: case SIM_SH_R3_BANK1_REGNUM
:
2060 case SIM_SH_R4_BANK1_REGNUM
: case SIM_SH_R5_BANK1_REGNUM
:
2061 case SIM_SH_R6_BANK1_REGNUM
: case SIM_SH_R7_BANK1_REGNUM
:
2063 saved_state
.asregs
.regs
[rn
- SIM_SH_R0_BANK1_REGNUM
] = val
;
2065 Rn_BANK (rn
- SIM_SH_R0_BANK1_REGNUM
) = val
;
2067 case SIM_SH_R0_BANK_REGNUM
: case SIM_SH_R1_BANK_REGNUM
:
2068 case SIM_SH_R2_BANK_REGNUM
: case SIM_SH_R3_BANK_REGNUM
:
2069 case SIM_SH_R4_BANK_REGNUM
: case SIM_SH_R5_BANK_REGNUM
:
2070 case SIM_SH_R6_BANK_REGNUM
: case SIM_SH_R7_BANK_REGNUM
:
2071 SET_Rn_BANK (rn
- SIM_SH_R0_BANK_REGNUM
, val
);
2080 sim_fetch_register (sd
, rn
, memory
, length
)
2083 unsigned char *memory
;
2091 case SIM_SH_R0_REGNUM
: case SIM_SH_R1_REGNUM
: case SIM_SH_R2_REGNUM
:
2092 case SIM_SH_R3_REGNUM
: case SIM_SH_R4_REGNUM
: case SIM_SH_R5_REGNUM
:
2093 case SIM_SH_R6_REGNUM
: case SIM_SH_R7_REGNUM
: case SIM_SH_R8_REGNUM
:
2094 case SIM_SH_R9_REGNUM
: case SIM_SH_R10_REGNUM
: case SIM_SH_R11_REGNUM
:
2095 case SIM_SH_R12_REGNUM
: case SIM_SH_R13_REGNUM
: case SIM_SH_R14_REGNUM
:
2096 case SIM_SH_R15_REGNUM
:
2097 val
= saved_state
.asregs
.regs
[rn
];
2099 case SIM_SH_PC_REGNUM
:
2100 val
= saved_state
.asregs
.pc
;
2102 case SIM_SH_PR_REGNUM
:
2105 case SIM_SH_GBR_REGNUM
:
2108 case SIM_SH_VBR_REGNUM
:
2111 case SIM_SH_MACH_REGNUM
:
2114 case SIM_SH_MACL_REGNUM
:
2117 case SIM_SH_SR_REGNUM
:
2120 case SIM_SH_FPUL_REGNUM
:
2123 case SIM_SH_FPSCR_REGNUM
:
2126 case SIM_SH_FR0_REGNUM
: case SIM_SH_FR1_REGNUM
: case SIM_SH_FR2_REGNUM
:
2127 case SIM_SH_FR3_REGNUM
: case SIM_SH_FR4_REGNUM
: case SIM_SH_FR5_REGNUM
:
2128 case SIM_SH_FR6_REGNUM
: case SIM_SH_FR7_REGNUM
: case SIM_SH_FR8_REGNUM
:
2129 case SIM_SH_FR9_REGNUM
: case SIM_SH_FR10_REGNUM
: case SIM_SH_FR11_REGNUM
:
2130 case SIM_SH_FR12_REGNUM
: case SIM_SH_FR13_REGNUM
: case SIM_SH_FR14_REGNUM
:
2131 case SIM_SH_FR15_REGNUM
:
2132 val
= FI (rn
- SIM_SH_FR0_REGNUM
);
2134 case SIM_SH_DSR_REGNUM
:
2137 case SIM_SH_A0G_REGNUM
:
2140 case SIM_SH_A0_REGNUM
:
2143 case SIM_SH_A1G_REGNUM
:
2146 case SIM_SH_A1_REGNUM
:
2149 case SIM_SH_M0_REGNUM
:
2152 case SIM_SH_M1_REGNUM
:
2155 case SIM_SH_X0_REGNUM
:
2158 case SIM_SH_X1_REGNUM
:
2161 case SIM_SH_Y0_REGNUM
:
2164 case SIM_SH_Y1_REGNUM
:
2167 case SIM_SH_MOD_REGNUM
:
2170 case SIM_SH_RS_REGNUM
:
2173 case SIM_SH_RE_REGNUM
:
2176 case SIM_SH_SSR_REGNUM
:
2179 case SIM_SH_SPC_REGNUM
:
2182 /* The rn_bank idiosyncracies are not due to hardware differences, but to
2183 a weird aliasing naming scheme for sh3 / sh3e / sh4. */
2184 case SIM_SH_R0_BANK0_REGNUM
: case SIM_SH_R1_BANK0_REGNUM
:
2185 case SIM_SH_R2_BANK0_REGNUM
: case SIM_SH_R3_BANK0_REGNUM
:
2186 case SIM_SH_R4_BANK0_REGNUM
: case SIM_SH_R5_BANK0_REGNUM
:
2187 case SIM_SH_R6_BANK0_REGNUM
: case SIM_SH_R7_BANK0_REGNUM
:
2188 val
= (SR_MD
&& SR_RB
2189 ? Rn_BANK (rn
- SIM_SH_R0_BANK0_REGNUM
)
2190 : saved_state
.asregs
.regs
[rn
- SIM_SH_R0_BANK0_REGNUM
]);
2192 case SIM_SH_R0_BANK1_REGNUM
: case SIM_SH_R1_BANK1_REGNUM
:
2193 case SIM_SH_R2_BANK1_REGNUM
: case SIM_SH_R3_BANK1_REGNUM
:
2194 case SIM_SH_R4_BANK1_REGNUM
: case SIM_SH_R5_BANK1_REGNUM
:
2195 case SIM_SH_R6_BANK1_REGNUM
: case SIM_SH_R7_BANK1_REGNUM
:
2196 val
= (! SR_MD
|| ! SR_RB
2197 ? Rn_BANK (rn
- SIM_SH_R0_BANK1_REGNUM
)
2198 : saved_state
.asregs
.regs
[rn
- SIM_SH_R0_BANK1_REGNUM
]);
2200 case SIM_SH_R0_BANK_REGNUM
: case SIM_SH_R1_BANK_REGNUM
:
2201 case SIM_SH_R2_BANK_REGNUM
: case SIM_SH_R3_BANK_REGNUM
:
2202 case SIM_SH_R4_BANK_REGNUM
: case SIM_SH_R5_BANK_REGNUM
:
2203 case SIM_SH_R6_BANK_REGNUM
: case SIM_SH_R7_BANK_REGNUM
:
2204 val
= Rn_BANK (rn
- SIM_SH_R0_BANK_REGNUM
);
2209 * (int *) memory
= swap (val
);
2221 sim_stop_reason (sd
, reason
, sigrc
)
2223 enum sim_stop
*reason
;
2226 /* The SH simulator uses SIGQUIT to indicate that the program has
2227 exited, so we must check for it here and translate it to exit. */
2228 if (saved_state
.asregs
.exception
== SIGQUIT
)
2230 *reason
= sim_exited
;
2231 *sigrc
= saved_state
.asregs
.regs
[5];
2235 *reason
= sim_stopped
;
2236 *sigrc
= saved_state
.asregs
.exception
;
2241 sim_info (sd
, verbose
)
2246 (double) saved_state
.asregs
.ticks
/ (double) now_persec ();
2247 double virttime
= saved_state
.asregs
.cycles
/ 36.0e6
;
2249 callback
->printf_filtered (callback
, "\n\n# instructions executed %10d\n",
2250 saved_state
.asregs
.insts
);
2251 callback
->printf_filtered (callback
, "# cycles %10d\n",
2252 saved_state
.asregs
.cycles
);
2253 callback
->printf_filtered (callback
, "# pipeline stalls %10d\n",
2254 saved_state
.asregs
.stalls
);
2255 callback
->printf_filtered (callback
, "# misaligned load/store %10d\n",
2256 saved_state
.asregs
.memstalls
);
2257 callback
->printf_filtered (callback
, "# real time taken %10.4f\n",
2259 callback
->printf_filtered (callback
, "# virtual time taken %10.4f\n",
2261 callback
->printf_filtered (callback
, "# profiling size %10d\n",
2263 callback
->printf_filtered (callback
, "# profiling frequency %10d\n",
2264 saved_state
.asregs
.profile
);
2265 callback
->printf_filtered (callback
, "# profile maxpc %10x\n",
2266 (1 << sim_profile_size
) << PROFILE_SHIFT
);
2270 callback
->printf_filtered (callback
, "# cycles/second %10d\n",
2271 (int) (saved_state
.asregs
.cycles
/ timetaken
));
2272 callback
->printf_filtered (callback
, "# simulation ratio %10.4f\n",
2273 virttime
/ timetaken
);
2281 saved_state
.asregs
.profile
= n
;
2285 sim_set_profile_size (n
)
2288 sim_profile_size
= n
;
2292 sim_open (kind
, cb
, abfd
, argv
)
2313 for (p
= argv
+ 1; *p
!= NULL
; ++p
)
2315 if (strcmp (*p
, "-E") == 0)
2320 /* FIXME: This doesn't use stderr, but then the rest of the
2321 file doesn't either. */
2322 callback
->printf_filtered (callback
, "Missing argument to `-E'.\n");
2325 target_little_endian
= strcmp (*p
, "big") != 0;
2328 else if (isdigit (**p
))
2329 parse_and_set_memory_size (*p
);
2332 if (abfd
!= NULL
&& ! endian_set
)
2333 target_little_endian
= ! bfd_big_endian (abfd
);
2338 for (i
= 4; (i
-= 2) >= 0; )
2339 mem_word
.s
[i
>> 1] = i
;
2340 global_endianw
= mem_word
.i
>> (target_little_endian
? 0 : 16) & 0xffff;
2342 for (i
= 4; --i
>= 0; )
2344 endianb
= mem_word
.i
>> (target_little_endian
? 0 : 24) & 0xff;
2346 /* fudge our descriptor for now */
2347 return (SIM_DESC
) 1;
2351 parse_and_set_memory_size (str
)
2356 n
= strtol (str
, NULL
, 10);
2357 if (n
> 0 && n
<= 24)
2358 sim_memory_size
= n
;
2360 callback
->printf_filtered (callback
, "Bad memory size %d; must be 1 to 24, inclusive\n", n
);
2364 sim_close (sd
, quitting
)
2372 sim_load (sd
, prog
, abfd
, from_tty
)
2378 extern bfd
*sim_load_file (); /* ??? Don't know where this should live. */
2381 prog_bfd
= sim_load_file (sd
, myname
, callback
, prog
, abfd
,
2382 sim_kind
== SIM_OPEN_DEBUG
,
2384 if (prog_bfd
== NULL
)
2387 bfd_close (prog_bfd
);
2392 sim_create_inferior (sd
, prog_bfd
, argv
, env
)
2394 struct bfd
*prog_bfd
;
2398 /* Clear the registers. */
2399 memset (&saved_state
, 0,
2400 (char*) &saved_state
.asregs
.end_of_registers
- (char*) &saved_state
);
2403 if (prog_bfd
!= NULL
)
2404 saved_state
.asregs
.pc
= bfd_get_start_address (prog_bfd
);
2406 /* Record the program's arguments. */
2413 sim_do_command (sd
, cmd
)
2417 char *sms_cmd
= "set-memory-size";
2420 if (cmd
== NULL
|| *cmd
== '\0')
2425 cmdsize
= strlen (sms_cmd
);
2426 if (strncmp (cmd
, sms_cmd
, cmdsize
) == 0
2427 && strchr (" \t", cmd
[cmdsize
]) != NULL
)
2429 parse_and_set_memory_size (cmd
+ cmdsize
+ 1);
2431 else if (strcmp (cmd
, "help") == 0)
2433 (callback
->printf_filtered
) (callback
,
2434 "List of SH simulator commands:\n\n");
2435 (callback
->printf_filtered
) (callback
, "set-memory-size <n> -- Set the number of address bits to use\n");
2436 (callback
->printf_filtered
) (callback
, "\n");
2440 (callback
->printf_filtered
) (callback
, "Error: \"%s\" is not a valid SH simulator command.\n", cmd
);
2445 sim_set_callbacks (p
)