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 == LITTLE_ENDIAN)
120 static int global_endianw, endianb;
121 static int target_dsp;
122 #define host_little_endian (CURRENT_HOST_BYTE_ORDER == LITTLE_ENDIAN)
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)
243 /* Count the number of arguments in an argv. */
245 count_argc (char **argv)
252 for (i = 0; argv[i] != NULL; ++i)
260 int old = saved_state.asregs.sregs.named.fpscr;
261 saved_state.asregs.sregs.named.fpscr = (x);
262 /* swap the floating point register banks */
263 if ((saved_state.asregs.sregs.named.fpscr ^ old) & FPSCR_MASK_FR
264 /* Ignore bit change if simulating sh-dsp. */
267 union fregs_u tmpf = saved_state.asregs.fregs[0];
268 saved_state.asregs.fregs[0] = saved_state.asregs.fregs[1];
269 saved_state.asregs.fregs[1] = tmpf;
273 /* sts relies on being able to read fpscr directly. */
274 #define GET_FPSCR() (saved_state.asregs.sregs.named.fpscr)
275 #define SET_FPSCR(x) \
280 #define DSR (saved_state.asregs.sregs.named.fpscr)
282 #define RAISE_EXCEPTION(x) \
283 (saved_state.asregs.exception = x, saved_state.asregs.insn_end = 0)
285 #define RAISE_EXCEPTION_IF_IN_DELAY_SLOT() \
286 if (in_delay_slot) RAISE_EXCEPTION (SIGILL)
288 /* This function exists mainly for the purpose of setting a breakpoint to
289 catch simulated bus errors when running the simulator under GDB. */
292 raise_exception (int x)
298 raise_buserror (void)
300 raise_exception (SIGBUS);
303 #define PROCESS_SPECIAL_ADDRESS(addr, endian, ptr, bits_written, \
304 forbidden_addr_bits, data, retval) \
306 if (addr & forbidden_addr_bits) \
311 else if ((addr & saved_state.asregs.xyram_select) \
312 == saved_state.asregs.xram_start) \
313 ptr = (void *) &saved_state.asregs.xmem_offset[addr ^ endian]; \
314 else if ((addr & saved_state.asregs.xyram_select) \
315 == saved_state.asregs.yram_start) \
316 ptr = (void *) &saved_state.asregs.ymem_offset[addr ^ endian]; \
317 else if ((unsigned) addr >> 24 == 0xf0 \
318 && bits_written == 32 && (data & 1) == 0) \
319 /* This invalidates (if not associative) or might invalidate \
320 (if associative) an instruction cache line. This is used for \
321 trampolines. Since we don't simulate the cache, this is a no-op \
322 as far as the simulator is concerned. */ \
326 if (bits_written == 8 && addr > 0x5000000) \
327 IOMEM (addr, 1, data); \
328 /* We can't do anything useful with the other stuff, so fail. */ \
334 /* FIXME: sim_resume should be renamed to sim_engine_run. sim_resume
335 being implemented by ../common/sim_resume.c and the below should
336 make a call to sim_engine_halt */
338 #define BUSERROR(addr, mask) ((addr) & (mask))
340 #define WRITE_BUSERROR(addr, mask, data, addr_func) \
345 addr_func (addr, data); \
351 #define READ_BUSERROR(addr, mask, addr_func) \
355 return addr_func (addr); \
359 /* Define this to enable register lifetime checking.
360 The compiler generates "add #0,rn" insns to mark registers as invalid,
361 the simulator uses this info to call fail if it finds a ref to an invalid
362 register before a def
369 #define CREF(x) if (!valid[x]) fail ();
370 #define CDEF(x) valid[x] = 1;
371 #define UNDEF(x) valid[x] = 0;
378 static void parse_and_set_memory_size (SIM_DESC sd, const char *str);
379 static int IOMEM (int addr, int write, int value);
380 static struct loop_bounds get_loop_bounds (int, int, unsigned char *,
381 unsigned char *, int, int);
382 static void process_wlat_addr (int, int);
383 static void process_wwat_addr (int, int);
384 static void process_wbat_addr (int, int);
385 static int process_rlat_addr (int);
386 static int process_rwat_addr (int);
387 static int process_rbat_addr (int);
389 /* Floating point registers */
391 #define DR(n) (get_dr (n))
396 if (host_little_endian)
403 dr.i[1] = saved_state.asregs.fregs[0].i[n + 0];
404 dr.i[0] = saved_state.asregs.fregs[0].i[n + 1];
408 return (saved_state.asregs.fregs[0].d[n >> 1]);
411 #define SET_DR(n, EXP) set_dr ((n), (EXP))
413 set_dr (int n, double exp)
416 if (host_little_endian)
424 saved_state.asregs.fregs[0].i[n + 0] = dr.i[1];
425 saved_state.asregs.fregs[0].i[n + 1] = dr.i[0];
428 saved_state.asregs.fregs[0].d[n >> 1] = exp;
431 #define SET_FI(n,EXP) (saved_state.asregs.fregs[0].i[(n)] = (EXP))
432 #define FI(n) (saved_state.asregs.fregs[0].i[(n)])
434 #define FR(n) (saved_state.asregs.fregs[0].f[(n)])
435 #define SET_FR(n,EXP) (saved_state.asregs.fregs[0].f[(n)] = (EXP))
437 #define XD_TO_XF(n) ((((n) & 1) << 5) | ((n) & 0x1e))
438 #define XF(n) (saved_state.asregs.fregs[(n) >> 5].i[(n) & 0x1f])
439 #define SET_XF(n,EXP) (saved_state.asregs.fregs[(n) >> 5].i[(n) & 0x1f] = (EXP))
441 #define RS saved_state.asregs.cregs.named.rs
442 #define RE saved_state.asregs.cregs.named.re
443 #define MOD (saved_state.asregs.cregs.named.mod)
446 MOD_ME = (unsigned) MOD >> 16 | (SR_DMY ? ~0xffff : (SR_DMX ? 0 : 0x10000)), \
447 MOD_DELTA = (MOD & 0xffff) - ((unsigned) MOD >> 16))
449 #define DSP_R(n) saved_state.asregs.sregs.i[(n)]
450 #define DSP_GRD(n) DSP_R ((n) + 8)
451 #define GET_DSP_GRD(n) ((n | 2) == 7 ? SEXT (DSP_GRD (n)) : SIGN32 (DSP_R (n)))
456 #define Y0 DSP_R (10)
457 #define Y1 DSP_R (11)
458 #define M0 DSP_R (12)
459 #define A1G DSP_R (13)
460 #define M1 DSP_R (14)
461 #define A0G DSP_R (15)
462 /* DSP_R (16) / DSP_GRD (16) are used as a fake destination for pcmp. */
463 #define MOD_ME DSP_GRD (17)
464 #define MOD_DELTA DSP_GRD (18)
466 #define FP_OP(n, OP, m) \
470 if (((n) & 1) || ((m) & 1)) \
471 RAISE_EXCEPTION (SIGILL); \
473 SET_DR (n, (DR (n) OP DR (m))); \
476 SET_FR (n, (FR (n) OP FR (m))); \
479 #define FP_UNARY(n, OP) \
484 RAISE_EXCEPTION (SIGILL); \
486 SET_DR (n, (OP (DR (n)))); \
489 SET_FR (n, (OP (FR (n)))); \
492 #define FP_CMP(n, OP, m) \
496 if (((n) & 1) || ((m) & 1)) \
497 RAISE_EXCEPTION (SIGILL); \
499 SET_SR_T (DR (n) OP DR (m)); \
502 SET_SR_T (FR (n) OP FR (m)); \
508 /* do we need to swap banks */
509 int old_gpr = SR_MD && SR_RB;
510 int new_gpr = (new_sr & SR_MASK_MD) && (new_sr & SR_MASK_RB);
511 if (old_gpr != new_gpr)
514 for (i = 0; i < 8; i++)
516 tmp = saved_state.asregs.cregs.named.bank[i];
517 saved_state.asregs.cregs.named.bank[i] = saved_state.asregs.regs[i];
518 saved_state.asregs.regs[i] = tmp;
521 saved_state.asregs.cregs.named.sr = new_sr;
526 wlat_fast (unsigned char *memory, int x, int value, int maskl)
529 unsigned int *p = (unsigned int *) (memory + x);
530 WRITE_BUSERROR (x, maskl, v, process_wlat_addr);
535 wwat_fast (unsigned char *memory, int x, int value, int maskw, int endianw)
538 unsigned short *p = (unsigned short *) (memory + (x ^ endianw));
539 WRITE_BUSERROR (x, maskw, v, process_wwat_addr);
544 wbat_fast (unsigned char *memory, int x, int value, int maskb)
546 unsigned char *p = memory + (x ^ endianb);
547 WRITE_BUSERROR (x, maskb, value, process_wbat_addr);
555 rlat_fast (unsigned char *memory, int x, int maskl)
557 unsigned int *p = (unsigned int *) (memory + x);
558 READ_BUSERROR (x, maskl, process_rlat_addr);
564 rwat_fast (unsigned char *memory, int x, int maskw, int endianw)
566 unsigned short *p = (unsigned short *) (memory + (x ^ endianw));
567 READ_BUSERROR (x, maskw, process_rwat_addr);
573 riat_fast (unsigned char *insn_ptr, int endianw)
575 unsigned short *p = (unsigned short *) ((size_t) insn_ptr ^ endianw);
581 rbat_fast (unsigned char *memory, int x, int maskb)
583 unsigned char *p = memory + (x ^ endianb);
584 READ_BUSERROR (x, maskb, process_rbat_addr);
589 #define RWAT(x) (rwat_fast (memory, x, maskw, endianw))
590 #define RLAT(x) (rlat_fast (memory, x, maskl))
591 #define RBAT(x) (rbat_fast (memory, x, maskb))
592 #define RIAT(p) (riat_fast ((p), endianw))
593 #define WWAT(x,v) (wwat_fast (memory, x, v, maskw, endianw))
594 #define WLAT(x,v) (wlat_fast (memory, x, v, maskl))
595 #define WBAT(x,v) (wbat_fast (memory, x, v, maskb))
597 #define RUWAT(x) (RWAT (x) & 0xffff)
598 #define RSWAT(x) ((short) (RWAT (x)))
599 #define RSLAT(x) ((long) (RLAT (x)))
600 #define RSBAT(x) (SEXT (RBAT (x)))
602 #define RDAT(x, n) (do_rdat (memory, (x), (n), (maskl)))
604 do_rdat (unsigned char *memory, int x, int n, int maskl)
610 f0 = rlat_fast (memory, x + 0, maskl);
611 f1 = rlat_fast (memory, x + 4, maskl);
612 saved_state.asregs.fregs[i].i[(j + 0)] = f0;
613 saved_state.asregs.fregs[i].i[(j + 1)] = f1;
617 #define WDAT(x, n) (do_wdat (memory, (x), (n), (maskl)))
619 do_wdat (unsigned char *memory, int x, int n, int maskl)
625 f0 = saved_state.asregs.fregs[i].i[(j + 0)];
626 f1 = saved_state.asregs.fregs[i].i[(j + 1)];
627 wlat_fast (memory, (x + 0), f0, maskl);
628 wlat_fast (memory, (x + 4), f1, maskl);
633 process_wlat_addr (int addr, int value)
637 PROCESS_SPECIAL_ADDRESS (addr, endianb, ptr, 32, 3, value, );
642 process_wwat_addr (int addr, int value)
646 PROCESS_SPECIAL_ADDRESS (addr, endianb, ptr, 16, 1, value, );
651 process_wbat_addr (int addr, int value)
655 PROCESS_SPECIAL_ADDRESS (addr, endianb, ptr, 8, 0, value, );
660 process_rlat_addr (int addr)
664 PROCESS_SPECIAL_ADDRESS (addr, endianb, ptr, -32, 3, -1, 0);
669 process_rwat_addr (int addr)
673 PROCESS_SPECIAL_ADDRESS (addr, endianb, ptr, -16, 1, -1, 0);
678 process_rbat_addr (int addr)
682 PROCESS_SPECIAL_ADDRESS (addr, endianb, ptr, -8, 0, -1, 0);
686 #define SEXT(x) (((x & 0xff) ^ (~0x7f))+0x80)
687 #define SEXT12(x) (((x & 0xfff) ^ 0x800) - 0x800)
688 #define SEXTW(y) ((int) ((short) y))
690 #define SEXT32(x) ((int) ((x & 0xffffffff) ^ 0x80000000U) - 0x7fffffff - 1)
692 #define SEXT32(x) ((int) (x))
694 #define SIGN32(x) (SEXT32 (x) >> 31)
696 /* convert pointer from target to host value. */
697 #define PT2H(x) ((x) + memory)
698 /* convert pointer from host to target value. */
699 #define PH2T(x) ((x) - memory)
701 #define SKIP_INSN(p) ((p) += ((RIAT (p) & 0xfc00) == 0xf800 ? 4 : 2))
703 #define SET_NIP(x) nip = (x); CHECK_INSN_PTR (nip);
705 static int in_delay_slot = 0;
706 #define Delay_Slot(TEMPPC) iword = RIAT (TEMPPC); in_delay_slot = 1; goto top;
708 #define CHECK_INSN_PTR(p) \
710 if (saved_state.asregs.exception || PH2T (p) & maskw) \
711 saved_state.asregs.insn_end = 0; \
712 else if (p < loop.end) \
713 saved_state.asregs.insn_end = loop.end; \
715 saved_state.asregs.insn_end = mem_end; \
728 do { memstalls += ((((long) PC & 3) != 0) ? (n) : ((n) - 1)); } while (0)
730 #define L(x) thislock = x;
731 #define TL(x) if ((x) == prevlock) stalls++;
732 #define TB(x,y) if ((x) == prevlock || (y) == prevlock) stalls++;
736 #if defined(__GO32__)
737 int sim_memory_size = 19;
739 int sim_memory_size = 24;
742 static int sim_profile_size = 17;
748 #define SMR1 (0x05FFFEC8) /* Channel 1 serial mode register */
749 #define BRR1 (0x05FFFEC9) /* Channel 1 bit rate register */
750 #define SCR1 (0x05FFFECA) /* Channel 1 serial control register */
751 #define TDR1 (0x05FFFECB) /* Channel 1 transmit data register */
752 #define SSR1 (0x05FFFECC) /* Channel 1 serial status register */
753 #define RDR1 (0x05FFFECD) /* Channel 1 receive data register */
755 #define SCI_RDRF 0x40 /* Recieve data register full */
756 #define SCI_TDRE 0x80 /* Transmit data register empty */
759 IOMEM (int addr, int write, int value)
788 return time ((long *) 0);
797 static FILE *profile_file;
799 static INLINE unsigned
803 n = (n << 24 | (n & 0xff00) << 8
804 | (n & 0xff0000) >> 8 | (n & 0xff000000) >> 24);
808 static INLINE unsigned short
809 swap16 (unsigned short n)
812 n = n << 8 | (n & 0xff00) >> 8;
821 union { char b[4]; int n; } u;
823 fwrite (u.b, 4, 1, profile_file);
830 union { char b[4]; int n; } u;
832 fwrite (u.b, 2, 1, profile_file);
835 /* Turn a pointer in a register into a pointer into real memory. */
840 return (char *) (x + saved_state.asregs.memory);
843 /* STR points to a zero-terminated string in target byte order. Return
844 the number of bytes that need to be converted to host byte order in order
845 to use this string as a zero-terminated string on the host.
846 (Not counting the rounding up needed to operate on entire words.) */
850 unsigned char *memory = saved_state.asregs.memory;
852 int endian = endianb;
857 for (end = str; memory[end ^ endian]; end++) ;
858 return end - str + 1;
862 strnswap (int str, int len)
866 if (! endianb || ! len)
868 start = (int *) ptr (str & ~3);
869 end = (int *) ptr (str + len);
873 *start = (old << 24 | (old & 0xff00) << 8
874 | (old & 0xff0000) >> 8 | (old & 0xff000000) >> 24);
880 /* Simulate a monitor trap, put the result into r0 and errno into r1
881 return offset by which to adjust pc. */
884 trap (SIM_DESC sd, int i, int *regs, unsigned char *insn_ptr,
885 unsigned char *memory, int maskl, int maskw, int endianw)
887 host_callback *callback = STATE_CALLBACK (sd);
888 char **prog_argv = STATE_PROG_ARGV (sd);
893 printf ("%c", regs[0]);
896 raise_exception (SIGQUIT);
898 case 3: /* FIXME: for backwards compat, should be removed */
901 unsigned int countp = * (unsigned int *) (insn_ptr + 4);
903 WLAT (countp, RLAT (countp) + 1);
915 #if !defined(__GO32__) && !defined(_WIN32)
919 /* This would work only if endianness matched between host and target.
920 Besides, it's quite dangerous. */
923 regs[0] = execve (ptr (regs[5]), (char **) ptr (regs[6]),
924 (char **) ptr (regs[7]));
927 regs[0] = execve (ptr (regs[5]), (char **) ptr (regs[6]), 0);
932 regs[0] = (BUSERROR (regs[5], maskl)
934 : pipe ((int *) ptr (regs[5])));
939 regs[0] = wait ((int *) ptr (regs[5]));
941 #endif /* !defined(__GO32__) && !defined(_WIN32) */
944 strnswap (regs[6], regs[7]);
946 = callback->read (callback, regs[5], ptr (regs[6]), regs[7]);
947 strnswap (regs[6], regs[7]);
950 strnswap (regs[6], regs[7]);
952 regs[0] = (int) callback->write_stdout (callback,
953 ptr (regs[6]), regs[7]);
955 regs[0] = (int) callback->write (callback, regs[5],
956 ptr (regs[6]), regs[7]);
957 strnswap (regs[6], regs[7]);
960 regs[0] = callback->lseek (callback,regs[5], regs[6], regs[7]);
963 regs[0] = callback->close (callback,regs[5]);
967 int len = strswaplen (regs[5]);
968 strnswap (regs[5], len);
969 regs[0] = callback->open (callback, ptr (regs[5]), regs[6]);
970 strnswap (regs[5], len);
974 /* EXIT - caller can look in r5 to work out the reason */
975 raise_exception (SIGQUIT);
979 case SYS_stat: /* added at hmsi */
980 /* stat system call */
982 struct stat host_stat;
984 int len = strswaplen (regs[5]);
986 strnswap (regs[5], len);
987 regs[0] = stat (ptr (regs[5]), &host_stat);
988 strnswap (regs[5], len);
992 WWAT (buf, host_stat.st_dev);
994 WWAT (buf, host_stat.st_ino);
996 WLAT (buf, host_stat.st_mode);
998 WWAT (buf, host_stat.st_nlink);
1000 WWAT (buf, host_stat.st_uid);
1002 WWAT (buf, host_stat.st_gid);
1004 WWAT (buf, host_stat.st_rdev);
1006 WLAT (buf, host_stat.st_size);
1008 WLAT (buf, host_stat.st_atime);
1012 WLAT (buf, host_stat.st_mtime);
1016 WLAT (buf, host_stat.st_ctime);
1030 int len = strswaplen (regs[5]);
1032 strnswap (regs[5], len);
1033 regs[0] = chown (ptr (regs[5]), regs[6], regs[7]);
1034 strnswap (regs[5], len);
1040 int len = strswaplen (regs[5]);
1042 strnswap (regs[5], len);
1043 regs[0] = chmod (ptr (regs[5]), regs[6]);
1044 strnswap (regs[5], len);
1049 /* Cast the second argument to void *, to avoid type mismatch
1050 if a prototype is present. */
1051 int len = strswaplen (regs[5]);
1053 strnswap (regs[5], len);
1054 regs[0] = utime (ptr (regs[5]), (void *) ptr (regs[6]));
1055 strnswap (regs[5], len);
1059 regs[0] = count_argc (prog_argv);
1062 if (regs[5] < count_argc (prog_argv))
1063 regs[0] = strlen (prog_argv[regs[5]]);
1068 if (regs[5] < count_argc (prog_argv))
1070 /* Include the termination byte. */
1071 int i = strlen (prog_argv[regs[5]]) + 1;
1072 regs[0] = sim_write (0, regs[6], (void *) prog_argv[regs[5]], i);
1078 regs[0] = get_now ();
1081 regs[0] = callback->ftruncate (callback, regs[5], regs[6]);
1085 int len = strswaplen (regs[5]);
1086 strnswap (regs[5], len);
1087 regs[0] = callback->truncate (callback, ptr (regs[5]), regs[6]);
1088 strnswap (regs[5], len);
1095 regs[1] = callback->get_errno (callback);
1100 case 13: /* Set IBNR */
1101 IBNR = regs[0] & 0xffff;
1103 case 14: /* Set IBCR */
1104 IBCR = regs[0] & 0xffff;
1108 raise_exception (SIGTRAP);
1117 div1 (int *R, int iRn2, int iRn1/*, int T*/)
1120 unsigned char old_q, tmp1;
1123 SET_SR_Q ((unsigned char) ((0x80000000 & R[iRn1]) != 0));
1125 R[iRn1] |= (unsigned long) T;
1135 tmp1 = (R[iRn1] > tmp0);
1142 SET_SR_Q ((unsigned char) (tmp1 == 0));
1149 tmp1 = (R[iRn1] < tmp0);
1153 SET_SR_Q ((unsigned char) (tmp1 == 0));
1168 tmp1 = (R[iRn1] < tmp0);
1175 SET_SR_Q ((unsigned char) (tmp1 == 0));
1182 tmp1 = (R[iRn1] > tmp0);
1186 SET_SR_Q ((unsigned char) (tmp1 == 0));
1202 dmul (int sign, unsigned int rm, unsigned int rn)
1204 unsigned long RnL, RnH;
1205 unsigned long RmL, RmH;
1206 unsigned long temp0, temp1, temp2, temp3;
1207 unsigned long Res2, Res1, Res0;
1210 RnH = (rn >> 16) & 0xffff;
1212 RmH = (rm >> 16) & 0xffff;
1218 Res1 = temp1 + temp2;
1221 temp1 = (Res1 << 16) & 0xffff0000;
1222 Res0 = temp0 + temp1;
1225 Res2 += ((Res1 >> 16) & 0xffff) + temp3;
1229 if (rn & 0x80000000)
1231 if (rm & 0x80000000)
1240 macw (int *regs, unsigned char *memory, int n, int m, int endianw)
1243 long prod, macl, sum;
1245 tempm=RSWAT (regs[m]); regs[m]+=2;
1246 tempn=RSWAT (regs[n]); regs[n]+=2;
1249 prod = (long) (short) tempm * (long) (short) tempn;
1253 if ((~(prod ^ macl) & (sum ^ prod)) < 0)
1255 /* MACH's lsb is a sticky overflow bit. */
1257 /* Store the smallest negative number in MACL if prod is
1258 negative, and the largest positive number otherwise. */
1259 sum = 0x7fffffff + (prod < 0);
1265 /* Add to MACH the sign extended product, and carry from low sum. */
1266 mach = MACH + (-(prod < 0)) + ((unsigned long) sum < prod);
1267 /* Sign extend at 10:th bit in MACH. */
1268 MACH = (mach & 0x1ff) | -(mach & 0x200);
1274 macl (int *regs, unsigned char *memory, int n, int m)
1281 tempm = RSLAT (regs[m]);
1284 tempn = RSLAT (regs[n]);
1290 mac64 = ((long long) macl & 0xffffffff) |
1291 ((long long) mach & 0xffffffff) << 32;
1293 ans = (long long) tempm * (long long) tempn; /* Multiply 32bit * 32bit */
1295 mac64 += ans; /* Accumulate 64bit + 64 bit */
1297 macl = (long) (mac64 & 0xffffffff);
1298 mach = (long) ((mac64 >> 32) & 0xffffffff);
1300 if (S) /* Store only 48 bits of the result */
1302 if (mach < 0) /* Result is negative */
1304 mach = mach & 0x0000ffff; /* Mask higher 16 bits */
1305 mach |= 0xffff8000; /* Sign extend higher 16 bits */
1308 mach = mach & 0x00007fff; /* Postive Result */
1339 /* Do extended displacement move instructions. */
1341 do_long_move_insn (int op, int disp12, int m, int n, int *thatlock)
1344 int thislock = *thatlock;
1345 int endianw = global_endianw;
1346 int *R = &(saved_state.asregs.regs[0]);
1347 unsigned char *memory = saved_state.asregs.memory;
1348 int maskb = ~((saved_state.asregs.msize - 1) & ~0);
1349 unsigned char *insn_ptr = PT2H (saved_state.asregs.pc);
1352 case MOVB_RM: /* signed */
1353 WBAT (disp12 * 1 + R[n], R[m]);
1356 WWAT (disp12 * 2 + R[n], R[m]);
1359 WLAT (disp12 * 4 + R[n], R[m]);
1361 case FMOV_RM: /* floating point */
1365 WDAT (R[n] + 8 * disp12, m);
1368 WLAT (R[n] + 4 * disp12, FI (m));
1371 R[n] = RSBAT (disp12 * 1 + R[m]);
1375 R[n] = RSWAT (disp12 * 2 + R[m]);
1379 R[n] = RLAT (disp12 * 4 + R[m]);
1385 RDAT (R[m] + 8 * disp12, n);
1388 SET_FI (n, RLAT (R[m] + 4 * disp12));
1390 case MOVU_BMR: /* unsigned */
1391 R[n] = RBAT (disp12 * 1 + R[m]);
1395 R[n] = RWAT (disp12 * 2 + R[m]);
1399 RAISE_EXCEPTION (SIGINT);
1402 saved_state.asregs.memstalls += memstalls;
1403 *thatlock = thislock;
1406 /* Do binary logical bit-manipulation insns. */
1408 do_blog_insn (int imm, int addr, int binop,
1409 unsigned char *memory, int maskb)
1411 int oldval = RBAT (addr);
1414 case B_BCLR: /* bclr.b */
1415 WBAT (addr, oldval & ~imm);
1417 case B_BSET: /* bset.b */
1418 WBAT (addr, oldval | imm);
1420 case B_BST: /* bst.b */
1422 WBAT (addr, oldval | imm);
1424 WBAT (addr, oldval & ~imm);
1426 case B_BLD: /* bld.b */
1427 SET_SR_T ((oldval & imm) != 0);
1429 case B_BAND: /* band.b */
1430 SET_SR_T (T && ((oldval & imm) != 0));
1432 case B_BOR: /* bor.b */
1433 SET_SR_T (T || ((oldval & imm) != 0));
1435 case B_BXOR: /* bxor.b */
1436 SET_SR_T (T ^ ((oldval & imm) != 0));
1438 case B_BLDNOT: /* bldnot.b */
1439 SET_SR_T ((oldval & imm) == 0);
1441 case B_BANDNOT: /* bandnot.b */
1442 SET_SR_T (T && ((oldval & imm) == 0));
1444 case B_BORNOT: /* bornot.b */
1445 SET_SR_T (T || ((oldval & imm) == 0));
1451 fsca_s (int in, double (*f) (double))
1453 double rad = ldexp ((in & 0xffff), -15) * 3.141592653589793238462643383;
1454 double result = (*f) (rad);
1455 double error, upper, lower, frac;
1458 /* Search the value with the maximum error that is still within the
1459 architectural spec. */
1460 error = ldexp (1., -21);
1461 /* compensate for calculation inaccuracy by reducing error. */
1462 error = error - ldexp (1., -50);
1463 upper = result + error;
1464 frac = frexp (upper, &exp);
1465 upper = ldexp (floor (ldexp (frac, 24)), exp - 24);
1466 lower = result - error;
1467 frac = frexp (lower, &exp);
1468 lower = ldexp (ceil (ldexp (frac, 24)), exp - 24);
1469 return abs (upper - result) >= abs (lower - result) ? upper : lower;
1475 double result = 1. / sqrt (in);
1477 double frac, upper, lower, error, eps;
1480 result = result - (result * result * in - 1) * 0.5 * result;
1481 /* Search the value with the maximum error that is still within the
1482 architectural spec. */
1483 frac = frexp (result, &exp);
1484 frac = ldexp (frac, 24);
1485 error = 4.0; /* 1 << 24-1-21 */
1486 /* use eps to compensate for possible 1 ulp error in our 'exact' result. */
1487 eps = ldexp (1., -29);
1488 upper = floor (frac + error - eps);
1489 if (upper > 16777216.)
1490 upper = floor ((frac + error - eps) * 0.5) * 2.;
1491 lower = ceil ((frac - error + eps) * 2) * .5;
1492 if (lower > 8388608.)
1493 lower = ceil (frac - error + eps);
1494 upper = ldexp (upper, exp - 24);
1495 lower = ldexp (lower, exp - 24);
1496 return upper - result >= result - lower ? upper : lower;
1500 /* GET_LOOP_BOUNDS {EXTENDED}
1501 These two functions compute the actual starting and ending point
1502 of the repeat loop, based on the RS and RE registers (repeat start,
1503 repeat stop). The extended version is called for LDRC, and the
1504 regular version is called for SETRC. The difference is that for
1505 LDRC, the loop start and end instructions are literally the ones
1506 pointed to by RS and RE -- for SETRC, they're not (see docs). */
1508 static struct loop_bounds
1509 get_loop_bounds_ext (int rs, int re, unsigned char *memory,
1510 unsigned char *mem_end, int maskw, int endianw)
1512 struct loop_bounds loop;
1514 /* FIXME: should I verify RS < RE? */
1515 loop.start = PT2H (RS); /* FIXME not using the params? */
1516 loop.end = PT2H (RE & ~1); /* Ignore bit 0 of RE. */
1517 SKIP_INSN (loop.end);
1518 if (loop.end >= mem_end)
1519 loop.end = PT2H (0);
1523 static struct loop_bounds
1524 get_loop_bounds (int rs, int re, unsigned char *memory, unsigned char *mem_end,
1525 int maskw, int endianw)
1527 struct loop_bounds loop;
1533 loop.start = PT2H (RE - 4);
1534 SKIP_INSN (loop.start);
1535 loop.end = loop.start;
1537 SKIP_INSN (loop.end);
1539 SKIP_INSN (loop.end);
1540 SKIP_INSN (loop.end);
1544 loop.start = PT2H (RS);
1545 loop.end = PT2H (RE - 4);
1546 SKIP_INSN (loop.end);
1547 SKIP_INSN (loop.end);
1548 SKIP_INSN (loop.end);
1549 SKIP_INSN (loop.end);
1551 if (loop.end >= mem_end)
1552 loop.end = PT2H (0);
1555 loop.end = PT2H (0);
1560 static void ppi_insn ();
1564 /* Provide calloc / free versions that use an anonymous mmap. This can
1565 significantly cut the start-up time when a large simulator memory is
1566 required, because pages are only zeroed on demand. */
1567 #ifdef MAP_ANONYMOUS
1569 mcalloc (size_t nmemb, size_t size)
1575 return mmap (0, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS,
1579 #define mfree(start,length) munmap ((start), (length))
1581 #define mcalloc calloc
1582 #define mfree(start,length) free(start)
1585 /* Set the memory size to the power of two provided. */
1588 sim_size (int power)
1590 sim_memory_size = power;
1592 if (saved_state.asregs.memory)
1594 mfree (saved_state.asregs.memory, saved_state.asregs.msize);
1597 saved_state.asregs.msize = 1 << power;
1599 saved_state.asregs.memory =
1600 (unsigned char *) mcalloc (1, saved_state.asregs.msize);
1602 if (!saved_state.asregs.memory)
1605 "Not enough VM for simulation of %d bytes of RAM\n",
1606 saved_state.asregs.msize);
1608 saved_state.asregs.msize = 1;
1609 saved_state.asregs.memory = (unsigned char *) mcalloc (1, 1);
1614 init_dsp (struct bfd *abfd)
1616 int was_dsp = target_dsp;
1617 unsigned long mach = bfd_get_mach (abfd);
1619 if (mach == bfd_mach_sh_dsp ||
1620 mach == bfd_mach_sh4al_dsp ||
1621 mach == bfd_mach_sh3_dsp)
1623 int ram_area_size, xram_start, yram_start;
1627 if (mach == bfd_mach_sh_dsp)
1629 /* SH7410 (orig. sh-sdp):
1630 4KB each for X & Y memory;
1631 On-chip X RAM 0x0800f000-0x0800ffff
1632 On-chip Y RAM 0x0801f000-0x0801ffff */
1633 xram_start = 0x0800f000;
1634 ram_area_size = 0x1000;
1636 if (mach == bfd_mach_sh3_dsp || mach == bfd_mach_sh4al_dsp)
1639 8KB each for X & Y memory;
1640 On-chip X RAM 0x1000e000-0x1000ffff
1641 On-chip Y RAM 0x1001e000-0x1001ffff */
1642 xram_start = 0x1000e000;
1643 ram_area_size = 0x2000;
1645 yram_start = xram_start + 0x10000;
1646 new_select = ~(ram_area_size - 1);
1647 if (saved_state.asregs.xyram_select != new_select)
1649 saved_state.asregs.xyram_select = new_select;
1650 free (saved_state.asregs.xmem);
1651 free (saved_state.asregs.ymem);
1652 saved_state.asregs.xmem =
1653 (unsigned char *) calloc (1, ram_area_size);
1654 saved_state.asregs.ymem =
1655 (unsigned char *) calloc (1, ram_area_size);
1657 /* Disable use of X / Y mmeory if not allocated. */
1658 if (! saved_state.asregs.xmem || ! saved_state.asregs.ymem)
1660 saved_state.asregs.xyram_select = 0;
1661 if (saved_state.asregs.xmem)
1662 free (saved_state.asregs.xmem);
1663 if (saved_state.asregs.ymem)
1664 free (saved_state.asregs.ymem);
1667 saved_state.asregs.xram_start = xram_start;
1668 saved_state.asregs.yram_start = yram_start;
1669 saved_state.asregs.xmem_offset = saved_state.asregs.xmem - xram_start;
1670 saved_state.asregs.ymem_offset = saved_state.asregs.ymem - yram_start;
1675 if (saved_state.asregs.xyram_select)
1677 saved_state.asregs.xyram_select = 0;
1678 free (saved_state.asregs.xmem);
1679 free (saved_state.asregs.ymem);
1683 if (! saved_state.asregs.xyram_select)
1685 saved_state.asregs.xram_start = 1;
1686 saved_state.asregs.yram_start = 1;
1689 if (saved_state.asregs.regstack == NULL)
1690 saved_state.asregs.regstack =
1691 calloc (512, sizeof *saved_state.asregs.regstack);
1693 if (target_dsp != was_dsp)
1697 for (i = (sizeof sh_dsp_table / sizeof sh_dsp_table[0]) - 1; i >= 0; i--)
1699 tmp = sh_jump_table[0xf000 + i];
1700 sh_jump_table[0xf000 + i] = sh_dsp_table[i];
1701 sh_dsp_table[i] = tmp;
1707 init_pointers (void)
1709 if (saved_state.asregs.msize != 1 << sim_memory_size)
1711 sim_size (sim_memory_size);
1714 if (saved_state.asregs.profile && !profile_file)
1716 profile_file = fopen ("gmon.out", "wb");
1717 /* Seek to where to put the call arc data */
1718 nsamples = (1 << sim_profile_size);
1720 fseek (profile_file, nsamples * 2 + 12, 0);
1724 fprintf (stderr, "Can't open gmon.out\n");
1728 saved_state.asregs.profile_hist =
1729 (unsigned short *) calloc (64, (nsamples * sizeof (short) / 64));
1742 p = saved_state.asregs.profile_hist;
1744 maxpc = (1 << sim_profile_size);
1746 fseek (profile_file, 0L, 0);
1747 swapout (minpc << PROFILE_SHIFT);
1748 swapout (maxpc << PROFILE_SHIFT);
1749 swapout (nsamples * 2 + 12);
1750 for (i = 0; i < nsamples; i++)
1751 swapout16 (saved_state.asregs.profile_hist[i]);
1756 gotcall (int from, int to)
1763 #define MMASKB ((saved_state.asregs.msize -1) & ~0)
1766 sim_resume (SIM_DESC sd, int step, int siggnal)
1768 register unsigned char *insn_ptr;
1769 unsigned char *mem_end;
1770 struct loop_bounds loop;
1771 register int cycles = 0;
1772 register int stalls = 0;
1773 register int memstalls = 0;
1774 register int insts = 0;
1775 register int prevlock;
1779 register int thislock;
1781 register unsigned int doprofile;
1782 register int pollcount = 0;
1783 /* endianw is used for every insn fetch, hence it makes sense to cache it.
1784 endianb is used less often. */
1785 register int endianw = global_endianw;
1787 int tick_start = get_now ();
1788 void (*prev_fpe) ();
1790 register unsigned short *jump_table = sh_jump_table;
1792 register int *R = &(saved_state.asregs.regs[0]);
1798 register int maskb = ~((saved_state.asregs.msize - 1) & ~0);
1799 register int maskw = ~((saved_state.asregs.msize - 1) & ~1);
1800 register int maskl = ~((saved_state.asregs.msize - 1) & ~3);
1801 register unsigned char *memory;
1802 register unsigned int sbit = ((unsigned int) 1 << 31);
1804 prev_fpe = signal (SIGFPE, SIG_IGN);
1807 saved_state.asregs.exception = 0;
1809 memory = saved_state.asregs.memory;
1810 mem_end = memory + saved_state.asregs.msize;
1813 loop = get_loop_bounds_ext (RS, RE, memory, mem_end, maskw, endianw);
1815 loop = get_loop_bounds (RS, RE, memory, mem_end, maskw, endianw);
1817 insn_ptr = PT2H (saved_state.asregs.pc);
1818 CHECK_INSN_PTR (insn_ptr);
1821 PR = saved_state.asregs.sregs.named.pr;
1823 /*T = GET_SR () & SR_MASK_T;*/
1824 prevlock = saved_state.asregs.prevlock;
1825 thislock = saved_state.asregs.thislock;
1826 doprofile = saved_state.asregs.profile;
1828 /* If profiling not enabled, disable it by asking for
1829 profiles infrequently. */
1834 if (step && insn_ptr < saved_state.asregs.insn_end)
1836 if (saved_state.asregs.exception)
1837 /* This can happen if we've already been single-stepping and
1838 encountered a loop end. */
1839 saved_state.asregs.insn_end = insn_ptr;
1842 saved_state.asregs.exception = SIGTRAP;
1843 saved_state.asregs.insn_end = insn_ptr + 2;
1847 while (insn_ptr < saved_state.asregs.insn_end)
1849 register unsigned int iword = RIAT (insn_ptr);
1850 register unsigned int ult;
1851 register unsigned char *nip = insn_ptr + 2;
1864 if (--pollcount < 0)
1866 host_callback *callback = STATE_CALLBACK (sd);
1868 pollcount = POLL_QUIT_INTERVAL;
1869 if ((*callback->poll_quit) != NULL
1870 && (*callback->poll_quit) (callback))
1877 prevlock = thislock;
1881 if (cycles >= doprofile)
1884 saved_state.asregs.cycles += doprofile;
1885 cycles -= doprofile;
1886 if (saved_state.asregs.profile_hist)
1888 int n = PH2T (insn_ptr) >> PROFILE_SHIFT;
1891 int i = saved_state.asregs.profile_hist[n];
1893 saved_state.asregs.profile_hist[n] = i + 1;
1900 if (saved_state.asregs.insn_end == loop.end)
1902 saved_state.asregs.cregs.named.sr += SR_RC_INCREMENT;
1904 insn_ptr = loop.start;
1907 saved_state.asregs.insn_end = mem_end;
1908 loop.end = PT2H (0);
1913 if (saved_state.asregs.exception == SIGILL
1914 || saved_state.asregs.exception == SIGBUS)
1918 /* Check for SIGBUS due to insn fetch. */
1919 else if (! saved_state.asregs.exception)
1920 saved_state.asregs.exception = SIGBUS;
1922 saved_state.asregs.ticks += get_now () - tick_start;
1923 saved_state.asregs.cycles += cycles;
1924 saved_state.asregs.stalls += stalls;
1925 saved_state.asregs.memstalls += memstalls;
1926 saved_state.asregs.insts += insts;
1927 saved_state.asregs.pc = PH2T (insn_ptr);
1929 saved_state.asregs.sregs.named.pr = PR;
1932 saved_state.asregs.prevlock = prevlock;
1933 saved_state.asregs.thislock = thislock;
1940 signal (SIGFPE, prev_fpe);
1944 sim_write (SIM_DESC sd, SIM_ADDR addr, const unsigned char *buffer, int size)
1950 for (i = 0; i < size; i++)
1952 saved_state.asregs.memory[(MMASKB & (addr + i)) ^ endianb] = buffer[i];
1958 sim_read (SIM_DESC sd, SIM_ADDR addr, unsigned char *buffer, int size)
1964 for (i = 0; i < size; i++)
1966 buffer[i] = saved_state.asregs.memory[(MMASKB & (addr + i)) ^ endianb];
1971 static int gdb_bank_number;
1981 sh_reg_store (SIM_CPU *cpu, int rn, unsigned char *memory, int length)
1986 val = swap (* (int *) memory);
1989 case SIM_SH_R0_REGNUM: case SIM_SH_R1_REGNUM: case SIM_SH_R2_REGNUM:
1990 case SIM_SH_R3_REGNUM: case SIM_SH_R4_REGNUM: case SIM_SH_R5_REGNUM:
1991 case SIM_SH_R6_REGNUM: case SIM_SH_R7_REGNUM: case SIM_SH_R8_REGNUM:
1992 case SIM_SH_R9_REGNUM: case SIM_SH_R10_REGNUM: case SIM_SH_R11_REGNUM:
1993 case SIM_SH_R12_REGNUM: case SIM_SH_R13_REGNUM: case SIM_SH_R14_REGNUM:
1994 case SIM_SH_R15_REGNUM:
1995 saved_state.asregs.regs[rn] = val;
1997 case SIM_SH_PC_REGNUM:
1998 saved_state.asregs.pc = val;
2000 case SIM_SH_PR_REGNUM:
2003 case SIM_SH_GBR_REGNUM:
2006 case SIM_SH_VBR_REGNUM:
2009 case SIM_SH_MACH_REGNUM:
2012 case SIM_SH_MACL_REGNUM:
2015 case SIM_SH_SR_REGNUM:
2018 case SIM_SH_FPUL_REGNUM:
2021 case SIM_SH_FPSCR_REGNUM:
2024 case SIM_SH_FR0_REGNUM: case SIM_SH_FR1_REGNUM: case SIM_SH_FR2_REGNUM:
2025 case SIM_SH_FR3_REGNUM: case SIM_SH_FR4_REGNUM: case SIM_SH_FR5_REGNUM:
2026 case SIM_SH_FR6_REGNUM: case SIM_SH_FR7_REGNUM: case SIM_SH_FR8_REGNUM:
2027 case SIM_SH_FR9_REGNUM: case SIM_SH_FR10_REGNUM: case SIM_SH_FR11_REGNUM:
2028 case SIM_SH_FR12_REGNUM: case SIM_SH_FR13_REGNUM: case SIM_SH_FR14_REGNUM:
2029 case SIM_SH_FR15_REGNUM:
2030 SET_FI (rn - SIM_SH_FR0_REGNUM, val);
2032 case SIM_SH_DSR_REGNUM:
2035 case SIM_SH_A0G_REGNUM:
2038 case SIM_SH_A0_REGNUM:
2041 case SIM_SH_A1G_REGNUM:
2044 case SIM_SH_A1_REGNUM:
2047 case SIM_SH_M0_REGNUM:
2050 case SIM_SH_M1_REGNUM:
2053 case SIM_SH_X0_REGNUM:
2056 case SIM_SH_X1_REGNUM:
2059 case SIM_SH_Y0_REGNUM:
2062 case SIM_SH_Y1_REGNUM:
2065 case SIM_SH_MOD_REGNUM:
2068 case SIM_SH_RS_REGNUM:
2071 case SIM_SH_RE_REGNUM:
2074 case SIM_SH_SSR_REGNUM:
2077 case SIM_SH_SPC_REGNUM:
2080 /* The rn_bank idiosyncracies are not due to hardware differences, but to
2081 a weird aliasing naming scheme for sh3 / sh3e / sh4. */
2082 case SIM_SH_R0_BANK0_REGNUM: case SIM_SH_R1_BANK0_REGNUM:
2083 case SIM_SH_R2_BANK0_REGNUM: case SIM_SH_R3_BANK0_REGNUM:
2084 case SIM_SH_R4_BANK0_REGNUM: case SIM_SH_R5_BANK0_REGNUM:
2085 case SIM_SH_R6_BANK0_REGNUM: case SIM_SH_R7_BANK0_REGNUM:
2086 if (saved_state.asregs.bfd_mach == bfd_mach_sh2a)
2088 rn -= SIM_SH_R0_BANK0_REGNUM;
2089 saved_state.asregs.regstack[gdb_bank_number].regs[rn] = val;
2093 Rn_BANK (rn - SIM_SH_R0_BANK0_REGNUM) = val;
2095 saved_state.asregs.regs[rn - SIM_SH_R0_BANK0_REGNUM] = val;
2097 case SIM_SH_R0_BANK1_REGNUM: case SIM_SH_R1_BANK1_REGNUM:
2098 case SIM_SH_R2_BANK1_REGNUM: case SIM_SH_R3_BANK1_REGNUM:
2099 case SIM_SH_R4_BANK1_REGNUM: case SIM_SH_R5_BANK1_REGNUM:
2100 case SIM_SH_R6_BANK1_REGNUM: case SIM_SH_R7_BANK1_REGNUM:
2101 if (saved_state.asregs.bfd_mach == bfd_mach_sh2a)
2103 rn -= SIM_SH_R0_BANK1_REGNUM;
2104 saved_state.asregs.regstack[gdb_bank_number].regs[rn + 8] = val;
2108 saved_state.asregs.regs[rn - SIM_SH_R0_BANK1_REGNUM] = val;
2110 Rn_BANK (rn - SIM_SH_R0_BANK1_REGNUM) = val;
2112 case SIM_SH_R0_BANK_REGNUM: case SIM_SH_R1_BANK_REGNUM:
2113 case SIM_SH_R2_BANK_REGNUM: case SIM_SH_R3_BANK_REGNUM:
2114 case SIM_SH_R4_BANK_REGNUM: case SIM_SH_R5_BANK_REGNUM:
2115 case SIM_SH_R6_BANK_REGNUM: case SIM_SH_R7_BANK_REGNUM:
2116 SET_Rn_BANK (rn - SIM_SH_R0_BANK_REGNUM, val);
2118 case SIM_SH_TBR_REGNUM:
2121 case SIM_SH_IBNR_REGNUM:
2124 case SIM_SH_IBCR_REGNUM:
2127 case SIM_SH_BANK_REGNUM:
2128 /* This is a pseudo-register maintained just for gdb.
2129 It tells us what register bank gdb would like to read/write. */
2130 gdb_bank_number = val;
2132 case SIM_SH_BANK_MACL_REGNUM:
2133 saved_state.asregs.regstack[gdb_bank_number].regs[REGBANK_MACL] = val;
2135 case SIM_SH_BANK_GBR_REGNUM:
2136 saved_state.asregs.regstack[gdb_bank_number].regs[REGBANK_GBR] = val;
2138 case SIM_SH_BANK_PR_REGNUM:
2139 saved_state.asregs.regstack[gdb_bank_number].regs[REGBANK_PR] = val;
2141 case SIM_SH_BANK_IVN_REGNUM:
2142 saved_state.asregs.regstack[gdb_bank_number].regs[REGBANK_IVN] = val;
2144 case SIM_SH_BANK_MACH_REGNUM:
2145 saved_state.asregs.regstack[gdb_bank_number].regs[REGBANK_MACH] = val;
2154 sh_reg_fetch (SIM_CPU *cpu, int rn, unsigned char *memory, int length)
2161 case SIM_SH_R0_REGNUM: case SIM_SH_R1_REGNUM: case SIM_SH_R2_REGNUM:
2162 case SIM_SH_R3_REGNUM: case SIM_SH_R4_REGNUM: case SIM_SH_R5_REGNUM:
2163 case SIM_SH_R6_REGNUM: case SIM_SH_R7_REGNUM: case SIM_SH_R8_REGNUM:
2164 case SIM_SH_R9_REGNUM: case SIM_SH_R10_REGNUM: case SIM_SH_R11_REGNUM:
2165 case SIM_SH_R12_REGNUM: case SIM_SH_R13_REGNUM: case SIM_SH_R14_REGNUM:
2166 case SIM_SH_R15_REGNUM:
2167 val = saved_state.asregs.regs[rn];
2169 case SIM_SH_PC_REGNUM:
2170 val = saved_state.asregs.pc;
2172 case SIM_SH_PR_REGNUM:
2175 case SIM_SH_GBR_REGNUM:
2178 case SIM_SH_VBR_REGNUM:
2181 case SIM_SH_MACH_REGNUM:
2184 case SIM_SH_MACL_REGNUM:
2187 case SIM_SH_SR_REGNUM:
2190 case SIM_SH_FPUL_REGNUM:
2193 case SIM_SH_FPSCR_REGNUM:
2196 case SIM_SH_FR0_REGNUM: case SIM_SH_FR1_REGNUM: case SIM_SH_FR2_REGNUM:
2197 case SIM_SH_FR3_REGNUM: case SIM_SH_FR4_REGNUM: case SIM_SH_FR5_REGNUM:
2198 case SIM_SH_FR6_REGNUM: case SIM_SH_FR7_REGNUM: case SIM_SH_FR8_REGNUM:
2199 case SIM_SH_FR9_REGNUM: case SIM_SH_FR10_REGNUM: case SIM_SH_FR11_REGNUM:
2200 case SIM_SH_FR12_REGNUM: case SIM_SH_FR13_REGNUM: case SIM_SH_FR14_REGNUM:
2201 case SIM_SH_FR15_REGNUM:
2202 val = FI (rn - SIM_SH_FR0_REGNUM);
2204 case SIM_SH_DSR_REGNUM:
2207 case SIM_SH_A0G_REGNUM:
2210 case SIM_SH_A0_REGNUM:
2213 case SIM_SH_A1G_REGNUM:
2216 case SIM_SH_A1_REGNUM:
2219 case SIM_SH_M0_REGNUM:
2222 case SIM_SH_M1_REGNUM:
2225 case SIM_SH_X0_REGNUM:
2228 case SIM_SH_X1_REGNUM:
2231 case SIM_SH_Y0_REGNUM:
2234 case SIM_SH_Y1_REGNUM:
2237 case SIM_SH_MOD_REGNUM:
2240 case SIM_SH_RS_REGNUM:
2243 case SIM_SH_RE_REGNUM:
2246 case SIM_SH_SSR_REGNUM:
2249 case SIM_SH_SPC_REGNUM:
2252 /* The rn_bank idiosyncracies are not due to hardware differences, but to
2253 a weird aliasing naming scheme for sh3 / sh3e / sh4. */
2254 case SIM_SH_R0_BANK0_REGNUM: case SIM_SH_R1_BANK0_REGNUM:
2255 case SIM_SH_R2_BANK0_REGNUM: case SIM_SH_R3_BANK0_REGNUM:
2256 case SIM_SH_R4_BANK0_REGNUM: case SIM_SH_R5_BANK0_REGNUM:
2257 case SIM_SH_R6_BANK0_REGNUM: case SIM_SH_R7_BANK0_REGNUM:
2258 if (saved_state.asregs.bfd_mach == bfd_mach_sh2a)
2260 rn -= SIM_SH_R0_BANK0_REGNUM;
2261 val = saved_state.asregs.regstack[gdb_bank_number].regs[rn];
2264 val = (SR_MD && SR_RB
2265 ? Rn_BANK (rn - SIM_SH_R0_BANK0_REGNUM)
2266 : saved_state.asregs.regs[rn - SIM_SH_R0_BANK0_REGNUM]);
2268 case SIM_SH_R0_BANK1_REGNUM: case SIM_SH_R1_BANK1_REGNUM:
2269 case SIM_SH_R2_BANK1_REGNUM: case SIM_SH_R3_BANK1_REGNUM:
2270 case SIM_SH_R4_BANK1_REGNUM: case SIM_SH_R5_BANK1_REGNUM:
2271 case SIM_SH_R6_BANK1_REGNUM: case SIM_SH_R7_BANK1_REGNUM:
2272 if (saved_state.asregs.bfd_mach == bfd_mach_sh2a)
2274 rn -= SIM_SH_R0_BANK1_REGNUM;
2275 val = saved_state.asregs.regstack[gdb_bank_number].regs[rn + 8];
2278 val = (! SR_MD || ! SR_RB
2279 ? Rn_BANK (rn - SIM_SH_R0_BANK1_REGNUM)
2280 : saved_state.asregs.regs[rn - SIM_SH_R0_BANK1_REGNUM]);
2282 case SIM_SH_R0_BANK_REGNUM: case SIM_SH_R1_BANK_REGNUM:
2283 case SIM_SH_R2_BANK_REGNUM: case SIM_SH_R3_BANK_REGNUM:
2284 case SIM_SH_R4_BANK_REGNUM: case SIM_SH_R5_BANK_REGNUM:
2285 case SIM_SH_R6_BANK_REGNUM: case SIM_SH_R7_BANK_REGNUM:
2286 val = Rn_BANK (rn - SIM_SH_R0_BANK_REGNUM);
2288 case SIM_SH_TBR_REGNUM:
2291 case SIM_SH_IBNR_REGNUM:
2294 case SIM_SH_IBCR_REGNUM:
2297 case SIM_SH_BANK_REGNUM:
2298 /* This is a pseudo-register maintained just for gdb.
2299 It tells us what register bank gdb would like to read/write. */
2300 val = gdb_bank_number;
2302 case SIM_SH_BANK_MACL_REGNUM:
2303 val = saved_state.asregs.regstack[gdb_bank_number].regs[REGBANK_MACL];
2305 case SIM_SH_BANK_GBR_REGNUM:
2306 val = saved_state.asregs.regstack[gdb_bank_number].regs[REGBANK_GBR];
2308 case SIM_SH_BANK_PR_REGNUM:
2309 val = saved_state.asregs.regstack[gdb_bank_number].regs[REGBANK_PR];
2311 case SIM_SH_BANK_IVN_REGNUM:
2312 val = saved_state.asregs.regstack[gdb_bank_number].regs[REGBANK_IVN];
2314 case SIM_SH_BANK_MACH_REGNUM:
2315 val = saved_state.asregs.regstack[gdb_bank_number].regs[REGBANK_MACH];
2320 * (int *) memory = swap (val);
2325 sim_stop_reason (SIM_DESC sd, enum sim_stop *reason, int *sigrc)
2327 /* The SH simulator uses SIGQUIT to indicate that the program has
2328 exited, so we must check for it here and translate it to exit. */
2329 if (saved_state.asregs.exception == SIGQUIT)
2331 *reason = sim_exited;
2332 *sigrc = saved_state.asregs.regs[5];
2336 *reason = sim_stopped;
2337 *sigrc = saved_state.asregs.exception;
2342 sim_info (SIM_DESC sd, int verbose)
2345 (double) saved_state.asregs.ticks / (double) now_persec ();
2346 double virttime = saved_state.asregs.cycles / 36.0e6;
2348 sim_io_printf (sd, "\n\n# instructions executed %10d\n",
2349 saved_state.asregs.insts);
2350 sim_io_printf (sd, "# cycles %10d\n",
2351 saved_state.asregs.cycles);
2352 sim_io_printf (sd, "# pipeline stalls %10d\n",
2353 saved_state.asregs.stalls);
2354 sim_io_printf (sd, "# misaligned load/store %10d\n",
2355 saved_state.asregs.memstalls);
2356 sim_io_printf (sd, "# real time taken %10.4f\n", timetaken);
2357 sim_io_printf (sd, "# virtual time taken %10.4f\n", virttime);
2358 sim_io_printf (sd, "# profiling size %10d\n", sim_profile_size);
2359 sim_io_printf (sd, "# profiling frequency %10d\n",
2360 saved_state.asregs.profile);
2361 sim_io_printf (sd, "# profile maxpc %10x\n",
2362 (1 << sim_profile_size) << PROFILE_SHIFT);
2366 sim_io_printf (sd, "# cycles/second %10d\n",
2367 (int) (saved_state.asregs.cycles / timetaken));
2368 sim_io_printf (sd, "# simulation ratio %10.4f\n",
2369 virttime / timetaken);
2374 sh_pc_get (sim_cpu *cpu)
2376 return saved_state.asregs.pc;
2380 sh_pc_set (sim_cpu *cpu, sim_cia pc)
2382 saved_state.asregs.pc = pc;
2386 free_state (SIM_DESC sd)
2388 if (STATE_MODULES (sd) != NULL)
2389 sim_module_uninstall (sd);
2390 sim_cpu_free_all (sd);
2391 sim_state_free (sd);
2395 sim_open (SIM_OPEN_KIND kind, host_callback *cb, struct bfd *abfd, char **argv)
2407 SIM_DESC sd = sim_state_alloc (kind, cb);
2408 SIM_ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER);
2410 /* The cpu data is kept in a separately allocated chunk of memory. */
2411 if (sim_cpu_alloc_all (sd, 1, /*cgen_cpu_max_extra_bytes ()*/0) != SIM_RC_OK)
2417 if (sim_pre_argv_init (sd, argv[0]) != SIM_RC_OK)
2423 /* getopt will print the error message so we just have to exit if this fails.
2424 FIXME: Hmmm... in the case of gdb we need getopt to call
2426 if (sim_parse_args (sd, argv) != SIM_RC_OK)
2432 /* Check for/establish the a reference program image. */
2433 if (sim_analyze_program (sd,
2434 (STATE_PROG_ARGV (sd) != NULL
2435 ? *STATE_PROG_ARGV (sd)
2436 : NULL), abfd) != SIM_RC_OK)
2442 /* Configure/verify the target byte order and other runtime
2443 configuration options. */
2444 if (sim_config (sd) != SIM_RC_OK)
2446 sim_module_uninstall (sd);
2450 if (sim_post_argv_init (sd) != SIM_RC_OK)
2452 /* Uninstall the modules to avoid memory leaks,
2453 file descriptor leaks, etc. */
2454 sim_module_uninstall (sd);
2458 /* CPU specific initialization. */
2459 for (i = 0; i < MAX_NR_PROCESSORS; ++i)
2461 SIM_CPU *cpu = STATE_CPU (sd, i);
2463 CPU_REG_FETCH (cpu) = sh_reg_fetch;
2464 CPU_REG_STORE (cpu) = sh_reg_store;
2465 CPU_PC_FETCH (cpu) = sh_pc_get;
2466 CPU_PC_STORE (cpu) = sh_pc_set;
2469 for (p = argv + 1; *p != NULL; ++p)
2472 parse_and_set_memory_size (sd, *p);
2478 for (i = 4; (i -= 2) >= 0; )
2479 mem_word.s[i >> 1] = i;
2480 global_endianw = mem_word.i >> (target_little_endian ? 0 : 16) & 0xffff;
2482 for (i = 4; --i >= 0; )
2484 endianb = mem_word.i >> (target_little_endian ? 0 : 24) & 0xff;
2490 parse_and_set_memory_size (SIM_DESC sd, const char *str)
2494 n = strtol (str, NULL, 10);
2495 if (n > 0 && n <= 24)
2496 sim_memory_size = n;
2498 sim_io_printf (sd, "Bad memory size %d; must be 1 to 24, inclusive\n", n);
2502 sim_create_inferior (SIM_DESC sd, struct bfd *prog_bfd, char **argv, char **env)
2504 /* Clear the registers. */
2505 memset (&saved_state, 0,
2506 (char*) &saved_state.asregs.end_of_registers - (char*) &saved_state);
2509 if (prog_bfd != NULL)
2510 saved_state.asregs.pc = bfd_get_start_address (prog_bfd);
2512 /* Set the bfd machine type. */
2513 if (prog_bfd != NULL)
2514 saved_state.asregs.bfd_mach = bfd_get_mach (prog_bfd);
2516 if (prog_bfd != NULL)
2517 init_dsp (prog_bfd);
2523 sim_do_command (SIM_DESC sd, const char *cmd)
2525 const char *sms_cmd = "set-memory-size";
2528 if (cmd == NULL || *cmd == '\0')
2533 cmdsize = strlen (sms_cmd);
2534 if (strncmp (cmd, sms_cmd, cmdsize) == 0
2535 && strchr (" \t", cmd[cmdsize]) != NULL)
2537 parse_and_set_memory_size (sd, cmd + cmdsize + 1);
2539 else if (strcmp (cmd, "help") == 0)
2541 sim_io_printf (sd, "List of SH simulator commands:\n\n");
2542 sim_io_printf (sd, "set-memory-size <n> -- Set the number of address bits to use\n");
2543 sim_io_printf (sd, "\n");
2547 sim_io_printf (sd, "Error: \"%s\" is not a valid SH simulator command.\n", cmd);