1 /* Simulator for the Hitachi SH architecture.
3 Written by Steve Chamberlain of Cygnus Support.
6 This file is part of SH sim
9 THIS SOFTWARE IS NOT COPYRIGHTED
11 Cygnus offers the following for use in the public domain. Cygnus
12 makes no warranty with regard to the software or it's performance
13 and the user accepts the software "AS IS" with all faults.
15 CYGNUS DISCLAIMS ANY WARRANTIES, EXPRESS OR IMPLIED, WITH REGARD TO
16 THIS SOFTWARE INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17 MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
31 #include "remote-sim.h"
33 /* This file is local - if newlib changes, then so should this. */
39 #include <float.h> /* Needed for _isnan() */
44 #define SIGBUS SIGSEGV
48 #define SIGQUIT SIGTERM
55 #define O_RECOMPILE 85
57 #define DISASSEMBLER_TABLE
87 /* start-sanitize-sh4 */
91 /* end-sanitize-sh4 */
93 /* start-sanitize-sh4 */
95 /* end-sanitize-sh4 */
112 int end_of_registers
;
115 #define PROFILE_FREQ 1
116 #define PROFILE_SHIFT 2
118 unsigned short *profile_hist
;
119 unsigned char *memory
;
125 saved_state_type saved_state
;
128 /* These variables are at file scope so that functions other than
129 sim_resume can use the fetch/store macros */
131 static int target_little_endian
;
132 static int host_little_endian
;
135 static int maskl
= ~0;
136 static int maskw
= ~0;
139 static SIM_OPEN_KIND sim_kind
;
143 /* Short hand definitions of the registers */
145 #define SBIT(x) ((x)&sbit)
146 #define R0 saved_state.asregs.regs[0]
147 #define Rn saved_state.asregs.regs[n]
148 #define Rm saved_state.asregs.regs[m]
149 #define UR0 (unsigned int)(saved_state.asregs.regs[0])
150 #define UR (unsigned int)R
151 #define UR (unsigned int)R
152 #define SR0 saved_state.asregs.regs[0]
153 #define GBR saved_state.asregs.gbr
154 #define VBR saved_state.asregs.vbr
155 #define SSR saved_state.asregs.ssr
156 #define SPC saved_state.asregs.spc
157 #define MACH saved_state.asregs.mach
158 #define MACL saved_state.asregs.macl
159 #define FPUL saved_state.asregs.fpul
165 /* Alternate bank of registers r0-r6 */
167 /* Note: code controling SR handles flips between BANK0 and BANK1 */
168 #define Rn_BANK(n) (saved_state.asregs.bank[!SR_RB][(n)])
169 #define SET_Rn_BANK(n, EXP) do { saved_state.asregs.bank[!SR_RB][(n)] = (EXP); } while (0)
174 #define SR_MASK_M (1 << 9)
175 #define SR_MASK_Q (1 << 8)
176 #define SR_MASK_I (0xf << 4)
177 #define SR_MASK_S (1 << 1)
178 #define SR_MASK_T (1 << 0)
180 #define SR_MASK_BL (1 << 28)
181 #define SR_MASK_RB (1 << 29)
182 #define SR_MASK_MD (1 << 30)
184 #define M ((saved_state.asregs.sr & SR_MASK_M) != 0)
185 #define Q ((saved_state.asregs.sr & SR_MASK_Q) != 0)
186 #define S ((saved_state.asregs.sr & SR_MASK_S) != 0)
187 #define T ((saved_state.asregs.sr & SR_MASK_T) != 0)
189 #define SR_BL ((saved_state.asregs.sr & SR_MASK_BL) != 0)
190 #define SR_RB ((saved_state.asregs.sr & SR_MASK_RB) != 0)
191 #define SR_MD ((saved_state.asregs.sr & SR_MASK_MD) != 0)
193 /* Note: don't use this for privileged bits */
194 #define SET_SR_BIT(EXP, BIT) \
197 saved_state.asregs.sr |= (BIT); \
199 saved_state.asregs.sr &= ~(BIT); \
202 #define SET_SR_M(EXP) SET_SR_BIT ((EXP), SR_MASK_M)
203 #define SET_SR_Q(EXP) SET_SR_BIT ((EXP), SR_MASK_Q)
204 #define SET_SR_S(EXP) SET_SR_BIT ((EXP), SR_MASK_S)
205 #define SET_SR_T(EXP) SET_SR_BIT ((EXP), SR_MASK_T)
207 #define GET_SR() (saved_state.asregs.sr - 0)
208 #define SET_SR(x) set_sr (x)
213 /* do we need to swap banks */
214 int old_gpr
= (SR_MD
? !SR_RB
: 0);
215 int new_gpr
= ((new_sr
& SR_MASK_MD
)
216 ? (new_sr
& SR_MASK_RB
) == 0
218 if (old_gpr
!= new_gpr
)
221 for (i
= 0; i
< 8; i
++)
223 saved_state
.asregs
.bank
[old_gpr
][i
] = saved_state
.asregs
.regs
[i
];
224 saved_state
.asregs
.regs
[i
] = saved_state
.asregs
.bank
[new_gpr
][i
];
230 /* Manipulate FPSCR */
232 /* start-sanitize-sh4 */
234 #define FPSCR_MASK_FR (1 << 21)
235 #define FPSCR_MASK_SZ (1 << 20)
236 #define FPSCR_MASK_PR (1 << 19)
238 #define FPSCR_FR ((GET_FPSCR() & FPSCR_MASK_FR) != 0)
239 #define FPSCR_SZ ((GET_FPSCR() & FPSCR_MASK_SZ) != 0)
240 #define FPSCR_PR ((GET_FPSCR() & FPSCR_MASK_PR) != 0)
246 int old
= saved_state
.asregs
.fpscr
;
247 saved_state
.asregs
.fpscr
= (x
);
248 /* swap the floating point register banks */
249 if ((saved_state
.asregs
.fpscr
^ old
) & FPSCR_MASK_FR
)
251 union fregs_u tmpf
= saved_state
.asregs
.fregs
[0];
252 saved_state
.asregs
.fregs
[0] = saved_state
.asregs
.fregs
[1];
253 saved_state
.asregs
.fregs
[1] = tmpf
;
257 #define GET_FPSCR() (saved_state.asregs.fpscr)
258 #define SET_FPSCR(x) \
263 /* end-sanitize-sh4 */
264 #define set_fpscr1(x)
265 #define SET_FPSCR(x) (saved_state.asregs.fpscr = (x))
266 #define GET_FPSCR() (saved_state.asregs.fpscr)
267 /* start-sanitize-sh4 */
269 /* end-sanitize-sh4 */
278 /* start-sanitize-sh4 */
280 special_address (addr
, bits_written
, data
)
282 int bits_written
, data
;
284 if ((unsigned) addr
>> 24 == 0xf0 && bits_written
== 32 && (data
& 1) == 0)
285 /* This invalidates (if not associative) or might invalidate
286 (if associative) an instruction cache line. This is used for
287 trampolines. Since we don't simulate the cache, this is a no-op
288 as far as the simulator is concerned. */
290 /* We can't do anything useful with the other stuff, so fail. */
294 /* end-sanitize-sh4 */
295 /* This function exists solely for the purpose of setting a breakpoint to
296 catch simulated bus errors when running the simulator under GDB. */
303 /* FIXME: sim_resume should be renamed to sim_engine_run. sim_resume
304 being implemented by ../common/sim_resume.c and the below should
305 make a call to sim_engine_halt */
307 /* restore-sanitize-sh4#define BUSERROR(addr, mask) \
308 restore-sanitize-sh4 if (addr & ~mask) { saved_state.asregs.exception = SIGBUS; bp_holder (); }
309 start-sanitize-sh4 */
310 #define BUSERROR(addr, mask, bits_written, data) \
313 if (special_address (addr, bits_written, data)) \
315 saved_state.asregs.exception = SIGBUS; \
318 /* end-sanitize-sh4 */
320 /* Define this to enable register lifetime checking.
321 The compiler generates "add #0,rn" insns to mark registers as invalid,
322 the simulator uses this info to call fail if it finds a ref to an invalid
323 register before a def
330 #define CREF(x) if(!valid[x]) fail();
331 #define CDEF(x) valid[x] = 1;
332 #define UNDEF(x) valid[x] = 0;
339 static void parse_and_set_memory_size
PARAMS ((char *str
));
341 static int IOMEM
PARAMS ((int addr
, int write
, int value
));
343 static host_callback
*callback
;
347 /* Floating point registers */
349 /* start-sanitize-sh4 */
352 #define DR(n) (get_dr (n))
358 if (host_little_endian
)
365 dr
.i
[1] = saved_state
.asregs
.fregs
[0].i
[n
+ 0];
366 dr
.i
[0] = saved_state
.asregs
.fregs
[0].i
[n
+ 1];
370 return (saved_state
.asregs
.fregs
[0].d
[n
>> 1]);
373 #define SET_DR(n, EXP) set_dr ((n), (EXP))
380 if (host_little_endian
)
388 saved_state
.asregs
.fregs
[0].i
[n
+ 0] = dr
.i
[1];
389 saved_state
.asregs
.fregs
[0].i
[n
+ 1] = dr
.i
[0];
392 saved_state
.asregs
.fregs
[0].d
[n
>> 1] = exp
;
395 #define SET_FI(n,EXP) (saved_state.asregs.fregs[0].i[(n)] = (EXP))
396 #define FI(n) (saved_state.asregs.fregs[0].i[(n)])
398 #define FR(n) (saved_state.asregs.fregs[0].f[(n)])
399 #define SET_FR(n,EXP) (saved_state.asregs.fregs[0].f[(n)] = (EXP))
401 #define XD_TO_XF(n) ((((n) & 1) << 5) | ((n) & 0x1e))
402 #define XF(n) (saved_state.asregs.fregs[(n) >> 5].i[(n) & 0x1f])
403 #define SET_XF(n,EXP) (saved_state.asregs.fregs[(n) >> 5].i[(n) & 0x1f] = (EXP))
406 #define FP_OP(n, OP, m) \
410 if (((n) & 1) || ((m) & 1)) \
411 saved_state.asregs.exception = SIGILL; \
413 SET_DR(n, (DR(n) OP DR(m))); \
416 SET_FR(n, (FR(n) OP FR(m))); \
419 #define FP_UNARY(n, OP) \
424 saved_state.asregs.exception = SIGILL; \
426 SET_DR(n, (OP (DR(n)))); \
429 SET_FR(n, (OP (FR(n)))); \
432 #define FP_CMP(n, OP, m) \
436 if (((n) & 1) || ((m) & 1)) \
437 saved_state.asregs.exception = SIGILL; \
439 SET_SR_T (DR(n) OP DR(m)); \
442 SET_SR_T (FR(n) OP FR(m)); \
446 /* end-sanitize-sh4 */
447 #define FI(n) (saved_state.asregs.fregs.i[(n)])
448 #define FR(n) (saved_state.asregs.fregs.f[(n)])
450 #define SET_FI(n,EXP) (saved_state.asregs.fregs.i[(n)] = (EXP))
451 #define SET_FR(n,EXP) (saved_state.asregs.fregs.f[(n)] = (EXP))
453 #define FP_OP(n, OP, m) (SET_FR(n, (FR(n) OP FR(m))))
454 #define FP_UNARY(n, OP) (SET_FR(n, (OP (FR(n)))))
455 #define FP_CMP(n, OP, m) SET_SR_T(FR(n) OP FR(m))
456 /* start-sanitize-sh4 */
458 /* end-sanitize-sh4 */
463 wlat_little (memory
, x
, value
, maskl
)
464 unsigned char *memory
;
467 unsigned char *p
= memory
+ ((x
) & maskl
);
468 /* restore-sanitize-sh4 BUSERROR(x, maskl);
469 start-sanitize-sh4 */
470 BUSERROR(x
, maskl
, 32, v
);
471 /* end-sanitize-sh4 */
479 wwat_little (memory
, x
, value
, maskw
)
480 unsigned char *memory
;
483 unsigned char *p
= memory
+ ((x
) & maskw
);
484 /* restore-sanitize-sh4 BUSERROR(x, maskw);
485 start-sanitize-sh4 */
486 BUSERROR(x
, maskw
, 16, v
);
487 /* end-sanitize-sh4 */
494 wbat_any (memory
, x
, value
, maskb
)
495 unsigned char *memory
;
497 unsigned char *p
= memory
+ (x
& maskb
);
500 /* restore-sanitize-sh4 BUSERROR(x, maskb);
501 start-sanitize-sh4 */
502 BUSERROR(x
, maskb
, 8, value
);
503 /* end-sanitize-sh4 */
509 wlat_big (memory
, x
, value
, maskl
)
510 unsigned char *memory
;
513 unsigned char *p
= memory
+ ((x
) & maskl
);
514 /* restore-sanitize-sh4 BUSERROR(x, maskl);
515 start-sanitize-sh4 */
516 BUSERROR(x
, maskl
, 32, v
);
517 /* end-sanitize-sh4 */
526 wwat_big (memory
, x
, value
, maskw
)
527 unsigned char *memory
;
530 unsigned char *p
= memory
+ ((x
) & maskw
);
531 /* restore-sanitize-sh4 BUSERROR(x, maskw);
532 start-sanitize-sh4 */
533 BUSERROR(x
, maskw
, 16, v
);
534 /* end-sanitize-sh4 */
541 wbat_big (memory
, x
, value
, maskb
)
542 unsigned char *memory
;
544 unsigned char *p
= memory
+ (x
& maskb
);
545 /* restore-sanitize-sh4 BUSERROR(x, maskb);
546 start-sanitize-sh4 */
547 BUSERROR(x
, maskb
, 8, value
);
548 /* end-sanitize-sh4 */
558 rlat_little (memory
, x
, maskl
)
559 unsigned char *memory
;
561 unsigned char *p
= memory
+ ((x
) & maskl
);
562 /* restore-sanitize-sh4 BUSERROR(x, maskl);
563 start-sanitize-sh4 */
564 BUSERROR(x
, maskl
, -32, -1);
565 /* end-sanitize-sh4 */
567 return (p
[3] << 24) | (p
[2] << 16) | (p
[1] << 8) | p
[0];
571 rwat_little (memory
, x
, maskw
)
572 unsigned char *memory
;
574 unsigned char *p
= memory
+ ((x
) & maskw
);
575 /* restore-sanitize-sh4 BUSERROR(x, maskw);
576 start-sanitize-sh4 */
577 BUSERROR(x
, maskw
, -16, -1);
578 /* end-sanitize-sh4 */
580 return (p
[1] << 8) | p
[0];
584 rbat_any (memory
, x
, maskb
)
585 unsigned char *memory
;
587 unsigned char *p
= memory
+ ((x
) & maskb
);
588 /* restore-sanitize-sh4 BUSERROR(x, maskb);
589 start-sanitize-sh4 */
590 BUSERROR(x
, maskb
, -8, -1);
591 /* end-sanitize-sh4 */
597 rlat_big (memory
, x
, maskl
)
598 unsigned char *memory
;
600 unsigned char *p
= memory
+ ((x
) & maskl
);
601 /* restore-sanitize-sh4 BUSERROR(x, maskl);
602 start-sanitize-sh4 */
603 BUSERROR(x
, maskl
, -32, -1);
604 /* end-sanitize-sh4 */
606 return (p
[0] << 24) | (p
[1] << 16) | (p
[2] << 8) | p
[3];
610 rwat_big (memory
, x
, maskw
)
611 unsigned char *memory
;
613 unsigned char *p
= memory
+ ((x
) & maskw
);
614 /* restore-sanitize-sh4 BUSERROR(x, maskw);
615 start-sanitize-sh4 */
616 BUSERROR(x
, maskw
, -16, -1);
617 /* end-sanitize-sh4 */
619 return (p
[0] << 8) | p
[1];
622 #define RWAT(x) (little_endian ? rwat_little(memory, x, maskw): rwat_big(memory, x, maskw))
623 #define RLAT(x) (little_endian ? rlat_little(memory, x, maskl): rlat_big(memory, x, maskl))
624 #define RBAT(x) (rbat_any (memory, x, maskb))
625 #define WWAT(x,v) (little_endian ? wwat_little(memory, x, v, maskw): wwat_big(memory, x, v, maskw))
626 #define WLAT(x,v) (little_endian ? wlat_little(memory, x, v, maskl): wlat_big(memory, x, v, maskl))
627 #define WBAT(x,v) (wbat_any (memory, x, v, maskb))
629 #define RUWAT(x) (RWAT(x) & 0xffff)
630 #define RSWAT(x) ((short)(RWAT(x)))
631 #define RSBAT(x) (SEXT(RBAT(x)))
633 /* start-sanitize-sh4 */
634 #define RDAT(x, n) (do_rdat (memory, (x), (n), (little_endian)))
636 do_rdat (memory
, x
, n
, little_endian
)
648 f0
= rlat_little (memory
, x
+ 0, maskl
);
649 f1
= rlat_little (memory
, x
+ 4, maskl
);
653 f0
= rlat_big (memory
, x
+ 0, maskl
);
654 f1
= rlat_big (memory
, x
+ 4, maskl
);
656 saved_state
.asregs
.fregs
[i
].i
[(j
+ 0)] = f0
;
657 saved_state
.asregs
.fregs
[i
].i
[(j
+ 1)] = f1
;
660 /* end-sanitize-sh4 */
662 /* start-sanitize-sh4 */
663 #define WDAT(x, n) (do_wdat (memory, (x), (n), (little_endian)))
665 do_wdat (memory
, x
, n
, little_endian
)
675 f0
= saved_state
.asregs
.fregs
[i
].i
[(j
+ 0)];
676 f1
= saved_state
.asregs
.fregs
[i
].i
[(j
+ 1)];
679 wlat_little (memory
, (x
+ 0), f0
, maskl
);
680 wlat_little (memory
, (x
+ 4), f1
, maskl
);
684 wlat_big (memory
, (x
+ 0), f0
, maskl
);
685 wlat_big (memory
, (x
+ 4), f1
, maskl
);
689 /* end-sanitize-sh4 */
692 #define MA(n) do { memstalls += (((pc & 3) != 0) ? (n) : ((n) - 1)); } while (0)
694 #define SEXT(x) (((x & 0xff) ^ (~0x7f))+0x80)
695 #define SEXT12(x) (((x & 0xfff) ^ 0x800) - 0x800)
696 #define SEXTW(y) ((int)((short)y))
698 #define Delay_Slot(TEMPPC) iword = RUWAT(TEMPPC); goto top;
702 #define L(x) thislock = x;
703 #define TL(x) if ((x) == prevlock) stalls++;
704 #define TB(x,y) if ((x) == prevlock || (y)==prevlock) stalls++;
706 #if defined(__GO32__) || defined(_WIN32)
707 int sim_memory_size
= 19;
709 int sim_memory_size
= 24;
712 static int sim_profile_size
= 17;
718 #define SMR1 (0x05FFFEC8) /* Channel 1 serial mode register */
719 #define BRR1 (0x05FFFEC9) /* Channel 1 bit rate register */
720 #define SCR1 (0x05FFFECA) /* Channel 1 serial control register */
721 #define TDR1 (0x05FFFECB) /* Channel 1 transmit data register */
722 #define SSR1 (0x05FFFECC) /* Channel 1 serial status register */
723 #define RDR1 (0x05FFFECD) /* Channel 1 receive data register */
725 #define SCI_RDRF 0x40 /* Recieve data register full */
726 #define SCI_TDRE 0x80 /* Transmit data register empty */
729 IOMEM (addr
, write
, value
)
761 return time ((long *) 0);
770 static FILE *profile_file
;
774 unsigned char *memory
;
777 int little_endian
= target_little_endian
;
783 unsigned char *memory
;
786 int little_endian
= target_little_endian
;
798 fwrite (b
, 4, 1, profile_file
);
808 fwrite (b
, 2, 1, profile_file
);
811 /* Turn a pointer in a register into a pointer into real memory. */
817 return (char *) (x
+ saved_state
.asregs
.memory
);
820 /* Simulate a monitor trap, put the result into r0 and errno into r1 */
823 trap (i
, regs
, memory
, maskl
, maskw
, little_endian
)
826 unsigned char *memory
;
831 printf ("%c", regs
[0]);
834 saved_state
.asregs
.exception
= SIGQUIT
;
836 case 3: /* FIXME: for backwards compat, should be removed */
846 #if !defined(__GO32__) && !defined(_WIN32)
851 regs
[0] = execve (ptr (regs
[5]), (char **)ptr (regs
[6]), (char **)ptr (regs
[7]));
854 regs
[0] = execve (ptr (regs
[5]),(char **) ptr (regs
[6]), 0);
863 regs
[0] = pipe (host_fd
);
865 WLAT (buf
, host_fd
[0]);
867 WLAT (buf
, host_fd
[1]);
872 regs
[0] = wait (ptr (regs
[5]));
877 regs
[0] = callback
->read (callback
, regs
[5], ptr (regs
[6]), regs
[7]);
881 regs
[0] = (int)callback
->write_stdout (callback
, ptr(regs
[6]), regs
[7]);
883 regs
[0] = (int)callback
->write (callback
, regs
[5], ptr (regs
[6]), regs
[7]);
886 regs
[0] = callback
->lseek (callback
,regs
[5], regs
[6], regs
[7]);
889 regs
[0] = callback
->close (callback
,regs
[5]);
892 regs
[0] = callback
->open (callback
,ptr (regs
[5]), regs
[6]);
895 /* EXIT - caller can look in r5 to work out the reason */
896 saved_state
.asregs
.exception
= SIGQUIT
;
900 case SYS_stat
: /* added at hmsi */
901 /* stat system call */
903 struct stat host_stat
;
906 regs
[0] = stat (ptr (regs
[5]), &host_stat
);
910 WWAT (buf
, host_stat
.st_dev
);
912 WWAT (buf
, host_stat
.st_ino
);
914 WLAT (buf
, host_stat
.st_mode
);
916 WWAT (buf
, host_stat
.st_nlink
);
918 WWAT (buf
, host_stat
.st_uid
);
920 WWAT (buf
, host_stat
.st_gid
);
922 WWAT (buf
, host_stat
.st_rdev
);
924 WLAT (buf
, host_stat
.st_size
);
926 WLAT (buf
, host_stat
.st_atime
);
930 WLAT (buf
, host_stat
.st_mtime
);
934 WLAT (buf
, host_stat
.st_ctime
);
947 regs
[0] = chown (ptr (regs
[5]), regs
[6], regs
[7]);
951 regs
[0] = chmod (ptr (regs
[5]), regs
[6]);
954 /* Cast the second argument to void *, to avoid type mismatch
955 if a prototype is present. */
956 regs
[0] = utime (ptr (regs
[5]), (void *) ptr (regs
[6]));
961 regs
[1] = callback
->get_errno (callback
);
968 saved_state
.asregs
.exception
= SIGTRAP
;
975 control_c (sig
, code
, scp
, addr
)
981 saved_state
.asregs
.exception
= SIGINT
;
985 div1 (R
, iRn2
, iRn1
/*, T*/)
992 unsigned char old_q
, tmp1
;
995 SET_SR_Q ((unsigned char) ((0x80000000 & R
[iRn1
]) != 0));
997 R
[iRn1
] |= (unsigned long) T
;
1007 tmp1
= (R
[iRn1
] > tmp0
);
1014 SET_SR_Q ((unsigned char) (tmp1
== 0));
1021 tmp1
= (R
[iRn1
] < tmp0
);
1025 SET_SR_Q ((unsigned char) (tmp1
== 0));
1040 tmp1
= (R
[iRn1
] < tmp0
);
1047 SET_SR_Q ((unsigned char) (tmp1
== 0));
1054 tmp1
= (R
[iRn1
] > tmp0
);
1058 SET_SR_Q ((unsigned char) (tmp1
== 0));
1079 unsigned long RnL
, RnH
;
1080 unsigned long RmL
, RmH
;
1081 unsigned long temp0
, temp1
, temp2
, temp3
;
1082 unsigned long Res2
, Res1
, Res0
;
1085 RnH
= (rn
>> 16) & 0xffff;
1087 RmH
= (rm
>> 16) & 0xffff;
1093 Res1
= temp1
+ temp2
;
1096 temp1
= (Res1
<< 16) & 0xffff0000;
1097 Res0
= temp0
+ temp1
;
1100 Res2
+= ((Res1
>> 16) & 0xffff) + temp3
;
1104 if (rn
& 0x80000000)
1106 if (rm
& 0x80000000)
1115 macw (regs
, memory
, n
, m
)
1117 unsigned char *memory
;
1120 int little_endian
= target_little_endian
;
1122 long prod
, macl
, sum
;
1124 tempm
=RSWAT(regs
[m
]); regs
[m
]+=2;
1125 tempn
=RSWAT(regs
[n
]); regs
[n
]+=2;
1128 prod
= (long)(short) tempm
* (long)(short) tempn
;
1132 if ((~(prod
^ macl
) & (sum
^ prod
)) < 0)
1134 /* MACH's lsb is a sticky overflow bit. */
1136 /* Store the smallest negative number in MACL if prod is
1137 negative, and the largest positive number otherwise. */
1138 sum
= 0x7fffffff + (prod
< 0);
1144 /* Add to MACH the sign extended product, and carry from low sum. */
1145 mach
= MACH
+ (-(prod
< 0)) + ((unsigned long) sum
< prod
);
1146 /* Sign extend at 10:th bit in MACH. */
1147 MACH
= (mach
& 0x1ff) | -(mach
& 0x200);
1152 /* Set the memory size to the power of two provided. */
1159 saved_state
.asregs
.msize
= 1 << power
;
1161 sim_memory_size
= power
;
1163 if (saved_state
.asregs
.memory
)
1165 free (saved_state
.asregs
.memory
);
1168 saved_state
.asregs
.memory
=
1169 (unsigned char *) calloc (64, saved_state
.asregs
.msize
/ 64);
1171 if (!saved_state
.asregs
.memory
)
1174 "Not enough VM for simulation of %d bytes of RAM\n",
1175 saved_state
.asregs
.msize
);
1177 saved_state
.asregs
.msize
= 1;
1178 saved_state
.asregs
.memory
= (unsigned char *) calloc (1, 1);
1185 host_little_endian
= 0;
1186 *(char*)&host_little_endian
= 1;
1187 host_little_endian
&= 1;
1189 if (saved_state
.asregs
.msize
!= 1 << sim_memory_size
)
1191 sim_size (sim_memory_size
);
1194 if (saved_state
.asregs
.profile
&& !profile_file
)
1196 profile_file
= fopen ("gmon.out", "wb");
1197 /* Seek to where to put the call arc data */
1198 nsamples
= (1 << sim_profile_size
);
1200 fseek (profile_file
, nsamples
* 2 + 12, 0);
1204 fprintf (stderr
, "Can't open gmon.out\n");
1208 saved_state
.asregs
.profile_hist
=
1209 (unsigned short *) calloc (64, (nsamples
* sizeof (short) / 64));
1222 p
= saved_state
.asregs
.profile_hist
;
1224 maxpc
= (1 << sim_profile_size
);
1226 fseek (profile_file
, 0L, 0);
1227 swapout (minpc
<< PROFILE_SHIFT
);
1228 swapout (maxpc
<< PROFILE_SHIFT
);
1229 swapout (nsamples
* 2 + 12);
1230 for (i
= 0; i
< nsamples
; i
++)
1231 swapout16 (saved_state
.asregs
.profile_hist
[i
]);
1245 #define MMASKB ((saved_state.asregs.msize -1) & ~0)
1251 saved_state
.asregs
.exception
= SIGINT
;
1256 sim_resume (sd
, step
, siggnal
)
1260 register unsigned int pc
;
1261 register int cycles
= 0;
1262 register int stalls
= 0;
1263 register int memstalls
= 0;
1264 register int insts
= 0;
1265 register int prevlock
;
1266 register int thislock
;
1267 register unsigned int doprofile
;
1268 register int pollcount
= 0;
1269 register int little_endian
= target_little_endian
;
1271 int tick_start
= get_now ();
1273 void (*prev_fpe
) ();
1274 extern unsigned char sh_jump_table0
[];
1276 register unsigned char *jump_table
= sh_jump_table0
;
1278 register int *R
= &(saved_state
.asregs
.regs
[0]);
1282 register int maskb
= ((saved_state
.asregs
.msize
- 1) & ~0);
1283 register int maskw
= ((saved_state
.asregs
.msize
- 1) & ~1);
1284 register int maskl
= ((saved_state
.asregs
.msize
- 1) & ~3);
1285 register unsigned char *memory
;
1286 register unsigned int sbit
= ((unsigned int) 1 << 31);
1288 prev
= signal (SIGINT
, control_c
);
1289 prev_fpe
= signal (SIGFPE
, SIG_IGN
);
1293 memory
= saved_state
.asregs
.memory
;
1297 saved_state
.asregs
.exception
= SIGTRAP
;
1301 saved_state
.asregs
.exception
= 0;
1304 pc
= saved_state
.asregs
.pc
;
1305 PR
= saved_state
.asregs
.pr
;
1306 /*T = GET_SR () & SR_MASK_T;*/
1307 prevlock
= saved_state
.asregs
.prevlock
;
1308 thislock
= saved_state
.asregs
.thislock
;
1309 doprofile
= saved_state
.asregs
.profile
;
1311 /* If profiling not enabled, disable it by asking for
1312 profiles infrequently. */
1318 register unsigned int iword
= RUWAT (pc
);
1319 register unsigned int ult
;
1320 register unsigned int nia
= pc
+ 2;
1332 if (pollcount
> 1000)
1335 if ((*callback
->poll_quit
) != NULL
1336 && (*callback
->poll_quit
) (callback
))
1343 prevlock
= thislock
;
1347 if (cycles
>= doprofile
)
1350 saved_state
.asregs
.cycles
+= doprofile
;
1351 cycles
-= doprofile
;
1352 if (saved_state
.asregs
.profile_hist
)
1354 int n
= pc
>> PROFILE_SHIFT
;
1357 int i
= saved_state
.asregs
.profile_hist
[n
];
1359 saved_state
.asregs
.profile_hist
[n
] = i
+ 1;
1366 while (!saved_state
.asregs
.exception
);
1368 if (saved_state
.asregs
.exception
== SIGILL
1369 || saved_state
.asregs
.exception
== SIGBUS
)
1374 saved_state
.asregs
.ticks
+= get_now () - tick_start
;
1375 saved_state
.asregs
.cycles
+= cycles
;
1376 saved_state
.asregs
.stalls
+= stalls
;
1377 saved_state
.asregs
.memstalls
+= memstalls
;
1378 saved_state
.asregs
.insts
+= insts
;
1379 saved_state
.asregs
.pc
= pc
;
1380 /* restore the T and other cached SR bits */
1382 saved_state
.asregs
.pr
= PR
;
1384 saved_state
.asregs
.prevlock
= prevlock
;
1385 saved_state
.asregs
.thislock
= thislock
;
1392 signal (SIGFPE
, prev_fpe
);
1393 signal (SIGINT
, prev
);
1397 sim_write (sd
, addr
, buffer
, size
)
1400 unsigned char *buffer
;
1407 for (i
= 0; i
< size
; i
++)
1409 saved_state
.asregs
.memory
[MMASKB
& (addr
+ i
)] = buffer
[i
];
1415 sim_read (sd
, addr
, buffer
, size
)
1418 unsigned char *buffer
;
1425 for (i
= 0; i
< size
; i
++)
1427 buffer
[i
] = saved_state
.asregs
.memory
[MMASKB
& (addr
+ i
)];
1433 sim_store_register (sd
, rn
, memory
)
1436 unsigned char *memory
;
1440 little_endian
= target_little_endian
;
1441 if (&saved_state
.asints
[rn
]
1442 == &saved_state
.asregs
.fpscr
)
1443 set_fpscr1 (RLAT(0));
1445 saved_state
.asints
[rn
] = RLAT(0);
1449 sim_fetch_register (sd
, rn
, memory
)
1452 unsigned char *memory
;
1456 little_endian
= target_little_endian
;
1457 WLAT (0, saved_state
.asints
[rn
]);
1468 sim_stop_reason (sd
, reason
, sigrc
)
1470 enum sim_stop
*reason
;
1473 /* The SH simulator uses SIGQUIT to indicate that the program has
1474 exited, so we must check for it here and translate it to exit. */
1475 if (saved_state
.asregs
.exception
== SIGQUIT
)
1477 *reason
= sim_exited
;
1478 *sigrc
= saved_state
.asregs
.regs
[5];
1482 *reason
= sim_stopped
;
1483 *sigrc
= saved_state
.asregs
.exception
;
1488 sim_info (sd
, verbose
)
1492 double timetaken
= (double) saved_state
.asregs
.ticks
/ (double) now_persec ();
1493 double virttime
= saved_state
.asregs
.cycles
/ 36.0e6
;
1495 callback
->printf_filtered (callback
, "\n\n# instructions executed %10d\n",
1496 saved_state
.asregs
.insts
);
1497 callback
->printf_filtered (callback
, "# cycles %10d\n",
1498 saved_state
.asregs
.cycles
);
1499 callback
->printf_filtered (callback
, "# pipeline stalls %10d\n",
1500 saved_state
.asregs
.stalls
);
1501 callback
->printf_filtered (callback
, "# misaligned load/store %10d\n",
1502 saved_state
.asregs
.memstalls
);
1503 callback
->printf_filtered (callback
, "# real time taken %10.4f\n",
1505 callback
->printf_filtered (callback
, "# virtual time taken %10.4f\n",
1507 callback
->printf_filtered (callback
, "# profiling size %10d\n",
1509 callback
->printf_filtered (callback
, "# profiling frequency %10d\n",
1510 saved_state
.asregs
.profile
);
1511 callback
->printf_filtered (callback
, "# profile maxpc %10x\n",
1512 (1 << sim_profile_size
) << PROFILE_SHIFT
);
1516 callback
->printf_filtered (callback
, "# cycles/second %10d\n",
1517 (int) (saved_state
.asregs
.cycles
/ timetaken
));
1518 callback
->printf_filtered (callback
, "# simulation ratio %10.4f\n",
1519 virttime
/ timetaken
);
1527 saved_state
.asregs
.profile
= n
;
1531 sim_set_profile_size (n
)
1534 sim_profile_size
= n
;
1538 sim_open (kind
, cb
, abfd
, argv
)
1550 for (p
= argv
+ 1; *p
!= NULL
; ++p
)
1552 if (strcmp (*p
, "-E") == 0)
1557 /* FIXME: This doesn't use stderr, but then the rest of the
1558 file doesn't either. */
1559 callback
->printf_filtered (callback
, "Missing argument to `-E'.\n");
1562 target_little_endian
= strcmp (*p
, "big") != 0;
1564 else if (isdigit (**p
))
1565 parse_and_set_memory_size (*p
);
1568 /* fudge our descriptor for now */
1569 return (SIM_DESC
) 1;
1573 parse_and_set_memory_size (str
)
1578 n
= strtol (str
, NULL
, 10);
1579 if (n
> 0 && n
<= 24)
1580 sim_memory_size
= n
;
1582 callback
->printf_filtered (callback
, "Bad memory size %d; must be 1 to 24, inclusive\n", n
);
1586 sim_close (sd
, quitting
)
1594 sim_load (sd
, prog
, abfd
, from_tty
)
1600 extern bfd
*sim_load_file (); /* ??? Don't know where this should live. */
1603 prog_bfd
= sim_load_file (sd
, myname
, callback
, prog
, abfd
,
1604 sim_kind
== SIM_OPEN_DEBUG
);
1605 if (prog_bfd
== NULL
)
1608 bfd_close (prog_bfd
);
1613 sim_create_inferior (sd
, prog_bfd
, argv
, env
)
1615 struct _bfd
*prog_bfd
;
1619 /* clear the registers */
1620 memset (&saved_state
, 0,
1621 (char*)&saved_state
.asregs
.end_of_registers
- (char*)&saved_state
);
1623 if (prog_bfd
!= NULL
)
1624 saved_state
.asregs
.pc
= bfd_get_start_address (prog_bfd
);
1629 sim_do_command (sd
, cmd
)
1633 char *sms_cmd
= "set-memory-size";
1636 if (cmd
== NULL
|| *cmd
== '\0')
1641 cmdsize
= strlen (sms_cmd
);
1642 if (strncmp (cmd
, sms_cmd
, cmdsize
) == 0 && strchr (" \t", cmd
[cmdsize
]) != NULL
)
1644 parse_and_set_memory_size (cmd
+ cmdsize
+ 1);
1646 else if (strcmp (cmd
, "help") == 0)
1648 (callback
->printf_filtered
) (callback
, "List of SH simulator commands:\n\n");
1649 (callback
->printf_filtered
) (callback
, "set-memory-size <n> -- Set the number of address bits to use\n");
1650 (callback
->printf_filtered
) (callback
, "\n");
1654 (callback
->printf_filtered
) (callback
, "Error: \"%s\" is not a valid SH simulator command.\n", cmd
);
1659 sim_set_callbacks (p
)