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