]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blob - sim/sh/interp.c
sim: common: change sim_read & sim_write to use void* buffers
[thirdparty/binutils-gdb.git] / sim / sh / interp.c
1 /* Simulator for the Renesas (formerly Hitachi) / SuperH Inc. SH architecture.
2
3 Written by Steve Chamberlain of Cygnus Support.
4 sac@cygnus.com
5
6 This file is part of SH sim
7
8
9 THIS SOFTWARE IS NOT COPYRIGHTED
10
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.
14
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.
18
19 */
20
21 /* This must come before any other includes. */
22 #include "defs.h"
23
24 #include <ctype.h>
25 #include <stdio.h>
26 #include <errno.h>
27 #include <signal.h>
28 #ifdef HAVE_UNISTD_H
29 #include <unistd.h>
30 #endif
31 #ifdef HAVE_MMAP
32 #include <sys/mman.h>
33 # ifndef MAP_FAILED
34 # define MAP_FAILED -1
35 # endif
36 # if !defined (MAP_ANONYMOUS) && defined (MAP_ANON)
37 # define MAP_ANONYMOUS MAP_ANON
38 # endif
39 #endif
40
41 #include <string.h>
42 #include <stdlib.h>
43 #ifdef HAVE_SYS_STAT_H
44 #include <sys/stat.h>
45 #endif
46 #include <time.h>
47 #include <sys/time.h>
48 #ifdef HAVE_UTIME_H
49 #include <utime.h>
50 #endif
51 #ifndef _WIN32
52 #include <sys/wait.h>
53 #endif
54
55 #include "bfd.h"
56 #include "sim/callback.h"
57 #include "sim/sim.h"
58 #include "gdb/sim-sh.h"
59
60 #include "sim-main.h"
61 #include "sim-base.h"
62 #include "sim-options.h"
63
64 #include "target-newlib-syscall.h"
65
66 #include <math.h>
67
68 #ifdef _WIN32
69 #include <float.h> /* Needed for _isnan() */
70 #ifndef isnan
71 #define isnan _isnan
72 #endif
73 #endif
74
75 #ifndef SIGBUS
76 #define SIGBUS SIGSEGV
77 #endif
78
79 #ifndef SIGQUIT
80 #define SIGQUIT SIGTERM
81 #endif
82
83 #ifndef SIGTRAP
84 #define SIGTRAP 5
85 #endif
86
87 /* TODO: Stop using these names. */
88 #undef SEXT
89 #undef SEXT32
90
91 extern unsigned short sh_jump_table[], sh_dsp_table[0x1000], ppi_table[];
92
93 #define O_RECOMPILE 85
94 #define DEFINE_TABLE
95 #define DISASSEMBLER_TABLE
96
97 /* Define the rate at which the simulator should poll the host
98 for a quit. */
99 #define POLL_QUIT_INTERVAL 0x60000
100
101 /* TODO: Move into sim_cpu. */
102 saved_state_type saved_state;
103
104 struct loop_bounds { unsigned char *start, *end; };
105
106 /* These variables are at file scope so that functions other than
107 sim_resume can use the fetch/store macros */
108
109 #define target_little_endian (CURRENT_TARGET_BYTE_ORDER == BFD_ENDIAN_LITTLE)
110 static int global_endianw, endianb;
111 static int target_dsp;
112 #define host_little_endian (HOST_BYTE_ORDER == BFD_ENDIAN_LITTLE)
113
114 static int maskw = 0;
115 static int maskl = 0;
116
117 /* Short hand definitions of the registers */
118
119 #define SBIT(x) ((x)&sbit)
120 #define R0 saved_state.asregs.regs[0]
121 #define Rn saved_state.asregs.regs[n]
122 #define Rm saved_state.asregs.regs[m]
123 #define UR0 (unsigned int) (saved_state.asregs.regs[0])
124 #define UR (unsigned int) R
125 #define UR (unsigned int) R
126 #define SR0 saved_state.asregs.regs[0]
127 #define CREG(n) (saved_state.asregs.cregs[(n)])
128 #define GBR saved_state.asregs.gbr
129 #define VBR saved_state.asregs.vbr
130 #define DBR saved_state.asregs.dbr
131 #define TBR saved_state.asregs.tbr
132 #define IBCR saved_state.asregs.ibcr
133 #define IBNR saved_state.asregs.ibnr
134 #define BANKN (saved_state.asregs.ibnr & 0x1ff)
135 #define ME ((saved_state.asregs.ibnr >> 14) & 0x3)
136 #define SSR saved_state.asregs.ssr
137 #define SPC saved_state.asregs.spc
138 #define SGR saved_state.asregs.sgr
139 #define SREG(n) (saved_state.asregs.sregs[(n)])
140 #define MACH saved_state.asregs.mach
141 #define MACL saved_state.asregs.macl
142 #define PR saved_state.asregs.pr
143 #define FPUL saved_state.asregs.fpul
144
145 #define PC insn_ptr
146
147
148
149 /* Alternate bank of registers r0-r7 */
150
151 /* Note: code controling SR handles flips between BANK0 and BANK1 */
152 #define Rn_BANK(n) (saved_state.asregs.bank[(n)])
153 #define SET_Rn_BANK(n, EXP) do { saved_state.asregs.bank[(n)] = (EXP); } while (0)
154
155
156 /* Manipulate SR */
157
158 #define SR_MASK_BO (1 << 14)
159 #define SR_MASK_CS (1 << 13)
160 #define SR_MASK_DMY (1 << 11)
161 #define SR_MASK_DMX (1 << 10)
162 #define SR_MASK_M (1 << 9)
163 #define SR_MASK_Q (1 << 8)
164 #define SR_MASK_I (0xf << 4)
165 #define SR_MASK_S (1 << 1)
166 #define SR_MASK_T (1 << 0)
167
168 #define SR_MASK_BL (1 << 28)
169 #define SR_MASK_RB (1 << 29)
170 #define SR_MASK_MD (1 << 30)
171 #define SR_MASK_RC 0x0fff0000
172 #define SR_RC_INCREMENT -0x00010000
173
174 #define BO ((saved_state.asregs.sr & SR_MASK_BO) != 0)
175 #define CS ((saved_state.asregs.sr & SR_MASK_CS) != 0)
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)
180 #define LDST ((saved_state.asregs.ldst) != 0)
181
182 #define SR_BL ((saved_state.asregs.sr & SR_MASK_BL) != 0)
183 #define SR_RB ((saved_state.asregs.sr & SR_MASK_RB) != 0)
184 #define SR_MD ((saved_state.asregs.sr & SR_MASK_MD) != 0)
185 #define SR_DMY ((saved_state.asregs.sr & SR_MASK_DMY) != 0)
186 #define SR_DMX ((saved_state.asregs.sr & SR_MASK_DMX) != 0)
187 #define SR_RC ((saved_state.asregs.sr & SR_MASK_RC))
188
189 /* Note: don't use this for privileged bits */
190 #define SET_SR_BIT(EXP, BIT) \
191 do { \
192 if ((EXP) & 1) \
193 saved_state.asregs.sr |= (BIT); \
194 else \
195 saved_state.asregs.sr &= ~(BIT); \
196 } while (0)
197
198 #define SET_SR_BO(EXP) SET_SR_BIT ((EXP), SR_MASK_BO)
199 #define SET_SR_CS(EXP) SET_SR_BIT ((EXP), SR_MASK_CS)
200 #define SET_BANKN(EXP) \
201 do { \
202 IBNR = (IBNR & 0xfe00) | ((EXP) & 0x1f); \
203 } while (0)
204 #define SET_ME(EXP) \
205 do { \
206 IBNR = (IBNR & 0x3fff) | (((EXP) & 0x3) << 14); \
207 } while (0)
208 #define SET_SR_M(EXP) SET_SR_BIT ((EXP), SR_MASK_M)
209 #define SET_SR_Q(EXP) SET_SR_BIT ((EXP), SR_MASK_Q)
210 #define SET_SR_S(EXP) SET_SR_BIT ((EXP), SR_MASK_S)
211 #define SET_SR_T(EXP) SET_SR_BIT ((EXP), SR_MASK_T)
212 #define SET_LDST(EXP) (saved_state.asregs.ldst = ((EXP) != 0))
213
214 /* stc currently relies on being able to read SR without modifications. */
215 #define GET_SR() (saved_state.asregs.sr - 0)
216
217 #define SET_SR(x) set_sr (x)
218
219 #define SET_RC(x) \
220 (saved_state.asregs.sr \
221 = (saved_state.asregs.sr & 0xf000ffff) | ((x) & 0xfff) << 16)
222
223 /* Manipulate FPSCR */
224
225 #define FPSCR_MASK_FR (1 << 21)
226 #define FPSCR_MASK_SZ (1 << 20)
227 #define FPSCR_MASK_PR (1 << 19)
228
229 #define FPSCR_FR ((GET_FPSCR () & FPSCR_MASK_FR) != 0)
230 #define FPSCR_SZ ((GET_FPSCR () & FPSCR_MASK_SZ) != 0)
231 #define FPSCR_PR ((GET_FPSCR () & FPSCR_MASK_PR) != 0)
232
233 static void
234 set_fpscr1 (int x)
235 {
236 int old = saved_state.asregs.fpscr;
237 saved_state.asregs.fpscr = (x);
238 /* swap the floating point register banks */
239 if ((saved_state.asregs.fpscr ^ old) & FPSCR_MASK_FR
240 /* Ignore bit change if simulating sh-dsp. */
241 && ! target_dsp)
242 {
243 union fregs_u tmpf = saved_state.asregs.fregs[0];
244 saved_state.asregs.fregs[0] = saved_state.asregs.fregs[1];
245 saved_state.asregs.fregs[1] = tmpf;
246 }
247 }
248
249 /* sts relies on being able to read fpscr directly. */
250 #define GET_FPSCR() (saved_state.asregs.fpscr)
251 #define SET_FPSCR(x) \
252 do { \
253 set_fpscr1 (x); \
254 } while (0)
255
256 #define DSR (saved_state.asregs.fpscr)
257
258 #define RAISE_EXCEPTION(x) \
259 (saved_state.asregs.exception = x, saved_state.asregs.insn_end = 0)
260
261 #define RAISE_EXCEPTION_IF_IN_DELAY_SLOT() \
262 if (in_delay_slot) RAISE_EXCEPTION (SIGILL)
263
264 /* This function exists mainly for the purpose of setting a breakpoint to
265 catch simulated bus errors when running the simulator under GDB. */
266
267 static void
268 raise_exception (int x)
269 {
270 RAISE_EXCEPTION (x);
271 }
272
273 static void
274 raise_buserror (void)
275 {
276 raise_exception (SIGBUS);
277 }
278
279 #define PROCESS_SPECIAL_ADDRESS(addr, endian, ptr, bits_written, \
280 forbidden_addr_bits, data, retval) \
281 do { \
282 if (addr & forbidden_addr_bits) \
283 { \
284 raise_buserror (); \
285 return retval; \
286 } \
287 else if ((addr & saved_state.asregs.xyram_select) \
288 == saved_state.asregs.xram_start) \
289 ptr = (void *) &saved_state.asregs.xmem_offset[addr ^ endian]; \
290 else if ((addr & saved_state.asregs.xyram_select) \
291 == saved_state.asregs.yram_start) \
292 ptr = (void *) &saved_state.asregs.ymem_offset[addr ^ endian]; \
293 else if ((unsigned) addr >> 24 == 0xf0 \
294 && bits_written == 32 && (data & 1) == 0) \
295 /* This invalidates (if not associative) or might invalidate \
296 (if associative) an instruction cache line. This is used for \
297 trampolines. Since we don't simulate the cache, this is a no-op \
298 as far as the simulator is concerned. */ \
299 return retval; \
300 else \
301 { \
302 if (bits_written == 8 && addr > 0x5000000) \
303 IOMEM (addr, 1, data); \
304 /* We can't do anything useful with the other stuff, so fail. */ \
305 raise_buserror (); \
306 return retval; \
307 } \
308 } while (0)
309
310 /* FIXME: sim_resume should be renamed to sim_engine_run. sim_resume
311 being implemented by ../common/sim_resume.c and the below should
312 make a call to sim_engine_halt */
313
314 #define BUSERROR(addr, mask) ((addr) & (mask))
315
316 #define WRITE_BUSERROR(addr, mask, data, addr_func) \
317 do \
318 { \
319 if (addr & mask) \
320 { \
321 addr_func (addr, data); \
322 return; \
323 } \
324 } \
325 while (0)
326
327 #define READ_BUSERROR(addr, mask, addr_func) \
328 do \
329 { \
330 if (addr & mask) \
331 return addr_func (addr); \
332 } \
333 while (0)
334
335 /* Define this to enable register lifetime checking.
336 The compiler generates "add #0,rn" insns to mark registers as invalid,
337 the simulator uses this info to call fail if it finds a ref to an invalid
338 register before a def
339
340 #define PARANOID
341 */
342
343 #ifdef PARANOID
344 int valid[16];
345 #define CREF(x) if (!valid[x]) fail ();
346 #define CDEF(x) valid[x] = 1;
347 #define UNDEF(x) valid[x] = 0;
348 #else
349 #define CREF(x)
350 #define CDEF(x)
351 #define UNDEF(x)
352 #endif
353
354 static void parse_and_set_memory_size (SIM_DESC sd, const char *str);
355 static int IOMEM (int addr, int write, int value);
356 static struct loop_bounds get_loop_bounds (int, int, unsigned char *,
357 unsigned char *, int, int);
358 static void process_wlat_addr (int, int);
359 static void process_wwat_addr (int, int);
360 static void process_wbat_addr (int, int);
361 static int process_rlat_addr (int);
362 static int process_rwat_addr (int);
363 static int process_rbat_addr (int);
364
365 /* Floating point registers */
366
367 #define DR(n) (get_dr (n))
368 static double
369 get_dr (int n)
370 {
371 n = (n & ~1);
372 if (host_little_endian)
373 {
374 union
375 {
376 int i[2];
377 double d;
378 } dr;
379 dr.i[1] = saved_state.asregs.fregs[0].i[n + 0];
380 dr.i[0] = saved_state.asregs.fregs[0].i[n + 1];
381 return dr.d;
382 }
383 else
384 return (saved_state.asregs.fregs[0].d[n >> 1]);
385 }
386
387 #define SET_DR(n, EXP) set_dr ((n), (EXP))
388 static void
389 set_dr (int n, double exp)
390 {
391 n = (n & ~1);
392 if (host_little_endian)
393 {
394 union
395 {
396 int i[2];
397 double d;
398 } dr;
399 dr.d = exp;
400 saved_state.asregs.fregs[0].i[n + 0] = dr.i[1];
401 saved_state.asregs.fregs[0].i[n + 1] = dr.i[0];
402 }
403 else
404 saved_state.asregs.fregs[0].d[n >> 1] = exp;
405 }
406
407 #define SET_FI(n,EXP) (saved_state.asregs.fregs[0].i[(n)] = (EXP))
408 #define FI(n) (saved_state.asregs.fregs[0].i[(n)])
409
410 #define FR(n) (saved_state.asregs.fregs[0].f[(n)])
411 #define SET_FR(n,EXP) (saved_state.asregs.fregs[0].f[(n)] = (EXP))
412
413 #define XD_TO_XF(n) ((((n) & 1) << 5) | ((n) & 0x1e))
414 #define XF(n) (saved_state.asregs.fregs[(n) >> 5].i[(n) & 0x1f])
415 #define SET_XF(n,EXP) (saved_state.asregs.fregs[(n) >> 5].i[(n) & 0x1f] = (EXP))
416
417 #define RS saved_state.asregs.rs
418 #define RE saved_state.asregs.re
419 #define MOD (saved_state.asregs.mod)
420 #define SET_MOD(i) \
421 (MOD = (i), \
422 MOD_ME = (unsigned) MOD >> 16 | (SR_DMY ? ~0xffff : (SR_DMX ? 0 : 0x10000)), \
423 MOD_DELTA = (MOD & 0xffff) - ((unsigned) MOD >> 16))
424
425 #define DSP_R(n) saved_state.asregs.sregs[(n)]
426 #define DSP_GRD(n) DSP_R ((n) + 8)
427 #define GET_DSP_GRD(n) ((n | 2) == 7 ? SEXT (DSP_GRD (n)) : SIGN32 (DSP_R (n)))
428 #define A1 DSP_R (5)
429 #define A0 DSP_R (7)
430 #define X0 DSP_R (8)
431 #define X1 DSP_R (9)
432 #define Y0 DSP_R (10)
433 #define Y1 DSP_R (11)
434 #define M0 DSP_R (12)
435 #define A1G DSP_R (13)
436 #define M1 DSP_R (14)
437 #define A0G DSP_R (15)
438 /* DSP_R (16) / DSP_GRD (16) are used as a fake destination for pcmp. */
439 #define MOD_ME DSP_GRD (17)
440 #define MOD_DELTA DSP_GRD (18)
441
442 #define FP_OP(n, OP, m) \
443 { \
444 if (FPSCR_PR) \
445 { \
446 if (((n) & 1) || ((m) & 1)) \
447 RAISE_EXCEPTION (SIGILL); \
448 else \
449 SET_DR (n, (DR (n) OP DR (m))); \
450 } \
451 else \
452 SET_FR (n, (FR (n) OP FR (m))); \
453 } while (0)
454
455 #define FP_UNARY(n, OP) \
456 { \
457 if (FPSCR_PR) \
458 { \
459 if ((n) & 1) \
460 RAISE_EXCEPTION (SIGILL); \
461 else \
462 SET_DR (n, (OP (DR (n)))); \
463 } \
464 else \
465 SET_FR (n, (OP (FR (n)))); \
466 } while (0)
467
468 #define FP_CMP(n, OP, m) \
469 { \
470 if (FPSCR_PR) \
471 { \
472 if (((n) & 1) || ((m) & 1)) \
473 RAISE_EXCEPTION (SIGILL); \
474 else \
475 SET_SR_T (DR (n) OP DR (m)); \
476 } \
477 else \
478 SET_SR_T (FR (n) OP FR (m)); \
479 } while (0)
480
481 static void
482 set_sr (int new_sr)
483 {
484 /* do we need to swap banks */
485 int old_gpr = SR_MD && SR_RB;
486 int new_gpr = (new_sr & SR_MASK_MD) && (new_sr & SR_MASK_RB);
487 if (old_gpr != new_gpr)
488 {
489 int i, tmp;
490 for (i = 0; i < 8; i++)
491 {
492 tmp = saved_state.asregs.bank[i];
493 saved_state.asregs.bank[i] = saved_state.asregs.regs[i];
494 saved_state.asregs.regs[i] = tmp;
495 }
496 }
497 saved_state.asregs.sr = new_sr;
498 SET_MOD (MOD);
499 }
500
501 static INLINE void
502 wlat_fast (unsigned char *memory, int x, int value, int maskl)
503 {
504 int v = value;
505 unsigned int *p = (unsigned int *) (memory + x);
506 WRITE_BUSERROR (x, maskl, v, process_wlat_addr);
507 *p = v;
508 }
509
510 static INLINE void
511 wwat_fast (unsigned char *memory, int x, int value, int maskw, int endianw)
512 {
513 int v = value;
514 unsigned short *p = (unsigned short *) (memory + (x ^ endianw));
515 WRITE_BUSERROR (x, maskw, v, process_wwat_addr);
516 *p = v;
517 }
518
519 static INLINE void
520 wbat_fast (unsigned char *memory, int x, int value, int maskb)
521 {
522 unsigned char *p = memory + (x ^ endianb);
523 WRITE_BUSERROR (x, maskb, value, process_wbat_addr);
524
525 p[0] = value;
526 }
527
528 /* Read functions */
529
530 static INLINE int
531 rlat_fast (unsigned char *memory, int x, int maskl)
532 {
533 unsigned int *p = (unsigned int *) (memory + x);
534 READ_BUSERROR (x, maskl, process_rlat_addr);
535
536 return *p;
537 }
538
539 static INLINE int
540 rwat_fast (unsigned char *memory, int x, int maskw, int endianw)
541 {
542 unsigned short *p = (unsigned short *) (memory + (x ^ endianw));
543 READ_BUSERROR (x, maskw, process_rwat_addr);
544
545 return *p;
546 }
547
548 static INLINE int
549 riat_fast (unsigned char *insn_ptr, int endianw)
550 {
551 unsigned short *p = (unsigned short *) ((uintptr_t) insn_ptr ^ endianw);
552
553 return *p;
554 }
555
556 static INLINE int
557 rbat_fast (unsigned char *memory, int x, int maskb)
558 {
559 unsigned char *p = memory + (x ^ endianb);
560 READ_BUSERROR (x, maskb, process_rbat_addr);
561
562 return *p;
563 }
564
565 #define RWAT(x) (rwat_fast (memory, x, maskw, endianw))
566 #define RLAT(x) (rlat_fast (memory, x, maskl))
567 #define RBAT(x) (rbat_fast (memory, x, maskb))
568 #define RIAT(p) (riat_fast ((p), endianw))
569 #define WWAT(x,v) (wwat_fast (memory, x, v, maskw, endianw))
570 #define WLAT(x,v) (wlat_fast (memory, x, v, maskl))
571 #define WBAT(x,v) (wbat_fast (memory, x, v, maskb))
572
573 #define RUWAT(x) (RWAT (x) & 0xffff)
574 #define RSWAT(x) ((short) (RWAT (x)))
575 #define RSLAT(x) ((long) (RLAT (x)))
576 #define RSBAT(x) (SEXT (RBAT (x)))
577
578 #define RDAT(x, n) (do_rdat (memory, (x), (n), (maskl)))
579 static int
580 do_rdat (unsigned char *memory, int x, int n, int maskl)
581 {
582 int f0;
583 int f1;
584 int i = (n & 1);
585 int j = (n & ~1);
586 f0 = rlat_fast (memory, x + 0, maskl);
587 f1 = rlat_fast (memory, x + 4, maskl);
588 saved_state.asregs.fregs[i].i[(j + 0)] = f0;
589 saved_state.asregs.fregs[i].i[(j + 1)] = f1;
590 return 0;
591 }
592
593 #define WDAT(x, n) (do_wdat (memory, (x), (n), (maskl)))
594 static int
595 do_wdat (unsigned char *memory, int x, int n, int maskl)
596 {
597 int f0;
598 int f1;
599 int i = (n & 1);
600 int j = (n & ~1);
601 f0 = saved_state.asregs.fregs[i].i[(j + 0)];
602 f1 = saved_state.asregs.fregs[i].i[(j + 1)];
603 wlat_fast (memory, (x + 0), f0, maskl);
604 wlat_fast (memory, (x + 4), f1, maskl);
605 return 0;
606 }
607
608 static void
609 process_wlat_addr (int addr, int value)
610 {
611 unsigned int *ptr;
612
613 PROCESS_SPECIAL_ADDRESS (addr, endianb, ptr, 32, 3, value, );
614 *ptr = value;
615 }
616
617 static void
618 process_wwat_addr (int addr, int value)
619 {
620 unsigned short *ptr;
621
622 PROCESS_SPECIAL_ADDRESS (addr, endianb, ptr, 16, 1, value, );
623 *ptr = value;
624 }
625
626 static void
627 process_wbat_addr (int addr, int value)
628 {
629 unsigned char *ptr;
630
631 PROCESS_SPECIAL_ADDRESS (addr, endianb, ptr, 8, 0, value, );
632 *ptr = value;
633 }
634
635 static int
636 process_rlat_addr (int addr)
637 {
638 unsigned char *ptr;
639
640 PROCESS_SPECIAL_ADDRESS (addr, endianb, ptr, -32, 3, -1, 0);
641 return *ptr;
642 }
643
644 static int
645 process_rwat_addr (int addr)
646 {
647 unsigned char *ptr;
648
649 PROCESS_SPECIAL_ADDRESS (addr, endianb, ptr, -16, 1, -1, 0);
650 return *ptr;
651 }
652
653 static int
654 process_rbat_addr (int addr)
655 {
656 unsigned char *ptr;
657
658 PROCESS_SPECIAL_ADDRESS (addr, endianb, ptr, -8, 0, -1, 0);
659 return *ptr;
660 }
661
662 #define SEXT(x) (((x & 0xff) ^ (~0x7f))+0x80)
663 #define SEXT12(x) (((x & 0xfff) ^ 0x800) - 0x800)
664 #define SEXTW(y) ((int) ((short) y))
665 #if 0
666 #define SEXT32(x) ((int) ((x & 0xffffffff) ^ 0x80000000U) - 0x7fffffff - 1)
667 #else
668 #define SEXT32(x) ((int) (x))
669 #endif
670 #define SIGN32(x) (SEXT32 (x) >> 31)
671
672 /* convert pointer from target to host value. */
673 #define PT2H(x) ((x) + memory)
674 /* convert pointer from host to target value. */
675 #define PH2T(x) ((x) - memory)
676
677 #define SKIP_INSN(p) ((p) += ((RIAT (p) & 0xfc00) == 0xf800 ? 4 : 2))
678
679 #define SET_NIP(x) nip = (x); CHECK_INSN_PTR (nip);
680
681 static int in_delay_slot = 0;
682 #define Delay_Slot(TEMPPC) iword = RIAT (TEMPPC); in_delay_slot = 1; goto top;
683
684 #define CHECK_INSN_PTR(p) \
685 do { \
686 if (saved_state.asregs.exception || PH2T (p) & maskw) \
687 saved_state.asregs.insn_end = 0; \
688 else if (p < loop.end) \
689 saved_state.asregs.insn_end = loop.end; \
690 else \
691 saved_state.asregs.insn_end = mem_end; \
692 } while (0)
693
694 #ifdef ACE_FAST
695
696 #define MA(n)
697 #define L(x)
698 #define TL(x)
699 #define TB(x)
700
701 #else
702
703 #define MA(n) \
704 do { memstalls += ((((uintptr_t) PC & 3) != 0) ? (n) : ((n) - 1)); } while (0)
705
706 #define L(x) thislock = x;
707 #define TL(x) if ((x) == prevlock) stalls++;
708 #define TB(x,y) if ((x) == prevlock || (y) == prevlock) stalls++;
709
710 #endif
711
712 #if defined(__GO32__)
713 int sim_memory_size = 19;
714 #else
715 int sim_memory_size = 30;
716 #endif
717
718 static int sim_profile_size = 17;
719 static int nsamples;
720
721 #undef TB
722 #define TB(x,y)
723
724 #define SMR1 (0x05FFFEC8) /* Channel 1 serial mode register */
725 #define BRR1 (0x05FFFEC9) /* Channel 1 bit rate register */
726 #define SCR1 (0x05FFFECA) /* Channel 1 serial control register */
727 #define TDR1 (0x05FFFECB) /* Channel 1 transmit data register */
728 #define SSR1 (0x05FFFECC) /* Channel 1 serial status register */
729 #define RDR1 (0x05FFFECD) /* Channel 1 receive data register */
730
731 #define SCI_RDRF 0x40 /* Recieve data register full */
732 #define SCI_TDRE 0x80 /* Transmit data register empty */
733
734 static int
735 IOMEM (int addr, int write, int value)
736 {
737 if (write)
738 {
739 switch (addr)
740 {
741 case TDR1:
742 if (value != '\r')
743 {
744 putchar (value);
745 fflush (stdout);
746 }
747 break;
748 }
749 }
750 else
751 {
752 switch (addr)
753 {
754 case RDR1:
755 return getchar ();
756 }
757 }
758 return 0;
759 }
760
761 static int
762 get_now (void)
763 {
764 return time (NULL);
765 }
766
767 static int
768 now_persec (void)
769 {
770 return 1;
771 }
772
773 static FILE *profile_file;
774
775 static INLINE unsigned
776 swap (unsigned n)
777 {
778 if (endianb)
779 n = (n << 24 | (n & 0xff00) << 8
780 | (n & 0xff0000) >> 8 | (n & 0xff000000) >> 24);
781 return n;
782 }
783
784 static INLINE unsigned short
785 swap16 (unsigned short n)
786 {
787 if (endianb)
788 n = n << 8 | (n & 0xff00) >> 8;
789 return n;
790 }
791
792 static void
793 swapout (int n)
794 {
795 if (profile_file)
796 {
797 union { char b[4]; int n; } u;
798 u.n = swap (n);
799 fwrite (u.b, 4, 1, profile_file);
800 }
801 }
802
803 static void
804 swapout16 (int n)
805 {
806 union { char b[4]; int n; } u;
807 u.n = swap16 (n);
808 fwrite (u.b, 2, 1, profile_file);
809 }
810
811 /* Turn a pointer in a register into a pointer into real memory. */
812
813 static char *
814 ptr (int x)
815 {
816 return (char *) (x + saved_state.asregs.memory);
817 }
818
819 /* STR points to a zero-terminated string in target byte order. Return
820 the number of bytes that need to be converted to host byte order in order
821 to use this string as a zero-terminated string on the host.
822 (Not counting the rounding up needed to operate on entire words.) */
823 static int
824 strswaplen (int str)
825 {
826 unsigned char *memory = saved_state.asregs.memory;
827 int start, end;
828 int endian = endianb;
829
830 if (! endian)
831 return 0;
832 end = str;
833 for (end = str; memory[end ^ endian]; end++) ;
834 return end - str + 1;
835 }
836
837 static void
838 strnswap (int str, int len)
839 {
840 int *start, *end;
841
842 if (! endianb || ! len)
843 return;
844 start = (int *) ptr (str & ~3);
845 end = (int *) ptr (str + len);
846 do
847 {
848 int old = *start;
849 *start = (old << 24 | (old & 0xff00) << 8
850 | (old & 0xff0000) >> 8 | (old & 0xff000000) >> 24);
851 start++;
852 }
853 while (start < end);
854 }
855
856 /* Simulate a monitor trap, put the result into r0 and errno into r1
857 return offset by which to adjust pc. */
858
859 static int
860 trap (SIM_DESC sd, int i, int *regs, unsigned char *insn_ptr,
861 unsigned char *memory, int maskl, int maskw, int endianw)
862 {
863 host_callback *callback = STATE_CALLBACK (sd);
864 char **prog_argv = STATE_PROG_ARGV (sd);
865
866 switch (i)
867 {
868 case 1:
869 printf ("%c", regs[0]);
870 break;
871 case 2:
872 raise_exception (SIGQUIT);
873 break;
874 case 3: /* FIXME: for backwards compat, should be removed */
875 case 33:
876 {
877 unsigned int countp = * (unsigned int *) (insn_ptr + 4);
878
879 WLAT (countp, RLAT (countp) + 1);
880 return 6;
881 }
882 case 34:
883 {
884 int perrno = errno;
885 errno = 0;
886
887 switch (regs[4])
888 {
889
890 #if !defined(__GO32__) && !defined(_WIN32)
891 case TARGET_NEWLIB_SH_SYS_fork:
892 regs[0] = fork ();
893 break;
894 /* This would work only if endianness matched between host and target.
895 Besides, it's quite dangerous. */
896 #if 0
897 case TARGET_NEWLIB_SH_SYS_execve:
898 regs[0] = execve (ptr (regs[5]), (char **) ptr (regs[6]),
899 (char **) ptr (regs[7]));
900 break;
901 case TARGET_NEWLIB_SH_SYS_execv:
902 regs[0] = execve (ptr (regs[5]), (char **) ptr (regs[6]), 0);
903 break;
904 #endif
905 case TARGET_NEWLIB_SH_SYS_pipe:
906 {
907 regs[0] = (BUSERROR (regs[5], maskl)
908 ? -EINVAL
909 : pipe ((int *) ptr (regs[5])));
910 }
911 break;
912
913 case TARGET_NEWLIB_SH_SYS_wait:
914 regs[0] = wait ((int *) ptr (regs[5]));
915 break;
916 #endif /* !defined(__GO32__) && !defined(_WIN32) */
917
918 case TARGET_NEWLIB_SH_SYS_read:
919 strnswap (regs[6], regs[7]);
920 regs[0]
921 = callback->read (callback, regs[5], ptr (regs[6]), regs[7]);
922 strnswap (regs[6], regs[7]);
923 break;
924 case TARGET_NEWLIB_SH_SYS_write:
925 strnswap (regs[6], regs[7]);
926 if (regs[5] == 1)
927 regs[0] = (int) callback->write_stdout (callback,
928 ptr (regs[6]), regs[7]);
929 else
930 regs[0] = (int) callback->write (callback, regs[5],
931 ptr (regs[6]), regs[7]);
932 strnswap (regs[6], regs[7]);
933 break;
934 case TARGET_NEWLIB_SH_SYS_lseek:
935 regs[0] = callback->lseek (callback,regs[5], regs[6], regs[7]);
936 break;
937 case TARGET_NEWLIB_SH_SYS_close:
938 regs[0] = callback->close (callback,regs[5]);
939 break;
940 case TARGET_NEWLIB_SH_SYS_open:
941 {
942 int len = strswaplen (regs[5]);
943 strnswap (regs[5], len);
944 regs[0] = callback->open (callback, ptr (regs[5]), regs[6]);
945 strnswap (regs[5], len);
946 break;
947 }
948 case TARGET_NEWLIB_SH_SYS_exit:
949 /* EXIT - caller can look in r5 to work out the reason */
950 raise_exception (SIGQUIT);
951 regs[0] = regs[5];
952 break;
953
954 case TARGET_NEWLIB_SH_SYS_stat: /* added at hmsi */
955 /* stat system call */
956 {
957 struct stat host_stat;
958 int buf;
959 int len = strswaplen (regs[5]);
960
961 strnswap (regs[5], len);
962 regs[0] = stat (ptr (regs[5]), &host_stat);
963 strnswap (regs[5], len);
964
965 buf = regs[6];
966
967 WWAT (buf, host_stat.st_dev);
968 buf += 2;
969 WWAT (buf, host_stat.st_ino);
970 buf += 2;
971 WLAT (buf, host_stat.st_mode);
972 buf += 4;
973 WWAT (buf, host_stat.st_nlink);
974 buf += 2;
975 WWAT (buf, host_stat.st_uid);
976 buf += 2;
977 WWAT (buf, host_stat.st_gid);
978 buf += 2;
979 WWAT (buf, host_stat.st_rdev);
980 buf += 2;
981 WLAT (buf, host_stat.st_size);
982 buf += 4;
983 WLAT (buf, host_stat.st_atime);
984 buf += 4;
985 WLAT (buf, 0);
986 buf += 4;
987 WLAT (buf, host_stat.st_mtime);
988 buf += 4;
989 WLAT (buf, 0);
990 buf += 4;
991 WLAT (buf, host_stat.st_ctime);
992 buf += 4;
993 WLAT (buf, 0);
994 buf += 4;
995 WLAT (buf, 0);
996 buf += 4;
997 WLAT (buf, 0);
998 buf += 4;
999 }
1000 break;
1001
1002 #ifndef _WIN32
1003 case TARGET_NEWLIB_SH_SYS_chown:
1004 {
1005 int len = strswaplen (regs[5]);
1006
1007 strnswap (regs[5], len);
1008 regs[0] = chown (ptr (regs[5]), regs[6], regs[7]);
1009 strnswap (regs[5], len);
1010 break;
1011 }
1012 #endif /* _WIN32 */
1013 case TARGET_NEWLIB_SH_SYS_chmod:
1014 {
1015 int len = strswaplen (regs[5]);
1016
1017 strnswap (regs[5], len);
1018 regs[0] = chmod (ptr (regs[5]), regs[6]);
1019 strnswap (regs[5], len);
1020 break;
1021 }
1022 case TARGET_NEWLIB_SH_SYS_utime:
1023 {
1024 /* Cast the second argument to void *, to avoid type mismatch
1025 if a prototype is present. */
1026 int len = strswaplen (regs[5]);
1027
1028 strnswap (regs[5], len);
1029 #ifdef HAVE_UTIME_H
1030 regs[0] = utime (ptr (regs[5]), (void *) ptr (regs[6]));
1031 #else
1032 errno = ENOSYS;
1033 regs[0] = -1;
1034 #endif
1035 strnswap (regs[5], len);
1036 break;
1037 }
1038 case TARGET_NEWLIB_SH_SYS_argc:
1039 regs[0] = countargv (prog_argv);
1040 break;
1041 case TARGET_NEWLIB_SH_SYS_argnlen:
1042 if (regs[5] < countargv (prog_argv))
1043 regs[0] = strlen (prog_argv[regs[5]]);
1044 else
1045 regs[0] = -1;
1046 break;
1047 case TARGET_NEWLIB_SH_SYS_argn:
1048 if (regs[5] < countargv (prog_argv))
1049 {
1050 /* Include the termination byte. */
1051 int i = strlen (prog_argv[regs[5]]) + 1;
1052 regs[0] = sim_write (0, regs[6], prog_argv[regs[5]], i);
1053 }
1054 else
1055 regs[0] = -1;
1056 break;
1057 case TARGET_NEWLIB_SH_SYS_time:
1058 regs[0] = get_now ();
1059 break;
1060 case TARGET_NEWLIB_SH_SYS_ftruncate:
1061 regs[0] = callback->ftruncate (callback, regs[5], regs[6]);
1062 break;
1063 case TARGET_NEWLIB_SH_SYS_truncate:
1064 {
1065 int len = strswaplen (regs[5]);
1066 strnswap (regs[5], len);
1067 regs[0] = callback->truncate (callback, ptr (regs[5]), regs[6]);
1068 strnswap (regs[5], len);
1069 break;
1070 }
1071 default:
1072 regs[0] = -1;
1073 break;
1074 }
1075 regs[1] = callback->get_errno (callback);
1076 errno = perrno;
1077 }
1078 break;
1079
1080 case 13: /* Set IBNR */
1081 IBNR = regs[0] & 0xffff;
1082 break;
1083 case 14: /* Set IBCR */
1084 IBCR = regs[0] & 0xffff;
1085 break;
1086 case 0xc3:
1087 case 255:
1088 raise_exception (SIGTRAP);
1089 if (i == 0xc3)
1090 return -2;
1091 break;
1092 }
1093 return 0;
1094 }
1095
1096 static void
1097 div1 (int *R, int iRn2, int iRn1/*, int T*/)
1098 {
1099 unsigned long tmp0;
1100 unsigned char old_q, tmp1;
1101
1102 old_q = Q;
1103 SET_SR_Q ((unsigned char) ((0x80000000 & R[iRn1]) != 0));
1104 R[iRn1] <<= 1;
1105 R[iRn1] |= (unsigned long) T;
1106
1107 if (!old_q)
1108 {
1109 if (!M)
1110 {
1111 tmp0 = R[iRn1];
1112 R[iRn1] -= R[iRn2];
1113 tmp1 = (R[iRn1] > tmp0);
1114 if (!Q)
1115 SET_SR_Q (tmp1);
1116 else
1117 SET_SR_Q ((unsigned char) (tmp1 == 0));
1118 }
1119 else
1120 {
1121 tmp0 = R[iRn1];
1122 R[iRn1] += R[iRn2];
1123 tmp1 = (R[iRn1] < tmp0);
1124 if (!Q)
1125 SET_SR_Q ((unsigned char) (tmp1 == 0));
1126 else
1127 SET_SR_Q (tmp1);
1128 }
1129 }
1130 else
1131 {
1132 if (!M)
1133 {
1134 tmp0 = R[iRn1];
1135 R[iRn1] += R[iRn2];
1136 tmp1 = (R[iRn1] < tmp0);
1137 if (!Q)
1138 SET_SR_Q (tmp1);
1139 else
1140 SET_SR_Q ((unsigned char) (tmp1 == 0));
1141 }
1142 else
1143 {
1144 tmp0 = R[iRn1];
1145 R[iRn1] -= R[iRn2];
1146 tmp1 = (R[iRn1] > tmp0);
1147 if (!Q)
1148 SET_SR_Q ((unsigned char) (tmp1 == 0));
1149 else
1150 SET_SR_Q (tmp1);
1151 }
1152 }
1153 /*T = (Q == M);*/
1154 SET_SR_T (Q == M);
1155 /*return T;*/
1156 }
1157
1158 static void
1159 dmul_s (uint32_t rm, uint32_t rn)
1160 {
1161 int64_t res = (int64_t)(int32_t)rm * (int64_t)(int32_t)rn;
1162 MACH = (uint32_t)((uint64_t)res >> 32);
1163 MACL = (uint32_t)res;
1164 }
1165
1166 static void
1167 dmul_u (uint32_t rm, uint32_t rn)
1168 {
1169 uint64_t res = (uint64_t)(uint32_t)rm * (uint64_t)(uint32_t)rn;
1170 MACH = (uint32_t)(res >> 32);
1171 MACL = (uint32_t)res;
1172 }
1173
1174 static void
1175 macw (int *regs, unsigned char *memory, int n, int m, int endianw)
1176 {
1177 long tempm, tempn;
1178 long prod, macl, sum;
1179
1180 tempm=RSWAT (regs[m]); regs[m]+=2;
1181 tempn=RSWAT (regs[n]); regs[n]+=2;
1182
1183 macl = MACL;
1184 prod = (long) (short) tempm * (long) (short) tempn;
1185 sum = prod + macl;
1186 if (S)
1187 {
1188 if ((~(prod ^ macl) & (sum ^ prod)) < 0)
1189 {
1190 /* MACH's lsb is a sticky overflow bit. */
1191 MACH |= 1;
1192 /* Store the smallest negative number in MACL if prod is
1193 negative, and the largest positive number otherwise. */
1194 sum = 0x7fffffff + (prod < 0);
1195 }
1196 }
1197 else
1198 {
1199 long mach;
1200 /* Add to MACH the sign extended product, and carry from low sum. */
1201 mach = MACH + (-(prod < 0)) + ((unsigned long) sum < prod);
1202 /* Sign extend at 10:th bit in MACH. */
1203 MACH = (mach & 0x1ff) | -(mach & 0x200);
1204 }
1205 MACL = sum;
1206 }
1207
1208 static void
1209 macl (int *regs, unsigned char *memory, int n, int m)
1210 {
1211 long tempm, tempn;
1212 long macl, mach;
1213 long long ans;
1214 long long mac64;
1215
1216 tempm = RSLAT (regs[m]);
1217 regs[m] += 4;
1218
1219 tempn = RSLAT (regs[n]);
1220 regs[n] += 4;
1221
1222 mach = MACH;
1223 macl = MACL;
1224
1225 mac64 = ((long long) macl & 0xffffffff) |
1226 ((long long) mach & 0xffffffff) << 32;
1227
1228 ans = (long long) tempm * (long long) tempn; /* Multiply 32bit * 32bit */
1229
1230 mac64 += ans; /* Accumulate 64bit + 64 bit */
1231
1232 macl = (long) (mac64 & 0xffffffff);
1233 mach = (long) ((mac64 >> 32) & 0xffffffff);
1234
1235 if (S) /* Store only 48 bits of the result */
1236 {
1237 if (mach < 0) /* Result is negative */
1238 {
1239 mach = mach & 0x0000ffff; /* Mask higher 16 bits */
1240 mach |= 0xffff8000; /* Sign extend higher 16 bits */
1241 }
1242 else
1243 mach = mach & 0x00007fff; /* Postive Result */
1244 }
1245
1246 MACL = macl;
1247 MACH = mach;
1248 }
1249
1250 enum {
1251 B_BCLR = 0,
1252 B_BSET = 1,
1253 B_BST = 2,
1254 B_BLD = 3,
1255 B_BAND = 4,
1256 B_BOR = 5,
1257 B_BXOR = 6,
1258 B_BLDNOT = 11,
1259 B_BANDNOT = 12,
1260 B_BORNOT = 13,
1261
1262 MOVB_RM = 0x0000,
1263 MOVW_RM = 0x1000,
1264 MOVL_RM = 0x2000,
1265 FMOV_RM = 0x3000,
1266 MOVB_MR = 0x4000,
1267 MOVW_MR = 0x5000,
1268 MOVL_MR = 0x6000,
1269 FMOV_MR = 0x7000,
1270 MOVU_BMR = 0x8000,
1271 MOVU_WMR = 0x9000,
1272 };
1273
1274 /* Do extended displacement move instructions. */
1275 static void
1276 do_long_move_insn (int op, int disp12, int m, int n, int *thatlock)
1277 {
1278 int memstalls = 0;
1279 int thislock = *thatlock;
1280 int endianw = global_endianw;
1281 int *R = &(saved_state.asregs.regs[0]);
1282 unsigned char *memory = saved_state.asregs.memory;
1283 int maskb = ~((saved_state.asregs.msize - 1) & ~0);
1284 unsigned char *insn_ptr = PT2H (saved_state.asregs.pc);
1285
1286 switch (op) {
1287 case MOVB_RM: /* signed */
1288 WBAT (disp12 * 1 + R[n], R[m]);
1289 break;
1290 case MOVW_RM:
1291 WWAT (disp12 * 2 + R[n], R[m]);
1292 break;
1293 case MOVL_RM:
1294 WLAT (disp12 * 4 + R[n], R[m]);
1295 break;
1296 case FMOV_RM: /* floating point */
1297 if (FPSCR_SZ)
1298 {
1299 MA (1);
1300 WDAT (R[n] + 8 * disp12, m);
1301 }
1302 else
1303 WLAT (R[n] + 4 * disp12, FI (m));
1304 break;
1305 case MOVB_MR:
1306 R[n] = RSBAT (disp12 * 1 + R[m]);
1307 L (n);
1308 break;
1309 case MOVW_MR:
1310 R[n] = RSWAT (disp12 * 2 + R[m]);
1311 L (n);
1312 break;
1313 case MOVL_MR:
1314 R[n] = RLAT (disp12 * 4 + R[m]);
1315 L (n);
1316 break;
1317 case FMOV_MR:
1318 if (FPSCR_SZ) {
1319 MA (1);
1320 RDAT (R[m] + 8 * disp12, n);
1321 }
1322 else
1323 SET_FI (n, RLAT (R[m] + 4 * disp12));
1324 break;
1325 case MOVU_BMR: /* unsigned */
1326 R[n] = RBAT (disp12 * 1 + R[m]);
1327 L (n);
1328 break;
1329 case MOVU_WMR:
1330 R[n] = RWAT (disp12 * 2 + R[m]);
1331 L (n);
1332 break;
1333 default:
1334 RAISE_EXCEPTION (SIGINT);
1335 exit (1);
1336 }
1337 saved_state.asregs.memstalls += memstalls;
1338 *thatlock = thislock;
1339 }
1340
1341 /* Do binary logical bit-manipulation insns. */
1342 static void
1343 do_blog_insn (int imm, int addr, int binop,
1344 unsigned char *memory, int maskb)
1345 {
1346 int oldval = RBAT (addr);
1347
1348 switch (binop) {
1349 case B_BCLR: /* bclr.b */
1350 WBAT (addr, oldval & ~imm);
1351 break;
1352 case B_BSET: /* bset.b */
1353 WBAT (addr, oldval | imm);
1354 break;
1355 case B_BST: /* bst.b */
1356 if (T)
1357 WBAT (addr, oldval | imm);
1358 else
1359 WBAT (addr, oldval & ~imm);
1360 break;
1361 case B_BLD: /* bld.b */
1362 SET_SR_T ((oldval & imm) != 0);
1363 break;
1364 case B_BAND: /* band.b */
1365 SET_SR_T (T && ((oldval & imm) != 0));
1366 break;
1367 case B_BOR: /* bor.b */
1368 SET_SR_T (T || ((oldval & imm) != 0));
1369 break;
1370 case B_BXOR: /* bxor.b */
1371 SET_SR_T (T ^ ((oldval & imm) != 0));
1372 break;
1373 case B_BLDNOT: /* bldnot.b */
1374 SET_SR_T ((oldval & imm) == 0);
1375 break;
1376 case B_BANDNOT: /* bandnot.b */
1377 SET_SR_T (T && ((oldval & imm) == 0));
1378 break;
1379 case B_BORNOT: /* bornot.b */
1380 SET_SR_T (T || ((oldval & imm) == 0));
1381 break;
1382 }
1383 }
1384
1385 static float
1386 fsca_s (int in, double (*f) (double))
1387 {
1388 double rad = ldexp ((in & 0xffff), -15) * 3.141592653589793238462643383;
1389 double result = (*f) (rad);
1390 double error, upper, lower, frac;
1391 int exp;
1392
1393 /* Search the value with the maximum error that is still within the
1394 architectural spec. */
1395 error = ldexp (1., -21);
1396 /* compensate for calculation inaccuracy by reducing error. */
1397 error = error - ldexp (1., -50);
1398 upper = result + error;
1399 frac = frexp (upper, &exp);
1400 upper = ldexp (floor (ldexp (frac, 24)), exp - 24);
1401 lower = result - error;
1402 frac = frexp (lower, &exp);
1403 lower = ldexp (ceil (ldexp (frac, 24)), exp - 24);
1404 return fabs (upper - result) >= fabs (lower - result) ? upper : lower;
1405 }
1406
1407 static float
1408 fsrra_s (float in)
1409 {
1410 double result = 1. / sqrt (in);
1411 int exp;
1412 double frac, upper, lower, error, eps;
1413
1414 /* refine result */
1415 result = result - (result * result * in - 1) * 0.5 * result;
1416 /* Search the value with the maximum error that is still within the
1417 architectural spec. */
1418 frac = frexp (result, &exp);
1419 frac = ldexp (frac, 24);
1420 error = 4.0; /* 1 << 24-1-21 */
1421 /* use eps to compensate for possible 1 ulp error in our 'exact' result. */
1422 eps = ldexp (1., -29);
1423 upper = floor (frac + error - eps);
1424 if (upper > 16777216.)
1425 upper = floor ((frac + error - eps) * 0.5) * 2.;
1426 lower = ceil ((frac - error + eps) * 2) * .5;
1427 if (lower > 8388608.)
1428 lower = ceil (frac - error + eps);
1429 upper = ldexp (upper, exp - 24);
1430 lower = ldexp (lower, exp - 24);
1431 return upper - result >= result - lower ? upper : lower;
1432 }
1433
1434
1435 /* GET_LOOP_BOUNDS {EXTENDED}
1436 These two functions compute the actual starting and ending point
1437 of the repeat loop, based on the RS and RE registers (repeat start,
1438 repeat stop). The extended version is called for LDRC, and the
1439 regular version is called for SETRC. The difference is that for
1440 LDRC, the loop start and end instructions are literally the ones
1441 pointed to by RS and RE -- for SETRC, they're not (see docs). */
1442
1443 static struct loop_bounds
1444 get_loop_bounds_ext (int rs, int re, unsigned char *memory,
1445 unsigned char *mem_end, int maskw, int endianw)
1446 {
1447 struct loop_bounds loop;
1448
1449 /* FIXME: should I verify RS < RE? */
1450 loop.start = PT2H (RS); /* FIXME not using the params? */
1451 loop.end = PT2H (RE & ~1); /* Ignore bit 0 of RE. */
1452 SKIP_INSN (loop.end);
1453 if (loop.end >= mem_end)
1454 loop.end = PT2H (0);
1455 return loop;
1456 }
1457
1458 static struct loop_bounds
1459 get_loop_bounds (int rs, int re, unsigned char *memory, unsigned char *mem_end,
1460 int maskw, int endianw)
1461 {
1462 struct loop_bounds loop;
1463
1464 if (SR_RC)
1465 {
1466 if (RS >= RE)
1467 {
1468 loop.start = PT2H (RE - 4);
1469 SKIP_INSN (loop.start);
1470 loop.end = loop.start;
1471 if (RS - RE == 0)
1472 SKIP_INSN (loop.end);
1473 if (RS - RE <= 2)
1474 SKIP_INSN (loop.end);
1475 SKIP_INSN (loop.end);
1476 }
1477 else
1478 {
1479 loop.start = PT2H (RS);
1480 loop.end = PT2H (RE - 4);
1481 SKIP_INSN (loop.end);
1482 SKIP_INSN (loop.end);
1483 SKIP_INSN (loop.end);
1484 SKIP_INSN (loop.end);
1485 }
1486 if (loop.end >= mem_end)
1487 loop.end = PT2H (0);
1488 }
1489 else
1490 loop.end = PT2H (0);
1491
1492 return loop;
1493 }
1494
1495 #include "ppi.c"
1496
1497 /* Provide calloc / free versions that use an anonymous mmap. This can
1498 significantly cut the start-up time when a large simulator memory is
1499 required, because pages are only zeroed on demand. */
1500 #ifdef MAP_ANONYMOUS
1501 static void *
1502 mcalloc (size_t nmemb, size_t size)
1503 {
1504 void *page;
1505
1506 if (nmemb != 1)
1507 size *= nmemb;
1508 return mmap (0, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS,
1509 -1, 0);
1510 }
1511
1512 #define mfree(start,length) munmap ((start), (length))
1513 #else
1514 #define mcalloc calloc
1515 #define mfree(start,length) free(start)
1516 #endif
1517
1518 /* Set the memory size to the power of two provided. */
1519
1520 static void
1521 sim_size (int power)
1522 {
1523 sim_memory_size = power;
1524
1525 if (saved_state.asregs.memory)
1526 {
1527 mfree (saved_state.asregs.memory, saved_state.asregs.msize);
1528 }
1529
1530 saved_state.asregs.msize = 1 << power;
1531
1532 saved_state.asregs.memory =
1533 (unsigned char *) mcalloc (1, saved_state.asregs.msize);
1534
1535 if (!saved_state.asregs.memory)
1536 {
1537 fprintf (stderr,
1538 "Not enough VM for simulation of %d bytes of RAM\n",
1539 saved_state.asregs.msize);
1540
1541 saved_state.asregs.msize = 1;
1542 saved_state.asregs.memory = (unsigned char *) mcalloc (1, 1);
1543 }
1544 }
1545
1546 static void
1547 init_dsp (struct bfd *abfd)
1548 {
1549 int was_dsp = target_dsp;
1550 unsigned long mach = bfd_get_mach (abfd);
1551
1552 if (mach == bfd_mach_sh_dsp ||
1553 mach == bfd_mach_sh4al_dsp ||
1554 mach == bfd_mach_sh3_dsp)
1555 {
1556 int ram_area_size, xram_start, yram_start;
1557 int new_select;
1558
1559 target_dsp = 1;
1560 if (mach == bfd_mach_sh_dsp)
1561 {
1562 /* SH7410 (orig. sh-sdp):
1563 4KB each for X & Y memory;
1564 On-chip X RAM 0x0800f000-0x0800ffff
1565 On-chip Y RAM 0x0801f000-0x0801ffff */
1566 xram_start = 0x0800f000;
1567 ram_area_size = 0x1000;
1568 }
1569 if (mach == bfd_mach_sh3_dsp || mach == bfd_mach_sh4al_dsp)
1570 {
1571 /* SH7612:
1572 8KB each for X & Y memory;
1573 On-chip X RAM 0x1000e000-0x1000ffff
1574 On-chip Y RAM 0x1001e000-0x1001ffff */
1575 xram_start = 0x1000e000;
1576 ram_area_size = 0x2000;
1577 }
1578 yram_start = xram_start + 0x10000;
1579 new_select = ~(ram_area_size - 1);
1580 if (saved_state.asregs.xyram_select != new_select)
1581 {
1582 saved_state.asregs.xyram_select = new_select;
1583 free (saved_state.asregs.xmem);
1584 free (saved_state.asregs.ymem);
1585 saved_state.asregs.xmem =
1586 (unsigned char *) calloc (1, ram_area_size);
1587 saved_state.asregs.ymem =
1588 (unsigned char *) calloc (1, ram_area_size);
1589
1590 /* Disable use of X / Y mmeory if not allocated. */
1591 if (! saved_state.asregs.xmem || ! saved_state.asregs.ymem)
1592 {
1593 saved_state.asregs.xyram_select = 0;
1594 if (saved_state.asregs.xmem)
1595 free (saved_state.asregs.xmem);
1596 if (saved_state.asregs.ymem)
1597 free (saved_state.asregs.ymem);
1598 }
1599 }
1600 saved_state.asregs.xram_start = xram_start;
1601 saved_state.asregs.yram_start = yram_start;
1602 saved_state.asregs.xmem_offset = saved_state.asregs.xmem - xram_start;
1603 saved_state.asregs.ymem_offset = saved_state.asregs.ymem - yram_start;
1604 }
1605 else
1606 {
1607 target_dsp = 0;
1608 if (saved_state.asregs.xyram_select)
1609 {
1610 saved_state.asregs.xyram_select = 0;
1611 free (saved_state.asregs.xmem);
1612 free (saved_state.asregs.ymem);
1613 }
1614 }
1615
1616 if (! saved_state.asregs.xyram_select)
1617 {
1618 saved_state.asregs.xram_start = 1;
1619 saved_state.asregs.yram_start = 1;
1620 }
1621
1622 if (saved_state.asregs.regstack == NULL)
1623 saved_state.asregs.regstack =
1624 calloc (512, sizeof *saved_state.asregs.regstack);
1625
1626 if (target_dsp != was_dsp)
1627 {
1628 int i, tmp;
1629
1630 for (i = ARRAY_SIZE (sh_dsp_table) - 1; i >= 0; i--)
1631 {
1632 tmp = sh_jump_table[0xf000 + i];
1633 sh_jump_table[0xf000 + i] = sh_dsp_table[i];
1634 sh_dsp_table[i] = tmp;
1635 }
1636 }
1637 }
1638
1639 static void
1640 init_pointers (void)
1641 {
1642 if (saved_state.asregs.msize != 1 << sim_memory_size)
1643 {
1644 sim_size (sim_memory_size);
1645 }
1646
1647 if (saved_state.asregs.profile && !profile_file)
1648 {
1649 profile_file = fopen ("gmon.out", "wb");
1650 /* Seek to where to put the call arc data */
1651 nsamples = (1 << sim_profile_size);
1652
1653 fseek (profile_file, nsamples * 2 + 12, 0);
1654
1655 if (!profile_file)
1656 {
1657 fprintf (stderr, "Can't open gmon.out\n");
1658 }
1659 else
1660 {
1661 saved_state.asregs.profile_hist =
1662 (unsigned short *) calloc (64, (nsamples * sizeof (short) / 64));
1663 }
1664 }
1665 }
1666
1667 static void
1668 dump_profile (void)
1669 {
1670 unsigned int minpc;
1671 unsigned int maxpc;
1672 unsigned short *p;
1673 int i;
1674
1675 p = saved_state.asregs.profile_hist;
1676 minpc = 0;
1677 maxpc = (1 << sim_profile_size);
1678
1679 fseek (profile_file, 0L, 0);
1680 swapout (minpc << PROFILE_SHIFT);
1681 swapout (maxpc << PROFILE_SHIFT);
1682 swapout (nsamples * 2 + 12);
1683 for (i = 0; i < nsamples; i++)
1684 swapout16 (saved_state.asregs.profile_hist[i]);
1685
1686 }
1687
1688 static void
1689 gotcall (int from, int to)
1690 {
1691 swapout (from);
1692 swapout (to);
1693 swapout (1);
1694 }
1695
1696 #define MMASKB ((saved_state.asregs.msize -1) & ~0)
1697
1698 void
1699 sim_resume (SIM_DESC sd, int step, int siggnal)
1700 {
1701 register unsigned char *insn_ptr;
1702 unsigned char *mem_end;
1703 struct loop_bounds loop;
1704 register int cycles = 0;
1705 register int stalls = 0;
1706 register int memstalls = 0;
1707 register int insts = 0;
1708 register int prevlock;
1709 #if 1
1710 int thislock;
1711 #else
1712 register int thislock;
1713 #endif
1714 register unsigned int doprofile;
1715 register int pollcount = 0;
1716 /* endianw is used for every insn fetch, hence it makes sense to cache it.
1717 endianb is used less often. */
1718 register int endianw = global_endianw;
1719
1720 int tick_start = get_now ();
1721 void (*prev_fpe) ();
1722
1723 register unsigned short *jump_table = sh_jump_table;
1724
1725 register int *R = &(saved_state.asregs.regs[0]);
1726 /*register int T;*/
1727 #ifndef PR
1728 register int PR;
1729 #endif
1730
1731 register int maskb = ~((saved_state.asregs.msize - 1) & ~0);
1732 register int maskw = ~((saved_state.asregs.msize - 1) & ~1);
1733 register int maskl = ~((saved_state.asregs.msize - 1) & ~3);
1734 register unsigned char *memory;
1735 register unsigned int sbit = ((unsigned int) 1 << 31);
1736
1737 prev_fpe = signal (SIGFPE, SIG_IGN);
1738
1739 init_pointers ();
1740 saved_state.asregs.exception = 0;
1741
1742 memory = saved_state.asregs.memory;
1743 mem_end = memory + saved_state.asregs.msize;
1744
1745 if (RE & 1)
1746 loop = get_loop_bounds_ext (RS, RE, memory, mem_end, maskw, endianw);
1747 else
1748 loop = get_loop_bounds (RS, RE, memory, mem_end, maskw, endianw);
1749
1750 insn_ptr = PT2H (saved_state.asregs.pc);
1751 CHECK_INSN_PTR (insn_ptr);
1752
1753 #ifndef PR
1754 PR = saved_state.asregs.pr;
1755 #endif
1756 /*T = GET_SR () & SR_MASK_T;*/
1757 prevlock = saved_state.asregs.prevlock;
1758 thislock = saved_state.asregs.thislock;
1759 doprofile = saved_state.asregs.profile;
1760
1761 /* If profiling not enabled, disable it by asking for
1762 profiles infrequently. */
1763 if (doprofile == 0)
1764 doprofile = ~0;
1765
1766 loop:
1767 if (step && insn_ptr < saved_state.asregs.insn_end)
1768 {
1769 if (saved_state.asregs.exception)
1770 /* This can happen if we've already been single-stepping and
1771 encountered a loop end. */
1772 saved_state.asregs.insn_end = insn_ptr;
1773 else
1774 {
1775 saved_state.asregs.exception = SIGTRAP;
1776 saved_state.asregs.insn_end = insn_ptr + 2;
1777 }
1778 }
1779
1780 while (insn_ptr < saved_state.asregs.insn_end)
1781 {
1782 register unsigned int iword = RIAT (insn_ptr);
1783 register unsigned int ult;
1784 register unsigned char *nip = insn_ptr + 2;
1785
1786 #ifndef ACE_FAST
1787 insts++;
1788 #endif
1789 top:
1790
1791 #include "code.c"
1792
1793
1794 in_delay_slot = 0;
1795 insn_ptr = nip;
1796
1797 if (--pollcount < 0)
1798 {
1799 host_callback *callback = STATE_CALLBACK (sd);
1800
1801 pollcount = POLL_QUIT_INTERVAL;
1802 if ((*callback->poll_quit) != NULL
1803 && (*callback->poll_quit) (callback))
1804 {
1805 sim_stop (sd);
1806 }
1807 }
1808
1809 #ifndef ACE_FAST
1810 prevlock = thislock;
1811 thislock = 30;
1812 cycles++;
1813
1814 if (cycles >= doprofile)
1815 {
1816
1817 saved_state.asregs.cycles += doprofile;
1818 cycles -= doprofile;
1819 if (saved_state.asregs.profile_hist)
1820 {
1821 int n = PH2T (insn_ptr) >> PROFILE_SHIFT;
1822 if (n < nsamples)
1823 {
1824 int i = saved_state.asregs.profile_hist[n];
1825 if (i < 65000)
1826 saved_state.asregs.profile_hist[n] = i + 1;
1827 }
1828
1829 }
1830 }
1831 #endif
1832 }
1833 if (saved_state.asregs.insn_end == loop.end)
1834 {
1835 saved_state.asregs.sr += SR_RC_INCREMENT;
1836 if (SR_RC)
1837 insn_ptr = loop.start;
1838 else
1839 {
1840 saved_state.asregs.insn_end = mem_end;
1841 loop.end = PT2H (0);
1842 }
1843 goto loop;
1844 }
1845
1846 if (saved_state.asregs.exception == SIGILL
1847 || saved_state.asregs.exception == SIGBUS)
1848 {
1849 insn_ptr -= 2;
1850 }
1851 /* Check for SIGBUS due to insn fetch. */
1852 else if (! saved_state.asregs.exception)
1853 saved_state.asregs.exception = SIGBUS;
1854
1855 saved_state.asregs.ticks += get_now () - tick_start;
1856 saved_state.asregs.cycles += cycles;
1857 saved_state.asregs.stalls += stalls;
1858 saved_state.asregs.memstalls += memstalls;
1859 saved_state.asregs.insts += insts;
1860 saved_state.asregs.pc = PH2T (insn_ptr);
1861 #ifndef PR
1862 saved_state.asregs.pr = PR;
1863 #endif
1864
1865 saved_state.asregs.prevlock = prevlock;
1866 saved_state.asregs.thislock = thislock;
1867
1868 if (profile_file)
1869 {
1870 dump_profile ();
1871 }
1872
1873 signal (SIGFPE, prev_fpe);
1874 }
1875
1876 int
1877 sim_write (SIM_DESC sd, SIM_ADDR addr, const void *buffer, int size)
1878 {
1879 int i;
1880 const unsigned char *data = buffer;
1881
1882 init_pointers ();
1883
1884 for (i = 0; i < size; i++)
1885 {
1886 saved_state.asregs.memory[(MMASKB & (addr + i)) ^ endianb] = data[i];
1887 }
1888 return size;
1889 }
1890
1891 int
1892 sim_read (SIM_DESC sd, SIM_ADDR addr, void *buffer, int size)
1893 {
1894 int i;
1895 unsigned char *data = buffer;
1896
1897 init_pointers ();
1898
1899 for (i = 0; i < size; i++)
1900 {
1901 data[i] = saved_state.asregs.memory[(MMASKB & (addr + i)) ^ endianb];
1902 }
1903 return size;
1904 }
1905
1906 static int gdb_bank_number;
1907 enum {
1908 REGBANK_MACH = 15,
1909 REGBANK_IVN = 16,
1910 REGBANK_PR = 17,
1911 REGBANK_GBR = 18,
1912 REGBANK_MACL = 19
1913 };
1914
1915 static int
1916 sh_reg_store (SIM_CPU *cpu, int rn, unsigned char *memory, int length)
1917 {
1918 unsigned val;
1919
1920 init_pointers ();
1921 val = swap (* (int *) memory);
1922 switch (rn)
1923 {
1924 case SIM_SH_R0_REGNUM: case SIM_SH_R1_REGNUM: case SIM_SH_R2_REGNUM:
1925 case SIM_SH_R3_REGNUM: case SIM_SH_R4_REGNUM: case SIM_SH_R5_REGNUM:
1926 case SIM_SH_R6_REGNUM: case SIM_SH_R7_REGNUM: case SIM_SH_R8_REGNUM:
1927 case SIM_SH_R9_REGNUM: case SIM_SH_R10_REGNUM: case SIM_SH_R11_REGNUM:
1928 case SIM_SH_R12_REGNUM: case SIM_SH_R13_REGNUM: case SIM_SH_R14_REGNUM:
1929 case SIM_SH_R15_REGNUM:
1930 saved_state.asregs.regs[rn] = val;
1931 break;
1932 case SIM_SH_PC_REGNUM:
1933 saved_state.asregs.pc = val;
1934 break;
1935 case SIM_SH_PR_REGNUM:
1936 PR = val;
1937 break;
1938 case SIM_SH_GBR_REGNUM:
1939 GBR = val;
1940 break;
1941 case SIM_SH_VBR_REGNUM:
1942 VBR = val;
1943 break;
1944 case SIM_SH_MACH_REGNUM:
1945 MACH = val;
1946 break;
1947 case SIM_SH_MACL_REGNUM:
1948 MACL = val;
1949 break;
1950 case SIM_SH_SR_REGNUM:
1951 SET_SR (val);
1952 break;
1953 case SIM_SH_FPUL_REGNUM:
1954 FPUL = val;
1955 break;
1956 case SIM_SH_FPSCR_REGNUM:
1957 SET_FPSCR (val);
1958 break;
1959 case SIM_SH_FR0_REGNUM: case SIM_SH_FR1_REGNUM: case SIM_SH_FR2_REGNUM:
1960 case SIM_SH_FR3_REGNUM: case SIM_SH_FR4_REGNUM: case SIM_SH_FR5_REGNUM:
1961 case SIM_SH_FR6_REGNUM: case SIM_SH_FR7_REGNUM: case SIM_SH_FR8_REGNUM:
1962 case SIM_SH_FR9_REGNUM: case SIM_SH_FR10_REGNUM: case SIM_SH_FR11_REGNUM:
1963 case SIM_SH_FR12_REGNUM: case SIM_SH_FR13_REGNUM: case SIM_SH_FR14_REGNUM:
1964 case SIM_SH_FR15_REGNUM:
1965 SET_FI (rn - SIM_SH_FR0_REGNUM, val);
1966 break;
1967 case SIM_SH_DSR_REGNUM:
1968 DSR = val;
1969 break;
1970 case SIM_SH_A0G_REGNUM:
1971 A0G = val;
1972 break;
1973 case SIM_SH_A0_REGNUM:
1974 A0 = val;
1975 break;
1976 case SIM_SH_A1G_REGNUM:
1977 A1G = val;
1978 break;
1979 case SIM_SH_A1_REGNUM:
1980 A1 = val;
1981 break;
1982 case SIM_SH_M0_REGNUM:
1983 M0 = val;
1984 break;
1985 case SIM_SH_M1_REGNUM:
1986 M1 = val;
1987 break;
1988 case SIM_SH_X0_REGNUM:
1989 X0 = val;
1990 break;
1991 case SIM_SH_X1_REGNUM:
1992 X1 = val;
1993 break;
1994 case SIM_SH_Y0_REGNUM:
1995 Y0 = val;
1996 break;
1997 case SIM_SH_Y1_REGNUM:
1998 Y1 = val;
1999 break;
2000 case SIM_SH_MOD_REGNUM:
2001 SET_MOD (val);
2002 break;
2003 case SIM_SH_RS_REGNUM:
2004 RS = val;
2005 break;
2006 case SIM_SH_RE_REGNUM:
2007 RE = val;
2008 break;
2009 case SIM_SH_SSR_REGNUM:
2010 SSR = val;
2011 break;
2012 case SIM_SH_SPC_REGNUM:
2013 SPC = val;
2014 break;
2015 /* The rn_bank idiosyncracies are not due to hardware differences, but to
2016 a weird aliasing naming scheme for sh3 / sh3e / sh4. */
2017 case SIM_SH_R0_BANK0_REGNUM: case SIM_SH_R1_BANK0_REGNUM:
2018 case SIM_SH_R2_BANK0_REGNUM: case SIM_SH_R3_BANK0_REGNUM:
2019 case SIM_SH_R4_BANK0_REGNUM: case SIM_SH_R5_BANK0_REGNUM:
2020 case SIM_SH_R6_BANK0_REGNUM: case SIM_SH_R7_BANK0_REGNUM:
2021 if (saved_state.asregs.bfd_mach == bfd_mach_sh2a)
2022 {
2023 rn -= SIM_SH_R0_BANK0_REGNUM;
2024 saved_state.asregs.regstack[gdb_bank_number].regs[rn] = val;
2025 }
2026 else
2027 if (SR_MD && SR_RB)
2028 Rn_BANK (rn - SIM_SH_R0_BANK0_REGNUM) = val;
2029 else
2030 saved_state.asregs.regs[rn - SIM_SH_R0_BANK0_REGNUM] = val;
2031 break;
2032 case SIM_SH_R0_BANK1_REGNUM: case SIM_SH_R1_BANK1_REGNUM:
2033 case SIM_SH_R2_BANK1_REGNUM: case SIM_SH_R3_BANK1_REGNUM:
2034 case SIM_SH_R4_BANK1_REGNUM: case SIM_SH_R5_BANK1_REGNUM:
2035 case SIM_SH_R6_BANK1_REGNUM: case SIM_SH_R7_BANK1_REGNUM:
2036 if (saved_state.asregs.bfd_mach == bfd_mach_sh2a)
2037 {
2038 rn -= SIM_SH_R0_BANK1_REGNUM;
2039 saved_state.asregs.regstack[gdb_bank_number].regs[rn + 8] = val;
2040 }
2041 else
2042 if (SR_MD && SR_RB)
2043 saved_state.asregs.regs[rn - SIM_SH_R0_BANK1_REGNUM] = val;
2044 else
2045 Rn_BANK (rn - SIM_SH_R0_BANK1_REGNUM) = val;
2046 break;
2047 case SIM_SH_R0_BANK_REGNUM: case SIM_SH_R1_BANK_REGNUM:
2048 case SIM_SH_R2_BANK_REGNUM: case SIM_SH_R3_BANK_REGNUM:
2049 case SIM_SH_R4_BANK_REGNUM: case SIM_SH_R5_BANK_REGNUM:
2050 case SIM_SH_R6_BANK_REGNUM: case SIM_SH_R7_BANK_REGNUM:
2051 SET_Rn_BANK (rn - SIM_SH_R0_BANK_REGNUM, val);
2052 break;
2053 case SIM_SH_TBR_REGNUM:
2054 TBR = val;
2055 break;
2056 case SIM_SH_IBNR_REGNUM:
2057 IBNR = val;
2058 break;
2059 case SIM_SH_IBCR_REGNUM:
2060 IBCR = val;
2061 break;
2062 case SIM_SH_BANK_REGNUM:
2063 /* This is a pseudo-register maintained just for gdb.
2064 It tells us what register bank gdb would like to read/write. */
2065 gdb_bank_number = val;
2066 break;
2067 case SIM_SH_BANK_MACL_REGNUM:
2068 saved_state.asregs.regstack[gdb_bank_number].regs[REGBANK_MACL] = val;
2069 break;
2070 case SIM_SH_BANK_GBR_REGNUM:
2071 saved_state.asregs.regstack[gdb_bank_number].regs[REGBANK_GBR] = val;
2072 break;
2073 case SIM_SH_BANK_PR_REGNUM:
2074 saved_state.asregs.regstack[gdb_bank_number].regs[REGBANK_PR] = val;
2075 break;
2076 case SIM_SH_BANK_IVN_REGNUM:
2077 saved_state.asregs.regstack[gdb_bank_number].regs[REGBANK_IVN] = val;
2078 break;
2079 case SIM_SH_BANK_MACH_REGNUM:
2080 saved_state.asregs.regstack[gdb_bank_number].regs[REGBANK_MACH] = val;
2081 break;
2082 default:
2083 return 0;
2084 }
2085 return length;
2086 }
2087
2088 static int
2089 sh_reg_fetch (SIM_CPU *cpu, int rn, unsigned char *memory, int length)
2090 {
2091 int val;
2092
2093 init_pointers ();
2094 switch (rn)
2095 {
2096 case SIM_SH_R0_REGNUM: case SIM_SH_R1_REGNUM: case SIM_SH_R2_REGNUM:
2097 case SIM_SH_R3_REGNUM: case SIM_SH_R4_REGNUM: case SIM_SH_R5_REGNUM:
2098 case SIM_SH_R6_REGNUM: case SIM_SH_R7_REGNUM: case SIM_SH_R8_REGNUM:
2099 case SIM_SH_R9_REGNUM: case SIM_SH_R10_REGNUM: case SIM_SH_R11_REGNUM:
2100 case SIM_SH_R12_REGNUM: case SIM_SH_R13_REGNUM: case SIM_SH_R14_REGNUM:
2101 case SIM_SH_R15_REGNUM:
2102 val = saved_state.asregs.regs[rn];
2103 break;
2104 case SIM_SH_PC_REGNUM:
2105 val = saved_state.asregs.pc;
2106 break;
2107 case SIM_SH_PR_REGNUM:
2108 val = PR;
2109 break;
2110 case SIM_SH_GBR_REGNUM:
2111 val = GBR;
2112 break;
2113 case SIM_SH_VBR_REGNUM:
2114 val = VBR;
2115 break;
2116 case SIM_SH_MACH_REGNUM:
2117 val = MACH;
2118 break;
2119 case SIM_SH_MACL_REGNUM:
2120 val = MACL;
2121 break;
2122 case SIM_SH_SR_REGNUM:
2123 val = GET_SR ();
2124 break;
2125 case SIM_SH_FPUL_REGNUM:
2126 val = FPUL;
2127 break;
2128 case SIM_SH_FPSCR_REGNUM:
2129 val = GET_FPSCR ();
2130 break;
2131 case SIM_SH_FR0_REGNUM: case SIM_SH_FR1_REGNUM: case SIM_SH_FR2_REGNUM:
2132 case SIM_SH_FR3_REGNUM: case SIM_SH_FR4_REGNUM: case SIM_SH_FR5_REGNUM:
2133 case SIM_SH_FR6_REGNUM: case SIM_SH_FR7_REGNUM: case SIM_SH_FR8_REGNUM:
2134 case SIM_SH_FR9_REGNUM: case SIM_SH_FR10_REGNUM: case SIM_SH_FR11_REGNUM:
2135 case SIM_SH_FR12_REGNUM: case SIM_SH_FR13_REGNUM: case SIM_SH_FR14_REGNUM:
2136 case SIM_SH_FR15_REGNUM:
2137 val = FI (rn - SIM_SH_FR0_REGNUM);
2138 break;
2139 case SIM_SH_DSR_REGNUM:
2140 val = DSR;
2141 break;
2142 case SIM_SH_A0G_REGNUM:
2143 val = SEXT (A0G);
2144 break;
2145 case SIM_SH_A0_REGNUM:
2146 val = A0;
2147 break;
2148 case SIM_SH_A1G_REGNUM:
2149 val = SEXT (A1G);
2150 break;
2151 case SIM_SH_A1_REGNUM:
2152 val = A1;
2153 break;
2154 case SIM_SH_M0_REGNUM:
2155 val = M0;
2156 break;
2157 case SIM_SH_M1_REGNUM:
2158 val = M1;
2159 break;
2160 case SIM_SH_X0_REGNUM:
2161 val = X0;
2162 break;
2163 case SIM_SH_X1_REGNUM:
2164 val = X1;
2165 break;
2166 case SIM_SH_Y0_REGNUM:
2167 val = Y0;
2168 break;
2169 case SIM_SH_Y1_REGNUM:
2170 val = Y1;
2171 break;
2172 case SIM_SH_MOD_REGNUM:
2173 val = MOD;
2174 break;
2175 case SIM_SH_RS_REGNUM:
2176 val = RS;
2177 break;
2178 case SIM_SH_RE_REGNUM:
2179 val = RE;
2180 break;
2181 case SIM_SH_SSR_REGNUM:
2182 val = SSR;
2183 break;
2184 case SIM_SH_SPC_REGNUM:
2185 val = SPC;
2186 break;
2187 /* The rn_bank idiosyncracies are not due to hardware differences, but to
2188 a weird aliasing naming scheme for sh3 / sh3e / sh4. */
2189 case SIM_SH_R0_BANK0_REGNUM: case SIM_SH_R1_BANK0_REGNUM:
2190 case SIM_SH_R2_BANK0_REGNUM: case SIM_SH_R3_BANK0_REGNUM:
2191 case SIM_SH_R4_BANK0_REGNUM: case SIM_SH_R5_BANK0_REGNUM:
2192 case SIM_SH_R6_BANK0_REGNUM: case SIM_SH_R7_BANK0_REGNUM:
2193 if (saved_state.asregs.bfd_mach == bfd_mach_sh2a)
2194 {
2195 rn -= SIM_SH_R0_BANK0_REGNUM;
2196 val = saved_state.asregs.regstack[gdb_bank_number].regs[rn];
2197 }
2198 else
2199 val = (SR_MD && SR_RB
2200 ? Rn_BANK (rn - SIM_SH_R0_BANK0_REGNUM)
2201 : saved_state.asregs.regs[rn - SIM_SH_R0_BANK0_REGNUM]);
2202 break;
2203 case SIM_SH_R0_BANK1_REGNUM: case SIM_SH_R1_BANK1_REGNUM:
2204 case SIM_SH_R2_BANK1_REGNUM: case SIM_SH_R3_BANK1_REGNUM:
2205 case SIM_SH_R4_BANK1_REGNUM: case SIM_SH_R5_BANK1_REGNUM:
2206 case SIM_SH_R6_BANK1_REGNUM: case SIM_SH_R7_BANK1_REGNUM:
2207 if (saved_state.asregs.bfd_mach == bfd_mach_sh2a)
2208 {
2209 rn -= SIM_SH_R0_BANK1_REGNUM;
2210 val = saved_state.asregs.regstack[gdb_bank_number].regs[rn + 8];
2211 }
2212 else
2213 val = (! SR_MD || ! SR_RB
2214 ? Rn_BANK (rn - SIM_SH_R0_BANK1_REGNUM)
2215 : saved_state.asregs.regs[rn - SIM_SH_R0_BANK1_REGNUM]);
2216 break;
2217 case SIM_SH_R0_BANK_REGNUM: case SIM_SH_R1_BANK_REGNUM:
2218 case SIM_SH_R2_BANK_REGNUM: case SIM_SH_R3_BANK_REGNUM:
2219 case SIM_SH_R4_BANK_REGNUM: case SIM_SH_R5_BANK_REGNUM:
2220 case SIM_SH_R6_BANK_REGNUM: case SIM_SH_R7_BANK_REGNUM:
2221 val = Rn_BANK (rn - SIM_SH_R0_BANK_REGNUM);
2222 break;
2223 case SIM_SH_TBR_REGNUM:
2224 val = TBR;
2225 break;
2226 case SIM_SH_IBNR_REGNUM:
2227 val = IBNR;
2228 break;
2229 case SIM_SH_IBCR_REGNUM:
2230 val = IBCR;
2231 break;
2232 case SIM_SH_BANK_REGNUM:
2233 /* This is a pseudo-register maintained just for gdb.
2234 It tells us what register bank gdb would like to read/write. */
2235 val = gdb_bank_number;
2236 break;
2237 case SIM_SH_BANK_MACL_REGNUM:
2238 val = saved_state.asregs.regstack[gdb_bank_number].regs[REGBANK_MACL];
2239 break;
2240 case SIM_SH_BANK_GBR_REGNUM:
2241 val = saved_state.asregs.regstack[gdb_bank_number].regs[REGBANK_GBR];
2242 break;
2243 case SIM_SH_BANK_PR_REGNUM:
2244 val = saved_state.asregs.regstack[gdb_bank_number].regs[REGBANK_PR];
2245 break;
2246 case SIM_SH_BANK_IVN_REGNUM:
2247 val = saved_state.asregs.regstack[gdb_bank_number].regs[REGBANK_IVN];
2248 break;
2249 case SIM_SH_BANK_MACH_REGNUM:
2250 val = saved_state.asregs.regstack[gdb_bank_number].regs[REGBANK_MACH];
2251 break;
2252 default:
2253 return 0;
2254 }
2255 * (int *) memory = swap (val);
2256 return length;
2257 }
2258
2259 void
2260 sim_stop_reason (SIM_DESC sd, enum sim_stop *reason, int *sigrc)
2261 {
2262 /* The SH simulator uses SIGQUIT to indicate that the program has
2263 exited, so we must check for it here and translate it to exit. */
2264 if (saved_state.asregs.exception == SIGQUIT)
2265 {
2266 *reason = sim_exited;
2267 *sigrc = saved_state.asregs.regs[5];
2268 }
2269 else
2270 {
2271 *reason = sim_stopped;
2272 *sigrc = saved_state.asregs.exception;
2273 }
2274 }
2275
2276 void
2277 sim_info (SIM_DESC sd, int verbose)
2278 {
2279 double timetaken =
2280 (double) saved_state.asregs.ticks / (double) now_persec ();
2281 double virttime = saved_state.asregs.cycles / 36.0e6;
2282
2283 sim_io_printf (sd, "\n\n# instructions executed %10d\n",
2284 saved_state.asregs.insts);
2285 sim_io_printf (sd, "# cycles %10d\n",
2286 saved_state.asregs.cycles);
2287 sim_io_printf (sd, "# pipeline stalls %10d\n",
2288 saved_state.asregs.stalls);
2289 sim_io_printf (sd, "# misaligned load/store %10d\n",
2290 saved_state.asregs.memstalls);
2291 sim_io_printf (sd, "# real time taken %10.4f\n", timetaken);
2292 sim_io_printf (sd, "# virtual time taken %10.4f\n", virttime);
2293 sim_io_printf (sd, "# profiling size %10d\n", sim_profile_size);
2294 sim_io_printf (sd, "# profiling frequency %10d\n",
2295 saved_state.asregs.profile);
2296 sim_io_printf (sd, "# profile maxpc %10x\n",
2297 (1 << sim_profile_size) << PROFILE_SHIFT);
2298
2299 if (timetaken != 0)
2300 {
2301 sim_io_printf (sd, "# cycles/second %10d\n",
2302 (int) (saved_state.asregs.cycles / timetaken));
2303 sim_io_printf (sd, "# simulation ratio %10.4f\n",
2304 virttime / timetaken);
2305 }
2306 }
2307
2308 static sim_cia
2309 sh_pc_get (sim_cpu *cpu)
2310 {
2311 return saved_state.asregs.pc;
2312 }
2313
2314 static void
2315 sh_pc_set (sim_cpu *cpu, sim_cia pc)
2316 {
2317 saved_state.asregs.pc = pc;
2318 }
2319
2320 static void
2321 free_state (SIM_DESC sd)
2322 {
2323 if (STATE_MODULES (sd) != NULL)
2324 sim_module_uninstall (sd);
2325 sim_cpu_free_all (sd);
2326 sim_state_free (sd);
2327 }
2328
2329 SIM_DESC
2330 sim_open (SIM_OPEN_KIND kind, host_callback *cb,
2331 struct bfd *abfd, char * const *argv)
2332 {
2333 char * const *p;
2334 int i;
2335 union
2336 {
2337 int i;
2338 short s[2];
2339 char c[4];
2340 }
2341 mem_word;
2342
2343 SIM_DESC sd = sim_state_alloc (kind, cb);
2344 SIM_ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER);
2345
2346 /* Set default options before parsing user options. */
2347 current_alignment = STRICT_ALIGNMENT;
2348 cb->syscall_map = cb_sh_syscall_map;
2349
2350 /* The cpu data is kept in a separately allocated chunk of memory. */
2351 if (sim_cpu_alloc_all (sd, 1) != SIM_RC_OK)
2352 {
2353 free_state (sd);
2354 return 0;
2355 }
2356
2357 if (sim_pre_argv_init (sd, argv[0]) != SIM_RC_OK)
2358 {
2359 free_state (sd);
2360 return 0;
2361 }
2362
2363 /* The parser will print an error message for us, so we silently return. */
2364 if (sim_parse_args (sd, argv) != SIM_RC_OK)
2365 {
2366 free_state (sd);
2367 return 0;
2368 }
2369
2370 /* Check for/establish the a reference program image. */
2371 if (sim_analyze_program (sd, STATE_PROG_FILE (sd), abfd) != SIM_RC_OK)
2372 {
2373 free_state (sd);
2374 return 0;
2375 }
2376
2377 /* Configure/verify the target byte order and other runtime
2378 configuration options. */
2379 if (sim_config (sd) != SIM_RC_OK)
2380 {
2381 sim_module_uninstall (sd);
2382 return 0;
2383 }
2384
2385 if (sim_post_argv_init (sd) != SIM_RC_OK)
2386 {
2387 /* Uninstall the modules to avoid memory leaks,
2388 file descriptor leaks, etc. */
2389 sim_module_uninstall (sd);
2390 return 0;
2391 }
2392
2393 /* CPU specific initialization. */
2394 for (i = 0; i < MAX_NR_PROCESSORS; ++i)
2395 {
2396 SIM_CPU *cpu = STATE_CPU (sd, i);
2397
2398 CPU_REG_FETCH (cpu) = sh_reg_fetch;
2399 CPU_REG_STORE (cpu) = sh_reg_store;
2400 CPU_PC_FETCH (cpu) = sh_pc_get;
2401 CPU_PC_STORE (cpu) = sh_pc_set;
2402 }
2403
2404 for (p = argv + 1; *p != NULL; ++p)
2405 {
2406 if (isdigit (**p))
2407 parse_and_set_memory_size (sd, *p);
2408 }
2409
2410 if (abfd)
2411 init_dsp (abfd);
2412
2413 for (i = 4; (i -= 2) >= 0; )
2414 mem_word.s[i >> 1] = i;
2415 global_endianw = mem_word.i >> (target_little_endian ? 0 : 16) & 0xffff;
2416
2417 for (i = 4; --i >= 0; )
2418 mem_word.c[i] = i;
2419 endianb = mem_word.i >> (target_little_endian ? 0 : 24) & 0xff;
2420
2421 return sd;
2422 }
2423
2424 static void
2425 parse_and_set_memory_size (SIM_DESC sd, const char *str)
2426 {
2427 int n;
2428
2429 n = strtol (str, NULL, 10);
2430 if (n > 0 && n <= 31)
2431 sim_memory_size = n;
2432 else
2433 sim_io_printf (sd, "Bad memory size %d; must be 1 to 31, inclusive\n", n);
2434 }
2435
2436 SIM_RC
2437 sim_create_inferior (SIM_DESC sd, struct bfd *prog_bfd,
2438 char * const *argv, char * const *env)
2439 {
2440 /* Clear the registers. */
2441 memset (&saved_state, 0,
2442 (char*) &saved_state.asregs.end_of_registers - (char*) &saved_state);
2443
2444 /* Set the PC. */
2445 if (prog_bfd != NULL)
2446 saved_state.asregs.pc = bfd_get_start_address (prog_bfd);
2447
2448 /* Set the bfd machine type. */
2449 if (prog_bfd != NULL)
2450 saved_state.asregs.bfd_mach = bfd_get_mach (prog_bfd);
2451
2452 if (prog_bfd != NULL)
2453 init_dsp (prog_bfd);
2454
2455 return SIM_RC_OK;
2456 }
2457
2458 void
2459 sim_do_command (SIM_DESC sd, const char *cmd)
2460 {
2461 const char *sms_cmd = "set-memory-size";
2462 int cmdsize;
2463
2464 if (cmd == NULL || *cmd == '\0')
2465 {
2466 cmd = "help";
2467 }
2468
2469 cmdsize = strlen (sms_cmd);
2470 if (strncmp (cmd, sms_cmd, cmdsize) == 0
2471 && strchr (" \t", cmd[cmdsize]) != NULL)
2472 {
2473 parse_and_set_memory_size (sd, cmd + cmdsize + 1);
2474 }
2475 else if (strcmp (cmd, "help") == 0)
2476 {
2477 sim_io_printf (sd, "List of SH simulator commands:\n\n");
2478 sim_io_printf (sd, "set-memory-size <n> -- Set the number of address bits to use\n");
2479 sim_io_printf (sd, "\n");
2480 }
2481 else
2482 {
2483 sim_io_printf (sd, "Error: \"%s\" is not a valid SH simulator command.\n", cmd);
2484 }
2485 }