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