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.
33 # define MAP_FAILED -1
35 # if !defined (MAP_ANONYMOUS) && defined (MAP_ANON)
36 # define MAP_ANONYMOUS MAP_ANON
52 #ifdef HAVE_SYS_STAT_H
58 #ifdef HAVE_SYS_TIME_H
67 #include "gdb/callback.h"
68 #include "gdb/remote-sim.h"
69 #include "gdb/sim-sh.h"
73 #include "sim-options.h"
75 /* This file is local - if newlib changes, then so should this. */
81 #include <float.h> /* Needed for _isnan() */
86 #define SIGBUS SIGSEGV
90 #define SIGQUIT SIGTERM
97 /* TODO: Stop using these names. */
101 extern unsigned short sh_jump_table
[], sh_dsp_table
[0x1000], ppi_table
[];
103 #define O_RECOMPILE 85
105 #define DISASSEMBLER_TABLE
107 /* Define the rate at which the simulator should poll the host
109 #define POLL_QUIT_INTERVAL 0x60000
111 /* TODO: Move into sim_cpu. */
112 saved_state_type saved_state
;
114 struct loop_bounds
{ unsigned char *start
, *end
; };
116 /* These variables are at file scope so that functions other than
117 sim_resume can use the fetch/store macros */
119 #define target_little_endian (CURRENT_TARGET_BYTE_ORDER == BFD_ENDIAN_LITTLE)
120 static int global_endianw
, endianb
;
121 static int target_dsp
;
122 #define host_little_endian (HOST_BYTE_ORDER == BFD_ENDIAN_LITTLE)
124 static int maskw
= 0;
125 static int maskl
= 0;
127 /* Short hand definitions of the registers */
129 #define SBIT(x) ((x)&sbit)
130 #define R0 saved_state.asregs.regs[0]
131 #define Rn saved_state.asregs.regs[n]
132 #define Rm saved_state.asregs.regs[m]
133 #define UR0 (unsigned int) (saved_state.asregs.regs[0])
134 #define UR (unsigned int) R
135 #define UR (unsigned int) R
136 #define SR0 saved_state.asregs.regs[0]
137 #define CREG(n) (saved_state.asregs.cregs.i[(n)])
138 #define GBR saved_state.asregs.cregs.named.gbr
139 #define VBR saved_state.asregs.cregs.named.vbr
140 #define DBR saved_state.asregs.cregs.named.dbr
141 #define TBR saved_state.asregs.cregs.named.tbr
142 #define IBCR saved_state.asregs.cregs.named.ibcr
143 #define IBNR saved_state.asregs.cregs.named.ibnr
144 #define BANKN (saved_state.asregs.cregs.named.ibnr & 0x1ff)
145 #define ME ((saved_state.asregs.cregs.named.ibnr >> 14) & 0x3)
146 #define SSR saved_state.asregs.cregs.named.ssr
147 #define SPC saved_state.asregs.cregs.named.spc
148 #define SGR saved_state.asregs.cregs.named.sgr
149 #define SREG(n) (saved_state.asregs.sregs.i[(n)])
150 #define MACH saved_state.asregs.sregs.named.mach
151 #define MACL saved_state.asregs.sregs.named.macl
152 #define PR saved_state.asregs.sregs.named.pr
153 #define FPUL saved_state.asregs.sregs.named.fpul
159 /* Alternate bank of registers r0-r7 */
161 /* Note: code controling SR handles flips between BANK0 and BANK1 */
162 #define Rn_BANK(n) (saved_state.asregs.cregs.named.bank[(n)])
163 #define SET_Rn_BANK(n, EXP) do { saved_state.asregs.cregs.named.bank[(n)] = (EXP); } while (0)
168 #define SR_MASK_BO (1 << 14)
169 #define SR_MASK_CS (1 << 13)
170 #define SR_MASK_DMY (1 << 11)
171 #define SR_MASK_DMX (1 << 10)
172 #define SR_MASK_M (1 << 9)
173 #define SR_MASK_Q (1 << 8)
174 #define SR_MASK_I (0xf << 4)
175 #define SR_MASK_S (1 << 1)
176 #define SR_MASK_T (1 << 0)
178 #define SR_MASK_BL (1 << 28)
179 #define SR_MASK_RB (1 << 29)
180 #define SR_MASK_MD (1 << 30)
181 #define SR_MASK_RC 0x0fff0000
182 #define SR_RC_INCREMENT -0x00010000
184 #define BO ((saved_state.asregs.cregs.named.sr & SR_MASK_BO) != 0)
185 #define CS ((saved_state.asregs.cregs.named.sr & SR_MASK_CS) != 0)
186 #define M ((saved_state.asregs.cregs.named.sr & SR_MASK_M) != 0)
187 #define Q ((saved_state.asregs.cregs.named.sr & SR_MASK_Q) != 0)
188 #define S ((saved_state.asregs.cregs.named.sr & SR_MASK_S) != 0)
189 #define T ((saved_state.asregs.cregs.named.sr & SR_MASK_T) != 0)
190 #define LDST ((saved_state.asregs.cregs.named.ldst) != 0)
192 #define SR_BL ((saved_state.asregs.cregs.named.sr & SR_MASK_BL) != 0)
193 #define SR_RB ((saved_state.asregs.cregs.named.sr & SR_MASK_RB) != 0)
194 #define SR_MD ((saved_state.asregs.cregs.named.sr & SR_MASK_MD) != 0)
195 #define SR_DMY ((saved_state.asregs.cregs.named.sr & SR_MASK_DMY) != 0)
196 #define SR_DMX ((saved_state.asregs.cregs.named.sr & SR_MASK_DMX) != 0)
197 #define SR_RC ((saved_state.asregs.cregs.named.sr & SR_MASK_RC))
199 /* Note: don't use this for privileged bits */
200 #define SET_SR_BIT(EXP, BIT) \
203 saved_state.asregs.cregs.named.sr |= (BIT); \
205 saved_state.asregs.cregs.named.sr &= ~(BIT); \
208 #define SET_SR_BO(EXP) SET_SR_BIT ((EXP), SR_MASK_BO)
209 #define SET_SR_CS(EXP) SET_SR_BIT ((EXP), SR_MASK_CS)
210 #define SET_BANKN(EXP) \
212 IBNR = (IBNR & 0xfe00) | (EXP & 0x1f); \
214 #define SET_ME(EXP) \
216 IBNR = (IBNR & 0x3fff) | ((EXP & 0x3) << 14); \
218 #define SET_SR_M(EXP) SET_SR_BIT ((EXP), SR_MASK_M)
219 #define SET_SR_Q(EXP) SET_SR_BIT ((EXP), SR_MASK_Q)
220 #define SET_SR_S(EXP) SET_SR_BIT ((EXP), SR_MASK_S)
221 #define SET_SR_T(EXP) SET_SR_BIT ((EXP), SR_MASK_T)
222 #define SET_LDST(EXP) (saved_state.asregs.cregs.named.ldst = ((EXP) != 0))
224 /* stc currently relies on being able to read SR without modifications. */
225 #define GET_SR() (saved_state.asregs.cregs.named.sr - 0)
227 #define SET_SR(x) set_sr (x)
230 (saved_state.asregs.cregs.named.sr \
231 = saved_state.asregs.cregs.named.sr & 0xf000ffff | ((x) & 0xfff) << 16)
233 /* Manipulate FPSCR */
235 #define FPSCR_MASK_FR (1 << 21)
236 #define FPSCR_MASK_SZ (1 << 20)
237 #define FPSCR_MASK_PR (1 << 19)
239 #define FPSCR_FR ((GET_FPSCR () & FPSCR_MASK_FR) != 0)
240 #define FPSCR_SZ ((GET_FPSCR () & FPSCR_MASK_SZ) != 0)
241 #define FPSCR_PR ((GET_FPSCR () & FPSCR_MASK_PR) != 0)
246 int old
= saved_state
.asregs
.sregs
.named
.fpscr
;
247 saved_state
.asregs
.sregs
.named
.fpscr
= (x
);
248 /* swap the floating point register banks */
249 if ((saved_state
.asregs
.sregs
.named
.fpscr
^ old
) & FPSCR_MASK_FR
250 /* Ignore bit change if simulating sh-dsp. */
253 union fregs_u tmpf
= saved_state
.asregs
.fregs
[0];
254 saved_state
.asregs
.fregs
[0] = saved_state
.asregs
.fregs
[1];
255 saved_state
.asregs
.fregs
[1] = tmpf
;
259 /* sts relies on being able to read fpscr directly. */
260 #define GET_FPSCR() (saved_state.asregs.sregs.named.fpscr)
261 #define SET_FPSCR(x) \
266 #define DSR (saved_state.asregs.sregs.named.fpscr)
268 #define RAISE_EXCEPTION(x) \
269 (saved_state.asregs.exception = x, saved_state.asregs.insn_end = 0)
271 #define RAISE_EXCEPTION_IF_IN_DELAY_SLOT() \
272 if (in_delay_slot) RAISE_EXCEPTION (SIGILL)
274 /* This function exists mainly for the purpose of setting a breakpoint to
275 catch simulated bus errors when running the simulator under GDB. */
278 raise_exception (int x
)
284 raise_buserror (void)
286 raise_exception (SIGBUS
);
289 #define PROCESS_SPECIAL_ADDRESS(addr, endian, ptr, bits_written, \
290 forbidden_addr_bits, data, retval) \
292 if (addr & forbidden_addr_bits) \
297 else if ((addr & saved_state.asregs.xyram_select) \
298 == saved_state.asregs.xram_start) \
299 ptr = (void *) &saved_state.asregs.xmem_offset[addr ^ endian]; \
300 else if ((addr & saved_state.asregs.xyram_select) \
301 == saved_state.asregs.yram_start) \
302 ptr = (void *) &saved_state.asregs.ymem_offset[addr ^ endian]; \
303 else if ((unsigned) addr >> 24 == 0xf0 \
304 && bits_written == 32 && (data & 1) == 0) \
305 /* This invalidates (if not associative) or might invalidate \
306 (if associative) an instruction cache line. This is used for \
307 trampolines. Since we don't simulate the cache, this is a no-op \
308 as far as the simulator is concerned. */ \
312 if (bits_written == 8 && addr > 0x5000000) \
313 IOMEM (addr, 1, data); \
314 /* We can't do anything useful with the other stuff, so fail. */ \
320 /* FIXME: sim_resume should be renamed to sim_engine_run. sim_resume
321 being implemented by ../common/sim_resume.c and the below should
322 make a call to sim_engine_halt */
324 #define BUSERROR(addr, mask) ((addr) & (mask))
326 #define WRITE_BUSERROR(addr, mask, data, addr_func) \
331 addr_func (addr, data); \
337 #define READ_BUSERROR(addr, mask, addr_func) \
341 return addr_func (addr); \
345 /* Define this to enable register lifetime checking.
346 The compiler generates "add #0,rn" insns to mark registers as invalid,
347 the simulator uses this info to call fail if it finds a ref to an invalid
348 register before a def
355 #define CREF(x) if (!valid[x]) fail ();
356 #define CDEF(x) valid[x] = 1;
357 #define UNDEF(x) valid[x] = 0;
364 static void parse_and_set_memory_size (SIM_DESC sd
, const char *str
);
365 static int IOMEM (int addr
, int write
, int value
);
366 static struct loop_bounds
get_loop_bounds (int, int, unsigned char *,
367 unsigned char *, int, int);
368 static void process_wlat_addr (int, int);
369 static void process_wwat_addr (int, int);
370 static void process_wbat_addr (int, int);
371 static int process_rlat_addr (int);
372 static int process_rwat_addr (int);
373 static int process_rbat_addr (int);
375 /* Floating point registers */
377 #define DR(n) (get_dr (n))
382 if (host_little_endian
)
389 dr
.i
[1] = saved_state
.asregs
.fregs
[0].i
[n
+ 0];
390 dr
.i
[0] = saved_state
.asregs
.fregs
[0].i
[n
+ 1];
394 return (saved_state
.asregs
.fregs
[0].d
[n
>> 1]);
397 #define SET_DR(n, EXP) set_dr ((n), (EXP))
399 set_dr (int n
, double exp
)
402 if (host_little_endian
)
410 saved_state
.asregs
.fregs
[0].i
[n
+ 0] = dr
.i
[1];
411 saved_state
.asregs
.fregs
[0].i
[n
+ 1] = dr
.i
[0];
414 saved_state
.asregs
.fregs
[0].d
[n
>> 1] = exp
;
417 #define SET_FI(n,EXP) (saved_state.asregs.fregs[0].i[(n)] = (EXP))
418 #define FI(n) (saved_state.asregs.fregs[0].i[(n)])
420 #define FR(n) (saved_state.asregs.fregs[0].f[(n)])
421 #define SET_FR(n,EXP) (saved_state.asregs.fregs[0].f[(n)] = (EXP))
423 #define XD_TO_XF(n) ((((n) & 1) << 5) | ((n) & 0x1e))
424 #define XF(n) (saved_state.asregs.fregs[(n) >> 5].i[(n) & 0x1f])
425 #define SET_XF(n,EXP) (saved_state.asregs.fregs[(n) >> 5].i[(n) & 0x1f] = (EXP))
427 #define RS saved_state.asregs.cregs.named.rs
428 #define RE saved_state.asregs.cregs.named.re
429 #define MOD (saved_state.asregs.cregs.named.mod)
432 MOD_ME = (unsigned) MOD >> 16 | (SR_DMY ? ~0xffff : (SR_DMX ? 0 : 0x10000)), \
433 MOD_DELTA = (MOD & 0xffff) - ((unsigned) MOD >> 16))
435 #define DSP_R(n) saved_state.asregs.sregs.i[(n)]
436 #define DSP_GRD(n) DSP_R ((n) + 8)
437 #define GET_DSP_GRD(n) ((n | 2) == 7 ? SEXT (DSP_GRD (n)) : SIGN32 (DSP_R (n)))
442 #define Y0 DSP_R (10)
443 #define Y1 DSP_R (11)
444 #define M0 DSP_R (12)
445 #define A1G DSP_R (13)
446 #define M1 DSP_R (14)
447 #define A0G DSP_R (15)
448 /* DSP_R (16) / DSP_GRD (16) are used as a fake destination for pcmp. */
449 #define MOD_ME DSP_GRD (17)
450 #define MOD_DELTA DSP_GRD (18)
452 #define FP_OP(n, OP, m) \
456 if (((n) & 1) || ((m) & 1)) \
457 RAISE_EXCEPTION (SIGILL); \
459 SET_DR (n, (DR (n) OP DR (m))); \
462 SET_FR (n, (FR (n) OP FR (m))); \
465 #define FP_UNARY(n, OP) \
470 RAISE_EXCEPTION (SIGILL); \
472 SET_DR (n, (OP (DR (n)))); \
475 SET_FR (n, (OP (FR (n)))); \
478 #define FP_CMP(n, OP, m) \
482 if (((n) & 1) || ((m) & 1)) \
483 RAISE_EXCEPTION (SIGILL); \
485 SET_SR_T (DR (n) OP DR (m)); \
488 SET_SR_T (FR (n) OP FR (m)); \
494 /* do we need to swap banks */
495 int old_gpr
= SR_MD
&& SR_RB
;
496 int new_gpr
= (new_sr
& SR_MASK_MD
) && (new_sr
& SR_MASK_RB
);
497 if (old_gpr
!= new_gpr
)
500 for (i
= 0; i
< 8; i
++)
502 tmp
= saved_state
.asregs
.cregs
.named
.bank
[i
];
503 saved_state
.asregs
.cregs
.named
.bank
[i
] = saved_state
.asregs
.regs
[i
];
504 saved_state
.asregs
.regs
[i
] = tmp
;
507 saved_state
.asregs
.cregs
.named
.sr
= new_sr
;
512 wlat_fast (unsigned char *memory
, int x
, int value
, int maskl
)
515 unsigned int *p
= (unsigned int *) (memory
+ x
);
516 WRITE_BUSERROR (x
, maskl
, v
, process_wlat_addr
);
521 wwat_fast (unsigned char *memory
, int x
, int value
, int maskw
, int endianw
)
524 unsigned short *p
= (unsigned short *) (memory
+ (x
^ endianw
));
525 WRITE_BUSERROR (x
, maskw
, v
, process_wwat_addr
);
530 wbat_fast (unsigned char *memory
, int x
, int value
, int maskb
)
532 unsigned char *p
= memory
+ (x
^ endianb
);
533 WRITE_BUSERROR (x
, maskb
, value
, process_wbat_addr
);
541 rlat_fast (unsigned char *memory
, int x
, int maskl
)
543 unsigned int *p
= (unsigned int *) (memory
+ x
);
544 READ_BUSERROR (x
, maskl
, process_rlat_addr
);
550 rwat_fast (unsigned char *memory
, int x
, int maskw
, int endianw
)
552 unsigned short *p
= (unsigned short *) (memory
+ (x
^ endianw
));
553 READ_BUSERROR (x
, maskw
, process_rwat_addr
);
559 riat_fast (unsigned char *insn_ptr
, int endianw
)
561 unsigned short *p
= (unsigned short *) ((uintptr_t) insn_ptr
^ endianw
);
567 rbat_fast (unsigned char *memory
, int x
, int maskb
)
569 unsigned char *p
= memory
+ (x
^ endianb
);
570 READ_BUSERROR (x
, maskb
, process_rbat_addr
);
575 #define RWAT(x) (rwat_fast (memory, x, maskw, endianw))
576 #define RLAT(x) (rlat_fast (memory, x, maskl))
577 #define RBAT(x) (rbat_fast (memory, x, maskb))
578 #define RIAT(p) (riat_fast ((p), endianw))
579 #define WWAT(x,v) (wwat_fast (memory, x, v, maskw, endianw))
580 #define WLAT(x,v) (wlat_fast (memory, x, v, maskl))
581 #define WBAT(x,v) (wbat_fast (memory, x, v, maskb))
583 #define RUWAT(x) (RWAT (x) & 0xffff)
584 #define RSWAT(x) ((short) (RWAT (x)))
585 #define RSLAT(x) ((long) (RLAT (x)))
586 #define RSBAT(x) (SEXT (RBAT (x)))
588 #define RDAT(x, n) (do_rdat (memory, (x), (n), (maskl)))
590 do_rdat (unsigned char *memory
, int x
, int n
, int maskl
)
596 f0
= rlat_fast (memory
, x
+ 0, maskl
);
597 f1
= rlat_fast (memory
, x
+ 4, maskl
);
598 saved_state
.asregs
.fregs
[i
].i
[(j
+ 0)] = f0
;
599 saved_state
.asregs
.fregs
[i
].i
[(j
+ 1)] = f1
;
603 #define WDAT(x, n) (do_wdat (memory, (x), (n), (maskl)))
605 do_wdat (unsigned char *memory
, int x
, int n
, int maskl
)
611 f0
= saved_state
.asregs
.fregs
[i
].i
[(j
+ 0)];
612 f1
= saved_state
.asregs
.fregs
[i
].i
[(j
+ 1)];
613 wlat_fast (memory
, (x
+ 0), f0
, maskl
);
614 wlat_fast (memory
, (x
+ 4), f1
, maskl
);
619 process_wlat_addr (int addr
, int value
)
623 PROCESS_SPECIAL_ADDRESS (addr
, endianb
, ptr
, 32, 3, value
, );
628 process_wwat_addr (int addr
, int value
)
632 PROCESS_SPECIAL_ADDRESS (addr
, endianb
, ptr
, 16, 1, value
, );
637 process_wbat_addr (int addr
, int value
)
641 PROCESS_SPECIAL_ADDRESS (addr
, endianb
, ptr
, 8, 0, value
, );
646 process_rlat_addr (int addr
)
650 PROCESS_SPECIAL_ADDRESS (addr
, endianb
, ptr
, -32, 3, -1, 0);
655 process_rwat_addr (int addr
)
659 PROCESS_SPECIAL_ADDRESS (addr
, endianb
, ptr
, -16, 1, -1, 0);
664 process_rbat_addr (int addr
)
668 PROCESS_SPECIAL_ADDRESS (addr
, endianb
, ptr
, -8, 0, -1, 0);
672 #define SEXT(x) (((x & 0xff) ^ (~0x7f))+0x80)
673 #define SEXT12(x) (((x & 0xfff) ^ 0x800) - 0x800)
674 #define SEXTW(y) ((int) ((short) y))
676 #define SEXT32(x) ((int) ((x & 0xffffffff) ^ 0x80000000U) - 0x7fffffff - 1)
678 #define SEXT32(x) ((int) (x))
680 #define SIGN32(x) (SEXT32 (x) >> 31)
682 /* convert pointer from target to host value. */
683 #define PT2H(x) ((x) + memory)
684 /* convert pointer from host to target value. */
685 #define PH2T(x) ((x) - memory)
687 #define SKIP_INSN(p) ((p) += ((RIAT (p) & 0xfc00) == 0xf800 ? 4 : 2))
689 #define SET_NIP(x) nip = (x); CHECK_INSN_PTR (nip);
691 static int in_delay_slot
= 0;
692 #define Delay_Slot(TEMPPC) iword = RIAT (TEMPPC); in_delay_slot = 1; goto top;
694 #define CHECK_INSN_PTR(p) \
696 if (saved_state.asregs.exception || PH2T (p) & maskw) \
697 saved_state.asregs.insn_end = 0; \
698 else if (p < loop.end) \
699 saved_state.asregs.insn_end = loop.end; \
701 saved_state.asregs.insn_end = mem_end; \
714 do { memstalls += ((((long) PC & 3) != 0) ? (n) : ((n) - 1)); } while (0)
716 #define L(x) thislock = x;
717 #define TL(x) if ((x) == prevlock) stalls++;
718 #define TB(x,y) if ((x) == prevlock || (y) == prevlock) stalls++;
722 #if defined(__GO32__)
723 int sim_memory_size
= 19;
725 int sim_memory_size
= 30;
728 static int sim_profile_size
= 17;
734 #define SMR1 (0x05FFFEC8) /* Channel 1 serial mode register */
735 #define BRR1 (0x05FFFEC9) /* Channel 1 bit rate register */
736 #define SCR1 (0x05FFFECA) /* Channel 1 serial control register */
737 #define TDR1 (0x05FFFECB) /* Channel 1 transmit data register */
738 #define SSR1 (0x05FFFECC) /* Channel 1 serial status register */
739 #define RDR1 (0x05FFFECD) /* Channel 1 receive data register */
741 #define SCI_RDRF 0x40 /* Recieve data register full */
742 #define SCI_TDRE 0x80 /* Transmit data register empty */
745 IOMEM (int addr
, int write
, int value
)
774 return time ((long *) 0);
783 static FILE *profile_file
;
785 static INLINE
unsigned
789 n
= (n
<< 24 | (n
& 0xff00) << 8
790 | (n
& 0xff0000) >> 8 | (n
& 0xff000000) >> 24);
794 static INLINE
unsigned short
795 swap16 (unsigned short n
)
798 n
= n
<< 8 | (n
& 0xff00) >> 8;
807 union { char b
[4]; int n
; } u
;
809 fwrite (u
.b
, 4, 1, profile_file
);
816 union { char b
[4]; int n
; } u
;
818 fwrite (u
.b
, 2, 1, profile_file
);
821 /* Turn a pointer in a register into a pointer into real memory. */
826 return (char *) (x
+ saved_state
.asregs
.memory
);
829 /* STR points to a zero-terminated string in target byte order. Return
830 the number of bytes that need to be converted to host byte order in order
831 to use this string as a zero-terminated string on the host.
832 (Not counting the rounding up needed to operate on entire words.) */
836 unsigned char *memory
= saved_state
.asregs
.memory
;
838 int endian
= endianb
;
843 for (end
= str
; memory
[end
^ endian
]; end
++) ;
844 return end
- str
+ 1;
848 strnswap (int str
, int len
)
852 if (! endianb
|| ! len
)
854 start
= (int *) ptr (str
& ~3);
855 end
= (int *) ptr (str
+ len
);
859 *start
= (old
<< 24 | (old
& 0xff00) << 8
860 | (old
& 0xff0000) >> 8 | (old
& 0xff000000) >> 24);
866 /* Simulate a monitor trap, put the result into r0 and errno into r1
867 return offset by which to adjust pc. */
870 trap (SIM_DESC sd
, int i
, int *regs
, unsigned char *insn_ptr
,
871 unsigned char *memory
, int maskl
, int maskw
, int endianw
)
873 host_callback
*callback
= STATE_CALLBACK (sd
);
874 char **prog_argv
= STATE_PROG_ARGV (sd
);
879 printf ("%c", regs
[0]);
882 raise_exception (SIGQUIT
);
884 case 3: /* FIXME: for backwards compat, should be removed */
887 unsigned int countp
= * (unsigned int *) (insn_ptr
+ 4);
889 WLAT (countp
, RLAT (countp
) + 1);
901 #if !defined(__GO32__) && !defined(_WIN32)
905 /* This would work only if endianness matched between host and target.
906 Besides, it's quite dangerous. */
909 regs
[0] = execve (ptr (regs
[5]), (char **) ptr (regs
[6]),
910 (char **) ptr (regs
[7]));
913 regs
[0] = execve (ptr (regs
[5]), (char **) ptr (regs
[6]), 0);
918 regs
[0] = (BUSERROR (regs
[5], maskl
)
920 : pipe ((int *) ptr (regs
[5])));
925 regs
[0] = wait ((int *) ptr (regs
[5]));
927 #endif /* !defined(__GO32__) && !defined(_WIN32) */
930 strnswap (regs
[6], regs
[7]);
932 = callback
->read (callback
, regs
[5], ptr (regs
[6]), regs
[7]);
933 strnswap (regs
[6], regs
[7]);
936 strnswap (regs
[6], regs
[7]);
938 regs
[0] = (int) callback
->write_stdout (callback
,
939 ptr (regs
[6]), regs
[7]);
941 regs
[0] = (int) callback
->write (callback
, regs
[5],
942 ptr (regs
[6]), regs
[7]);
943 strnswap (regs
[6], regs
[7]);
946 regs
[0] = callback
->lseek (callback
,regs
[5], regs
[6], regs
[7]);
949 regs
[0] = callback
->close (callback
,regs
[5]);
953 int len
= strswaplen (regs
[5]);
954 strnswap (regs
[5], len
);
955 regs
[0] = callback
->open (callback
, ptr (regs
[5]), regs
[6]);
956 strnswap (regs
[5], len
);
960 /* EXIT - caller can look in r5 to work out the reason */
961 raise_exception (SIGQUIT
);
965 case SYS_stat
: /* added at hmsi */
966 /* stat system call */
968 struct stat host_stat
;
970 int len
= strswaplen (regs
[5]);
972 strnswap (regs
[5], len
);
973 regs
[0] = stat (ptr (regs
[5]), &host_stat
);
974 strnswap (regs
[5], len
);
978 WWAT (buf
, host_stat
.st_dev
);
980 WWAT (buf
, host_stat
.st_ino
);
982 WLAT (buf
, host_stat
.st_mode
);
984 WWAT (buf
, host_stat
.st_nlink
);
986 WWAT (buf
, host_stat
.st_uid
);
988 WWAT (buf
, host_stat
.st_gid
);
990 WWAT (buf
, host_stat
.st_rdev
);
992 WLAT (buf
, host_stat
.st_size
);
994 WLAT (buf
, host_stat
.st_atime
);
998 WLAT (buf
, host_stat
.st_mtime
);
1002 WLAT (buf
, host_stat
.st_ctime
);
1016 int len
= strswaplen (regs
[5]);
1018 strnswap (regs
[5], len
);
1019 regs
[0] = chown (ptr (regs
[5]), regs
[6], regs
[7]);
1020 strnswap (regs
[5], len
);
1026 int len
= strswaplen (regs
[5]);
1028 strnswap (regs
[5], len
);
1029 regs
[0] = chmod (ptr (regs
[5]), regs
[6]);
1030 strnswap (regs
[5], len
);
1035 /* Cast the second argument to void *, to avoid type mismatch
1036 if a prototype is present. */
1037 int len
= strswaplen (regs
[5]);
1039 strnswap (regs
[5], len
);
1040 regs
[0] = utime (ptr (regs
[5]), (void *) ptr (regs
[6]));
1041 strnswap (regs
[5], len
);
1045 regs
[0] = countargv (prog_argv
);
1048 if (regs
[5] < countargv (prog_argv
))
1049 regs
[0] = strlen (prog_argv
[regs
[5]]);
1054 if (regs
[5] < countargv (prog_argv
))
1056 /* Include the termination byte. */
1057 int i
= strlen (prog_argv
[regs
[5]]) + 1;
1058 regs
[0] = sim_write (0, regs
[6], (void *) prog_argv
[regs
[5]], i
);
1064 regs
[0] = get_now ();
1067 regs
[0] = callback
->ftruncate (callback
, regs
[5], regs
[6]);
1071 int len
= strswaplen (regs
[5]);
1072 strnswap (regs
[5], len
);
1073 regs
[0] = callback
->truncate (callback
, ptr (regs
[5]), regs
[6]);
1074 strnswap (regs
[5], len
);
1081 regs
[1] = callback
->get_errno (callback
);
1086 case 13: /* Set IBNR */
1087 IBNR
= regs
[0] & 0xffff;
1089 case 14: /* Set IBCR */
1090 IBCR
= regs
[0] & 0xffff;
1094 raise_exception (SIGTRAP
);
1103 div1 (int *R
, int iRn2
, int iRn1
/*, int T*/)
1106 unsigned char old_q
, tmp1
;
1109 SET_SR_Q ((unsigned char) ((0x80000000 & R
[iRn1
]) != 0));
1111 R
[iRn1
] |= (unsigned long) T
;
1121 tmp1
= (R
[iRn1
] > tmp0
);
1128 SET_SR_Q ((unsigned char) (tmp1
== 0));
1135 tmp1
= (R
[iRn1
] < tmp0
);
1139 SET_SR_Q ((unsigned char) (tmp1
== 0));
1154 tmp1
= (R
[iRn1
] < tmp0
);
1161 SET_SR_Q ((unsigned char) (tmp1
== 0));
1168 tmp1
= (R
[iRn1
] > tmp0
);
1172 SET_SR_Q ((unsigned char) (tmp1
== 0));
1188 dmul_s (uint32_t rm
, uint32_t rn
)
1190 int64_t res
= (int64_t)(int32_t)rm
* (int64_t)(int32_t)rn
;
1191 MACH
= (uint32_t)((uint64_t)res
>> 32);
1192 MACL
= (uint32_t)res
;
1196 dmul_u (uint32_t rm
, uint32_t rn
)
1198 uint64_t res
= (uint64_t)(uint32_t)rm
* (uint64_t)(uint32_t)rn
;
1199 MACH
= (uint32_t)(res
>> 32);
1200 MACL
= (uint32_t)res
;
1204 macw (int *regs
, unsigned char *memory
, int n
, int m
, int endianw
)
1207 long prod
, macl
, sum
;
1209 tempm
=RSWAT (regs
[m
]); regs
[m
]+=2;
1210 tempn
=RSWAT (regs
[n
]); regs
[n
]+=2;
1213 prod
= (long) (short) tempm
* (long) (short) tempn
;
1217 if ((~(prod
^ macl
) & (sum
^ prod
)) < 0)
1219 /* MACH's lsb is a sticky overflow bit. */
1221 /* Store the smallest negative number in MACL if prod is
1222 negative, and the largest positive number otherwise. */
1223 sum
= 0x7fffffff + (prod
< 0);
1229 /* Add to MACH the sign extended product, and carry from low sum. */
1230 mach
= MACH
+ (-(prod
< 0)) + ((unsigned long) sum
< prod
);
1231 /* Sign extend at 10:th bit in MACH. */
1232 MACH
= (mach
& 0x1ff) | -(mach
& 0x200);
1238 macl (int *regs
, unsigned char *memory
, int n
, int m
)
1245 tempm
= RSLAT (regs
[m
]);
1248 tempn
= RSLAT (regs
[n
]);
1254 mac64
= ((long long) macl
& 0xffffffff) |
1255 ((long long) mach
& 0xffffffff) << 32;
1257 ans
= (long long) tempm
* (long long) tempn
; /* Multiply 32bit * 32bit */
1259 mac64
+= ans
; /* Accumulate 64bit + 64 bit */
1261 macl
= (long) (mac64
& 0xffffffff);
1262 mach
= (long) ((mac64
>> 32) & 0xffffffff);
1264 if (S
) /* Store only 48 bits of the result */
1266 if (mach
< 0) /* Result is negative */
1268 mach
= mach
& 0x0000ffff; /* Mask higher 16 bits */
1269 mach
|= 0xffff8000; /* Sign extend higher 16 bits */
1272 mach
= mach
& 0x00007fff; /* Postive Result */
1303 /* Do extended displacement move instructions. */
1305 do_long_move_insn (int op
, int disp12
, int m
, int n
, int *thatlock
)
1308 int thislock
= *thatlock
;
1309 int endianw
= global_endianw
;
1310 int *R
= &(saved_state
.asregs
.regs
[0]);
1311 unsigned char *memory
= saved_state
.asregs
.memory
;
1312 int maskb
= ~((saved_state
.asregs
.msize
- 1) & ~0);
1313 unsigned char *insn_ptr
= PT2H (saved_state
.asregs
.pc
);
1316 case MOVB_RM
: /* signed */
1317 WBAT (disp12
* 1 + R
[n
], R
[m
]);
1320 WWAT (disp12
* 2 + R
[n
], R
[m
]);
1323 WLAT (disp12
* 4 + R
[n
], R
[m
]);
1325 case FMOV_RM
: /* floating point */
1329 WDAT (R
[n
] + 8 * disp12
, m
);
1332 WLAT (R
[n
] + 4 * disp12
, FI (m
));
1335 R
[n
] = RSBAT (disp12
* 1 + R
[m
]);
1339 R
[n
] = RSWAT (disp12
* 2 + R
[m
]);
1343 R
[n
] = RLAT (disp12
* 4 + R
[m
]);
1349 RDAT (R
[m
] + 8 * disp12
, n
);
1352 SET_FI (n
, RLAT (R
[m
] + 4 * disp12
));
1354 case MOVU_BMR
: /* unsigned */
1355 R
[n
] = RBAT (disp12
* 1 + R
[m
]);
1359 R
[n
] = RWAT (disp12
* 2 + R
[m
]);
1363 RAISE_EXCEPTION (SIGINT
);
1366 saved_state
.asregs
.memstalls
+= memstalls
;
1367 *thatlock
= thislock
;
1370 /* Do binary logical bit-manipulation insns. */
1372 do_blog_insn (int imm
, int addr
, int binop
,
1373 unsigned char *memory
, int maskb
)
1375 int oldval
= RBAT (addr
);
1378 case B_BCLR
: /* bclr.b */
1379 WBAT (addr
, oldval
& ~imm
);
1381 case B_BSET
: /* bset.b */
1382 WBAT (addr
, oldval
| imm
);
1384 case B_BST
: /* bst.b */
1386 WBAT (addr
, oldval
| imm
);
1388 WBAT (addr
, oldval
& ~imm
);
1390 case B_BLD
: /* bld.b */
1391 SET_SR_T ((oldval
& imm
) != 0);
1393 case B_BAND
: /* band.b */
1394 SET_SR_T (T
&& ((oldval
& imm
) != 0));
1396 case B_BOR
: /* bor.b */
1397 SET_SR_T (T
|| ((oldval
& imm
) != 0));
1399 case B_BXOR
: /* bxor.b */
1400 SET_SR_T (T
^ ((oldval
& imm
) != 0));
1402 case B_BLDNOT
: /* bldnot.b */
1403 SET_SR_T ((oldval
& imm
) == 0);
1405 case B_BANDNOT
: /* bandnot.b */
1406 SET_SR_T (T
&& ((oldval
& imm
) == 0));
1408 case B_BORNOT
: /* bornot.b */
1409 SET_SR_T (T
|| ((oldval
& imm
) == 0));
1415 fsca_s (int in
, double (*f
) (double))
1417 double rad
= ldexp ((in
& 0xffff), -15) * 3.141592653589793238462643383;
1418 double result
= (*f
) (rad
);
1419 double error
, upper
, lower
, frac
;
1422 /* Search the value with the maximum error that is still within the
1423 architectural spec. */
1424 error
= ldexp (1., -21);
1425 /* compensate for calculation inaccuracy by reducing error. */
1426 error
= error
- ldexp (1., -50);
1427 upper
= result
+ error
;
1428 frac
= frexp (upper
, &exp
);
1429 upper
= ldexp (floor (ldexp (frac
, 24)), exp
- 24);
1430 lower
= result
- error
;
1431 frac
= frexp (lower
, &exp
);
1432 lower
= ldexp (ceil (ldexp (frac
, 24)), exp
- 24);
1433 return abs (upper
- result
) >= abs (lower
- result
) ? upper
: lower
;
1439 double result
= 1. / sqrt (in
);
1441 double frac
, upper
, lower
, error
, eps
;
1444 result
= result
- (result
* result
* in
- 1) * 0.5 * result
;
1445 /* Search the value with the maximum error that is still within the
1446 architectural spec. */
1447 frac
= frexp (result
, &exp
);
1448 frac
= ldexp (frac
, 24);
1449 error
= 4.0; /* 1 << 24-1-21 */
1450 /* use eps to compensate for possible 1 ulp error in our 'exact' result. */
1451 eps
= ldexp (1., -29);
1452 upper
= floor (frac
+ error
- eps
);
1453 if (upper
> 16777216.)
1454 upper
= floor ((frac
+ error
- eps
) * 0.5) * 2.;
1455 lower
= ceil ((frac
- error
+ eps
) * 2) * .5;
1456 if (lower
> 8388608.)
1457 lower
= ceil (frac
- error
+ eps
);
1458 upper
= ldexp (upper
, exp
- 24);
1459 lower
= ldexp (lower
, exp
- 24);
1460 return upper
- result
>= result
- lower
? upper
: lower
;
1464 /* GET_LOOP_BOUNDS {EXTENDED}
1465 These two functions compute the actual starting and ending point
1466 of the repeat loop, based on the RS and RE registers (repeat start,
1467 repeat stop). The extended version is called for LDRC, and the
1468 regular version is called for SETRC. The difference is that for
1469 LDRC, the loop start and end instructions are literally the ones
1470 pointed to by RS and RE -- for SETRC, they're not (see docs). */
1472 static struct loop_bounds
1473 get_loop_bounds_ext (int rs
, int re
, unsigned char *memory
,
1474 unsigned char *mem_end
, int maskw
, int endianw
)
1476 struct loop_bounds loop
;
1478 /* FIXME: should I verify RS < RE? */
1479 loop
.start
= PT2H (RS
); /* FIXME not using the params? */
1480 loop
.end
= PT2H (RE
& ~1); /* Ignore bit 0 of RE. */
1481 SKIP_INSN (loop
.end
);
1482 if (loop
.end
>= mem_end
)
1483 loop
.end
= PT2H (0);
1487 static struct loop_bounds
1488 get_loop_bounds (int rs
, int re
, unsigned char *memory
, unsigned char *mem_end
,
1489 int maskw
, int endianw
)
1491 struct loop_bounds loop
;
1497 loop
.start
= PT2H (RE
- 4);
1498 SKIP_INSN (loop
.start
);
1499 loop
.end
= loop
.start
;
1501 SKIP_INSN (loop
.end
);
1503 SKIP_INSN (loop
.end
);
1504 SKIP_INSN (loop
.end
);
1508 loop
.start
= PT2H (RS
);
1509 loop
.end
= PT2H (RE
- 4);
1510 SKIP_INSN (loop
.end
);
1511 SKIP_INSN (loop
.end
);
1512 SKIP_INSN (loop
.end
);
1513 SKIP_INSN (loop
.end
);
1515 if (loop
.end
>= mem_end
)
1516 loop
.end
= PT2H (0);
1519 loop
.end
= PT2H (0);
1524 static void ppi_insn ();
1528 /* Provide calloc / free versions that use an anonymous mmap. This can
1529 significantly cut the start-up time when a large simulator memory is
1530 required, because pages are only zeroed on demand. */
1531 #ifdef MAP_ANONYMOUS
1533 mcalloc (size_t nmemb
, size_t size
)
1539 return mmap (0, size
, PROT_READ
| PROT_WRITE
, MAP_PRIVATE
| MAP_ANONYMOUS
,
1543 #define mfree(start,length) munmap ((start), (length))
1545 #define mcalloc calloc
1546 #define mfree(start,length) free(start)
1549 /* Set the memory size to the power of two provided. */
1552 sim_size (int power
)
1554 sim_memory_size
= power
;
1556 if (saved_state
.asregs
.memory
)
1558 mfree (saved_state
.asregs
.memory
, saved_state
.asregs
.msize
);
1561 saved_state
.asregs
.msize
= 1 << power
;
1563 saved_state
.asregs
.memory
=
1564 (unsigned char *) mcalloc (1, saved_state
.asregs
.msize
);
1566 if (!saved_state
.asregs
.memory
)
1569 "Not enough VM for simulation of %d bytes of RAM\n",
1570 saved_state
.asregs
.msize
);
1572 saved_state
.asregs
.msize
= 1;
1573 saved_state
.asregs
.memory
= (unsigned char *) mcalloc (1, 1);
1578 init_dsp (struct bfd
*abfd
)
1580 int was_dsp
= target_dsp
;
1581 unsigned long mach
= bfd_get_mach (abfd
);
1583 if (mach
== bfd_mach_sh_dsp
||
1584 mach
== bfd_mach_sh4al_dsp
||
1585 mach
== bfd_mach_sh3_dsp
)
1587 int ram_area_size
, xram_start
, yram_start
;
1591 if (mach
== bfd_mach_sh_dsp
)
1593 /* SH7410 (orig. sh-sdp):
1594 4KB each for X & Y memory;
1595 On-chip X RAM 0x0800f000-0x0800ffff
1596 On-chip Y RAM 0x0801f000-0x0801ffff */
1597 xram_start
= 0x0800f000;
1598 ram_area_size
= 0x1000;
1600 if (mach
== bfd_mach_sh3_dsp
|| mach
== bfd_mach_sh4al_dsp
)
1603 8KB each for X & Y memory;
1604 On-chip X RAM 0x1000e000-0x1000ffff
1605 On-chip Y RAM 0x1001e000-0x1001ffff */
1606 xram_start
= 0x1000e000;
1607 ram_area_size
= 0x2000;
1609 yram_start
= xram_start
+ 0x10000;
1610 new_select
= ~(ram_area_size
- 1);
1611 if (saved_state
.asregs
.xyram_select
!= new_select
)
1613 saved_state
.asregs
.xyram_select
= new_select
;
1614 free (saved_state
.asregs
.xmem
);
1615 free (saved_state
.asregs
.ymem
);
1616 saved_state
.asregs
.xmem
=
1617 (unsigned char *) calloc (1, ram_area_size
);
1618 saved_state
.asregs
.ymem
=
1619 (unsigned char *) calloc (1, ram_area_size
);
1621 /* Disable use of X / Y mmeory if not allocated. */
1622 if (! saved_state
.asregs
.xmem
|| ! saved_state
.asregs
.ymem
)
1624 saved_state
.asregs
.xyram_select
= 0;
1625 if (saved_state
.asregs
.xmem
)
1626 free (saved_state
.asregs
.xmem
);
1627 if (saved_state
.asregs
.ymem
)
1628 free (saved_state
.asregs
.ymem
);
1631 saved_state
.asregs
.xram_start
= xram_start
;
1632 saved_state
.asregs
.yram_start
= yram_start
;
1633 saved_state
.asregs
.xmem_offset
= saved_state
.asregs
.xmem
- xram_start
;
1634 saved_state
.asregs
.ymem_offset
= saved_state
.asregs
.ymem
- yram_start
;
1639 if (saved_state
.asregs
.xyram_select
)
1641 saved_state
.asregs
.xyram_select
= 0;
1642 free (saved_state
.asregs
.xmem
);
1643 free (saved_state
.asregs
.ymem
);
1647 if (! saved_state
.asregs
.xyram_select
)
1649 saved_state
.asregs
.xram_start
= 1;
1650 saved_state
.asregs
.yram_start
= 1;
1653 if (saved_state
.asregs
.regstack
== NULL
)
1654 saved_state
.asregs
.regstack
=
1655 calloc (512, sizeof *saved_state
.asregs
.regstack
);
1657 if (target_dsp
!= was_dsp
)
1661 for (i
= ARRAY_SIZE (sh_dsp_table
) - 1; i
>= 0; i
--)
1663 tmp
= sh_jump_table
[0xf000 + i
];
1664 sh_jump_table
[0xf000 + i
] = sh_dsp_table
[i
];
1665 sh_dsp_table
[i
] = tmp
;
1671 init_pointers (void)
1673 if (saved_state
.asregs
.msize
!= 1 << sim_memory_size
)
1675 sim_size (sim_memory_size
);
1678 if (saved_state
.asregs
.profile
&& !profile_file
)
1680 profile_file
= fopen ("gmon.out", "wb");
1681 /* Seek to where to put the call arc data */
1682 nsamples
= (1 << sim_profile_size
);
1684 fseek (profile_file
, nsamples
* 2 + 12, 0);
1688 fprintf (stderr
, "Can't open gmon.out\n");
1692 saved_state
.asregs
.profile_hist
=
1693 (unsigned short *) calloc (64, (nsamples
* sizeof (short) / 64));
1706 p
= saved_state
.asregs
.profile_hist
;
1708 maxpc
= (1 << sim_profile_size
);
1710 fseek (profile_file
, 0L, 0);
1711 swapout (minpc
<< PROFILE_SHIFT
);
1712 swapout (maxpc
<< PROFILE_SHIFT
);
1713 swapout (nsamples
* 2 + 12);
1714 for (i
= 0; i
< nsamples
; i
++)
1715 swapout16 (saved_state
.asregs
.profile_hist
[i
]);
1720 gotcall (int from
, int to
)
1727 #define MMASKB ((saved_state.asregs.msize -1) & ~0)
1730 sim_resume (SIM_DESC sd
, int step
, int siggnal
)
1732 register unsigned char *insn_ptr
;
1733 unsigned char *mem_end
;
1734 struct loop_bounds loop
;
1735 register int cycles
= 0;
1736 register int stalls
= 0;
1737 register int memstalls
= 0;
1738 register int insts
= 0;
1739 register int prevlock
;
1743 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 ();
1752 void (*prev_fpe
) ();
1754 register unsigned short *jump_table
= sh_jump_table
;
1756 register int *R
= &(saved_state
.asregs
.regs
[0]);
1762 register int maskb
= ~((saved_state
.asregs
.msize
- 1) & ~0);
1763 register int maskw
= ~((saved_state
.asregs
.msize
- 1) & ~1);
1764 register int maskl
= ~((saved_state
.asregs
.msize
- 1) & ~3);
1765 register unsigned char *memory
;
1766 register unsigned int sbit
= ((unsigned int) 1 << 31);
1768 prev_fpe
= signal (SIGFPE
, SIG_IGN
);
1771 saved_state
.asregs
.exception
= 0;
1773 memory
= saved_state
.asregs
.memory
;
1774 mem_end
= memory
+ saved_state
.asregs
.msize
;
1777 loop
= get_loop_bounds_ext (RS
, RE
, memory
, mem_end
, maskw
, endianw
);
1779 loop
= get_loop_bounds (RS
, RE
, memory
, mem_end
, maskw
, endianw
);
1781 insn_ptr
= PT2H (saved_state
.asregs
.pc
);
1782 CHECK_INSN_PTR (insn_ptr
);
1785 PR
= saved_state
.asregs
.sregs
.named
.pr
;
1787 /*T = GET_SR () & SR_MASK_T;*/
1788 prevlock
= saved_state
.asregs
.prevlock
;
1789 thislock
= saved_state
.asregs
.thislock
;
1790 doprofile
= saved_state
.asregs
.profile
;
1792 /* If profiling not enabled, disable it by asking for
1793 profiles infrequently. */
1798 if (step
&& insn_ptr
< saved_state
.asregs
.insn_end
)
1800 if (saved_state
.asregs
.exception
)
1801 /* This can happen if we've already been single-stepping and
1802 encountered a loop end. */
1803 saved_state
.asregs
.insn_end
= insn_ptr
;
1806 saved_state
.asregs
.exception
= SIGTRAP
;
1807 saved_state
.asregs
.insn_end
= insn_ptr
+ 2;
1811 while (insn_ptr
< saved_state
.asregs
.insn_end
)
1813 register unsigned int iword
= RIAT (insn_ptr
);
1814 register unsigned int ult
;
1815 register unsigned char *nip
= insn_ptr
+ 2;
1828 if (--pollcount
< 0)
1830 host_callback
*callback
= STATE_CALLBACK (sd
);
1832 pollcount
= POLL_QUIT_INTERVAL
;
1833 if ((*callback
->poll_quit
) != NULL
1834 && (*callback
->poll_quit
) (callback
))
1841 prevlock
= thislock
;
1845 if (cycles
>= doprofile
)
1848 saved_state
.asregs
.cycles
+= doprofile
;
1849 cycles
-= doprofile
;
1850 if (saved_state
.asregs
.profile_hist
)
1852 int n
= PH2T (insn_ptr
) >> PROFILE_SHIFT
;
1855 int i
= saved_state
.asregs
.profile_hist
[n
];
1857 saved_state
.asregs
.profile_hist
[n
] = i
+ 1;
1864 if (saved_state
.asregs
.insn_end
== loop
.end
)
1866 saved_state
.asregs
.cregs
.named
.sr
+= SR_RC_INCREMENT
;
1868 insn_ptr
= loop
.start
;
1871 saved_state
.asregs
.insn_end
= mem_end
;
1872 loop
.end
= PT2H (0);
1877 if (saved_state
.asregs
.exception
== SIGILL
1878 || saved_state
.asregs
.exception
== SIGBUS
)
1882 /* Check for SIGBUS due to insn fetch. */
1883 else if (! saved_state
.asregs
.exception
)
1884 saved_state
.asregs
.exception
= SIGBUS
;
1886 saved_state
.asregs
.ticks
+= get_now () - tick_start
;
1887 saved_state
.asregs
.cycles
+= cycles
;
1888 saved_state
.asregs
.stalls
+= stalls
;
1889 saved_state
.asregs
.memstalls
+= memstalls
;
1890 saved_state
.asregs
.insts
+= insts
;
1891 saved_state
.asregs
.pc
= PH2T (insn_ptr
);
1893 saved_state
.asregs
.sregs
.named
.pr
= PR
;
1896 saved_state
.asregs
.prevlock
= prevlock
;
1897 saved_state
.asregs
.thislock
= thislock
;
1904 signal (SIGFPE
, prev_fpe
);
1908 sim_write (SIM_DESC sd
, SIM_ADDR addr
, const unsigned char *buffer
, int size
)
1914 for (i
= 0; i
< size
; i
++)
1916 saved_state
.asregs
.memory
[(MMASKB
& (addr
+ i
)) ^ endianb
] = buffer
[i
];
1922 sim_read (SIM_DESC sd
, SIM_ADDR addr
, unsigned char *buffer
, int size
)
1928 for (i
= 0; i
< size
; i
++)
1930 buffer
[i
] = saved_state
.asregs
.memory
[(MMASKB
& (addr
+ i
)) ^ endianb
];
1935 static int gdb_bank_number
;
1945 sh_reg_store (SIM_CPU
*cpu
, int rn
, unsigned char *memory
, int length
)
1950 val
= swap (* (int *) memory
);
1953 case SIM_SH_R0_REGNUM
: case SIM_SH_R1_REGNUM
: case SIM_SH_R2_REGNUM
:
1954 case SIM_SH_R3_REGNUM
: case SIM_SH_R4_REGNUM
: case SIM_SH_R5_REGNUM
:
1955 case SIM_SH_R6_REGNUM
: case SIM_SH_R7_REGNUM
: case SIM_SH_R8_REGNUM
:
1956 case SIM_SH_R9_REGNUM
: case SIM_SH_R10_REGNUM
: case SIM_SH_R11_REGNUM
:
1957 case SIM_SH_R12_REGNUM
: case SIM_SH_R13_REGNUM
: case SIM_SH_R14_REGNUM
:
1958 case SIM_SH_R15_REGNUM
:
1959 saved_state
.asregs
.regs
[rn
] = val
;
1961 case SIM_SH_PC_REGNUM
:
1962 saved_state
.asregs
.pc
= val
;
1964 case SIM_SH_PR_REGNUM
:
1967 case SIM_SH_GBR_REGNUM
:
1970 case SIM_SH_VBR_REGNUM
:
1973 case SIM_SH_MACH_REGNUM
:
1976 case SIM_SH_MACL_REGNUM
:
1979 case SIM_SH_SR_REGNUM
:
1982 case SIM_SH_FPUL_REGNUM
:
1985 case SIM_SH_FPSCR_REGNUM
:
1988 case SIM_SH_FR0_REGNUM
: case SIM_SH_FR1_REGNUM
: case SIM_SH_FR2_REGNUM
:
1989 case SIM_SH_FR3_REGNUM
: case SIM_SH_FR4_REGNUM
: case SIM_SH_FR5_REGNUM
:
1990 case SIM_SH_FR6_REGNUM
: case SIM_SH_FR7_REGNUM
: case SIM_SH_FR8_REGNUM
:
1991 case SIM_SH_FR9_REGNUM
: case SIM_SH_FR10_REGNUM
: case SIM_SH_FR11_REGNUM
:
1992 case SIM_SH_FR12_REGNUM
: case SIM_SH_FR13_REGNUM
: case SIM_SH_FR14_REGNUM
:
1993 case SIM_SH_FR15_REGNUM
:
1994 SET_FI (rn
- SIM_SH_FR0_REGNUM
, val
);
1996 case SIM_SH_DSR_REGNUM
:
1999 case SIM_SH_A0G_REGNUM
:
2002 case SIM_SH_A0_REGNUM
:
2005 case SIM_SH_A1G_REGNUM
:
2008 case SIM_SH_A1_REGNUM
:
2011 case SIM_SH_M0_REGNUM
:
2014 case SIM_SH_M1_REGNUM
:
2017 case SIM_SH_X0_REGNUM
:
2020 case SIM_SH_X1_REGNUM
:
2023 case SIM_SH_Y0_REGNUM
:
2026 case SIM_SH_Y1_REGNUM
:
2029 case SIM_SH_MOD_REGNUM
:
2032 case SIM_SH_RS_REGNUM
:
2035 case SIM_SH_RE_REGNUM
:
2038 case SIM_SH_SSR_REGNUM
:
2041 case SIM_SH_SPC_REGNUM
:
2044 /* The rn_bank idiosyncracies are not due to hardware differences, but to
2045 a weird aliasing naming scheme for sh3 / sh3e / sh4. */
2046 case SIM_SH_R0_BANK0_REGNUM
: case SIM_SH_R1_BANK0_REGNUM
:
2047 case SIM_SH_R2_BANK0_REGNUM
: case SIM_SH_R3_BANK0_REGNUM
:
2048 case SIM_SH_R4_BANK0_REGNUM
: case SIM_SH_R5_BANK0_REGNUM
:
2049 case SIM_SH_R6_BANK0_REGNUM
: case SIM_SH_R7_BANK0_REGNUM
:
2050 if (saved_state
.asregs
.bfd_mach
== bfd_mach_sh2a
)
2052 rn
-= SIM_SH_R0_BANK0_REGNUM
;
2053 saved_state
.asregs
.regstack
[gdb_bank_number
].regs
[rn
] = val
;
2057 Rn_BANK (rn
- SIM_SH_R0_BANK0_REGNUM
) = val
;
2059 saved_state
.asregs
.regs
[rn
- SIM_SH_R0_BANK0_REGNUM
] = val
;
2061 case SIM_SH_R0_BANK1_REGNUM
: case SIM_SH_R1_BANK1_REGNUM
:
2062 case SIM_SH_R2_BANK1_REGNUM
: case SIM_SH_R3_BANK1_REGNUM
:
2063 case SIM_SH_R4_BANK1_REGNUM
: case SIM_SH_R5_BANK1_REGNUM
:
2064 case SIM_SH_R6_BANK1_REGNUM
: case SIM_SH_R7_BANK1_REGNUM
:
2065 if (saved_state
.asregs
.bfd_mach
== bfd_mach_sh2a
)
2067 rn
-= SIM_SH_R0_BANK1_REGNUM
;
2068 saved_state
.asregs
.regstack
[gdb_bank_number
].regs
[rn
+ 8] = val
;
2072 saved_state
.asregs
.regs
[rn
- SIM_SH_R0_BANK1_REGNUM
] = val
;
2074 Rn_BANK (rn
- SIM_SH_R0_BANK1_REGNUM
) = val
;
2076 case SIM_SH_R0_BANK_REGNUM
: case SIM_SH_R1_BANK_REGNUM
:
2077 case SIM_SH_R2_BANK_REGNUM
: case SIM_SH_R3_BANK_REGNUM
:
2078 case SIM_SH_R4_BANK_REGNUM
: case SIM_SH_R5_BANK_REGNUM
:
2079 case SIM_SH_R6_BANK_REGNUM
: case SIM_SH_R7_BANK_REGNUM
:
2080 SET_Rn_BANK (rn
- SIM_SH_R0_BANK_REGNUM
, val
);
2082 case SIM_SH_TBR_REGNUM
:
2085 case SIM_SH_IBNR_REGNUM
:
2088 case SIM_SH_IBCR_REGNUM
:
2091 case SIM_SH_BANK_REGNUM
:
2092 /* This is a pseudo-register maintained just for gdb.
2093 It tells us what register bank gdb would like to read/write. */
2094 gdb_bank_number
= val
;
2096 case SIM_SH_BANK_MACL_REGNUM
:
2097 saved_state
.asregs
.regstack
[gdb_bank_number
].regs
[REGBANK_MACL
] = val
;
2099 case SIM_SH_BANK_GBR_REGNUM
:
2100 saved_state
.asregs
.regstack
[gdb_bank_number
].regs
[REGBANK_GBR
] = val
;
2102 case SIM_SH_BANK_PR_REGNUM
:
2103 saved_state
.asregs
.regstack
[gdb_bank_number
].regs
[REGBANK_PR
] = val
;
2105 case SIM_SH_BANK_IVN_REGNUM
:
2106 saved_state
.asregs
.regstack
[gdb_bank_number
].regs
[REGBANK_IVN
] = val
;
2108 case SIM_SH_BANK_MACH_REGNUM
:
2109 saved_state
.asregs
.regstack
[gdb_bank_number
].regs
[REGBANK_MACH
] = val
;
2118 sh_reg_fetch (SIM_CPU
*cpu
, int rn
, unsigned char *memory
, int length
)
2125 case SIM_SH_R0_REGNUM
: case SIM_SH_R1_REGNUM
: case SIM_SH_R2_REGNUM
:
2126 case SIM_SH_R3_REGNUM
: case SIM_SH_R4_REGNUM
: case SIM_SH_R5_REGNUM
:
2127 case SIM_SH_R6_REGNUM
: case SIM_SH_R7_REGNUM
: case SIM_SH_R8_REGNUM
:
2128 case SIM_SH_R9_REGNUM
: case SIM_SH_R10_REGNUM
: case SIM_SH_R11_REGNUM
:
2129 case SIM_SH_R12_REGNUM
: case SIM_SH_R13_REGNUM
: case SIM_SH_R14_REGNUM
:
2130 case SIM_SH_R15_REGNUM
:
2131 val
= saved_state
.asregs
.regs
[rn
];
2133 case SIM_SH_PC_REGNUM
:
2134 val
= saved_state
.asregs
.pc
;
2136 case SIM_SH_PR_REGNUM
:
2139 case SIM_SH_GBR_REGNUM
:
2142 case SIM_SH_VBR_REGNUM
:
2145 case SIM_SH_MACH_REGNUM
:
2148 case SIM_SH_MACL_REGNUM
:
2151 case SIM_SH_SR_REGNUM
:
2154 case SIM_SH_FPUL_REGNUM
:
2157 case SIM_SH_FPSCR_REGNUM
:
2160 case SIM_SH_FR0_REGNUM
: case SIM_SH_FR1_REGNUM
: case SIM_SH_FR2_REGNUM
:
2161 case SIM_SH_FR3_REGNUM
: case SIM_SH_FR4_REGNUM
: case SIM_SH_FR5_REGNUM
:
2162 case SIM_SH_FR6_REGNUM
: case SIM_SH_FR7_REGNUM
: case SIM_SH_FR8_REGNUM
:
2163 case SIM_SH_FR9_REGNUM
: case SIM_SH_FR10_REGNUM
: case SIM_SH_FR11_REGNUM
:
2164 case SIM_SH_FR12_REGNUM
: case SIM_SH_FR13_REGNUM
: case SIM_SH_FR14_REGNUM
:
2165 case SIM_SH_FR15_REGNUM
:
2166 val
= FI (rn
- SIM_SH_FR0_REGNUM
);
2168 case SIM_SH_DSR_REGNUM
:
2171 case SIM_SH_A0G_REGNUM
:
2174 case SIM_SH_A0_REGNUM
:
2177 case SIM_SH_A1G_REGNUM
:
2180 case SIM_SH_A1_REGNUM
:
2183 case SIM_SH_M0_REGNUM
:
2186 case SIM_SH_M1_REGNUM
:
2189 case SIM_SH_X0_REGNUM
:
2192 case SIM_SH_X1_REGNUM
:
2195 case SIM_SH_Y0_REGNUM
:
2198 case SIM_SH_Y1_REGNUM
:
2201 case SIM_SH_MOD_REGNUM
:
2204 case SIM_SH_RS_REGNUM
:
2207 case SIM_SH_RE_REGNUM
:
2210 case SIM_SH_SSR_REGNUM
:
2213 case SIM_SH_SPC_REGNUM
:
2216 /* The rn_bank idiosyncracies are not due to hardware differences, but to
2217 a weird aliasing naming scheme for sh3 / sh3e / sh4. */
2218 case SIM_SH_R0_BANK0_REGNUM
: case SIM_SH_R1_BANK0_REGNUM
:
2219 case SIM_SH_R2_BANK0_REGNUM
: case SIM_SH_R3_BANK0_REGNUM
:
2220 case SIM_SH_R4_BANK0_REGNUM
: case SIM_SH_R5_BANK0_REGNUM
:
2221 case SIM_SH_R6_BANK0_REGNUM
: case SIM_SH_R7_BANK0_REGNUM
:
2222 if (saved_state
.asregs
.bfd_mach
== bfd_mach_sh2a
)
2224 rn
-= SIM_SH_R0_BANK0_REGNUM
;
2225 val
= saved_state
.asregs
.regstack
[gdb_bank_number
].regs
[rn
];
2228 val
= (SR_MD
&& SR_RB
2229 ? Rn_BANK (rn
- SIM_SH_R0_BANK0_REGNUM
)
2230 : saved_state
.asregs
.regs
[rn
- SIM_SH_R0_BANK0_REGNUM
]);
2232 case SIM_SH_R0_BANK1_REGNUM
: case SIM_SH_R1_BANK1_REGNUM
:
2233 case SIM_SH_R2_BANK1_REGNUM
: case SIM_SH_R3_BANK1_REGNUM
:
2234 case SIM_SH_R4_BANK1_REGNUM
: case SIM_SH_R5_BANK1_REGNUM
:
2235 case SIM_SH_R6_BANK1_REGNUM
: case SIM_SH_R7_BANK1_REGNUM
:
2236 if (saved_state
.asregs
.bfd_mach
== bfd_mach_sh2a
)
2238 rn
-= SIM_SH_R0_BANK1_REGNUM
;
2239 val
= saved_state
.asregs
.regstack
[gdb_bank_number
].regs
[rn
+ 8];
2242 val
= (! SR_MD
|| ! SR_RB
2243 ? Rn_BANK (rn
- SIM_SH_R0_BANK1_REGNUM
)
2244 : saved_state
.asregs
.regs
[rn
- SIM_SH_R0_BANK1_REGNUM
]);
2246 case SIM_SH_R0_BANK_REGNUM
: case SIM_SH_R1_BANK_REGNUM
:
2247 case SIM_SH_R2_BANK_REGNUM
: case SIM_SH_R3_BANK_REGNUM
:
2248 case SIM_SH_R4_BANK_REGNUM
: case SIM_SH_R5_BANK_REGNUM
:
2249 case SIM_SH_R6_BANK_REGNUM
: case SIM_SH_R7_BANK_REGNUM
:
2250 val
= Rn_BANK (rn
- SIM_SH_R0_BANK_REGNUM
);
2252 case SIM_SH_TBR_REGNUM
:
2255 case SIM_SH_IBNR_REGNUM
:
2258 case SIM_SH_IBCR_REGNUM
:
2261 case SIM_SH_BANK_REGNUM
:
2262 /* This is a pseudo-register maintained just for gdb.
2263 It tells us what register bank gdb would like to read/write. */
2264 val
= gdb_bank_number
;
2266 case SIM_SH_BANK_MACL_REGNUM
:
2267 val
= saved_state
.asregs
.regstack
[gdb_bank_number
].regs
[REGBANK_MACL
];
2269 case SIM_SH_BANK_GBR_REGNUM
:
2270 val
= saved_state
.asregs
.regstack
[gdb_bank_number
].regs
[REGBANK_GBR
];
2272 case SIM_SH_BANK_PR_REGNUM
:
2273 val
= saved_state
.asregs
.regstack
[gdb_bank_number
].regs
[REGBANK_PR
];
2275 case SIM_SH_BANK_IVN_REGNUM
:
2276 val
= saved_state
.asregs
.regstack
[gdb_bank_number
].regs
[REGBANK_IVN
];
2278 case SIM_SH_BANK_MACH_REGNUM
:
2279 val
= saved_state
.asregs
.regstack
[gdb_bank_number
].regs
[REGBANK_MACH
];
2284 * (int *) memory
= swap (val
);
2289 sim_stop_reason (SIM_DESC sd
, enum sim_stop
*reason
, int *sigrc
)
2291 /* The SH simulator uses SIGQUIT to indicate that the program has
2292 exited, so we must check for it here and translate it to exit. */
2293 if (saved_state
.asregs
.exception
== SIGQUIT
)
2295 *reason
= sim_exited
;
2296 *sigrc
= saved_state
.asregs
.regs
[5];
2300 *reason
= sim_stopped
;
2301 *sigrc
= saved_state
.asregs
.exception
;
2306 sim_info (SIM_DESC sd
, int verbose
)
2309 (double) saved_state
.asregs
.ticks
/ (double) now_persec ();
2310 double virttime
= saved_state
.asregs
.cycles
/ 36.0e6
;
2312 sim_io_printf (sd
, "\n\n# instructions executed %10d\n",
2313 saved_state
.asregs
.insts
);
2314 sim_io_printf (sd
, "# cycles %10d\n",
2315 saved_state
.asregs
.cycles
);
2316 sim_io_printf (sd
, "# pipeline stalls %10d\n",
2317 saved_state
.asregs
.stalls
);
2318 sim_io_printf (sd
, "# misaligned load/store %10d\n",
2319 saved_state
.asregs
.memstalls
);
2320 sim_io_printf (sd
, "# real time taken %10.4f\n", timetaken
);
2321 sim_io_printf (sd
, "# virtual time taken %10.4f\n", virttime
);
2322 sim_io_printf (sd
, "# profiling size %10d\n", sim_profile_size
);
2323 sim_io_printf (sd
, "# profiling frequency %10d\n",
2324 saved_state
.asregs
.profile
);
2325 sim_io_printf (sd
, "# profile maxpc %10x\n",
2326 (1 << sim_profile_size
) << PROFILE_SHIFT
);
2330 sim_io_printf (sd
, "# cycles/second %10d\n",
2331 (int) (saved_state
.asregs
.cycles
/ timetaken
));
2332 sim_io_printf (sd
, "# simulation ratio %10.4f\n",
2333 virttime
/ timetaken
);
2338 sh_pc_get (sim_cpu
*cpu
)
2340 return saved_state
.asregs
.pc
;
2344 sh_pc_set (sim_cpu
*cpu
, sim_cia pc
)
2346 saved_state
.asregs
.pc
= pc
;
2350 free_state (SIM_DESC sd
)
2352 if (STATE_MODULES (sd
) != NULL
)
2353 sim_module_uninstall (sd
);
2354 sim_cpu_free_all (sd
);
2355 sim_state_free (sd
);
2359 sim_open (SIM_OPEN_KIND kind
, host_callback
*cb
,
2360 struct bfd
*abfd
, char * const *argv
)
2372 SIM_DESC sd
= sim_state_alloc (kind
, cb
);
2373 SIM_ASSERT (STATE_MAGIC (sd
) == SIM_MAGIC_NUMBER
);
2375 /* The cpu data is kept in a separately allocated chunk of memory. */
2376 if (sim_cpu_alloc_all (sd
, 1, /*cgen_cpu_max_extra_bytes ()*/0) != SIM_RC_OK
)
2382 if (sim_pre_argv_init (sd
, argv
[0]) != SIM_RC_OK
)
2388 /* The parser will print an error message for us, so we silently return. */
2389 if (sim_parse_args (sd
, argv
) != SIM_RC_OK
)
2395 /* Check for/establish the a reference program image. */
2396 if (sim_analyze_program (sd
,
2397 (STATE_PROG_ARGV (sd
) != NULL
2398 ? *STATE_PROG_ARGV (sd
)
2399 : NULL
), abfd
) != SIM_RC_OK
)
2405 /* Configure/verify the target byte order and other runtime
2406 configuration options. */
2407 if (sim_config (sd
) != SIM_RC_OK
)
2409 sim_module_uninstall (sd
);
2413 if (sim_post_argv_init (sd
) != SIM_RC_OK
)
2415 /* Uninstall the modules to avoid memory leaks,
2416 file descriptor leaks, etc. */
2417 sim_module_uninstall (sd
);
2421 /* CPU specific initialization. */
2422 for (i
= 0; i
< MAX_NR_PROCESSORS
; ++i
)
2424 SIM_CPU
*cpu
= STATE_CPU (sd
, i
);
2426 CPU_REG_FETCH (cpu
) = sh_reg_fetch
;
2427 CPU_REG_STORE (cpu
) = sh_reg_store
;
2428 CPU_PC_FETCH (cpu
) = sh_pc_get
;
2429 CPU_PC_STORE (cpu
) = sh_pc_set
;
2432 for (p
= argv
+ 1; *p
!= NULL
; ++p
)
2435 parse_and_set_memory_size (sd
, *p
);
2441 for (i
= 4; (i
-= 2) >= 0; )
2442 mem_word
.s
[i
>> 1] = i
;
2443 global_endianw
= mem_word
.i
>> (target_little_endian
? 0 : 16) & 0xffff;
2445 for (i
= 4; --i
>= 0; )
2447 endianb
= mem_word
.i
>> (target_little_endian
? 0 : 24) & 0xff;
2453 parse_and_set_memory_size (SIM_DESC sd
, const char *str
)
2457 n
= strtol (str
, NULL
, 10);
2458 if (n
> 0 && n
<= 31)
2459 sim_memory_size
= n
;
2461 sim_io_printf (sd
, "Bad memory size %d; must be 1 to 31, inclusive\n", n
);
2465 sim_create_inferior (SIM_DESC sd
, struct bfd
*prog_bfd
,
2466 char * const *argv
, char * const *env
)
2468 /* Clear the registers. */
2469 memset (&saved_state
, 0,
2470 (char*) &saved_state
.asregs
.end_of_registers
- (char*) &saved_state
);
2473 if (prog_bfd
!= NULL
)
2474 saved_state
.asregs
.pc
= bfd_get_start_address (prog_bfd
);
2476 /* Set the bfd machine type. */
2477 if (prog_bfd
!= NULL
)
2478 saved_state
.asregs
.bfd_mach
= bfd_get_mach (prog_bfd
);
2480 if (prog_bfd
!= NULL
)
2481 init_dsp (prog_bfd
);
2487 sim_do_command (SIM_DESC sd
, const char *cmd
)
2489 const char *sms_cmd
= "set-memory-size";
2492 if (cmd
== NULL
|| *cmd
== '\0')
2497 cmdsize
= strlen (sms_cmd
);
2498 if (strncmp (cmd
, sms_cmd
, cmdsize
) == 0
2499 && strchr (" \t", cmd
[cmdsize
]) != NULL
)
2501 parse_and_set_memory_size (sd
, cmd
+ cmdsize
+ 1);
2503 else if (strcmp (cmd
, "help") == 0)
2505 sim_io_printf (sd
, "List of SH simulator commands:\n\n");
2506 sim_io_printf (sd
, "set-memory-size <n> -- Set the number of address bits to use\n");
2507 sim_io_printf (sd
, "\n");
2511 sim_io_printf (sd
, "Error: \"%s\" is not a valid SH simulator command.\n", cmd
);