1 /* This file is part of SIS (SPARC instruction simulator) 2 3 Copyright (C) 1995-2024 Free Software Foundation, Inc. 4 Contributed by Jiri Gaisler, European Space Agency 5 6 This program is free software; you can redistribute it and/or modify 7 it under the terms of the GNU General Public License as published by 8 the Free Software Foundation; either version 3 of the License, or 9 (at your option) any later version. 10 11 This program is distributed in the hope that it will be useful, 12 but WITHOUT ANY WARRANTY; without even the implied warranty of 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 GNU General Public License for more details. 15 16 You should have received a copy of the GNU General Public License 17 along with this program. If not, see <http://www.gnu.org/licenses/>. */ 18 19 /* The control space devices */ 20 21 /* This must come before any other includes. */ 22 #include "defs.h" 23 24 #include <sys/types.h> 25 #include <stdio.h> 26 #include <string.h> 27 #ifdef HAVE_TERMIOS_H 28 #include <termios.h> 29 #endif 30 #include <sys/fcntl.h> 31 #include <sys/file.h> 32 #include <unistd.h> 33 #include "sis.h" 34 #include "sim-config.h" 35 36 extern int ctrl_c; 37 extern int32_t sis_verbose; 38 extern int32_t sparclite, sparclite_board; 39 extern int rom8,wrp,uben; 40 extern char uart_dev1[], uart_dev2[]; 41 42 int dumbio = 0; /* normal, smart, terminal oriented IO by default */ 43 44 /* MEC registers */ 45 #define MEC_START 0x01f80000 46 #define MEC_END 0x01f80100 47 48 /* Memory exception waitstates */ 49 #define MEM_EX_WS 1 50 51 /* ERC32 always adds one waitstate during RAM std */ 52 #define STD_WS 1 53 54 #ifdef ERRINJ 55 extern int errmec; 56 #endif 57 58 #define MEC_WS 0 /* Waitstates per MEC access (0 ws) */ 59 #define MOK 0 60 61 /* MEC register addresses */ 62 63 #define MEC_MCR 0x000 64 #define MEC_SFR 0x004 65 #define MEC_PWDR 0x008 66 #define MEC_MEMCFG 0x010 67 #define MEC_IOCR 0x014 68 #define MEC_WCR 0x018 69 70 #define MEC_MAR0 0x020 71 #define MEC_MAR1 0x024 72 73 #define MEC_SSA1 0x020 74 #define MEC_SEA1 0x024 75 #define MEC_SSA2 0x028 76 #define MEC_SEA2 0x02C 77 #define MEC_ISR 0x044 78 #define MEC_IPR 0x048 79 #define MEC_IMR 0x04C 80 #define MEC_ICR 0x050 81 #define MEC_IFR 0x054 82 #define MEC_WDOG 0x060 83 #define MEC_TRAPD 0x064 84 #define MEC_RTC_COUNTER 0x080 85 #define MEC_RTC_RELOAD 0x080 86 #define MEC_RTC_SCALER 0x084 87 #define MEC_GPT_COUNTER 0x088 88 #define MEC_GPT_RELOAD 0x088 89 #define MEC_GPT_SCALER 0x08C 90 #define MEC_TIMER_CTRL 0x098 91 #define MEC_SFSR 0x0A0 92 #define MEC_FFAR 0x0A4 93 #define MEC_ERSR 0x0B0 94 #define MEC_DBG 0x0C0 95 #define MEC_TCR 0x0D0 96 97 #define MEC_BRK 0x0C4 98 #define MEC_WPR 0x0C8 99 100 #define MEC_UARTA 0x0E0 101 #define MEC_UARTB 0x0E4 102 #define MEC_UART_CTRL 0x0E8 103 #define SIM_LOAD 0x0F0 104 105 /* Memory exception causes */ 106 #define PROT_EXC 0x3 107 #define UIMP_ACC 0x4 108 #define MEC_ACC 0x6 109 #define WATCH_EXC 0xa 110 #define BREAK_EXC 0xb 111 112 /* Size of UART buffers (bytes) */ 113 #define UARTBUF 1024 114 115 /* Number of simulator ticks between flushing the UARTS. */ 116 /* For good performance, keep above 1000 */ 117 #define UART_FLUSH_TIME 3000 118 119 /* MEC timer control register bits */ 120 #define TCR_GACR 1 121 #define TCR_GACL 2 122 #define TCR_GASE 4 123 #define TCR_GASL 8 124 #define TCR_TCRCR 0x100 125 #define TCR_TCRCL 0x200 126 #define TCR_TCRSE 0x400 127 #define TCR_TCRSL 0x800 128 129 /* New uart defines */ 130 #define UART_TX_TIME 1000 131 #define UART_RX_TIME 1000 132 #define UARTA_DR 0x1 133 #define UARTA_SRE 0x2 134 #define UARTA_HRE 0x4 135 #define UARTA_OR 0x40 136 #define UARTA_CLR 0x80 137 #define UARTB_DR 0x10000 138 #define UARTB_SRE 0x20000 139 #define UARTB_HRE 0x40000 140 #define UARTB_OR 0x400000 141 #define UARTB_CLR 0x800000 142 143 #define UART_DR 0x100 144 #define UART_TSE 0x200 145 #define UART_THE 0x400 146 147 /* MEC registers */ 148 149 static char fname[256]; 150 static int32_t find = 0; 151 static uint32_t mec_ssa[2]; /* Write protection start address */ 152 static uint32_t mec_sea[2]; /* Write protection end address */ 153 static uint32_t mec_wpr[2]; /* Write protection control fields */ 154 static uint32_t mec_sfsr; 155 static uint32_t mec_ffar; 156 static uint32_t mec_ipr; 157 static uint32_t mec_imr; 158 static uint32_t mec_isr; 159 static uint32_t mec_icr; 160 static uint32_t mec_ifr; 161 static uint32_t mec_mcr; /* MEC control register */ 162 static uint32_t mec_memcfg; /* Memory control register */ 163 static uint32_t mec_wcr; /* MEC waitstate register */ 164 static uint32_t mec_iocr; /* MEC IO control register */ 165 static uint32_t posted_irq; 166 static uint32_t mec_ersr; /* MEC error and status register */ 167 static uint32_t mec_tcr; /* MEC test comtrol register */ 168 169 static uint32_t rtc_counter; 170 static uint32_t rtc_reload; 171 static uint32_t rtc_scaler; 172 static uint32_t rtc_scaler_start; 173 static uint32_t rtc_enabled; 174 static uint32_t rtc_cr; 175 static uint32_t rtc_se; 176 177 static uint32_t gpt_counter; 178 static uint32_t gpt_reload; 179 static uint32_t gpt_scaler; 180 static uint32_t gpt_scaler_start; 181 static uint32_t gpt_enabled; 182 static uint32_t gpt_cr; 183 static uint32_t gpt_se; 184 185 static uint32_t wdog_scaler; 186 static uint32_t wdog_counter; 187 static uint32_t wdog_rst_delay; 188 static uint32_t wdog_rston; 189 190 enum wdog_type { 191 init, disabled, enabled, stopped 192 }; 193 194 static enum wdog_type wdog_status; 195 196 197 /* ROM size 1024 Kbyte */ 198 #define ROM_SZ 0x100000 199 #define ROM_MASK 0x0fffff 200 201 /* RAM size 4 Mbyte */ 202 #define RAM_START 0x02000000 203 #define RAM_END 0x02400000 204 #define RAM_MASK 0x003fffff 205 206 /* SPARClite boards all seem to have RAM at the same place. */ 207 #define RAM_START_SLITE 0x40000000 208 #define RAM_END_SLITE 0x40400000 209 #define RAM_MASK_SLITE 0x003fffff 210 211 /* Memory support variables */ 212 213 static uint32_t mem_ramr_ws; /* RAM read waitstates */ 214 static uint32_t mem_ramw_ws; /* RAM write waitstates */ 215 static uint32_t mem_romr_ws; /* ROM read waitstates */ 216 static uint32_t mem_romw_ws; /* ROM write waitstates */ 217 static uint32_t mem_ramstart; /* RAM start */ 218 static uint32_t mem_ramend; /* RAM end */ 219 static uint32_t mem_rammask; /* RAM address mask */ 220 static uint32_t mem_ramsz; /* RAM size */ 221 static uint32_t mem_romsz; /* ROM size */ 222 static uint32_t mem_accprot; /* RAM write protection enabled */ 223 static uint32_t mem_blockprot; /* RAM block write protection enabled */ 224 225 static unsigned char romb[ROM_SZ]; 226 static unsigned char ramb[RAM_END - RAM_START]; 227 228 229 /* UART support variables */ 230 231 static int32_t fd1, fd2; /* file descriptor for input file */ 232 static int32_t Ucontrol; /* UART status register */ 233 static unsigned char aq[UARTBUF], bq[UARTBUF]; 234 static int32_t anum, aind = 0; 235 static int32_t bnum, bind = 0; 236 static char wbufa[UARTBUF], wbufb[UARTBUF]; 237 static unsigned wnuma; 238 static unsigned wnumb; 239 static FILE *f1in, *f1out, *f2in, *f2out; 240 #ifdef HAVE_TERMIOS_H 241 static struct termios ioc1, ioc2, iocold1, iocold2; 242 #endif 243 static int f1open = 0, f2open = 0; 244 245 static char uarta_sreg, uarta_hreg, uartb_sreg, uartb_hreg; 246 static uint32_t uart_stat_reg; 247 static uint32_t uarta_data, uartb_data; 248 249 #ifdef ERA 250 int era = 0; 251 int erareg; 252 #endif 253 254 /* Forward declarations */ 255 256 static void decode_ersr (void); 257 #ifdef ERRINJ 258 static void iucomperr (void); 259 #endif 260 static void mecparerror (void); 261 static void decode_memcfg (void); 262 static void decode_wcr (void); 263 static void decode_mcr (void); 264 static void close_port (void); 265 static void mec_reset (void); 266 static void mec_intack (int32_t level); 267 static void chk_irq (void); 268 static void mec_irq (int32_t level); 269 static void set_sfsr (uint32_t fault, uint32_t addr, 270 uint32_t asi, uint32_t read); 271 static int32_t mec_read (uint32_t addr, uint32_t asi, uint32_t *data); 272 static int mec_write (uint32_t addr, uint32_t data); 273 static void port_init (void); 274 static uint32_t read_uart (uint32_t addr); 275 static void write_uart (uint32_t addr, uint32_t data); 276 static void flush_uart (void); 277 static void uarta_tx (int32_t); 278 static void uartb_tx (int32_t); 279 static void uart_rx (int32_t); 280 static void uart_intr (int32_t); 281 static void uart_irq_start (void); 282 static void wdog_intr (int32_t); 283 static void wdog_start (void); 284 static void rtc_intr (int32_t); 285 static void rtc_start (void); 286 static uint32_t rtc_counter_read (void); 287 static void rtc_scaler_set (uint32_t val); 288 static void rtc_reload_set (uint32_t val); 289 static void gpt_intr (int32_t); 290 static void gpt_start (void); 291 static uint32_t gpt_counter_read (void); 292 static void gpt_scaler_set (uint32_t val); 293 static void gpt_reload_set (uint32_t val); 294 static void timer_ctrl (uint32_t val); 295 static void * get_mem_ptr (uint32_t addr, uint32_t size); 296 static void store_bytes (unsigned char *mem, uint32_t waddr, 297 uint32_t *data, int sz, int32_t *ws); 298 299 extern int ext_irl; 300 301 302 /* One-time init */ 303 304 void 305 init_sim(void) 306 { 307 port_init(); 308 } 309 310 /* Power-on reset init */ 311 312 void 313 reset(void) 314 { 315 mec_reset(); 316 uart_irq_start(); 317 wdog_start(); 318 } 319 320 static void 321 decode_ersr(void) 322 { 323 if (mec_ersr & 0x01) { 324 if (!(mec_mcr & 0x20)) { 325 if (mec_mcr & 0x40) { 326 sys_reset(); 327 mec_ersr = 0x8000; 328 if (sis_verbose) 329 printf("Error manager reset - IU in error mode\n"); 330 } else { 331 sys_halt(); 332 mec_ersr |= 0x2000; 333 if (sis_verbose) 334 printf("Error manager halt - IU in error mode\n"); 335 } 336 } else 337 mec_irq(1); 338 } 339 if (mec_ersr & 0x04) { 340 if (!(mec_mcr & 0x200)) { 341 if (mec_mcr & 0x400) { 342 sys_reset(); 343 mec_ersr = 0x8000; 344 if (sis_verbose) 345 printf("Error manager reset - IU comparison error\n"); 346 } else { 347 sys_halt(); 348 mec_ersr |= 0x2000; 349 if (sis_verbose) 350 printf("Error manager halt - IU comparison error\n"); 351 } 352 } else 353 mec_irq(1); 354 } 355 if (mec_ersr & 0x20) { 356 if (!(mec_mcr & 0x2000)) { 357 if (mec_mcr & 0x4000) { 358 sys_reset(); 359 mec_ersr = 0x8000; 360 if (sis_verbose) 361 printf("Error manager reset - MEC hardware error\n"); 362 } else { 363 sys_halt(); 364 mec_ersr |= 0x2000; 365 if (sis_verbose) 366 printf("Error manager halt - MEC hardware error\n"); 367 } 368 } else 369 mec_irq(1); 370 } 371 } 372 373 #ifdef ERRINJ 374 static void 375 iucomperr() 376 { 377 mec_ersr |= 0x04; 378 decode_ersr(); 379 } 380 #endif 381 382 static void 383 mecparerror(void) 384 { 385 mec_ersr |= 0x20; 386 decode_ersr(); 387 } 388 389 390 /* IU error mode manager */ 391 392 void 393 error_mode(uint32_t pc) 394 { 395 396 mec_ersr |= 0x1; 397 decode_ersr(); 398 } 399 400 401 /* Check memory settings */ 402 403 static void 404 decode_memcfg(void) 405 { 406 if (rom8) mec_memcfg &= ~0x20000; 407 else mec_memcfg |= 0x20000; 408 409 mem_ramsz = (256 * 1024) << ((mec_memcfg >> 10) & 7); 410 mem_romsz = (128 * 1024) << ((mec_memcfg >> 18) & 7); 411 412 if (sparclite_board) { 413 mem_ramstart = RAM_START_SLITE; 414 mem_ramend = RAM_END_SLITE; 415 mem_rammask = RAM_MASK_SLITE; 416 } 417 else { 418 mem_ramstart = RAM_START; 419 mem_ramend = RAM_END; 420 mem_rammask = RAM_MASK; 421 } 422 if (sis_verbose) 423 printf("RAM start: 0x%x, RAM size: %d K, ROM size: %d K\n", 424 mem_ramstart, mem_ramsz >> 10, mem_romsz >> 10); 425 } 426 427 static void 428 decode_wcr(void) 429 { 430 mem_ramr_ws = mec_wcr & 3; 431 mem_ramw_ws = (mec_wcr >> 2) & 3; 432 mem_romr_ws = (mec_wcr >> 4) & 0x0f; 433 if (rom8) { 434 if (mem_romr_ws > 0 ) mem_romr_ws--; 435 mem_romr_ws = 5 + (4*mem_romr_ws); 436 } 437 mem_romw_ws = (mec_wcr >> 8) & 0x0f; 438 if (sis_verbose) 439 printf("Waitstates = RAM read: %d, RAM write: %d, ROM read: %d, ROM write: %d\n", 440 mem_ramr_ws, mem_ramw_ws, mem_romr_ws, mem_romw_ws); 441 } 442 443 static void 444 decode_mcr(void) 445 { 446 mem_accprot = (mec_wpr[0] | mec_wpr[1]); 447 mem_blockprot = (mec_mcr >> 3) & 1; 448 if (sis_verbose && mem_accprot) 449 printf("Memory block write protection enabled\n"); 450 if (mec_mcr & 0x08000) { 451 mec_ersr |= 0x20; 452 decode_ersr(); 453 } 454 if (sis_verbose && (mec_mcr & 2)) 455 printf("Software reset enabled\n"); 456 if (sis_verbose && (mec_mcr & 1)) 457 printf("Power-down mode enabled\n"); 458 } 459 460 /* Flush ports when simulator stops */ 461 462 void 463 sim_halt(void) 464 { 465 #ifdef FAST_UART 466 flush_uart(); 467 #endif 468 } 469 470 int 471 sim_stop(SIM_DESC sd) 472 { 473 ctrl_c = 1; 474 return 1; 475 } 476 477 static void 478 close_port(void) 479 { 480 if (f1open && f1in != stdin) 481 fclose(f1in); 482 if (f2open && f2in != stdin) 483 fclose(f2in); 484 } 485 486 void 487 exit_sim(void) 488 { 489 close_port(); 490 } 491 492 static void 493 mec_reset(void) 494 { 495 int i; 496 497 find = 0; 498 for (i = 0; i < 2; i++) 499 mec_ssa[i] = mec_sea[i] = mec_wpr[i] = 0; 500 mec_mcr = 0x01350014; 501 mec_iocr = 0; 502 mec_sfsr = 0x078; 503 mec_ffar = 0; 504 mec_ipr = 0; 505 mec_imr = 0x7ffe; 506 mec_isr = 0; 507 mec_icr = 0; 508 mec_ifr = 0; 509 mec_memcfg = 0x10000; 510 mec_wcr = -1; 511 mec_ersr = 0; /* MEC error and status register */ 512 mec_tcr = 0; /* MEC test comtrol register */ 513 514 decode_memcfg(); 515 decode_wcr(); 516 decode_mcr(); 517 518 posted_irq = 0; 519 wnuma = wnumb = 0; 520 anum = aind = bnum = bind = 0; 521 522 uart_stat_reg = UARTA_SRE | UARTA_HRE | UARTB_SRE | UARTB_HRE; 523 uarta_data = uartb_data = UART_THE | UART_TSE; 524 525 rtc_counter = 0xffffffff; 526 rtc_reload = 0xffffffff; 527 rtc_scaler = 0xff; 528 rtc_enabled = 0; 529 rtc_cr = 0; 530 rtc_se = 0; 531 532 gpt_counter = 0xffffffff; 533 gpt_reload = 0xffffffff; 534 gpt_scaler = 0xffff; 535 gpt_enabled = 0; 536 gpt_cr = 0; 537 gpt_se = 0; 538 539 wdog_scaler = 255; 540 wdog_rst_delay = 255; 541 wdog_counter = 0xffff; 542 wdog_rston = 0; 543 wdog_status = init; 544 545 #ifdef ERA 546 erareg = 0; 547 #endif 548 549 } 550 551 552 553 static void 554 mec_intack(int32_t level) 555 { 556 int irq_test; 557 558 if (sis_verbose) 559 printf("interrupt %d acknowledged\n", level); 560 irq_test = mec_tcr & 0x80000; 561 if ((irq_test) && (mec_ifr & (1 << level))) 562 mec_ifr &= ~(1 << level); 563 else 564 mec_ipr &= ~(1 << level); 565 chk_irq(); 566 } 567 568 static void 569 chk_irq(void) 570 { 571 int32_t i; 572 uint32_t itmp; 573 int old_irl; 574 575 old_irl = ext_irl; 576 if (mec_tcr & 0x80000) itmp = mec_ifr; 577 else itmp = 0; 578 itmp = ((mec_ipr | itmp) & ~mec_imr) & 0x0fffe; 579 ext_irl = 0; 580 if (itmp != 0) { 581 for (i = 15; i > 0; i--) { 582 if (((itmp >> i) & 1) != 0) { 583 if ((sis_verbose) && (i > old_irl)) 584 printf("IU irl: %d\n", i); 585 ext_irl = i; 586 set_int(i, mec_intack, i); 587 break; 588 } 589 } 590 } 591 } 592 593 static void 594 mec_irq(int32_t level) 595 { 596 mec_ipr |= (1 << level); 597 chk_irq(); 598 } 599 600 static void 601 set_sfsr(uint32_t fault, uint32_t addr, uint32_t asi, uint32_t read) 602 { 603 if ((asi == 0xa) || (asi == 0xb)) { 604 mec_ffar = addr; 605 mec_sfsr = (fault << 3) | (!read << 15); 606 mec_sfsr |= ((mec_sfsr & 1) ^ 1) | (mec_sfsr & 1); 607 switch (asi) { 608 case 0xa: 609 mec_sfsr |= 0x0004; 610 break; 611 case 0xb: 612 mec_sfsr |= 0x1004; 613 break; 614 } 615 } 616 } 617 618 static int32_t 619 mec_read(uint32_t addr, uint32_t asi, uint32_t *data) 620 { 621 622 switch (addr & 0x0ff) { 623 624 case MEC_MCR: /* 0x00 */ 625 *data = mec_mcr; 626 break; 627 628 case MEC_MEMCFG: /* 0x10 */ 629 *data = mec_memcfg; 630 break; 631 632 case MEC_IOCR: 633 *data = mec_iocr; /* 0x14 */ 634 break; 635 636 case MEC_SSA1: /* 0x20 */ 637 *data = mec_ssa[0] | (mec_wpr[0] << 23); 638 break; 639 case MEC_SEA1: /* 0x24 */ 640 *data = mec_sea[0]; 641 break; 642 case MEC_SSA2: /* 0x28 */ 643 *data = mec_ssa[1] | (mec_wpr[1] << 23); 644 break; 645 case MEC_SEA2: /* 0x2c */ 646 *data = mec_sea[1]; 647 break; 648 649 case MEC_ISR: /* 0x44 */ 650 *data = mec_isr; 651 break; 652 653 case MEC_IPR: /* 0x48 */ 654 *data = mec_ipr; 655 break; 656 657 case MEC_IMR: /* 0x4c */ 658 *data = mec_imr; 659 break; 660 661 case MEC_IFR: /* 0x54 */ 662 *data = mec_ifr; 663 break; 664 665 case MEC_RTC_COUNTER: /* 0x80 */ 666 *data = rtc_counter_read(); 667 break; 668 case MEC_RTC_SCALER: /* 0x84 */ 669 if (rtc_enabled) 670 *data = rtc_scaler - (now() - rtc_scaler_start); 671 else 672 *data = rtc_scaler; 673 break; 674 675 case MEC_GPT_COUNTER: /* 0x88 */ 676 *data = gpt_counter_read(); 677 break; 678 679 case MEC_GPT_SCALER: /* 0x8c */ 680 if (rtc_enabled) 681 *data = gpt_scaler - (now() - gpt_scaler_start); 682 else 683 *data = gpt_scaler; 684 break; 685 686 687 case MEC_SFSR: /* 0xA0 */ 688 *data = mec_sfsr; 689 break; 690 691 case MEC_FFAR: /* 0xA4 */ 692 *data = mec_ffar; 693 break; 694 695 case SIM_LOAD: 696 fname[find] = 0; 697 if (find == 0) 698 strcpy(fname, "simload"); 699 find = bfd_load(fname); 700 if (find == -1) 701 *data = 0; 702 else 703 *data = 1; 704 find = 0; 705 break; 706 707 case MEC_ERSR: /* 0xB0 */ 708 *data = mec_ersr; 709 break; 710 711 case MEC_TCR: /* 0xD0 */ 712 *data = mec_tcr; 713 break; 714 715 case MEC_UARTA: /* 0xE0 */ 716 case MEC_UARTB: /* 0xE4 */ 717 if (asi != 0xb) { 718 set_sfsr(MEC_ACC, addr, asi, 1); 719 return 1; 720 } 721 *data = read_uart(addr); 722 break; 723 724 case MEC_UART_CTRL: /* 0xE8 */ 725 726 *data = read_uart(addr); 727 break; 728 729 case 0xF4: /* simulator RAM size in bytes */ 730 *data = 4096*1024; 731 break; 732 733 case 0xF8: /* simulator ROM size in bytes */ 734 *data = 1024*1024; 735 break; 736 737 default: 738 set_sfsr(MEC_ACC, addr, asi, 1); 739 return 1; 740 break; 741 } 742 return MOK; 743 } 744 745 static int 746 mec_write(uint32_t addr, uint32_t data) 747 { 748 if (sis_verbose > 1) 749 printf("MEC write a: %08x, d: %08x\n",addr,data); 750 switch (addr & 0x0ff) { 751 752 case MEC_MCR: 753 mec_mcr = data; 754 decode_mcr(); 755 if (mec_mcr & 0x08000) mecparerror(); 756 break; 757 758 case MEC_SFR: 759 if (mec_mcr & 0x2) { 760 sys_reset(); 761 mec_ersr = 0x4000; 762 if (sis_verbose) 763 printf(" Software reset issued\n"); 764 } 765 break; 766 767 case MEC_IOCR: 768 mec_iocr = data; 769 if (mec_iocr & 0xC0C0C0C0) mecparerror(); 770 break; 771 772 case MEC_SSA1: /* 0x20 */ 773 if (data & 0xFE000000) mecparerror(); 774 mec_ssa[0] = data & 0x7fffff; 775 mec_wpr[0] = (data >> 23) & 0x03; 776 mem_accprot = mec_wpr[0] || mec_wpr[1]; 777 if (sis_verbose && mec_wpr[0]) 778 printf("Segment 1 memory protection enabled (0x02%06x - 0x02%06x)\n", 779 mec_ssa[0] << 2, mec_sea[0] << 2); 780 break; 781 case MEC_SEA1: /* 0x24 */ 782 if (data & 0xFF800000) mecparerror(); 783 mec_sea[0] = data & 0x7fffff; 784 break; 785 case MEC_SSA2: /* 0x28 */ 786 if (data & 0xFE000000) mecparerror(); 787 mec_ssa[1] = data & 0x7fffff; 788 mec_wpr[1] = (data >> 23) & 0x03; 789 mem_accprot = mec_wpr[0] || mec_wpr[1]; 790 if (sis_verbose && mec_wpr[1]) 791 printf("Segment 2 memory protection enabled (0x02%06x - 0x02%06x)\n", 792 mec_ssa[1] << 2, mec_sea[1] << 2); 793 break; 794 case MEC_SEA2: /* 0x2c */ 795 if (data & 0xFF800000) mecparerror(); 796 mec_sea[1] = data & 0x7fffff; 797 break; 798 799 case MEC_UARTA: 800 case MEC_UARTB: 801 if (data & 0xFFFFFF00) mecparerror(); 802 ATTRIBUTE_FALLTHROUGH; 803 case MEC_UART_CTRL: 804 if (data & 0xFF00FF00) mecparerror(); 805 write_uart(addr, data); 806 break; 807 808 case MEC_GPT_RELOAD: 809 gpt_reload_set(data); 810 break; 811 812 case MEC_GPT_SCALER: 813 if (data & 0xFFFF0000) mecparerror(); 814 gpt_scaler_set(data); 815 break; 816 817 case MEC_TIMER_CTRL: 818 if (data & 0xFFFFF0F0) mecparerror(); 819 timer_ctrl(data); 820 break; 821 822 case MEC_RTC_RELOAD: 823 rtc_reload_set(data); 824 break; 825 826 case MEC_RTC_SCALER: 827 if (data & 0xFFFFFF00) mecparerror(); 828 rtc_scaler_set(data); 829 break; 830 831 case MEC_SFSR: /* 0xA0 */ 832 if (data & 0xFFFF0880) mecparerror(); 833 mec_sfsr = 0x78; 834 break; 835 836 case MEC_ISR: 837 if (data & 0xFFFFE000) mecparerror(); 838 mec_isr = data; 839 break; 840 841 case MEC_IMR: /* 0x4c */ 842 843 if (data & 0xFFFF8001) mecparerror(); 844 mec_imr = data & 0x7ffe; 845 chk_irq(); 846 break; 847 848 case MEC_ICR: /* 0x50 */ 849 850 if (data & 0xFFFF0001) mecparerror(); 851 mec_ipr &= ~data & 0x0fffe; 852 chk_irq(); 853 break; 854 855 case MEC_IFR: /* 0x54 */ 856 857 if (mec_tcr & 0x080000) { 858 if (data & 0xFFFF0001) mecparerror(); 859 mec_ifr = data & 0xfffe; 860 chk_irq(); 861 } 862 break; 863 case SIM_LOAD: 864 fname[find++] = (char) data; 865 break; 866 867 868 case MEC_MEMCFG: /* 0x10 */ 869 if (data & 0xC0E08000) mecparerror(); 870 mec_memcfg = data; 871 decode_memcfg(); 872 if (mec_memcfg & 0xc0e08000) 873 mecparerror(); 874 break; 875 876 case MEC_WCR: /* 0x18 */ 877 mec_wcr = data; 878 decode_wcr(); 879 break; 880 881 case MEC_ERSR: /* 0xB0 */ 882 if (mec_tcr & 0x100000) 883 if (data & 0xFFFFEFC0) mecparerror(); 884 mec_ersr = data & 0x103f; 885 break; 886 887 case MEC_TCR: /* 0xD0 */ 888 if (data & 0xFFE1FFC0) mecparerror(); 889 mec_tcr = data & 0x1e003f; 890 break; 891 892 case MEC_WDOG: /* 0x60 */ 893 wdog_scaler = (data >> 16) & 0x0ff; 894 wdog_counter = data & 0x0ffff; 895 wdog_rst_delay = data >> 24; 896 wdog_rston = 0; 897 if (wdog_status == stopped) 898 wdog_start(); 899 wdog_status = enabled; 900 break; 901 902 case MEC_TRAPD: /* 0x64 */ 903 if (wdog_status == init) { 904 wdog_status = disabled; 905 if (sis_verbose) 906 printf("Watchdog disabled\n"); 907 } 908 break; 909 910 case MEC_PWDR: 911 if (mec_mcr & 1) 912 wait_for_irq(); 913 break; 914 915 default: 916 set_sfsr(MEC_ACC, addr, 0xb, 0); 917 return 1; 918 break; 919 } 920 return MOK; 921 } 922 923 924 /* MEC UARTS */ 925 926 static int ifd1 = -1, ifd2 = -1, ofd1 = -1, ofd2 = -1; 927 928 void 929 init_stdio(void) 930 { 931 if (dumbio) 932 return; /* do nothing */ 933 #ifdef HAVE_TERMIOS_H 934 if (!ifd1) 935 tcsetattr(0, TCSANOW, &ioc1); 936 if (!ifd2) 937 tcsetattr(0, TCSANOW, &ioc2); 938 #endif 939 } 940 941 void 942 restore_stdio(void) 943 { 944 if (dumbio) 945 return; /* do nothing */ 946 #ifdef HAVE_TERMIOS_H 947 if (!ifd1) 948 tcsetattr(0, TCSANOW, &iocold1); 949 if (!ifd2) 950 tcsetattr(0, TCSANOW, &iocold2); 951 #endif 952 } 953 954 #define DO_STDIO_READ( _fd_, _buf_, _len_ ) \ 955 ( dumbio \ 956 ? (0) /* no bytes read, no delay */ \ 957 : read( _fd_, _buf_, _len_ ) ) 958 959 960 static void 961 port_init(void) 962 { 963 964 if (uben) { 965 f2in = stdin; 966 f1in = NULL; 967 f2out = stdout; 968 f1out = NULL; 969 } else { 970 f1in = stdin; 971 f2in = NULL; 972 f1out = stdout; 973 f2out = NULL; 974 } 975 if (uart_dev1[0] != 0) { 976 if ((fd1 = open(uart_dev1, O_RDWR | O_NONBLOCK)) < 0) { 977 printf("Warning, couldn't open output device %s\n", uart_dev1); 978 } else { 979 if (sis_verbose) 980 printf("serial port A on %s\n", uart_dev1); 981 f1in = f1out = fdopen(fd1, "r+"); 982 setbuf(f1out, NULL); 983 f1open = 1; 984 } 985 } 986 if (f1in) ifd1 = fileno(f1in); 987 if (ifd1 == 0) { 988 if (sis_verbose) 989 printf("serial port A on stdin/stdout\n"); 990 if (!dumbio) { 991 #ifdef HAVE_TERMIOS_H 992 tcgetattr(ifd1, &ioc1); 993 iocold1 = ioc1; 994 ioc1.c_lflag &= ~(ICANON | ECHO); 995 ioc1.c_cc[VMIN] = 0; 996 ioc1.c_cc[VTIME] = 0; 997 #endif 998 } 999 f1open = 1; 1000 } 1001 1002 if (f1out) { 1003 ofd1 = fileno(f1out); 1004 if (!dumbio && ofd1 == 1) setbuf(f1out, NULL); 1005 } 1006 1007 if (uart_dev2[0] != 0) { 1008 if ((fd2 = open(uart_dev2, O_RDWR | O_NONBLOCK)) < 0) { 1009 printf("Warning, couldn't open output device %s\n", uart_dev2); 1010 } else { 1011 if (sis_verbose) 1012 printf("serial port B on %s\n", uart_dev2); 1013 f2in = f2out = fdopen(fd2, "r+"); 1014 setbuf(f2out, NULL); 1015 f2open = 1; 1016 } 1017 } 1018 if (f2in) ifd2 = fileno(f2in); 1019 if (ifd2 == 0) { 1020 if (sis_verbose) 1021 printf("serial port B on stdin/stdout\n"); 1022 if (!dumbio) { 1023 #ifdef HAVE_TERMIOS_H 1024 tcgetattr(ifd2, &ioc2); 1025 iocold2 = ioc2; 1026 ioc2.c_lflag &= ~(ICANON | ECHO); 1027 ioc2.c_cc[VMIN] = 0; 1028 ioc2.c_cc[VTIME] = 0; 1029 #endif 1030 } 1031 f2open = 1; 1032 } 1033 1034 if (f2out) { 1035 ofd2 = fileno(f2out); 1036 if (!dumbio && ofd2 == 1) setbuf(f2out, NULL); 1037 } 1038 1039 wnuma = wnumb = 0; 1040 1041 } 1042 1043 static uint32_t 1044 read_uart(uint32_t addr) 1045 { 1046 switch (addr & 0xff) { 1047 1048 case 0xE0: /* UART 1 */ 1049 #ifndef _WIN32 1050 #ifdef FAST_UART 1051 1052 if (aind < anum) { 1053 if ((aind + 1) < anum) 1054 mec_irq(4); 1055 return (0x700 | (uint32_t) aq[aind++]); 1056 } else { 1057 if (f1open) { 1058 anum = DO_STDIO_READ(ifd1, aq, UARTBUF); 1059 } 1060 if (anum > 0) { 1061 aind = 0; 1062 if ((aind + 1) < anum) 1063 mec_irq(4); 1064 return (0x700 | (uint32_t) aq[aind++]); 1065 } else { 1066 return (0x600 | (uint32_t) aq[aind]); 1067 } 1068 1069 } 1070 #else 1071 unsigned tmp = uarta_data; 1072 uarta_data &= ~UART_DR; 1073 uart_stat_reg &= ~UARTA_DR; 1074 return tmp; 1075 #endif 1076 #else 1077 return 0; 1078 #endif 1079 break; 1080 1081 case 0xE4: /* UART 2 */ 1082 #ifndef _WIN32 1083 #ifdef FAST_UART 1084 if (bind < bnum) { 1085 if ((bind + 1) < bnum) 1086 mec_irq(5); 1087 return (0x700 | (uint32_t) bq[bind++]); 1088 } else { 1089 if (f2open) { 1090 bnum = DO_STDIO_READ(ifd2, bq, UARTBUF); 1091 } 1092 if (bnum > 0) { 1093 bind = 0; 1094 if ((bind + 1) < bnum) 1095 mec_irq(5); 1096 return (0x700 | (uint32_t) bq[bind++]); 1097 } else { 1098 return (0x600 | (uint32_t) bq[bind]); 1099 } 1100 1101 } 1102 #else 1103 unsigned tmp = uartb_data; 1104 uartb_data &= ~UART_DR; 1105 uart_stat_reg &= ~UARTB_DR; 1106 return tmp; 1107 #endif 1108 #else 1109 return 0; 1110 #endif 1111 break; 1112 1113 case 0xE8: /* UART status register */ 1114 #ifndef _WIN32 1115 #ifdef FAST_UART 1116 1117 Ucontrol = 0; 1118 if (aind < anum) { 1119 Ucontrol |= 0x00000001; 1120 } else { 1121 if (f1open) { 1122 anum = DO_STDIO_READ(ifd1, aq, UARTBUF); 1123 } 1124 if (anum > 0) { 1125 Ucontrol |= 0x00000001; 1126 aind = 0; 1127 mec_irq(4); 1128 } 1129 } 1130 if (bind < bnum) { 1131 Ucontrol |= 0x00010000; 1132 } else { 1133 if (f2open) { 1134 bnum = DO_STDIO_READ(ifd2, bq, UARTBUF); 1135 } 1136 if (bnum > 0) { 1137 Ucontrol |= 0x00010000; 1138 bind = 0; 1139 mec_irq(5); 1140 } 1141 } 1142 1143 Ucontrol |= 0x00060006; 1144 return Ucontrol; 1145 #else 1146 return uart_stat_reg; 1147 #endif 1148 #else 1149 return 0x00060006; 1150 #endif 1151 break; 1152 default: 1153 if (sis_verbose) 1154 printf("Read from unimplemented MEC register (%x)\n", addr); 1155 1156 } 1157 return 0; 1158 } 1159 1160 static void 1161 write_uart(uint32_t addr, uint32_t data) 1162 { 1163 unsigned char c; 1164 1165 c = (unsigned char) data; 1166 switch (addr & 0xff) { 1167 1168 case 0xE0: /* UART A */ 1169 #ifdef FAST_UART 1170 if (f1open) { 1171 if (wnuma < UARTBUF) 1172 wbufa[wnuma++] = c; 1173 else { 1174 while (wnuma) 1175 wnuma -= fwrite(wbufa, 1, wnuma, f1out); 1176 wbufa[wnuma++] = c; 1177 } 1178 } 1179 mec_irq(4); 1180 #else 1181 if (uart_stat_reg & UARTA_SRE) { 1182 uarta_sreg = c; 1183 uart_stat_reg &= ~UARTA_SRE; 1184 event(uarta_tx, 0, UART_TX_TIME); 1185 } else { 1186 uarta_hreg = c; 1187 uart_stat_reg &= ~UARTA_HRE; 1188 } 1189 #endif 1190 break; 1191 1192 case 0xE4: /* UART B */ 1193 #ifdef FAST_UART 1194 if (f2open) { 1195 if (wnumb < UARTBUF) 1196 wbufb[wnumb++] = c; 1197 else { 1198 while (wnumb) 1199 wnumb -= fwrite(wbufb, 1, wnumb, f2out); 1200 wbufb[wnumb++] = c; 1201 } 1202 } 1203 mec_irq(5); 1204 #else 1205 if (uart_stat_reg & UARTB_SRE) { 1206 uartb_sreg = c; 1207 uart_stat_reg &= ~UARTB_SRE; 1208 event(uartb_tx, 0, UART_TX_TIME); 1209 } else { 1210 uartb_hreg = c; 1211 uart_stat_reg &= ~UARTB_HRE; 1212 } 1213 #endif 1214 break; 1215 case 0xE8: /* UART status register */ 1216 #ifndef FAST_UART 1217 if (data & UARTA_CLR) { 1218 uart_stat_reg &= 0xFFFF0000; 1219 uart_stat_reg |= UARTA_SRE | UARTA_HRE; 1220 } 1221 if (data & UARTB_CLR) { 1222 uart_stat_reg &= 0x0000FFFF; 1223 uart_stat_reg |= UARTB_SRE | UARTB_HRE; 1224 } 1225 #endif 1226 break; 1227 default: 1228 if (sis_verbose) 1229 printf("Write to unimplemented MEC register (%x)\n", addr); 1230 1231 } 1232 } 1233 1234 static void 1235 flush_uart(void) 1236 { 1237 while (wnuma && f1open) 1238 wnuma -= fwrite(wbufa, 1, wnuma, f1out); 1239 while (wnumb && f2open) 1240 wnumb -= fwrite(wbufb, 1, wnumb, f2out); 1241 } 1242 1243 ATTRIBUTE_UNUSED 1244 static void 1245 uarta_tx(int32_t arg ATTRIBUTE_UNUSED) 1246 { 1247 1248 while (f1open && fwrite(&uarta_sreg, 1, 1, f1out) != 1); 1249 if (uart_stat_reg & UARTA_HRE) { 1250 uart_stat_reg |= UARTA_SRE; 1251 } else { 1252 uarta_sreg = uarta_hreg; 1253 uart_stat_reg |= UARTA_HRE; 1254 event(uarta_tx, 0, UART_TX_TIME); 1255 } 1256 mec_irq(4); 1257 } 1258 1259 ATTRIBUTE_UNUSED 1260 static void 1261 uartb_tx(int32_t arg ATTRIBUTE_UNUSED) 1262 { 1263 while (f2open && fwrite(&uartb_sreg, 1, 1, f2out) != 1); 1264 if (uart_stat_reg & UARTB_HRE) { 1265 uart_stat_reg |= UARTB_SRE; 1266 } else { 1267 uartb_sreg = uartb_hreg; 1268 uart_stat_reg |= UARTB_HRE; 1269 event(uartb_tx, 0, UART_TX_TIME); 1270 } 1271 mec_irq(5); 1272 } 1273 1274 ATTRIBUTE_UNUSED 1275 static void 1276 uart_rx(int32_t arg ATTRIBUTE_UNUSED) 1277 { 1278 int32_t rsize; 1279 char rxd; 1280 1281 1282 rsize = 0; 1283 if (f1open) 1284 rsize = DO_STDIO_READ(ifd1, &rxd, 1); 1285 if (rsize > 0) { 1286 uarta_data = UART_DR | rxd; 1287 if (uart_stat_reg & UARTA_HRE) 1288 uarta_data |= UART_THE; 1289 if (uart_stat_reg & UARTA_SRE) 1290 uarta_data |= UART_TSE; 1291 if (uart_stat_reg & UARTA_DR) { 1292 uart_stat_reg |= UARTA_OR; 1293 mec_irq(7); /* UART error interrupt */ 1294 } 1295 uart_stat_reg |= UARTA_DR; 1296 mec_irq(4); 1297 } 1298 rsize = 0; 1299 if (f2open) 1300 rsize = DO_STDIO_READ(ifd2, &rxd, 1); 1301 if (rsize) { 1302 uartb_data = UART_DR | rxd; 1303 if (uart_stat_reg & UARTB_HRE) 1304 uartb_data |= UART_THE; 1305 if (uart_stat_reg & UARTB_SRE) 1306 uartb_data |= UART_TSE; 1307 if (uart_stat_reg & UARTB_DR) { 1308 uart_stat_reg |= UARTB_OR; 1309 mec_irq(7); /* UART error interrupt */ 1310 } 1311 uart_stat_reg |= UARTB_DR; 1312 mec_irq(5); 1313 } 1314 event(uart_rx, 0, UART_RX_TIME); 1315 } 1316 1317 static void 1318 uart_intr(int32_t arg ATTRIBUTE_UNUSED) 1319 { 1320 read_uart(0xE8); /* Check for UART interrupts every 1000 clk */ 1321 flush_uart(); /* Flush UART ports */ 1322 event(uart_intr, 0, UART_FLUSH_TIME); 1323 } 1324 1325 1326 static void 1327 uart_irq_start(void) 1328 { 1329 #ifdef FAST_UART 1330 event(uart_intr, 0, UART_FLUSH_TIME); 1331 #else 1332 #ifndef _WIN32 1333 event(uart_rx, 0, UART_RX_TIME); 1334 #endif 1335 #endif 1336 } 1337 1338 /* Watch-dog */ 1339 1340 static void 1341 wdog_intr(int32_t arg ATTRIBUTE_UNUSED) 1342 { 1343 if (wdog_status == disabled) { 1344 wdog_status = stopped; 1345 } else { 1346 1347 if (wdog_counter) { 1348 wdog_counter--; 1349 event(wdog_intr, 0, wdog_scaler + 1); 1350 } else { 1351 if (wdog_rston) { 1352 printf("Watchdog reset!\n"); 1353 sys_reset(); 1354 mec_ersr = 0xC000; 1355 } else { 1356 mec_irq(15); 1357 wdog_rston = 1; 1358 wdog_counter = wdog_rst_delay; 1359 event(wdog_intr, 0, wdog_scaler + 1); 1360 } 1361 } 1362 } 1363 } 1364 1365 static void 1366 wdog_start(void) 1367 { 1368 event(wdog_intr, 0, wdog_scaler + 1); 1369 if (sis_verbose) 1370 printf("Watchdog started, scaler = %d, counter = %d\n", 1371 wdog_scaler, wdog_counter); 1372 } 1373 1374 1375 /* MEC timers */ 1376 1377 1378 static void 1379 rtc_intr(int32_t arg ATTRIBUTE_UNUSED) 1380 { 1381 if (rtc_counter == 0) { 1382 1383 mec_irq(13); 1384 if (rtc_cr) 1385 rtc_counter = rtc_reload; 1386 else 1387 rtc_se = 0; 1388 } else 1389 rtc_counter -= 1; 1390 if (rtc_se) { 1391 event(rtc_intr, 0, rtc_scaler + 1); 1392 rtc_scaler_start = now(); 1393 rtc_enabled = 1; 1394 } else { 1395 if (sis_verbose) 1396 printf("RTC stopped\n\r"); 1397 rtc_enabled = 0; 1398 } 1399 } 1400 1401 static void 1402 rtc_start(void) 1403 { 1404 if (sis_verbose) 1405 printf("RTC started (period %d)\n\r", rtc_scaler + 1); 1406 event(rtc_intr, 0, rtc_scaler + 1); 1407 rtc_scaler_start = now(); 1408 rtc_enabled = 1; 1409 } 1410 1411 static uint32_t 1412 rtc_counter_read(void) 1413 { 1414 return rtc_counter; 1415 } 1416 1417 static void 1418 rtc_scaler_set(uint32_t val) 1419 { 1420 rtc_scaler = val & 0x0ff; /* eight-bit scaler only */ 1421 } 1422 1423 static void 1424 rtc_reload_set(uint32_t val) 1425 { 1426 rtc_reload = val; 1427 } 1428 1429 static void 1430 gpt_intr(int32_t arg ATTRIBUTE_UNUSED) 1431 { 1432 if (gpt_counter == 0) { 1433 mec_irq(12); 1434 if (gpt_cr) 1435 gpt_counter = gpt_reload; 1436 else 1437 gpt_se = 0; 1438 } else 1439 gpt_counter -= 1; 1440 if (gpt_se) { 1441 event(gpt_intr, 0, gpt_scaler + 1); 1442 gpt_scaler_start = now(); 1443 gpt_enabled = 1; 1444 } else { 1445 if (sis_verbose) 1446 printf("GPT stopped\n\r"); 1447 gpt_enabled = 0; 1448 } 1449 } 1450 1451 static void 1452 gpt_start(void) 1453 { 1454 if (sis_verbose) 1455 printf("GPT started (period %d)\n\r", gpt_scaler + 1); 1456 event(gpt_intr, 0, gpt_scaler + 1); 1457 gpt_scaler_start = now(); 1458 gpt_enabled = 1; 1459 } 1460 1461 static uint32_t 1462 gpt_counter_read(void) 1463 { 1464 return gpt_counter; 1465 } 1466 1467 static void 1468 gpt_scaler_set(uint32_t val) 1469 { 1470 gpt_scaler = val & 0x0ffff; /* 16-bit scaler */ 1471 } 1472 1473 static void 1474 gpt_reload_set(uint32_t val) 1475 { 1476 gpt_reload = val; 1477 } 1478 1479 static void 1480 timer_ctrl(uint32_t val) 1481 { 1482 1483 rtc_cr = ((val & TCR_TCRCR) != 0); 1484 if (val & TCR_TCRCL) { 1485 rtc_counter = rtc_reload; 1486 } 1487 if (val & TCR_TCRSL) { 1488 } 1489 rtc_se = ((val & TCR_TCRSE) != 0); 1490 if (rtc_se && (rtc_enabled == 0)) 1491 rtc_start(); 1492 1493 gpt_cr = (val & TCR_GACR); 1494 if (val & TCR_GACL) { 1495 gpt_counter = gpt_reload; 1496 } 1497 if (val & TCR_GACL) { 1498 } 1499 gpt_se = (val & TCR_GASE) >> 2; 1500 if (gpt_se && (gpt_enabled == 0)) 1501 gpt_start(); 1502 } 1503 1504 /* Store data in host byte order. MEM points to the beginning of the 1505 emulated memory; WADDR contains the index the emulated memory, 1506 DATA points to words in host byte order to be stored. SZ contains log(2) 1507 of the number of bytes to retrieve, and can be 0 (1 byte), 1 (one half-word), 1508 2 (one word), or 3 (two words); WS should return the number of 1509 wait-states. */ 1510 1511 static void 1512 store_bytes (unsigned char *mem, uint32_t waddr, uint32_t *data, int32_t sz, 1513 int32_t *ws) 1514 { 1515 switch (sz) { 1516 case 0: 1517 waddr ^= EBT; 1518 mem[waddr] = *data & 0x0ff; 1519 *ws = mem_ramw_ws + 3; 1520 break; 1521 case 1: 1522 #ifdef HOST_LITTLE_ENDIAN 1523 waddr ^= 2; 1524 #endif 1525 memcpy (&mem[waddr], data, 2); 1526 *ws = mem_ramw_ws + 3; 1527 break; 1528 case 2: 1529 memcpy (&mem[waddr], data, 4); 1530 *ws = mem_ramw_ws; 1531 break; 1532 case 3: 1533 memcpy (&mem[waddr], data, 8); 1534 *ws = 2 * mem_ramw_ws + STD_WS; 1535 break; 1536 } 1537 } 1538 1539 1540 /* Memory emulation */ 1541 1542 int 1543 memory_iread (uint32_t addr, uint32_t *data, uint32_t *ws) 1544 { 1545 uint32_t asi; 1546 if ((addr >= mem_ramstart) && (addr < (mem_ramstart + mem_ramsz))) { 1547 memcpy (data, &ramb[addr & mem_rammask & ~3], 4); 1548 *ws = mem_ramr_ws; 1549 return 0; 1550 } else if (addr < mem_romsz) { 1551 memcpy (data, &romb[addr & ~3], 4); 1552 *ws = mem_romr_ws; 1553 return 0; 1554 } 1555 1556 if (sis_verbose) 1557 printf ("Memory exception at %x (illegal address)\n", addr); 1558 if (sregs.psr & 0x080) 1559 asi = 9; 1560 else 1561 asi = 8; 1562 set_sfsr (UIMP_ACC, addr, asi, 1); 1563 *ws = MEM_EX_WS; 1564 return 1; 1565 } 1566 1567 int 1568 memory_read(int32_t asi, uint32_t addr, void *data, int32_t sz, int32_t *ws) 1569 { 1570 int32_t mexc; 1571 1572 #ifdef ERRINJ 1573 if (errmec) { 1574 if (sis_verbose) 1575 printf("Inserted MEC error %d\n",errmec); 1576 set_sfsr(errmec, addr, asi, 1); 1577 if (errmec == 5) mecparerror(); 1578 if (errmec == 6) iucomperr(); 1579 errmec = 0; 1580 return 1; 1581 } 1582 #endif 1583 1584 if ((addr >= mem_ramstart) && (addr < (mem_ramstart + mem_ramsz))) { 1585 memcpy (data, &ramb[addr & mem_rammask & ~3], 4); 1586 *ws = mem_ramr_ws; 1587 return 0; 1588 } else if ((addr >= MEC_START) && (addr < MEC_END)) { 1589 mexc = mec_read(addr, asi, data); 1590 if (mexc) { 1591 set_sfsr(MEC_ACC, addr, asi, 1); 1592 *ws = MEM_EX_WS; 1593 } else { 1594 *ws = 0; 1595 } 1596 return mexc; 1597 1598 #ifdef ERA 1599 1600 } else if (era) { 1601 if ((addr < 0x100000) || 1602 ((addr>= 0x80000000) && (addr < 0x80100000))) { 1603 memcpy (data, &romb[addr & ROM_MASK & ~3], 4); 1604 *ws = 4; 1605 return 0; 1606 } else if ((addr >= 0x10000000) && 1607 (addr < (0x10000000 + (512 << (mec_iocr & 0x0f)))) && 1608 (mec_iocr & 0x10)) { 1609 memcpy (data, &erareg, 4); 1610 return 0; 1611 } 1612 1613 } else if (addr < mem_romsz) { 1614 memcpy (data, &romb[addr & ~3], 4); 1615 *ws = mem_romr_ws; 1616 return 0; 1617 #else 1618 } else if (addr < mem_romsz) { 1619 memcpy (data, &romb[addr & ~3], 4); 1620 *ws = mem_romr_ws; 1621 return 0; 1622 #endif 1623 1624 } 1625 1626 if (sis_verbose) 1627 printf ("Memory exception at %x (illegal address)\n", addr); 1628 set_sfsr(UIMP_ACC, addr, asi, 1); 1629 *ws = MEM_EX_WS; 1630 return 1; 1631 } 1632 1633 int 1634 memory_write(int32_t asi, uint32_t addr, uint32_t *data, int32_t sz, int32_t *ws) 1635 { 1636 uint32_t waddr; 1637 int32_t mexc; 1638 int i; 1639 int wphit[2]; 1640 1641 #ifdef ERRINJ 1642 if (errmec) { 1643 if (sis_verbose) 1644 printf("Inserted MEC error %d\n",errmec); 1645 set_sfsr(errmec, addr, asi, 0); 1646 if (errmec == 5) mecparerror(); 1647 if (errmec == 6) iucomperr(); 1648 errmec = 0; 1649 return 1; 1650 } 1651 #endif 1652 1653 if ((addr >= mem_ramstart) && (addr < (mem_ramstart + mem_ramsz))) { 1654 if (mem_accprot) { 1655 1656 waddr = (addr & 0x7fffff) >> 2; 1657 for (i = 0; i < 2; i++) 1658 wphit[i] = 1659 (((asi == 0xa) && (mec_wpr[i] & 1)) || 1660 ((asi == 0xb) && (mec_wpr[i] & 2))) && 1661 ((waddr >= mec_ssa[i]) && ((waddr | (sz == 3)) < mec_sea[i])); 1662 1663 if (((mem_blockprot) && (wphit[0] || wphit[1])) || 1664 ((!mem_blockprot) && 1665 !((mec_wpr[0] && wphit[0]) || (mec_wpr[1] && wphit[1])) 1666 )) { 1667 if (sis_verbose) 1668 printf("Memory access protection error at 0x%08x\n", addr); 1669 set_sfsr(PROT_EXC, addr, asi, 0); 1670 *ws = MEM_EX_WS; 1671 return 1; 1672 } 1673 } 1674 waddr = addr & mem_rammask; 1675 store_bytes (ramb, waddr, data, sz, ws); 1676 return 0; 1677 } else if ((addr >= MEC_START) && (addr < MEC_END)) { 1678 if ((sz != 2) || (asi != 0xb)) { 1679 set_sfsr(MEC_ACC, addr, asi, 0); 1680 *ws = MEM_EX_WS; 1681 return 1; 1682 } 1683 mexc = mec_write(addr, *data); 1684 if (mexc) { 1685 set_sfsr(MEC_ACC, addr, asi, 0); 1686 *ws = MEM_EX_WS; 1687 } else { 1688 *ws = 0; 1689 } 1690 return mexc; 1691 1692 #ifdef ERA 1693 1694 } else if (era) { 1695 if ((erareg & 2) && 1696 ((addr < 0x100000) || ((addr >= 0x80000000) && (addr < 0x80100000)))) { 1697 addr &= ROM_MASK; 1698 *ws = sz == 3 ? 8 : 4; 1699 store_bytes (romb, addr, data, sz, ws); 1700 return 0; 1701 } else if ((addr >= 0x10000000) && 1702 (addr < (0x10000000 + (512 << (mec_iocr & 0x0f)))) && 1703 (mec_iocr & 0x10)) { 1704 erareg = *data & 0x0e; 1705 return 0; 1706 } 1707 1708 } else if ((addr < mem_romsz) && (mec_memcfg & 0x10000) && (wrp) && 1709 (((mec_memcfg & 0x20000) && (sz > 1)) || 1710 (!(mec_memcfg & 0x20000) && (sz == 0)))) { 1711 1712 *ws = mem_romw_ws + 1; 1713 if (sz == 3) 1714 *ws += mem_romw_ws + STD_WS; 1715 store_bytes (romb, addr, data, sz, ws); 1716 return 0; 1717 1718 #else 1719 } else if ((addr < mem_romsz) && (mec_memcfg & 0x10000) && (wrp) && 1720 (((mec_memcfg & 0x20000) && (sz > 1)) || 1721 (!(mec_memcfg & 0x20000) && (sz == 0)))) { 1722 1723 *ws = mem_romw_ws + 1; 1724 if (sz == 3) 1725 *ws += mem_romw_ws + STD_WS; 1726 store_bytes (romb, addr, data, sz, ws); 1727 return 0; 1728 1729 #endif 1730 1731 } 1732 1733 *ws = MEM_EX_WS; 1734 set_sfsr(UIMP_ACC, addr, asi, 0); 1735 return 1; 1736 } 1737 1738 static void * 1739 get_mem_ptr(uint32_t addr, uint32_t size) 1740 { 1741 if ((addr + size) < ROM_SZ) { 1742 return &romb[addr]; 1743 } else if ((addr >= mem_ramstart) && ((addr + size) < mem_ramend)) { 1744 return &ramb[addr & mem_rammask]; 1745 } 1746 1747 #ifdef ERA 1748 else if ((era) && ((addr <0x100000) || 1749 ((addr >= (unsigned) 0x80000000) && ((addr + size) < (unsigned) 0x80100000)))) { 1750 return &romb[addr & ROM_MASK]; 1751 } 1752 #endif 1753 1754 return (void *) -1; 1755 } 1756 1757 int 1758 sis_memory_write(uint32_t addr, const void *data, uint32_t length) 1759 { 1760 void *mem; 1761 1762 if ((mem = get_mem_ptr(addr, length)) == ((void *) -1)) 1763 return 0; 1764 1765 memcpy(mem, data, length); 1766 return length; 1767 } 1768 1769 int 1770 sis_memory_read(uint32_t addr, void *data, uint32_t length) 1771 { 1772 char *mem; 1773 1774 if ((mem = get_mem_ptr(addr, length)) == ((void *) -1)) 1775 return 0; 1776 1777 memcpy(data, mem, length); 1778 return length; 1779 } 1780 1781 extern struct pstate sregs; 1782 1783 void 1784 boot_init (void) 1785 { 1786 mec_write(MEC_WCR, 0); /* zero waitstates */ 1787 mec_write(MEC_TRAPD, 0); /* turn off watch-dog */ 1788 mec_write(MEC_RTC_SCALER, sregs.freq - 1); /* generate 1 MHz RTC tick */ 1789 mec_write(MEC_MEMCFG, (3 << 18) | (4 << 10)); /* 1 MB ROM, 4 MB RAM */ 1790 sregs.wim = 2; 1791 sregs.psr = 0x110010e0; 1792 sregs.r[30] = RAM_END; 1793 sregs.r[14] = sregs.r[30] - 96 * 4; 1794 mec_mcr |= 1; /* power-down enabled */ 1795 } 1796