OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [tags/] [VER_5_3/] [gdb-5.3/] [sim/] [sh/] [interp.c] - Blame information for rev 1783

Go to most recent revision | Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.