1 #define MSIZE (256*1024)
2 #define MMASKL ((MSIZE -1) & ~3)
3 #define MMASKW ((MSIZE -1) & ~1)
4 #define MMASKB ((MSIZE -1) & ~0)
5 /* Simulator for the Hitachi SH architecture.
7 Written by Steve Chamberlain of Cygnus Support.
10 This file is part of SH sim
13 THIS SOFTWARE IS NOT COPYRIGHTED
15 Cygnus offers the following for use in the public domain. Cygnus
16 makes no warranty with regard to the software or it's performance
17 and the user accepts the software "AS IS" with all faults.
19 CYGNUS DISCLAIMS ANY WARRANTIES, EXPRESS OR IMPLIED, WITH REGARD TO
20 THIS SOFTWARE INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
21 MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
26 #include <sys/times.h>
27 #include <sys/param.h>
29 #define O_RECOMPILE 85
32 #define DISASSEMBLER_TABLE
34 #define SBIT(x) ((x)&sbit)
35 #define R0 saved_state.asregs.regs[0]
36 #define Rn saved_state.asregs.regs[n]
37 #define Rm saved_state.asregs.regs[m]
39 #define UR0 (unsigned long)(saved_state.asregs.regs[0])
40 #define UR (unsigned long)R
41 #define UR (unsigned long)R
43 #define SR0 saved_state.asregs.regs[0]
45 #define GBR saved_state.asregs.gbr
46 #define VBR saved_state.asregs.vbr
47 #define MACH saved_state.asregs.mach
48 #define MACL saved_state.asregs.macl
49 #define GET_SR() (saved_state.asregs.sr.bits.t = T, saved_state.asregs.sr.word)
50 #define SET_SR(x) {saved_state.asregs.sr.word = (x); T =saved_state.asregs.sr.bits.t;}
55 #define LMEM(x) *((long *)(memory+(x&maskl)))
56 #define BMEM(x) *((char *)(memory+(x&maskb)))
57 #define UWMEM(x) *((unsigned short *)(memory+(x&maskw)))
58 #define SWMEM(x) *((short *)(memory+(x&maskw)))
59 #define WLAT(x,value) (LMEM(x) = value)
60 #define RLAT(x) (LMEM(x))
62 #define WWAT(x,value) (UWMEM(x) = value)
63 #define RSWAT(x) (SWMEM(x))
64 #define RUWAT(x) (UWMEM(x))
66 #define WBAT(x,value) (BMEM(x) = value)
67 #define RBAT(x) (BMEM(x))
69 #define SEXT(x) ((int)((char)x))
70 #define SEXTW(y) ((int)((short)y))
71 #define M saved_state.asregs.sr.bits.m
72 #define Q saved_state.asregs.sr.bits.q
73 #define SL(TEMPPC) iword= RUWAT(TEMPPC); goto top;
110 unsigned char *memory
;
123 saved_state_type saved_state
;
127 /*#include "../opcodes/sh-opc.h"*/
135 return b
.tms_utime
+ b
.tms_stime
;
144 /* simulate a monitor trap */
151 printf ("%c", regs
[0]);
154 saved_state
.asregs
.exception
= SIGQUIT
;
157 saved_state
.asregs
.exception
= SIGILL
;
163 control_c (sig
, code
, scp
, addr
)
169 saved_state
.asregs
.exception
= SIGINT
;
180 unsigned char old_q
, tmp1
;
196 tmp1
= (R
[n
] > tmp0
) != Q
;
201 tmp1
= (R
[n
] < tmp0
) == Q
;
211 tmp1
= (R
[n
] < tmp0
) != Q
;
216 tmp1
= (R
[n
] > tmp0
) == Q
;
234 register int cycles
= 0;
235 register int insts
= 0;
236 int tick_start
= get_now ();
238 extern unsigned char sh_jump_table0
[];
240 register unsigned char *jump_table
= sh_jump_table0
;
242 register int *R
= &(saved_state
.asregs
.regs
[0]);
246 register int maskb
= MMASKB
;
247 register int maskw
= MMASKW
;
248 register int maskl
= MMASKL
;
249 register unsigned char *memory
= saved_state
.asregs
.memory
;
250 register int sbit
= (1<<31);
252 prev
= signal (SIGINT
, control_c
);
256 saved_state
.asregs
.exception
= SIGTRAP
;
260 saved_state
.asregs
.exception
= 0;
263 pc
= saved_state
.asregs
.pc
;
264 PR
= saved_state
.asregs
.pr
;
265 T
= saved_state
.asregs
.sr
.bits
.t
;
269 unsigned int iword
= RUWAT (pc
);
280 while (!saved_state
.asregs
.exception
);
282 if (saved_state
.asregs
.exception
== SIGILL
)
287 saved_state
.asregs
.ticks
+= get_now () - tick_start
;
288 saved_state
.asregs
.cycles
+= cycles
;
289 saved_state
.asregs
.insts
+= insts
;
290 saved_state
.asregs
.pc
= pc
;
291 saved_state
.asregs
.sr
.bits
.t
= T
;
292 saved_state
.asregs
.pr
= PR
;
294 signal (SIGINT
, prev
);
300 sim_write (addr
, buffer
, size
)
302 unsigned char *buffer
;
308 for (i
= 0; i
< size
; i
++)
310 saved_state
.asregs
.memory
[MMASKB
& (addr
+ i
)] = buffer
[i
];
315 sim_read (addr
, buffer
, size
)
324 for (i
= 0; i
< size
; i
++)
326 buffer
[i
] = saved_state
.asregs
.memory
[MMASKB
& (addr
+ i
)];
331 sim_store_register (rn
, value
)
335 saved_state
.asregs
.regs
[rn
] = value
;
338 sim_fetch_register (rn
, buf
)
343 int value
= ((int *) (&saved_state
))[rn
];
345 buf
[0] = value
>> 24;
346 buf
[1] = value
>> 16;
363 return saved_state
.asregs
.exception
;
368 saved_state
.asregs
.pc
= x
;
375 double timetaken
= (double) saved_state
.asregs
.ticks
/ (double) now_persec ();
376 double virttime
= saved_state
.asregs
.cycles
/ 10.0e6
;
378 printf ("\n\ninstructions executed %10d\n", saved_state
.asregs
.insts
);
379 printf ("cycles %10d\n", saved_state
.asregs
.cycles
);
380 printf ("real time taken %10.4f\n", timetaken
);
381 printf ("cycles/second %10d\n", (int)(saved_state
.asregs
.cycles
/timetaken
));
382 printf ("virtual time taked %10.4f\n", virttime
);
383 printf ("simulation ratio %10.4f\n", virttime
/ timetaken
);
388 if (!saved_state
.asregs
.memory
)
390 saved_state
.asregs
.memory
= (unsigned char *) (calloc (64, MSIZE
/ 64));