]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blob - sim/erc32/erc32.c
Update copyright year range in header of all files managed by GDB
[thirdparty/binutils-gdb.git] / sim / erc32 / erc32.c
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 }