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