1 /* This file is part of SIS (SPARC instruction simulator)
3 Copyright (C) 1995-2023 Free Software Foundation, Inc.
4 Contributed by Jiri Gaisler, European Space Agency
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.
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.
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/>. */
19 /* The control space devices */
21 /* This must come before any other includes. */
24 #include <sys/types.h>
30 #include <sys/fcntl.h>
34 #include "sim-config.h"
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
[];
42 int dumbio
= 0; /* normal, smart, terminal oriented IO by default */
45 #define MEC_START 0x01f80000
46 #define MEC_END 0x01f80100
48 /* Memory exception waitstates */
51 /* ERC32 always adds one waitstate during RAM std */
58 #define MEC_WS 0 /* Waitstates per MEC access (0 ws) */
61 /* MEC register addresses */
65 #define MEC_PWDR 0x008
66 #define MEC_MEMCFG 0x010
67 #define MEC_IOCR 0x014
70 #define MEC_MAR0 0x020
71 #define MEC_MAR1 0x024
73 #define MEC_SSA1 0x020
74 #define MEC_SEA1 0x024
75 #define MEC_SSA2 0x028
76 #define MEC_SEA2 0x02C
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
100 #define MEC_UARTA 0x0E0
101 #define MEC_UARTB 0x0E4
102 #define MEC_UART_CTRL 0x0E8
103 #define SIM_LOAD 0x0F0
105 /* Memory exception causes */
109 #define WATCH_EXC 0xa
110 #define BREAK_EXC 0xb
112 /* Size of UART buffers (bytes) */
115 /* Number of simulator ticks between flushing the UARTS. */
116 /* For good performance, keep above 1000 */
117 #define UART_FLUSH_TIME 3000
119 /* MEC timer control register bits */
124 #define TCR_TCRCR 0x100
125 #define TCR_TCRCL 0x200
126 #define TCR_TCRSE 0x400
127 #define TCR_TCRSL 0x800
129 /* New uart defines */
130 #define UART_TX_TIME 1000
131 #define UART_RX_TIME 1000
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
143 #define UART_DR 0x100
144 #define UART_TSE 0x200
145 #define UART_THE 0x400
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 */
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
;
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
;
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
;
191 init
, disabled
, enabled
, stopped
194 static enum wdog_type wdog_status
;
197 /* ROM size 1024 Kbyte */
198 #define ROM_SZ 0x100000
199 #define ROM_MASK 0x0fffff
201 /* RAM size 4 Mbyte */
202 #define RAM_START 0x02000000
203 #define RAM_END 0x02400000
204 #define RAM_MASK 0x003fffff
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
211 /* Memory support variables */
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 */
225 static unsigned char romb
[ROM_SZ
];
226 static unsigned char ramb
[RAM_END
- RAM_START
];
229 /* UART support variables */
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
;
243 static int f1open
= 0, f2open
= 0;
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
;
254 /* Forward declarations */
256 static void decode_ersr (void);
258 static void iucomperr (void);
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
);
310 /* Power-on reset init */
323 if (mec_ersr
& 0x01) {
324 if (!(mec_mcr
& 0x20)) {
325 if (mec_mcr
& 0x40) {
329 printf("Error manager reset - IU in error mode\n");
334 printf("Error manager halt - IU in error mode\n");
339 if (mec_ersr
& 0x04) {
340 if (!(mec_mcr
& 0x200)) {
341 if (mec_mcr
& 0x400) {
345 printf("Error manager reset - IU comparison error\n");
350 printf("Error manager halt - IU comparison error\n");
355 if (mec_ersr
& 0x20) {
356 if (!(mec_mcr
& 0x2000)) {
357 if (mec_mcr
& 0x4000) {
361 printf("Error manager reset - MEC hardware error\n");
366 printf("Error manager halt - MEC hardware error\n");
390 /* IU error mode manager */
393 error_mode(uint32_t pc
)
401 /* Check memory settings */
406 if (rom8
) mec_memcfg
&= ~0x20000;
407 else mec_memcfg
|= 0x20000;
409 mem_ramsz
= (256 * 1024) << ((mec_memcfg
>> 10) & 7);
410 mem_romsz
= (128 * 1024) << ((mec_memcfg
>> 18) & 7);
412 if (sparclite_board
) {
413 mem_ramstart
= RAM_START_SLITE
;
414 mem_ramend
= RAM_END_SLITE
;
415 mem_rammask
= RAM_MASK_SLITE
;
418 mem_ramstart
= RAM_START
;
419 mem_ramend
= RAM_END
;
420 mem_rammask
= RAM_MASK
;
423 printf("RAM start: 0x%x, RAM size: %d K, ROM size: %d K\n",
424 mem_ramstart
, mem_ramsz
>> 10, mem_romsz
>> 10);
430 mem_ramr_ws
= mec_wcr
& 3;
431 mem_ramw_ws
= (mec_wcr
>> 2) & 3;
432 mem_romr_ws
= (mec_wcr
>> 4) & 0x0f;
434 if (mem_romr_ws
> 0 ) mem_romr_ws
--;
435 mem_romr_ws
= 5 + (4*mem_romr_ws
);
437 mem_romw_ws
= (mec_wcr
>> 8) & 0x0f;
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
);
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) {
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");
460 /* Flush ports when simulator stops */
471 sim_stop(SIM_DESC sd
)
480 if (f1open
&& f1in
!= stdin
)
482 if (f2open
&& f2in
!= stdin
)
498 for (i
= 0; i
< 2; i
++)
499 mec_ssa
[i
] = mec_sea
[i
] = mec_wpr
[i
] = 0;
500 mec_mcr
= 0x01350014;
509 mec_memcfg
= 0x10000;
511 mec_ersr
= 0; /* MEC error and status register */
512 mec_tcr
= 0; /* MEC test comtrol register */
520 anum
= aind
= bnum
= bind
= 0;
522 uart_stat_reg
= UARTA_SRE
| UARTA_HRE
| UARTB_SRE
| UARTB_HRE
;
523 uarta_data
= uartb_data
= UART_THE
| UART_TSE
;
525 rtc_counter
= 0xffffffff;
526 rtc_reload
= 0xffffffff;
532 gpt_counter
= 0xffffffff;
533 gpt_reload
= 0xffffffff;
540 wdog_rst_delay
= 255;
541 wdog_counter
= 0xffff;
554 mec_intack(int32_t level
)
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
);
564 mec_ipr
&= ~(1 << level
);
576 if (mec_tcr
& 0x80000) itmp
= mec_ifr
;
578 itmp
= ((mec_ipr
| itmp
) & ~mec_imr
) & 0x0fffe;
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
);
586 set_int(i
, mec_intack
, i
);
594 mec_irq(int32_t level
)
596 mec_ipr
|= (1 << level
);
601 set_sfsr(uint32_t fault
, uint32_t addr
, uint32_t asi
, uint32_t read
)
603 if ((asi
== 0xa) || (asi
== 0xb)) {
605 mec_sfsr
= (fault
<< 3) | (!read
<< 15);
606 mec_sfsr
|= ((mec_sfsr
& 1) ^ 1) | (mec_sfsr
& 1);
619 mec_read(uint32_t addr
, uint32_t asi
, uint32_t *data
)
622 switch (addr
& 0x0ff) {
624 case MEC_MCR
: /* 0x00 */
628 case MEC_MEMCFG
: /* 0x10 */
633 *data
= mec_iocr
; /* 0x14 */
636 case MEC_SSA1
: /* 0x20 */
637 *data
= mec_ssa
[0] | (mec_wpr
[0] << 23);
639 case MEC_SEA1
: /* 0x24 */
642 case MEC_SSA2
: /* 0x28 */
643 *data
= mec_ssa
[1] | (mec_wpr
[1] << 23);
645 case MEC_SEA2
: /* 0x2c */
649 case MEC_ISR
: /* 0x44 */
653 case MEC_IPR
: /* 0x48 */
657 case MEC_IMR
: /* 0x4c */
661 case MEC_IFR
: /* 0x54 */
665 case MEC_RTC_COUNTER
: /* 0x80 */
666 *data
= rtc_counter_read();
668 case MEC_RTC_SCALER
: /* 0x84 */
670 *data
= rtc_scaler
- (now() - rtc_scaler_start
);
675 case MEC_GPT_COUNTER
: /* 0x88 */
676 *data
= gpt_counter_read();
679 case MEC_GPT_SCALER
: /* 0x8c */
681 *data
= gpt_scaler
- (now() - gpt_scaler_start
);
687 case MEC_SFSR
: /* 0xA0 */
691 case MEC_FFAR
: /* 0xA4 */
698 strcpy(fname
, "simload");
699 find
= bfd_load(fname
);
707 case MEC_ERSR
: /* 0xB0 */
711 case MEC_TCR
: /* 0xD0 */
715 case MEC_UARTA
: /* 0xE0 */
716 case MEC_UARTB
: /* 0xE4 */
718 set_sfsr(MEC_ACC
, addr
, asi
, 1);
721 *data
= read_uart(addr
);
724 case MEC_UART_CTRL
: /* 0xE8 */
726 *data
= read_uart(addr
);
729 case 0xF4: /* simulator RAM size in bytes */
733 case 0xF8: /* simulator ROM size in bytes */
738 set_sfsr(MEC_ACC
, addr
, asi
, 1);
746 mec_write(uint32_t addr
, uint32_t data
)
749 printf("MEC write a: %08x, d: %08x\n",addr
,data
);
750 switch (addr
& 0x0ff) {
755 if (mec_mcr
& 0x08000) mecparerror();
763 printf(" Software reset issued\n");
769 if (mec_iocr
& 0xC0C0C0C0) mecparerror();
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);
781 case MEC_SEA1
: /* 0x24 */
782 if (data
& 0xFF800000) mecparerror();
783 mec_sea
[0] = data
& 0x7fffff;
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);
794 case MEC_SEA2
: /* 0x2c */
795 if (data
& 0xFF800000) mecparerror();
796 mec_sea
[1] = data
& 0x7fffff;
801 if (data
& 0xFFFFFF00) mecparerror();
803 if (data
& 0xFF00FF00) mecparerror();
804 write_uart(addr
, data
);
808 gpt_reload_set(data
);
812 if (data
& 0xFFFF0000) mecparerror();
813 gpt_scaler_set(data
);
817 if (data
& 0xFFFFF0F0) mecparerror();
822 rtc_reload_set(data
);
826 if (data
& 0xFFFFFF00) mecparerror();
827 rtc_scaler_set(data
);
830 case MEC_SFSR
: /* 0xA0 */
831 if (data
& 0xFFFF0880) mecparerror();
836 if (data
& 0xFFFFE000) mecparerror();
840 case MEC_IMR
: /* 0x4c */
842 if (data
& 0xFFFF8001) mecparerror();
843 mec_imr
= data
& 0x7ffe;
847 case MEC_ICR
: /* 0x50 */
849 if (data
& 0xFFFF0001) mecparerror();
850 mec_ipr
&= ~data
& 0x0fffe;
854 case MEC_IFR
: /* 0x54 */
856 if (mec_tcr
& 0x080000) {
857 if (data
& 0xFFFF0001) mecparerror();
858 mec_ifr
= data
& 0xfffe;
863 fname
[find
++] = (char) data
;
867 case MEC_MEMCFG
: /* 0x10 */
868 if (data
& 0xC0E08000) mecparerror();
871 if (mec_memcfg
& 0xc0e08000)
875 case MEC_WCR
: /* 0x18 */
880 case MEC_ERSR
: /* 0xB0 */
881 if (mec_tcr
& 0x100000)
882 if (data
& 0xFFFFEFC0) mecparerror();
883 mec_ersr
= data
& 0x103f;
886 case MEC_TCR
: /* 0xD0 */
887 if (data
& 0xFFE1FFC0) mecparerror();
888 mec_tcr
= data
& 0x1e003f;
891 case MEC_WDOG
: /* 0x60 */
892 wdog_scaler
= (data
>> 16) & 0x0ff;
893 wdog_counter
= data
& 0x0ffff;
894 wdog_rst_delay
= data
>> 24;
896 if (wdog_status
== stopped
)
898 wdog_status
= enabled
;
901 case MEC_TRAPD
: /* 0x64 */
902 if (wdog_status
== init
) {
903 wdog_status
= disabled
;
905 printf("Watchdog disabled\n");
915 set_sfsr(MEC_ACC
, addr
, 0xb, 0);
925 static int ifd1
= -1, ifd2
= -1, ofd1
= -1, ofd2
= -1;
931 return; /* do nothing */
932 #ifdef HAVE_TERMIOS_H
934 tcsetattr(0, TCSANOW
, &ioc1
);
936 tcsetattr(0, TCSANOW
, &ioc2
);
944 return; /* do nothing */
945 #ifdef HAVE_TERMIOS_H
947 tcsetattr(0, TCSANOW
, &iocold1
);
949 tcsetattr(0, TCSANOW
, &iocold2
);
953 #define DO_STDIO_READ( _fd_, _buf_, _len_ ) \
955 ? (0) /* no bytes read, no delay */ \
956 : read( _fd_, _buf_, _len_ ) )
974 if (uart_dev1
[0] != 0) {
975 if ((fd1
= open(uart_dev1
, O_RDWR
| O_NONBLOCK
)) < 0) {
976 printf("Warning, couldn't open output device %s\n", uart_dev1
);
979 printf("serial port A on %s\n", uart_dev1
);
980 f1in
= f1out
= fdopen(fd1
, "r+");
985 if (f1in
) ifd1
= fileno(f1in
);
988 printf("serial port A on stdin/stdout\n");
990 #ifdef HAVE_TERMIOS_H
991 tcgetattr(ifd1
, &ioc1
);
993 ioc1
.c_lflag
&= ~(ICANON
| ECHO
);
995 ioc1
.c_cc
[VTIME
] = 0;
1002 ofd1
= fileno(f1out
);
1003 if (!dumbio
&& ofd1
== 1) setbuf(f1out
, NULL
);
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
);
1011 printf("serial port B on %s\n", uart_dev2
);
1012 f2in
= f2out
= fdopen(fd2
, "r+");
1013 setbuf(f2out
, NULL
);
1017 if (f2in
) ifd2
= fileno(f2in
);
1020 printf("serial port B on stdin/stdout\n");
1022 #ifdef HAVE_TERMIOS_H
1023 tcgetattr(ifd2
, &ioc2
);
1025 ioc2
.c_lflag
&= ~(ICANON
| ECHO
);
1026 ioc2
.c_cc
[VMIN
] = 0;
1027 ioc2
.c_cc
[VTIME
] = 0;
1034 ofd2
= fileno(f2out
);
1035 if (!dumbio
&& ofd2
== 1) setbuf(f2out
, NULL
);
1043 read_uart(uint32_t addr
)
1045 switch (addr
& 0xff) {
1047 case 0xE0: /* UART 1 */
1052 if ((aind
+ 1) < anum
)
1054 return (0x700 | (uint32_t) aq
[aind
++]);
1057 anum
= DO_STDIO_READ(ifd1
, aq
, UARTBUF
);
1061 if ((aind
+ 1) < anum
)
1063 return (0x700 | (uint32_t) aq
[aind
++]);
1065 return (0x600 | (uint32_t) aq
[aind
]);
1070 unsigned tmp
= uarta_data
;
1071 uarta_data
&= ~UART_DR
;
1072 uart_stat_reg
&= ~UARTA_DR
;
1080 case 0xE4: /* UART 2 */
1084 if ((bind
+ 1) < bnum
)
1086 return (0x700 | (uint32_t) bq
[bind
++]);
1089 bnum
= DO_STDIO_READ(ifd2
, bq
, UARTBUF
);
1093 if ((bind
+ 1) < bnum
)
1095 return (0x700 | (uint32_t) bq
[bind
++]);
1097 return (0x600 | (uint32_t) bq
[bind
]);
1102 unsigned tmp
= uartb_data
;
1103 uartb_data
&= ~UART_DR
;
1104 uart_stat_reg
&= ~UARTB_DR
;
1112 case 0xE8: /* UART status register */
1118 Ucontrol
|= 0x00000001;
1121 anum
= DO_STDIO_READ(ifd1
, aq
, UARTBUF
);
1124 Ucontrol
|= 0x00000001;
1130 Ucontrol
|= 0x00010000;
1133 bnum
= DO_STDIO_READ(ifd2
, bq
, UARTBUF
);
1136 Ucontrol
|= 0x00010000;
1142 Ucontrol
|= 0x00060006;
1145 return uart_stat_reg
;
1153 printf("Read from unimplemented MEC register (%x)\n", addr
);
1160 write_uart(uint32_t addr
, uint32_t data
)
1164 c
= (unsigned char) data
;
1165 switch (addr
& 0xff) {
1167 case 0xE0: /* UART A */
1170 if (wnuma
< UARTBUF
)
1174 wnuma
-= fwrite(wbufa
, 1, wnuma
, f1out
);
1180 if (uart_stat_reg
& UARTA_SRE
) {
1182 uart_stat_reg
&= ~UARTA_SRE
;
1183 event(uarta_tx
, 0, UART_TX_TIME
);
1186 uart_stat_reg
&= ~UARTA_HRE
;
1191 case 0xE4: /* UART B */
1194 if (wnumb
< UARTBUF
)
1198 wnumb
-= fwrite(wbufb
, 1, wnumb
, f2out
);
1204 if (uart_stat_reg
& UARTB_SRE
) {
1206 uart_stat_reg
&= ~UARTB_SRE
;
1207 event(uartb_tx
, 0, UART_TX_TIME
);
1210 uart_stat_reg
&= ~UARTB_HRE
;
1214 case 0xE8: /* UART status register */
1216 if (data
& UARTA_CLR
) {
1217 uart_stat_reg
&= 0xFFFF0000;
1218 uart_stat_reg
|= UARTA_SRE
| UARTA_HRE
;
1220 if (data
& UARTB_CLR
) {
1221 uart_stat_reg
&= 0x0000FFFF;
1222 uart_stat_reg
|= UARTB_SRE
| UARTB_HRE
;
1228 printf("Write to unimplemented MEC register (%x)\n", addr
);
1236 while (wnuma
&& f1open
)
1237 wnuma
-= fwrite(wbufa
, 1, wnuma
, f1out
);
1238 while (wnumb
&& f2open
)
1239 wnumb
-= fwrite(wbufb
, 1, wnumb
, f2out
);
1244 uarta_tx(int32_t arg ATTRIBUTE_UNUSED
)
1247 while (f1open
&& fwrite(&uarta_sreg
, 1, 1, f1out
) != 1);
1248 if (uart_stat_reg
& UARTA_HRE
) {
1249 uart_stat_reg
|= UARTA_SRE
;
1251 uarta_sreg
= uarta_hreg
;
1252 uart_stat_reg
|= UARTA_HRE
;
1253 event(uarta_tx
, 0, UART_TX_TIME
);
1260 uartb_tx(int32_t arg ATTRIBUTE_UNUSED
)
1262 while (f2open
&& fwrite(&uartb_sreg
, 1, 1, f2out
) != 1);
1263 if (uart_stat_reg
& UARTB_HRE
) {
1264 uart_stat_reg
|= UARTB_SRE
;
1266 uartb_sreg
= uartb_hreg
;
1267 uart_stat_reg
|= UARTB_HRE
;
1268 event(uartb_tx
, 0, UART_TX_TIME
);
1275 uart_rx(int32_t arg ATTRIBUTE_UNUSED
)
1283 rsize
= DO_STDIO_READ(ifd1
, &rxd
, 1);
1285 uarta_data
= UART_DR
| rxd
;
1286 if (uart_stat_reg
& UARTA_HRE
)
1287 uarta_data
|= UART_THE
;
1288 if (uart_stat_reg
& UARTA_SRE
)
1289 uarta_data
|= UART_TSE
;
1290 if (uart_stat_reg
& UARTA_DR
) {
1291 uart_stat_reg
|= UARTA_OR
;
1292 mec_irq(7); /* UART error interrupt */
1294 uart_stat_reg
|= UARTA_DR
;
1299 rsize
= DO_STDIO_READ(ifd2
, &rxd
, 1);
1301 uartb_data
= UART_DR
| rxd
;
1302 if (uart_stat_reg
& UARTB_HRE
)
1303 uartb_data
|= UART_THE
;
1304 if (uart_stat_reg
& UARTB_SRE
)
1305 uartb_data
|= UART_TSE
;
1306 if (uart_stat_reg
& UARTB_DR
) {
1307 uart_stat_reg
|= UARTB_OR
;
1308 mec_irq(7); /* UART error interrupt */
1310 uart_stat_reg
|= UARTB_DR
;
1313 event(uart_rx
, 0, UART_RX_TIME
);
1317 uart_intr(int32_t arg ATTRIBUTE_UNUSED
)
1319 read_uart(0xE8); /* Check for UART interrupts every 1000 clk */
1320 flush_uart(); /* Flush UART ports */
1321 event(uart_intr
, 0, UART_FLUSH_TIME
);
1326 uart_irq_start(void)
1329 event(uart_intr
, 0, UART_FLUSH_TIME
);
1332 event(uart_rx
, 0, UART_RX_TIME
);
1340 wdog_intr(int32_t arg ATTRIBUTE_UNUSED
)
1342 if (wdog_status
== disabled
) {
1343 wdog_status
= stopped
;
1348 event(wdog_intr
, 0, wdog_scaler
+ 1);
1351 printf("Watchdog reset!\n");
1357 wdog_counter
= wdog_rst_delay
;
1358 event(wdog_intr
, 0, wdog_scaler
+ 1);
1367 event(wdog_intr
, 0, wdog_scaler
+ 1);
1369 printf("Watchdog started, scaler = %d, counter = %d\n",
1370 wdog_scaler
, wdog_counter
);
1378 rtc_intr(int32_t arg ATTRIBUTE_UNUSED
)
1380 if (rtc_counter
== 0) {
1384 rtc_counter
= rtc_reload
;
1390 event(rtc_intr
, 0, rtc_scaler
+ 1);
1391 rtc_scaler_start
= now();
1395 printf("RTC stopped\n\r");
1404 printf("RTC started (period %d)\n\r", rtc_scaler
+ 1);
1405 event(rtc_intr
, 0, rtc_scaler
+ 1);
1406 rtc_scaler_start
= now();
1411 rtc_counter_read(void)
1417 rtc_scaler_set(uint32_t val
)
1419 rtc_scaler
= val
& 0x0ff; /* eight-bit scaler only */
1423 rtc_reload_set(uint32_t val
)
1429 gpt_intr(int32_t arg ATTRIBUTE_UNUSED
)
1431 if (gpt_counter
== 0) {
1434 gpt_counter
= gpt_reload
;
1440 event(gpt_intr
, 0, gpt_scaler
+ 1);
1441 gpt_scaler_start
= now();
1445 printf("GPT stopped\n\r");
1454 printf("GPT started (period %d)\n\r", gpt_scaler
+ 1);
1455 event(gpt_intr
, 0, gpt_scaler
+ 1);
1456 gpt_scaler_start
= now();
1461 gpt_counter_read(void)
1467 gpt_scaler_set(uint32_t val
)
1469 gpt_scaler
= val
& 0x0ffff; /* 16-bit scaler */
1473 gpt_reload_set(uint32_t val
)
1479 timer_ctrl(uint32_t val
)
1482 rtc_cr
= ((val
& TCR_TCRCR
) != 0);
1483 if (val
& TCR_TCRCL
) {
1484 rtc_counter
= rtc_reload
;
1486 if (val
& TCR_TCRSL
) {
1488 rtc_se
= ((val
& TCR_TCRSE
) != 0);
1489 if (rtc_se
&& (rtc_enabled
== 0))
1492 gpt_cr
= (val
& TCR_GACR
);
1493 if (val
& TCR_GACL
) {
1494 gpt_counter
= gpt_reload
;
1496 if (val
& TCR_GACL
) {
1498 gpt_se
= (val
& TCR_GASE
) >> 2;
1499 if (gpt_se
&& (gpt_enabled
== 0))
1503 /* Store data in host byte order. MEM points to the beginning of the
1504 emulated memory; WADDR contains the index the emulated memory,
1505 DATA points to words in host byte order to be stored. SZ contains log(2)
1506 of the number of bytes to retrieve, and can be 0 (1 byte), 1 (one half-word),
1507 2 (one word), or 3 (two words); WS should return the number of
1511 store_bytes (unsigned char *mem
, uint32_t waddr
, uint32_t *data
, int32_t sz
,
1517 mem
[waddr
] = *data
& 0x0ff;
1518 *ws
= mem_ramw_ws
+ 3;
1521 #ifdef HOST_LITTLE_ENDIAN
1524 memcpy (&mem
[waddr
], data
, 2);
1525 *ws
= mem_ramw_ws
+ 3;
1528 memcpy (&mem
[waddr
], data
, 4);
1532 memcpy (&mem
[waddr
], data
, 8);
1533 *ws
= 2 * mem_ramw_ws
+ STD_WS
;
1539 /* Memory emulation */
1542 memory_iread (uint32_t addr
, uint32_t *data
, uint32_t *ws
)
1545 if ((addr
>= mem_ramstart
) && (addr
< (mem_ramstart
+ mem_ramsz
))) {
1546 memcpy (data
, &ramb
[addr
& mem_rammask
& ~3], 4);
1549 } else if (addr
< mem_romsz
) {
1550 memcpy (data
, &romb
[addr
& ~3], 4);
1556 printf ("Memory exception at %x (illegal address)\n", addr
);
1557 if (sregs
.psr
& 0x080)
1561 set_sfsr (UIMP_ACC
, addr
, asi
, 1);
1567 memory_read(int32_t asi
, uint32_t addr
, void *data
, int32_t sz
, int32_t *ws
)
1574 printf("Inserted MEC error %d\n",errmec
);
1575 set_sfsr(errmec
, addr
, asi
, 1);
1576 if (errmec
== 5) mecparerror();
1577 if (errmec
== 6) iucomperr();
1583 if ((addr
>= mem_ramstart
) && (addr
< (mem_ramstart
+ mem_ramsz
))) {
1584 memcpy (data
, &ramb
[addr
& mem_rammask
& ~3], 4);
1587 } else if ((addr
>= MEC_START
) && (addr
< MEC_END
)) {
1588 mexc
= mec_read(addr
, asi
, data
);
1590 set_sfsr(MEC_ACC
, addr
, asi
, 1);
1600 if ((addr
< 0x100000) ||
1601 ((addr
>= 0x80000000) && (addr
< 0x80100000))) {
1602 memcpy (data
, &romb
[addr
& ROM_MASK
& ~3], 4);
1605 } else if ((addr
>= 0x10000000) &&
1606 (addr
< (0x10000000 + (512 << (mec_iocr
& 0x0f)))) &&
1607 (mec_iocr
& 0x10)) {
1608 memcpy (data
, &erareg
, 4);
1612 } else if (addr
< mem_romsz
) {
1613 memcpy (data
, &romb
[addr
& ~3], 4);
1617 } else if (addr
< mem_romsz
) {
1618 memcpy (data
, &romb
[addr
& ~3], 4);
1626 printf ("Memory exception at %x (illegal address)\n", addr
);
1627 set_sfsr(UIMP_ACC
, addr
, asi
, 1);
1633 memory_write(int32_t asi
, uint32_t addr
, uint32_t *data
, int32_t sz
, int32_t *ws
)
1646 printf("Inserted MEC error %d\n",errmec
);
1647 set_sfsr(errmec
, addr
, asi
, 0);
1648 if (errmec
== 5) mecparerror();
1649 if (errmec
== 6) iucomperr();
1655 if ((addr
>= mem_ramstart
) && (addr
< (mem_ramstart
+ mem_ramsz
))) {
1658 waddr
= (addr
& 0x7fffff) >> 2;
1659 for (i
= 0; i
< 2; i
++)
1661 (((asi
== 0xa) && (mec_wpr
[i
] & 1)) ||
1662 ((asi
== 0xb) && (mec_wpr
[i
] & 2))) &&
1663 ((waddr
>= mec_ssa
[i
]) && ((waddr
| (sz
== 3)) < mec_sea
[i
]));
1665 if (((mem_blockprot
) && (wphit
[0] || wphit
[1])) ||
1666 ((!mem_blockprot
) &&
1667 !((mec_wpr
[0] && wphit
[0]) || (mec_wpr
[1] && wphit
[1]))
1670 printf("Memory access protection error at 0x%08x\n", addr
);
1671 set_sfsr(PROT_EXC
, addr
, asi
, 0);
1676 waddr
= addr
& mem_rammask
;
1677 store_bytes (ramb
, waddr
, data
, sz
, ws
);
1679 } else if ((addr
>= MEC_START
) && (addr
< MEC_END
)) {
1680 if ((sz
!= 2) || (asi
!= 0xb)) {
1681 set_sfsr(MEC_ACC
, addr
, asi
, 0);
1685 mexc
= mec_write(addr
, *data
);
1687 set_sfsr(MEC_ACC
, addr
, asi
, 0);
1698 ((addr
< 0x100000) || ((addr
>= 0x80000000) && (addr
< 0x80100000)))) {
1700 *ws
= sz
== 3 ? 8 : 4;
1701 store_bytes (romb
, addr
, data
, sz
, ws
);
1703 } else if ((addr
>= 0x10000000) &&
1704 (addr
< (0x10000000 + (512 << (mec_iocr
& 0x0f)))) &&
1705 (mec_iocr
& 0x10)) {
1706 erareg
= *data
& 0x0e;
1710 } else if ((addr
< mem_romsz
) && (mec_memcfg
& 0x10000) && (wrp
) &&
1711 (((mec_memcfg
& 0x20000) && (sz
> 1)) ||
1712 (!(mec_memcfg
& 0x20000) && (sz
== 0)))) {
1714 *ws
= mem_romw_ws
+ 1;
1716 *ws
+= mem_romw_ws
+ STD_WS
;
1717 store_bytes (romb
, addr
, data
, sz
, ws
);
1721 } else if ((addr
< mem_romsz
) && (mec_memcfg
& 0x10000) && (wrp
) &&
1722 (((mec_memcfg
& 0x20000) && (sz
> 1)) ||
1723 (!(mec_memcfg
& 0x20000) && (sz
== 0)))) {
1725 *ws
= mem_romw_ws
+ 1;
1727 *ws
+= mem_romw_ws
+ STD_WS
;
1728 store_bytes (romb
, addr
, data
, sz
, ws
);
1736 set_sfsr(UIMP_ACC
, addr
, asi
, 0);
1741 get_mem_ptr(uint32_t addr
, uint32_t size
)
1743 if ((addr
+ size
) < ROM_SZ
) {
1745 } else if ((addr
>= mem_ramstart
) && ((addr
+ size
) < mem_ramend
)) {
1746 return &ramb
[addr
& mem_rammask
];
1750 else if ((era
) && ((addr
<0x100000) ||
1751 ((addr
>= (unsigned) 0x80000000) && ((addr
+ size
) < (unsigned) 0x80100000)))) {
1752 return &romb
[addr
& ROM_MASK
];
1760 sis_memory_write(uint32_t addr
, const void *data
, uint32_t length
)
1764 if ((mem
= get_mem_ptr(addr
, length
)) == ((void *) -1))
1767 memcpy(mem
, data
, length
);
1772 sis_memory_read(uint32_t addr
, void *data
, uint32_t length
)
1776 if ((mem
= get_mem_ptr(addr
, length
)) == ((void *) -1))
1779 memcpy(data
, mem
, length
);
1783 extern struct pstate sregs
;
1788 mec_write(MEC_WCR
, 0); /* zero waitstates */
1789 mec_write(MEC_TRAPD
, 0); /* turn off watch-dog */
1790 mec_write(MEC_RTC_SCALER
, sregs
.freq
- 1); /* generate 1 MHz RTC tick */
1791 mec_write(MEC_MEMCFG
, (3 << 18) | (4 << 10)); /* 1 MB ROM, 4 MB RAM */
1793 sregs
.psr
= 0x110010e0;
1794 sregs
.r
[30] = RAM_END
;
1795 sregs
.r
[14] = sregs
.r
[30] - 96 * 4;
1796 mec_mcr
|= 1; /* power-down enabled */