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
104 int end_of_registers
;
107 #define PROFILE_FREQ 1
108 #define PROFILE_SHIFT 2
110 unsigned short *profile_hist
;
111 unsigned char *memory
;
117 saved_state_type saved_state
;
120 /* These variables are at file scope so that functions other than
121 sim_resume can use the fetch/store macros */
123 static int target_little_endian
;
124 static int host_little_endian
;
127 static int maskl
= ~0;
128 static int maskw
= ~0;
131 static SIM_OPEN_KIND sim_kind
;
135 /* Short hand definitions of the registers */
137 #define SBIT(x) ((x)&sbit)
138 #define R0 saved_state.asregs.regs[0]
139 #define Rn saved_state.asregs.regs[n]
140 #define Rm saved_state.asregs.regs[m]
141 #define UR0 (unsigned int)(saved_state.asregs.regs[0])
142 #define UR (unsigned int)R
143 #define UR (unsigned int)R
144 #define SR0 saved_state.asregs.regs[0]
145 #define GBR saved_state.asregs.gbr
146 #define VBR saved_state.asregs.vbr
147 #define SSR saved_state.asregs.ssr
148 #define SPC saved_state.asregs.spc
149 #define MACH saved_state.asregs.mach
150 #define MACL saved_state.asregs.macl
151 #define FPUL saved_state.asregs.fpul
157 /* Alternate bank of registers r0-r6 */
159 /* Note: code controling SR handles flips between BANK0 and BANK1 */
160 #define Rn_BANK(n) (saved_state.asregs.bank[!SR_RB][(n)])
161 #define SET_Rn_BANK(n, EXP) do { saved_state.asregs.bank[!SR_RB][(n)] = (EXP); } while (0)
166 #define SR_MASK_M (1 << 9)
167 #define SR_MASK_Q (1 << 8)
168 #define SR_MASK_I (0xf << 4)
169 #define SR_MASK_S (1 << 1)
170 #define SR_MASK_T (1 << 0)
172 #define SR_MASK_BL (1 << 28)
173 #define SR_MASK_RB (1 << 29)
174 #define SR_MASK_MD (1 << 30)
176 #define M ((saved_state.asregs.sr & SR_MASK_M) != 0)
177 #define Q ((saved_state.asregs.sr & SR_MASK_Q) != 0)
178 #define S ((saved_state.asregs.sr & SR_MASK_S) != 0)
179 #define T ((saved_state.asregs.sr & SR_MASK_T) != 0)
181 #define SR_BL ((saved_state.asregs.sr & SR_MASK_BL) != 0)
182 #define SR_RB ((saved_state.asregs.sr & SR_MASK_RB) != 0)
183 #define SR_MD ((saved_state.asregs.sr & SR_MASK_MD) != 0)
185 /* Note: don't use this for privileged bits */
186 #define SET_SR_BIT(EXP, BIT) \
189 saved_state.asregs.sr |= (BIT); \
191 saved_state.asregs.sr &= ~(BIT); \
194 #define SET_SR_M(EXP) SET_SR_BIT ((EXP), SR_MASK_M)
195 #define SET_SR_Q(EXP) SET_SR_BIT ((EXP), SR_MASK_Q)
196 #define SET_SR_S(EXP) SET_SR_BIT ((EXP), SR_MASK_S)
197 #define SET_SR_T(EXP) SET_SR_BIT ((EXP), SR_MASK_T)
199 #define GET_SR() (saved_state.asregs.sr - 0)
200 #define SET_SR(x) set_sr (x)
205 /* do we need to swap banks */
206 int old_gpr
= (SR_MD
? !SR_RB
: 0);
207 int new_gpr
= ((new_sr
& SR_MASK_MD
)
208 ? (new_sr
& SR_MASK_RB
) == 0
210 if (old_gpr
!= new_gpr
)
213 for (i
= 0; i
< 8; i
++)
215 saved_state
.asregs
.bank
[old_gpr
][i
] = saved_state
.asregs
.regs
[i
];
216 saved_state
.asregs
.regs
[i
] = saved_state
.asregs
.bank
[new_gpr
][i
];
222 /* Manipulate FPSCR */
224 #define set_fpscr1(x)
225 #define SET_FPSCR(x) (saved_state.asregs.fpscr = (x))
226 #define GET_FPSCR() (saved_state.asregs.fpscr)
235 /* This function exists solely for the purpose of setting a breakpoint to
236 catch simulated bus errors when running the simulator under GDB. */
243 /* FIXME: sim_resume should be renamed to sim_engine_run. sim_resume
244 being implemented by ../common/sim_resume.c and the below should
245 make a call to sim_engine_halt */
247 #define BUSERROR(addr, mask) \
248 if (addr & ~mask) { saved_state.asregs.exception = SIGBUS; bp_holder (); }
250 /* Define this to enable register lifetime checking.
251 The compiler generates "add #0,rn" insns to mark registers as invalid,
252 the simulator uses this info to call fail if it finds a ref to an invalid
253 register before a def
260 #define CREF(x) if(!valid[x]) fail();
261 #define CDEF(x) valid[x] = 1;
262 #define UNDEF(x) valid[x] = 0;
269 static void parse_and_set_memory_size
PARAMS ((char *str
));
271 static int IOMEM
PARAMS ((int addr
, int write
, int value
));
273 static host_callback
*callback
;
277 /* Floating point registers */
279 #define FI(n) (saved_state.asregs.fregs.i[(n)])
280 #define FR(n) (saved_state.asregs.fregs.f[(n)])
282 #define SET_FI(n,EXP) (saved_state.asregs.fregs.i[(n)] = (EXP))
283 #define SET_FR(n,EXP) (saved_state.asregs.fregs.f[(n)] = (EXP))
285 #define FP_OP(n, OP, m) (SET_FR(n, (FR(n) OP FR(m))))
286 #define FP_UNARY(n, OP) (SET_FR(n, (OP (FR(n)))))
287 #define FP_CMP(n, OP, m) SET_SR_T(FR(n) OP FR(m))
292 wlat_little (memory
, x
, value
, maskl
)
293 unsigned char *memory
;
296 unsigned char *p
= memory
+ ((x
) & maskl
);
305 wwat_little (memory
, x
, value
, maskw
)
306 unsigned char *memory
;
309 unsigned char *p
= memory
+ ((x
) & maskw
);
317 wbat_any (memory
, x
, value
, maskb
)
318 unsigned char *memory
;
320 unsigned char *p
= memory
+ (x
& maskb
);
329 wlat_big (memory
, x
, value
, maskl
)
330 unsigned char *memory
;
333 unsigned char *p
= memory
+ ((x
) & maskl
);
343 wwat_big (memory
, x
, value
, maskw
)
344 unsigned char *memory
;
347 unsigned char *p
= memory
+ ((x
) & maskw
);
355 wbat_big (memory
, x
, value
, maskb
)
356 unsigned char *memory
;
358 unsigned char *p
= memory
+ (x
& maskb
);
369 rlat_little (memory
, x
, maskl
)
370 unsigned char *memory
;
372 unsigned char *p
= memory
+ ((x
) & maskl
);
375 return (p
[3] << 24) | (p
[2] << 16) | (p
[1] << 8) | p
[0];
379 rwat_little (memory
, x
, maskw
)
380 unsigned char *memory
;
382 unsigned char *p
= memory
+ ((x
) & maskw
);
385 return (p
[1] << 8) | p
[0];
389 rbat_any (memory
, x
, maskb
)
390 unsigned char *memory
;
392 unsigned char *p
= memory
+ ((x
) & maskb
);
399 rlat_big (memory
, x
, maskl
)
400 unsigned char *memory
;
402 unsigned char *p
= memory
+ ((x
) & maskl
);
405 return (p
[0] << 24) | (p
[1] << 16) | (p
[2] << 8) | p
[3];
409 rwat_big (memory
, x
, maskw
)
410 unsigned char *memory
;
412 unsigned char *p
= memory
+ ((x
) & maskw
);
415 return (p
[0] << 8) | p
[1];
418 #define RWAT(x) (little_endian ? rwat_little(memory, x, maskw): rwat_big(memory, x, maskw))
419 #define RLAT(x) (little_endian ? rlat_little(memory, x, maskl): rlat_big(memory, x, maskl))
420 #define RBAT(x) (rbat_any (memory, x, maskb))
421 #define WWAT(x,v) (little_endian ? wwat_little(memory, x, v, maskw): wwat_big(memory, x, v, maskw))
422 #define WLAT(x,v) (little_endian ? wlat_little(memory, x, v, maskl): wlat_big(memory, x, v, maskl))
423 #define WBAT(x,v) (wbat_any (memory, x, v, maskb))
425 #define RUWAT(x) (RWAT(x) & 0xffff)
426 #define RSWAT(x) ((short)(RWAT(x)))
427 #define RSBAT(x) (SEXT(RBAT(x)))
432 #define MA(n) do { memstalls += (((pc & 3) != 0) ? (n) : ((n) - 1)); } while (0)
434 #define SEXT(x) (((x & 0xff) ^ (~0x7f))+0x80)
435 #define SEXT12(x) (((x & 0xfff) ^ 0x800) - 0x800)
436 #define SEXTW(y) ((int)((short)y))
438 #define Delay_Slot(TEMPPC) iword = RUWAT(TEMPPC); goto top;
442 #define L(x) thislock = x;
443 #define TL(x) if ((x) == prevlock) stalls++;
444 #define TB(x,y) if ((x) == prevlock || (y)==prevlock) stalls++;
446 #if defined(__GO32__) || defined(_WIN32)
447 int sim_memory_size
= 19;
449 int sim_memory_size
= 24;
452 static int sim_profile_size
= 17;
458 #define SMR1 (0x05FFFEC8) /* Channel 1 serial mode register */
459 #define BRR1 (0x05FFFEC9) /* Channel 1 bit rate register */
460 #define SCR1 (0x05FFFECA) /* Channel 1 serial control register */
461 #define TDR1 (0x05FFFECB) /* Channel 1 transmit data register */
462 #define SSR1 (0x05FFFECC) /* Channel 1 serial status register */
463 #define RDR1 (0x05FFFECD) /* Channel 1 receive data register */
465 #define SCI_RDRF 0x40 /* Recieve data register full */
466 #define SCI_TDRE 0x80 /* Transmit data register empty */
469 IOMEM (addr
, write
, value
)
501 return time ((long *) 0);
510 static FILE *profile_file
;
514 unsigned char *memory
;
517 int little_endian
= target_little_endian
;
523 unsigned char *memory
;
526 int little_endian
= target_little_endian
;
538 fwrite (b
, 4, 1, profile_file
);
548 fwrite (b
, 2, 1, profile_file
);
551 /* Turn a pointer in a register into a pointer into real memory. */
557 return (char *) (x
+ saved_state
.asregs
.memory
);
560 /* Simulate a monitor trap, put the result into r0 and errno into r1 */
563 trap (i
, regs
, memory
, maskl
, maskw
, little_endian
)
566 unsigned char *memory
;
571 printf ("%c", regs
[0]);
574 saved_state
.asregs
.exception
= SIGQUIT
;
576 case 3: /* FIXME: for backwards compat, should be removed */
586 #if !defined(__GO32__) && !defined(_WIN32)
591 regs
[0] = execve (ptr (regs
[5]), (char **)ptr (regs
[6]), (char **)ptr (regs
[7]));
594 regs
[0] = execve (ptr (regs
[5]),(char **) ptr (regs
[6]), 0);
603 regs
[0] = pipe (host_fd
);
605 WLAT (buf
, host_fd
[0]);
607 WLAT (buf
, host_fd
[1]);
612 regs
[0] = wait (ptr (regs
[5]));
617 regs
[0] = callback
->read (callback
, regs
[5], ptr (regs
[6]), regs
[7]);
621 regs
[0] = (int)callback
->write_stdout (callback
, ptr(regs
[6]), regs
[7]);
623 regs
[0] = (int)callback
->write (callback
, regs
[5], ptr (regs
[6]), regs
[7]);
626 regs
[0] = callback
->lseek (callback
,regs
[5], regs
[6], regs
[7]);
629 regs
[0] = callback
->close (callback
,regs
[5]);
632 regs
[0] = callback
->open (callback
,ptr (regs
[5]), regs
[6]);
635 /* EXIT - caller can look in r5 to work out the reason */
636 saved_state
.asregs
.exception
= SIGQUIT
;
640 case SYS_stat
: /* added at hmsi */
641 /* stat system call */
643 struct stat host_stat
;
646 regs
[0] = stat (ptr (regs
[5]), &host_stat
);
650 WWAT (buf
, host_stat
.st_dev
);
652 WWAT (buf
, host_stat
.st_ino
);
654 WLAT (buf
, host_stat
.st_mode
);
656 WWAT (buf
, host_stat
.st_nlink
);
658 WWAT (buf
, host_stat
.st_uid
);
660 WWAT (buf
, host_stat
.st_gid
);
662 WWAT (buf
, host_stat
.st_rdev
);
664 WLAT (buf
, host_stat
.st_size
);
666 WLAT (buf
, host_stat
.st_atime
);
670 WLAT (buf
, host_stat
.st_mtime
);
674 WLAT (buf
, host_stat
.st_ctime
);
687 regs
[0] = chown (ptr (regs
[5]), regs
[6], regs
[7]);
691 regs
[0] = chmod (ptr (regs
[5]), regs
[6]);
694 /* Cast the second argument to void *, to avoid type mismatch
695 if a prototype is present. */
696 regs
[0] = utime (ptr (regs
[5]), (void *) ptr (regs
[6]));
701 regs
[1] = callback
->get_errno (callback
);
708 saved_state
.asregs
.exception
= SIGTRAP
;
715 control_c (sig
, code
, scp
, addr
)
721 saved_state
.asregs
.exception
= SIGINT
;
725 div1 (R
, iRn2
, iRn1
/*, T*/)
732 unsigned char old_q
, tmp1
;
735 SET_SR_Q ((unsigned char) ((0x80000000 & R
[iRn1
]) != 0));
737 R
[iRn1
] |= (unsigned long) T
;
747 tmp1
= (R
[iRn1
] > tmp0
);
754 SET_SR_Q ((unsigned char) (tmp1
== 0));
761 tmp1
= (R
[iRn1
] < tmp0
);
765 SET_SR_Q ((unsigned char) (tmp1
== 0));
780 tmp1
= (R
[iRn1
] < tmp0
);
787 SET_SR_Q ((unsigned char) (tmp1
== 0));
794 tmp1
= (R
[iRn1
] > tmp0
);
798 SET_SR_Q ((unsigned char) (tmp1
== 0));
819 unsigned long RnL
, RnH
;
820 unsigned long RmL
, RmH
;
821 unsigned long temp0
, temp1
, temp2
, temp3
;
822 unsigned long Res2
, Res1
, Res0
;
825 RnH
= (rn
>> 16) & 0xffff;
827 RmH
= (rm
>> 16) & 0xffff;
833 Res1
= temp1
+ temp2
;
836 temp1
= (Res1
<< 16) & 0xffff0000;
837 Res0
= temp0
+ temp1
;
840 Res2
+= ((Res1
>> 16) & 0xffff) + temp3
;
855 macw (regs
, memory
, n
, m
)
857 unsigned char *memory
;
860 int little_endian
= target_little_endian
;
862 long prod
, macl
, sum
;
864 tempm
=RSWAT(regs
[m
]); regs
[m
]+=2;
865 tempn
=RSWAT(regs
[n
]); regs
[n
]+=2;
868 prod
= (long)(short) tempm
* (long)(short) tempn
;
872 if ((~(prod
^ macl
) & (sum
^ prod
)) < 0)
874 /* MACH's lsb is a sticky overflow bit. */
876 /* Store the smallest negative number in MACL if prod is
877 negative, and the largest positive number otherwise. */
878 sum
= 0x7fffffff + (prod
< 0);
884 /* Add to MACH the sign extended product, and carry from low sum. */
885 mach
= MACH
+ (-(prod
< 0)) + ((unsigned long) sum
< prod
);
886 /* Sign extend at 10:th bit in MACH. */
887 MACH
= (mach
& 0x1ff) | -(mach
& 0x200);
892 /* Set the memory size to the power of two provided. */
899 saved_state
.asregs
.msize
= 1 << power
;
901 sim_memory_size
= power
;
903 if (saved_state
.asregs
.memory
)
905 free (saved_state
.asregs
.memory
);
908 saved_state
.asregs
.memory
=
909 (unsigned char *) calloc (64, saved_state
.asregs
.msize
/ 64);
911 if (!saved_state
.asregs
.memory
)
914 "Not enough VM for simulation of %d bytes of RAM\n",
915 saved_state
.asregs
.msize
);
917 saved_state
.asregs
.msize
= 1;
918 saved_state
.asregs
.memory
= (unsigned char *) calloc (1, 1);
925 host_little_endian
= 0;
926 *(char*)&host_little_endian
= 1;
927 host_little_endian
&= 1;
929 if (saved_state
.asregs
.msize
!= 1 << sim_memory_size
)
931 sim_size (sim_memory_size
);
934 if (saved_state
.asregs
.profile
&& !profile_file
)
936 profile_file
= fopen ("gmon.out", "wb");
937 /* Seek to where to put the call arc data */
938 nsamples
= (1 << sim_profile_size
);
940 fseek (profile_file
, nsamples
* 2 + 12, 0);
944 fprintf (stderr
, "Can't open gmon.out\n");
948 saved_state
.asregs
.profile_hist
=
949 (unsigned short *) calloc (64, (nsamples
* sizeof (short) / 64));
962 p
= saved_state
.asregs
.profile_hist
;
964 maxpc
= (1 << sim_profile_size
);
966 fseek (profile_file
, 0L, 0);
967 swapout (minpc
<< PROFILE_SHIFT
);
968 swapout (maxpc
<< PROFILE_SHIFT
);
969 swapout (nsamples
* 2 + 12);
970 for (i
= 0; i
< nsamples
; i
++)
971 swapout16 (saved_state
.asregs
.profile_hist
[i
]);
985 #define MMASKB ((saved_state.asregs.msize -1) & ~0)
991 saved_state
.asregs
.exception
= SIGINT
;
996 sim_resume (sd
, step
, siggnal
)
1000 register unsigned int pc
;
1001 register int cycles
= 0;
1002 register int stalls
= 0;
1003 register int memstalls
= 0;
1004 register int insts
= 0;
1005 register int prevlock
;
1006 register int thislock
;
1007 register unsigned int doprofile
;
1008 register int pollcount
= 0;
1009 register int little_endian
= target_little_endian
;
1011 int tick_start
= get_now ();
1013 void (*prev_fpe
) ();
1014 extern unsigned char sh_jump_table0
[];
1016 register unsigned char *jump_table
= sh_jump_table0
;
1018 register int *R
= &(saved_state
.asregs
.regs
[0]);
1022 register int maskb
= ((saved_state
.asregs
.msize
- 1) & ~0);
1023 register int maskw
= ((saved_state
.asregs
.msize
- 1) & ~1);
1024 register int maskl
= ((saved_state
.asregs
.msize
- 1) & ~3);
1025 register unsigned char *memory
;
1026 register unsigned int sbit
= ((unsigned int) 1 << 31);
1028 prev
= signal (SIGINT
, control_c
);
1029 prev_fpe
= signal (SIGFPE
, SIG_IGN
);
1033 memory
= saved_state
.asregs
.memory
;
1037 saved_state
.asregs
.exception
= SIGTRAP
;
1041 saved_state
.asregs
.exception
= 0;
1044 pc
= saved_state
.asregs
.pc
;
1045 PR
= saved_state
.asregs
.pr
;
1046 /*T = GET_SR () & SR_MASK_T;*/
1047 prevlock
= saved_state
.asregs
.prevlock
;
1048 thislock
= saved_state
.asregs
.thislock
;
1049 doprofile
= saved_state
.asregs
.profile
;
1051 /* If profiling not enabled, disable it by asking for
1052 profiles infrequently. */
1058 register unsigned int iword
= RUWAT (pc
);
1059 register unsigned int ult
;
1060 register unsigned int nia
= pc
+ 2;
1071 if (--pollcount
< 0)
1074 if ((*callback
->poll_quit
) != NULL
1075 && (*callback
->poll_quit
) (callback
))
1082 prevlock
= thislock
;
1086 if (cycles
>= doprofile
)
1089 saved_state
.asregs
.cycles
+= doprofile
;
1090 cycles
-= doprofile
;
1091 if (saved_state
.asregs
.profile_hist
)
1093 int n
= pc
>> PROFILE_SHIFT
;
1096 int i
= saved_state
.asregs
.profile_hist
[n
];
1098 saved_state
.asregs
.profile_hist
[n
] = i
+ 1;
1105 while (!saved_state
.asregs
.exception
);
1107 if (saved_state
.asregs
.exception
== SIGILL
1108 || saved_state
.asregs
.exception
== SIGBUS
)
1113 saved_state
.asregs
.ticks
+= get_now () - tick_start
;
1114 saved_state
.asregs
.cycles
+= cycles
;
1115 saved_state
.asregs
.stalls
+= stalls
;
1116 saved_state
.asregs
.memstalls
+= memstalls
;
1117 saved_state
.asregs
.insts
+= insts
;
1118 saved_state
.asregs
.pc
= pc
;
1119 /* restore the T and other cached SR bits */
1121 saved_state
.asregs
.pr
= PR
;
1123 saved_state
.asregs
.prevlock
= prevlock
;
1124 saved_state
.asregs
.thislock
= thislock
;
1131 signal (SIGFPE
, prev_fpe
);
1132 signal (SIGINT
, prev
);
1136 sim_write (sd
, addr
, buffer
, size
)
1139 unsigned char *buffer
;
1146 for (i
= 0; i
< size
; i
++)
1148 saved_state
.asregs
.memory
[MMASKB
& (addr
+ i
)] = buffer
[i
];
1154 sim_read (sd
, addr
, buffer
, size
)
1157 unsigned char *buffer
;
1164 for (i
= 0; i
< size
; i
++)
1166 buffer
[i
] = saved_state
.asregs
.memory
[MMASKB
& (addr
+ i
)];
1171 /* We have to add one to RN as an index into asints because of the padding
1172 added at the start of asregs. */
1174 sim_store_register (sd
, rn
, memory
, length
)
1177 unsigned char *memory
;
1182 little_endian
= target_little_endian
;
1183 if (&saved_state
.asints
[rn
+1]
1184 == &saved_state
.asregs
.fpscr
)
1185 set_fpscr1 (RLAT(0));
1187 saved_state
.asints
[rn
+1] = RLAT(0);
1192 sim_fetch_register (sd
, rn
, memory
, length
)
1195 unsigned char *memory
;
1200 little_endian
= target_little_endian
;
1201 WLAT (0, saved_state
.asints
[rn
+1]);
1213 sim_stop_reason (sd
, reason
, sigrc
)
1215 enum sim_stop
*reason
;
1218 /* The SH simulator uses SIGQUIT to indicate that the program has
1219 exited, so we must check for it here and translate it to exit. */
1220 if (saved_state
.asregs
.exception
== SIGQUIT
)
1222 *reason
= sim_exited
;
1223 *sigrc
= saved_state
.asregs
.regs
[5];
1227 *reason
= sim_stopped
;
1228 *sigrc
= saved_state
.asregs
.exception
;
1233 sim_info (sd
, verbose
)
1237 double timetaken
= (double) saved_state
.asregs
.ticks
/ (double) now_persec ();
1238 double virttime
= saved_state
.asregs
.cycles
/ 36.0e6
;
1240 callback
->printf_filtered (callback
, "\n\n# instructions executed %10d\n",
1241 saved_state
.asregs
.insts
);
1242 callback
->printf_filtered (callback
, "# cycles %10d\n",
1243 saved_state
.asregs
.cycles
);
1244 callback
->printf_filtered (callback
, "# pipeline stalls %10d\n",
1245 saved_state
.asregs
.stalls
);
1246 callback
->printf_filtered (callback
, "# misaligned load/store %10d\n",
1247 saved_state
.asregs
.memstalls
);
1248 callback
->printf_filtered (callback
, "# real time taken %10.4f\n",
1250 callback
->printf_filtered (callback
, "# virtual time taken %10.4f\n",
1252 callback
->printf_filtered (callback
, "# profiling size %10d\n",
1254 callback
->printf_filtered (callback
, "# profiling frequency %10d\n",
1255 saved_state
.asregs
.profile
);
1256 callback
->printf_filtered (callback
, "# profile maxpc %10x\n",
1257 (1 << sim_profile_size
) << PROFILE_SHIFT
);
1261 callback
->printf_filtered (callback
, "# cycles/second %10d\n",
1262 (int) (saved_state
.asregs
.cycles
/ timetaken
));
1263 callback
->printf_filtered (callback
, "# simulation ratio %10.4f\n",
1264 virttime
/ timetaken
);
1272 saved_state
.asregs
.profile
= n
;
1276 sim_set_profile_size (n
)
1279 sim_profile_size
= n
;
1283 sim_open (kind
, cb
, abfd
, argv
)
1296 for (p
= argv
+ 1; *p
!= NULL
; ++p
)
1298 if (strcmp (*p
, "-E") == 0)
1303 /* FIXME: This doesn't use stderr, but then the rest of the
1304 file doesn't either. */
1305 callback
->printf_filtered (callback
, "Missing argument to `-E'.\n");
1308 target_little_endian
= strcmp (*p
, "big") != 0;
1311 else if (isdigit (**p
))
1312 parse_and_set_memory_size (*p
);
1315 if (abfd
!= NULL
&& ! endian_set
)
1316 target_little_endian
= ! bfd_big_endian (abfd
);
1318 /* fudge our descriptor for now */
1319 return (SIM_DESC
) 1;
1323 parse_and_set_memory_size (str
)
1328 n
= strtol (str
, NULL
, 10);
1329 if (n
> 0 && n
<= 24)
1330 sim_memory_size
= n
;
1332 callback
->printf_filtered (callback
, "Bad memory size %d; must be 1 to 24, inclusive\n", n
);
1336 sim_close (sd
, quitting
)
1344 sim_load (sd
, prog
, abfd
, from_tty
)
1350 extern bfd
*sim_load_file (); /* ??? Don't know where this should live. */
1353 prog_bfd
= sim_load_file (sd
, myname
, callback
, prog
, abfd
,
1354 sim_kind
== SIM_OPEN_DEBUG
,
1356 if (prog_bfd
== NULL
)
1359 bfd_close (prog_bfd
);
1364 sim_create_inferior (sd
, prog_bfd
, argv
, env
)
1366 struct _bfd
*prog_bfd
;
1370 /* clear the registers */
1371 memset (&saved_state
, 0,
1372 (char*)&saved_state
.asregs
.end_of_registers
- (char*)&saved_state
);
1374 if (prog_bfd
!= NULL
)
1375 saved_state
.asregs
.pc
= bfd_get_start_address (prog_bfd
);
1380 sim_do_command (sd
, cmd
)
1384 char *sms_cmd
= "set-memory-size";
1387 if (cmd
== NULL
|| *cmd
== '\0')
1392 cmdsize
= strlen (sms_cmd
);
1393 if (strncmp (cmd
, sms_cmd
, cmdsize
) == 0 && strchr (" \t", cmd
[cmdsize
]) != NULL
)
1395 parse_and_set_memory_size (cmd
+ cmdsize
+ 1);
1397 else if (strcmp (cmd
, "help") == 0)
1399 (callback
->printf_filtered
) (callback
, "List of SH simulator commands:\n\n");
1400 (callback
->printf_filtered
) (callback
, "set-memory-size <n> -- Set the number of address bits to use\n");
1401 (callback
->printf_filtered
) (callback
, "\n");
1405 (callback
->printf_filtered
) (callback
, "Error: \"%s\" is not a valid SH simulator command.\n", cmd
);
1410 sim_set_callbacks (p
)