1 /* Copyright (C) 1995-2015 Free Software Foundation, Inc.
3 This program is free software; you can redistribute it and/or modify
4 it under the terms of the GNU General Public License as published by
5 the Free Software Foundation; either version 3 of the License, or
6 (at your option) any later version.
8 This program is distributed in the hope that it will be useful,
9 but WITHOUT ANY WARRANTY; without even the implied warranty of
10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 GNU General Public License for more details.
13 You should have received a copy of the GNU General Public License
14 along with this program. If not, see <http://www.gnu.org/licenses/>. */
16 /* The control space devices */
19 #include <sys/types.h>
23 #include <sys/fcntl.h>
27 #include "sim-config.h"
30 extern int32 sis_verbose
;
31 extern int32 sparclite
, sparclite_board
;
32 extern int rom8
,wrp
,uben
;
33 extern char uart_dev1
[], uart_dev2
[];
35 int dumbio
= 0; /* normal, smart, terminal oriented IO by default */
38 #define MEC_START 0x01f80000
39 #define MEC_END 0x01f80100
41 /* Memory exception waitstates */
44 /* ERC32 always adds one waitstate during RAM std */
51 #define MEC_WS 0 /* Waitstates per MEC access (0 ws) */
54 /* MEC register addresses */
58 #define MEC_PWDR 0x008
59 #define MEC_MEMCFG 0x010
60 #define MEC_IOCR 0x014
63 #define MEC_MAR0 0x020
64 #define MEC_MAR1 0x024
66 #define MEC_SSA1 0x020
67 #define MEC_SEA1 0x024
68 #define MEC_SSA2 0x028
69 #define MEC_SEA2 0x02C
75 #define MEC_WDOG 0x060
76 #define MEC_TRAPD 0x064
77 #define MEC_RTC_COUNTER 0x080
78 #define MEC_RTC_RELOAD 0x080
79 #define MEC_RTC_SCALER 0x084
80 #define MEC_GPT_COUNTER 0x088
81 #define MEC_GPT_RELOAD 0x088
82 #define MEC_GPT_SCALER 0x08C
83 #define MEC_TIMER_CTRL 0x098
84 #define MEC_SFSR 0x0A0
85 #define MEC_FFAR 0x0A4
86 #define MEC_ERSR 0x0B0
93 #define MEC_UARTA 0x0E0
94 #define MEC_UARTB 0x0E4
95 #define MEC_UART_CTRL 0x0E8
96 #define SIM_LOAD 0x0F0
98 /* Memory exception causes */
102 #define WATCH_EXC 0xa
103 #define BREAK_EXC 0xb
105 /* Size of UART buffers (bytes) */
108 /* Number of simulator ticks between flushing the UARTS. */
109 /* For good performance, keep above 1000 */
110 #define UART_FLUSH_TIME 3000
112 /* MEC timer control register bits */
117 #define TCR_TCRCR 0x100
118 #define TCR_TCRCL 0x200
119 #define TCR_TCRSE 0x400
120 #define TCR_TCRSL 0x800
122 /* New uart defines */
123 #define UART_TX_TIME 1000
124 #define UART_RX_TIME 1000
126 #define UARTA_SRE 0x2
127 #define UARTA_HRE 0x4
128 #define UARTA_OR 0x40
129 #define UARTA_CLR 0x80
130 #define UARTB_DR 0x10000
131 #define UARTB_SRE 0x20000
132 #define UARTB_HRE 0x40000
133 #define UARTB_OR 0x400000
134 #define UARTB_CLR 0x800000
136 #define UART_DR 0x100
137 #define UART_TSE 0x200
138 #define UART_THE 0x400
142 static char fname
[256];
143 static int32 find
= 0;
144 static uint32 mec_ssa
[2]; /* Write protection start address */
145 static uint32 mec_sea
[2]; /* Write protection end address */
146 static uint32 mec_wpr
[2]; /* Write protection control fields */
147 static uint32 mec_sfsr
;
148 static uint32 mec_ffar
;
149 static uint32 mec_ipr
;
150 static uint32 mec_imr
;
151 static uint32 mec_isr
;
152 static uint32 mec_icr
;
153 static uint32 mec_ifr
;
154 static uint32 mec_mcr
; /* MEC control register */
155 static uint32 mec_memcfg
; /* Memory control register */
156 static uint32 mec_wcr
; /* MEC waitstate register */
157 static uint32 mec_iocr
; /* MEC IO control register */
158 static uint32 posted_irq
;
159 static uint32 mec_ersr
; /* MEC error and status register */
160 static uint32 mec_tcr
; /* MEC test comtrol register */
162 static uint32 rtc_counter
;
163 static uint32 rtc_reload
;
164 static uint32 rtc_scaler
;
165 static uint32 rtc_scaler_start
;
166 static uint32 rtc_enabled
;
167 static uint32 rtc_cr
;
168 static uint32 rtc_se
;
170 static uint32 gpt_counter
;
171 static uint32 gpt_reload
;
172 static uint32 gpt_scaler
;
173 static uint32 gpt_scaler_start
;
174 static uint32 gpt_enabled
;
175 static uint32 gpt_cr
;
176 static uint32 gpt_se
;
178 static uint32 wdog_scaler
;
179 static uint32 wdog_counter
;
180 static uint32 wdog_rst_delay
;
181 static uint32 wdog_rston
;
184 init
, disabled
, enabled
, stopped
187 static enum wdog_type wdog_status
;
190 /* ROM size 1024 Kbyte */
191 #define ROM_SZ 0x100000
192 #define ROM_MASK 0x0fffff
194 /* RAM size 4 Mbyte */
195 #define RAM_START 0x02000000
196 #define RAM_END 0x02400000
197 #define RAM_MASK 0x003fffff
199 /* SPARClite boards all seem to have RAM at the same place. */
200 #define RAM_START_SLITE 0x40000000
201 #define RAM_END_SLITE 0x40400000
202 #define RAM_MASK_SLITE 0x003fffff
204 /* Memory support variables */
206 static uint32 mem_ramr_ws
; /* RAM read waitstates */
207 static uint32 mem_ramw_ws
; /* RAM write waitstates */
208 static uint32 mem_romr_ws
; /* ROM read waitstates */
209 static uint32 mem_romw_ws
; /* ROM write waitstates */
210 static uint32 mem_ramstart
; /* RAM start */
211 static uint32 mem_ramend
; /* RAM end */
212 static uint32 mem_rammask
; /* RAM address mask */
213 static uint32 mem_ramsz
; /* RAM size */
214 static uint32 mem_romsz
; /* ROM size */
215 static uint32 mem_accprot
; /* RAM write protection enabled */
216 static uint32 mem_blockprot
; /* RAM block write protection enabled */
218 static unsigned char romb
[ROM_SZ
];
219 static unsigned char ramb
[RAM_END
- RAM_START
];
222 /* UART support variables */
224 static int32 fd1
, fd2
; /* file descriptor for input file */
225 static int32 Ucontrol
; /* UART status register */
226 static unsigned char aq
[UARTBUF
], bq
[UARTBUF
];
227 static int32 anum
, aind
= 0;
228 static int32 bnum
, bind
= 0;
229 static char wbufa
[UARTBUF
], wbufb
[UARTBUF
];
230 static unsigned wnuma
;
231 static unsigned wnumb
;
232 static FILE *f1in
, *f1out
, *f2in
, *f2out
;
233 static struct termios ioc1
, ioc2
, iocold1
, iocold2
;
234 static int f1open
= 0, f2open
= 0;
236 static char uarta_sreg
, uarta_hreg
, uartb_sreg
, uartb_hreg
;
237 static uint32 uart_stat_reg
;
238 static uint32 uarta_data
, uartb_data
;
245 /* Forward declarations */
247 static void decode_ersr (void);
249 static void iucomperr (void);
251 static void mecparerror (void);
252 static void decode_memcfg (void);
253 static void decode_wcr (void);
254 static void decode_mcr (void);
255 static void close_port (void);
256 static void mec_reset (void);
257 static void mec_intack (int32 level
);
258 static void chk_irq (void);
259 static void mec_irq (int32 level
);
260 static void set_sfsr (uint32 fault
, uint32 addr
,
261 uint32 asi
, uint32 read
);
262 static int32
mec_read (uint32 addr
, uint32 asi
, uint32
*data
);
263 static int mec_write (uint32 addr
, uint32 data
);
264 static void port_init (void);
265 static uint32
read_uart (uint32 addr
);
266 static void write_uart (uint32 addr
, uint32 data
);
267 static void flush_uart (void);
268 static void uarta_tx (void);
269 static void uartb_tx (void);
270 static void uart_rx (caddr_t arg
);
271 static void uart_intr (caddr_t arg
);
272 static void uart_irq_start (void);
273 static void wdog_intr (caddr_t arg
);
274 static void wdog_start (void);
275 static void rtc_intr (caddr_t arg
);
276 static void rtc_start (void);
277 static uint32
rtc_counter_read (void);
278 static void rtc_scaler_set (uint32 val
);
279 static void rtc_reload_set (uint32 val
);
280 static void gpt_intr (caddr_t arg
);
281 static void gpt_start (void);
282 static uint32
gpt_counter_read (void);
283 static void gpt_scaler_set (uint32 val
);
284 static void gpt_reload_set (uint32 val
);
285 static void timer_ctrl (uint32 val
);
286 static unsigned char *
287 get_mem_ptr (uint32 addr
, uint32 size
);
288 static void store_bytes (unsigned char *mem
, uint32 waddr
,
289 uint32
*data
, int sz
, int32
*ws
);
302 /* Power-on reset init */
315 if (mec_ersr
& 0x01) {
316 if (!(mec_mcr
& 0x20)) {
317 if (mec_mcr
& 0x40) {
321 printf("Error manager reset - IU in error mode\n");
326 printf("Error manager halt - IU in error mode\n");
331 if (mec_ersr
& 0x04) {
332 if (!(mec_mcr
& 0x200)) {
333 if (mec_mcr
& 0x400) {
337 printf("Error manager reset - IU comparison error\n");
342 printf("Error manager halt - IU comparison error\n");
347 if (mec_ersr
& 0x20) {
348 if (!(mec_mcr
& 0x2000)) {
349 if (mec_mcr
& 0x4000) {
353 printf("Error manager reset - MEC hardware error\n");
358 printf("Error manager halt - MEC hardware error\n");
382 /* IU error mode manager */
394 /* Check memory settings */
399 if (rom8
) mec_memcfg
&= ~0x20000;
400 else mec_memcfg
|= 0x20000;
402 mem_ramsz
= (256 * 1024) << ((mec_memcfg
>> 10) & 7);
403 mem_romsz
= (128 * 1024) << ((mec_memcfg
>> 18) & 7);
405 if (sparclite_board
) {
406 mem_ramstart
= RAM_START_SLITE
;
407 mem_ramend
= RAM_END_SLITE
;
408 mem_rammask
= RAM_MASK_SLITE
;
411 mem_ramstart
= RAM_START
;
412 mem_ramend
= RAM_END
;
413 mem_rammask
= RAM_MASK
;
416 printf("RAM start: 0x%x, RAM size: %d K, ROM size: %d K\n",
417 mem_ramstart
, mem_ramsz
>> 10, mem_romsz
>> 10);
423 mem_ramr_ws
= mec_wcr
& 3;
424 mem_ramw_ws
= (mec_wcr
>> 2) & 3;
425 mem_romr_ws
= (mec_wcr
>> 4) & 0x0f;
427 if (mem_romr_ws
> 0 ) mem_romr_ws
--;
428 mem_romr_ws
= 5 + (4*mem_romr_ws
);
430 mem_romw_ws
= (mec_wcr
>> 8) & 0x0f;
432 printf("Waitstates = RAM read: %d, RAM write: %d, ROM read: %d, ROM write: %d\n",
433 mem_ramr_ws
, mem_ramw_ws
, mem_romr_ws
, mem_romw_ws
);
439 mem_accprot
= (mec_wpr
[0] | mec_wpr
[1]);
440 mem_blockprot
= (mec_mcr
>> 3) & 1;
441 if (sis_verbose
&& mem_accprot
)
442 printf("Memory block write protection enabled\n");
443 if (mec_mcr
& 0x08000) {
447 if (sis_verbose
&& (mec_mcr
& 2))
448 printf("Software reset enabled\n");
449 if (sis_verbose
&& (mec_mcr
& 1))
450 printf("Power-down mode enabled\n");
453 /* Flush ports when simulator stops */
464 sim_stop(SIM_DESC sd
)
473 if (f1open
&& f1in
!= stdin
)
475 if (f2open
&& f2in
!= stdin
)
491 for (i
= 0; i
< 2; i
++)
492 mec_ssa
[i
] = mec_sea
[i
] = mec_wpr
[i
] = 0;
493 mec_mcr
= 0x01350014;
502 mec_memcfg
= 0x10000;
504 mec_ersr
= 0; /* MEC error and status register */
505 mec_tcr
= 0; /* MEC test comtrol register */
513 anum
= aind
= bnum
= bind
= 0;
515 uart_stat_reg
= UARTA_SRE
| UARTA_HRE
| UARTB_SRE
| UARTB_HRE
;
516 uarta_data
= uartb_data
= UART_THE
| UART_TSE
;
518 rtc_counter
= 0xffffffff;
519 rtc_reload
= 0xffffffff;
525 gpt_counter
= 0xffffffff;
526 gpt_reload
= 0xffffffff;
533 wdog_rst_delay
= 255;
534 wdog_counter
= 0xffff;
553 printf("interrupt %d acknowledged\n", level
);
554 irq_test
= mec_tcr
& 0x80000;
555 if ((irq_test
) && (mec_ifr
& (1 << level
)))
556 mec_ifr
&= ~(1 << level
);
558 mec_ipr
&= ~(1 << level
);
570 if (mec_tcr
& 0x80000) itmp
= mec_ifr
;
572 itmp
= ((mec_ipr
| itmp
) & ~mec_imr
) & 0x0fffe;
575 for (i
= 15; i
> 0; i
--) {
576 if (((itmp
>> i
) & 1) != 0) {
577 if ((sis_verbose
) && (i
> old_irl
))
578 printf("IU irl: %d\n", i
);
580 set_int(i
, mec_intack
, i
);
591 mec_ipr
|= (1 << level
);
596 set_sfsr(fault
, addr
, asi
, read
)
602 if ((asi
== 0xa) || (asi
== 0xb)) {
604 mec_sfsr
= (fault
<< 3) | (!read
<< 15);
605 mec_sfsr
|= ((mec_sfsr
& 1) ^ 1) | (mec_sfsr
& 1);
618 mec_read(addr
, asi
, data
)
624 switch (addr
& 0x0ff) {
626 case MEC_MCR
: /* 0x00 */
630 case MEC_MEMCFG
: /* 0x10 */
635 *data
= mec_iocr
; /* 0x14 */
638 case MEC_SSA1
: /* 0x20 */
639 *data
= mec_ssa
[0] | (mec_wpr
[0] << 23);
641 case MEC_SEA1
: /* 0x24 */
644 case MEC_SSA2
: /* 0x28 */
645 *data
= mec_ssa
[1] | (mec_wpr
[1] << 23);
647 case MEC_SEA2
: /* 0x2c */
651 case MEC_ISR
: /* 0x44 */
655 case MEC_IPR
: /* 0x48 */
659 case MEC_IMR
: /* 0x4c */
663 case MEC_IFR
: /* 0x54 */
667 case MEC_RTC_COUNTER
: /* 0x80 */
668 *data
= rtc_counter_read();
670 case MEC_RTC_SCALER
: /* 0x84 */
672 *data
= rtc_scaler
- (now() - rtc_scaler_start
);
677 case MEC_GPT_COUNTER
: /* 0x88 */
678 *data
= gpt_counter_read();
681 case MEC_GPT_SCALER
: /* 0x8c */
683 *data
= gpt_scaler
- (now() - gpt_scaler_start
);
689 case MEC_SFSR
: /* 0xA0 */
693 case MEC_FFAR
: /* 0xA4 */
700 strcpy(fname
, "simload");
701 find
= bfd_load(fname
);
709 case MEC_ERSR
: /* 0xB0 */
713 case MEC_TCR
: /* 0xD0 */
717 case MEC_UARTA
: /* 0xE0 */
718 case MEC_UARTB
: /* 0xE4 */
720 set_sfsr(MEC_ACC
, addr
, asi
, 1);
723 *data
= read_uart(addr
);
726 case MEC_UART_CTRL
: /* 0xE8 */
728 *data
= read_uart(addr
);
731 case 0xF4: /* simulator RAM size in bytes */
735 case 0xF8: /* simulator ROM size in bytes */
740 set_sfsr(MEC_ACC
, addr
, asi
, 1);
748 mec_write(addr
, data
)
753 printf("MEC write a: %08x, d: %08x\n",addr
,data
);
754 switch (addr
& 0x0ff) {
759 if (mec_mcr
& 0x08000) mecparerror();
767 printf(" Software reset issued\n");
773 if (mec_iocr
& 0xC0C0C0C0) mecparerror();
776 case MEC_SSA1
: /* 0x20 */
777 if (data
& 0xFE000000) mecparerror();
778 mec_ssa
[0] = data
& 0x7fffff;
779 mec_wpr
[0] = (data
>> 23) & 0x03;
780 mem_accprot
= mec_wpr
[0] || mec_wpr
[1];
781 if (sis_verbose
&& mec_wpr
[0])
782 printf("Segment 1 memory protection enabled (0x02%06x - 0x02%06x)\n",
783 mec_ssa
[0] << 2, mec_sea
[0] << 2);
785 case MEC_SEA1
: /* 0x24 */
786 if (data
& 0xFF800000) mecparerror();
787 mec_sea
[0] = data
& 0x7fffff;
789 case MEC_SSA2
: /* 0x28 */
790 if (data
& 0xFE000000) mecparerror();
791 mec_ssa
[1] = data
& 0x7fffff;
792 mec_wpr
[1] = (data
>> 23) & 0x03;
793 mem_accprot
= mec_wpr
[0] || mec_wpr
[1];
794 if (sis_verbose
&& mec_wpr
[1])
795 printf("Segment 2 memory protection enabled (0x02%06x - 0x02%06x)\n",
796 mec_ssa
[1] << 2, mec_sea
[1] << 2);
798 case MEC_SEA2
: /* 0x2c */
799 if (data
& 0xFF800000) mecparerror();
800 mec_sea
[1] = data
& 0x7fffff;
805 if (data
& 0xFFFFFF00) mecparerror();
807 if (data
& 0xFF00FF00) mecparerror();
808 write_uart(addr
, data
);
812 gpt_reload_set(data
);
816 if (data
& 0xFFFF0000) mecparerror();
817 gpt_scaler_set(data
);
821 if (data
& 0xFFFFF0F0) mecparerror();
826 rtc_reload_set(data
);
830 if (data
& 0xFFFFFF00) mecparerror();
831 rtc_scaler_set(data
);
834 case MEC_SFSR
: /* 0xA0 */
835 if (data
& 0xFFFF0880) mecparerror();
840 if (data
& 0xFFFFE000) mecparerror();
844 case MEC_IMR
: /* 0x4c */
846 if (data
& 0xFFFF8001) mecparerror();
847 mec_imr
= data
& 0x7ffe;
851 case MEC_ICR
: /* 0x50 */
853 if (data
& 0xFFFF0001) mecparerror();
854 mec_ipr
&= ~data
& 0x0fffe;
858 case MEC_IFR
: /* 0x54 */
860 if (mec_tcr
& 0x080000) {
861 if (data
& 0xFFFF0001) mecparerror();
862 mec_ifr
= data
& 0xfffe;
867 fname
[find
++] = (char) data
;
871 case MEC_MEMCFG
: /* 0x10 */
872 if (data
& 0xC0E08000) mecparerror();
875 if (mec_memcfg
& 0xc0e08000)
879 case MEC_WCR
: /* 0x18 */
884 case MEC_ERSR
: /* 0xB0 */
885 if (mec_tcr
& 0x100000)
886 if (data
& 0xFFFFEFC0) mecparerror();
887 mec_ersr
= data
& 0x103f;
890 case MEC_TCR
: /* 0xD0 */
891 if (data
& 0xFFE1FFC0) mecparerror();
892 mec_tcr
= data
& 0x1e003f;
895 case MEC_WDOG
: /* 0x60 */
896 wdog_scaler
= (data
>> 16) & 0x0ff;
897 wdog_counter
= data
& 0x0ffff;
898 wdog_rst_delay
= data
>> 24;
900 if (wdog_status
== stopped
)
902 wdog_status
= enabled
;
905 case MEC_TRAPD
: /* 0x64 */
906 if (wdog_status
== init
) {
907 wdog_status
= disabled
;
909 printf("Watchdog disabled\n");
919 set_sfsr(MEC_ACC
, addr
, 0xb, 0);
929 static int ifd1
= -1, ifd2
= -1, ofd1
= -1, ofd2
= -1;
935 return; /* do nothing */
937 tcsetattr(0, TCSANOW
, &ioc1
);
939 tcsetattr(0, TCSANOW
, &ioc2
);
946 return; /* do nothing */
948 tcsetattr(0, TCSANOW
, &iocold1
);
950 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+");
984 if (f1in
) ifd1
= fileno(f1in
);
987 printf("serial port A on stdin/stdout\n");
989 tcgetattr(ifd1
, &ioc1
);
991 ioc1
.c_lflag
&= ~(ICANON
| ECHO
);
993 ioc1
.c_cc
[VTIME
] = 0;
999 ofd1
= fileno(f1out
);
1000 if (!dumbio
&& ofd1
== 1) setbuf(f1out
, NULL
);
1003 if (uart_dev2
[0] != 0)
1004 if ((fd2
= open(uart_dev2
, O_RDWR
| O_NONBLOCK
)) < 0) {
1005 printf("Warning, couldn't open output device %s\n", uart_dev2
);
1008 printf("serial port B on %s\n", uart_dev2
);
1009 f2in
= f2out
= fdopen(fd2
, "r+");
1010 setbuf(f2out
, NULL
);
1013 if (f2in
) ifd2
= fileno(f2in
);
1016 printf("serial port B on stdin/stdout\n");
1018 tcgetattr(ifd2
, &ioc2
);
1020 ioc2
.c_lflag
&= ~(ICANON
| ECHO
);
1021 ioc2
.c_cc
[VMIN
] = 0;
1022 ioc2
.c_cc
[VTIME
] = 0;
1028 ofd2
= fileno(f2out
);
1029 if (!dumbio
&& ofd2
== 1) setbuf(f2out
, NULL
);
1044 switch (addr
& 0xff) {
1046 case 0xE0: /* UART 1 */
1051 if ((aind
+ 1) < anum
)
1053 return (0x700 | (uint32
) aq
[aind
++]);
1056 anum
= DO_STDIO_READ(ifd1
, aq
, UARTBUF
);
1060 if ((aind
+ 1) < anum
)
1062 return (0x700 | (uint32
) aq
[aind
++]);
1064 return (0x600 | (uint32
) aq
[aind
]);
1070 uarta_data
&= ~UART_DR
;
1071 uart_stat_reg
&= ~UARTA_DR
;
1079 case 0xE4: /* UART 2 */
1083 if ((bind
+ 1) < bnum
)
1085 return (0x700 | (uint32
) bq
[bind
++]);
1088 bnum
= DO_STDIO_READ(ifd2
, bq
, UARTBUF
);
1092 if ((bind
+ 1) < bnum
)
1094 return (0x700 | (uint32
) bq
[bind
++]);
1096 return (0x600 | (uint32
) bq
[bind
]);
1102 uartb_data
&= ~UART_DR
;
1103 uart_stat_reg
&= ~UARTB_DR
;
1111 case 0xE8: /* UART status register */
1117 Ucontrol
|= 0x00000001;
1120 anum
= DO_STDIO_READ(ifd1
, aq
, UARTBUF
);
1123 Ucontrol
|= 0x00000001;
1129 Ucontrol
|= 0x00010000;
1132 bnum
= DO_STDIO_READ(ifd2
, bq
, UARTBUF
);
1135 Ucontrol
|= 0x00010000;
1141 Ucontrol
|= 0x00060006;
1144 return uart_stat_reg
;
1152 printf("Read from unimplemented MEC register (%x)\n", addr
);
1159 write_uart(addr
, data
)
1165 c
= (unsigned char) data
;
1166 switch (addr
& 0xff) {
1168 case 0xE0: /* UART A */
1171 if (wnuma
< UARTBUF
)
1175 wnuma
-= fwrite(wbufa
, 1, wnuma
, f1out
);
1181 if (uart_stat_reg
& UARTA_SRE
) {
1183 uart_stat_reg
&= ~UARTA_SRE
;
1184 event(uarta_tx
, 0, UART_TX_TIME
);
1187 uart_stat_reg
&= ~UARTA_HRE
;
1192 case 0xE4: /* UART B */
1195 if (wnumb
< UARTBUF
)
1199 wnumb
-= fwrite(wbufb
, 1, wnumb
, f2out
);
1205 if (uart_stat_reg
& UARTB_SRE
) {
1207 uart_stat_reg
&= ~UARTB_SRE
;
1208 event(uartb_tx
, 0, UART_TX_TIME
);
1211 uart_stat_reg
&= ~UARTB_HRE
;
1215 case 0xE8: /* UART status register */
1217 if (data
& UARTA_CLR
) {
1218 uart_stat_reg
&= 0xFFFF0000;
1219 uart_stat_reg
|= UARTA_SRE
| UARTA_HRE
;
1221 if (data
& UARTB_CLR
) {
1222 uart_stat_reg
&= 0x0000FFFF;
1223 uart_stat_reg
|= UARTB_SRE
| UARTB_HRE
;
1229 printf("Write to unimplemented MEC register (%x)\n", addr
);
1237 while (wnuma
&& f1open
)
1238 wnuma
-= fwrite(wbufa
, 1, wnuma
, f1out
);
1239 while (wnumb
&& f2open
)
1240 wnumb
-= fwrite(wbufb
, 1, wnumb
, f2out
);
1249 while (f1open
&& fwrite(&uarta_sreg
, 1, 1, f1out
) != 1);
1250 if (uart_stat_reg
& UARTA_HRE
) {
1251 uart_stat_reg
|= UARTA_SRE
;
1253 uarta_sreg
= uarta_hreg
;
1254 uart_stat_reg
|= UARTA_HRE
;
1255 event(uarta_tx
, 0, UART_TX_TIME
);
1263 while (f2open
&& fwrite(&uartb_sreg
, 1, 1, f2out
) != 1);
1264 if (uart_stat_reg
& UARTB_HRE
) {
1265 uart_stat_reg
|= UARTB_SRE
;
1267 uartb_sreg
= uartb_hreg
;
1268 uart_stat_reg
|= UARTB_HRE
;
1269 event(uartb_tx
, 0, UART_TX_TIME
);
1284 rsize
= DO_STDIO_READ(ifd1
, &rxd
, 1);
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 */
1295 uart_stat_reg
|= UARTA_DR
;
1300 rsize
= DO_STDIO_READ(ifd2
, &rxd
, 1);
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 */
1311 uart_stat_reg
|= UARTB_DR
;
1314 event(uart_rx
, 0, UART_RX_TIME
);
1321 read_uart(0xE8); /* Check for UART interrupts every 1000 clk */
1322 flush_uart(); /* Flush UART ports */
1323 event(uart_intr
, 0, UART_FLUSH_TIME
);
1331 event(uart_intr
, 0, UART_FLUSH_TIME
);
1334 event(uart_rx
, 0, UART_RX_TIME
);
1345 if (wdog_status
== disabled
) {
1346 wdog_status
= stopped
;
1351 event(wdog_intr
, 0, wdog_scaler
+ 1);
1354 printf("Watchdog reset!\n");
1360 wdog_counter
= wdog_rst_delay
;
1361 event(wdog_intr
, 0, wdog_scaler
+ 1);
1370 event(wdog_intr
, 0, wdog_scaler
+ 1);
1372 printf("Watchdog started, scaler = %d, counter = %d\n",
1373 wdog_scaler
, wdog_counter
);
1384 if (rtc_counter
== 0) {
1388 rtc_counter
= rtc_reload
;
1394 event(rtc_intr
, 0, rtc_scaler
+ 1);
1395 rtc_scaler_start
= now();
1399 printf("RTC stopped\n\r");
1408 printf("RTC started (period %d)\n\r", rtc_scaler
+ 1);
1409 event(rtc_intr
, 0, rtc_scaler
+ 1);
1410 rtc_scaler_start
= now();
1424 rtc_scaler
= val
& 0x0ff; /* eight-bit scaler only */
1438 if (gpt_counter
== 0) {
1441 gpt_counter
= gpt_reload
;
1447 event(gpt_intr
, 0, gpt_scaler
+ 1);
1448 gpt_scaler_start
= now();
1452 printf("GPT stopped\n\r");
1461 printf("GPT started (period %d)\n\r", gpt_scaler
+ 1);
1462 event(gpt_intr
, 0, gpt_scaler
+ 1);
1463 gpt_scaler_start
= now();
1477 gpt_scaler
= val
& 0x0ffff; /* 16-bit scaler */
1492 rtc_cr
= ((val
& TCR_TCRCR
) != 0);
1493 if (val
& TCR_TCRCL
) {
1494 rtc_counter
= rtc_reload
;
1496 if (val
& TCR_TCRSL
) {
1498 rtc_se
= ((val
& TCR_TCRSE
) != 0);
1499 if (rtc_se
&& (rtc_enabled
== 0))
1502 gpt_cr
= (val
& TCR_GACR
);
1503 if (val
& TCR_GACL
) {
1504 gpt_counter
= gpt_reload
;
1506 if (val
& TCR_GACL
) {
1508 gpt_se
= (val
& TCR_GASE
) >> 2;
1509 if (gpt_se
&& (gpt_enabled
== 0))
1513 /* Store data in host byte order. MEM points to the beginning of the
1514 emulated memory; WADDR contains the index the emulated memory,
1515 DATA points to words in host byte order to be stored. SZ contains log(2)
1516 of the number of bytes to retrieve, and can be 0 (1 byte), 1 (one half-word),
1517 2 (one word), or 3 (two words); WS should return the number of
1521 store_bytes (unsigned char *mem
, uint32 waddr
, uint32
*data
, int32 sz
,
1527 mem
[waddr
] = *data
& 0x0ff;
1528 *ws
= mem_ramw_ws
+ 3;
1531 #ifdef HOST_LITTLE_ENDIAN
1534 memcpy (&mem
[waddr
], data
, 2);
1535 *ws
= mem_ramw_ws
+ 3;
1538 memcpy (&mem
[waddr
], data
, 4);
1542 memcpy (&mem
[waddr
], data
, 8);
1543 *ws
= 2 * mem_ramw_ws
+ STD_WS
;
1549 /* Memory emulation */
1552 memory_iread (uint32 addr
, uint32
*data
, int32
*ws
)
1555 if ((addr
>= mem_ramstart
) && (addr
< (mem_ramstart
+ mem_ramsz
))) {
1556 memcpy (data
, &ramb
[addr
& mem_rammask
& ~3], 4);
1559 } else if (addr
< mem_romsz
) {
1560 memcpy (data
, &romb
[addr
& ~3], 4);
1566 printf ("Memory exception at %x (illegal address)\n", addr
);
1567 if (sregs
.psr
& 0x080)
1571 set_sfsr (UIMP_ACC
, addr
, asi
, 1);
1577 memory_read(asi
, addr
, data
, sz
, ws
)
1589 printf("Inserted MEC error %d\n",errmec
);
1590 set_sfsr(errmec
, addr
, asi
, 1);
1591 if (errmec
== 5) mecparerror();
1592 if (errmec
== 6) iucomperr();
1598 if ((addr
>= mem_ramstart
) && (addr
< (mem_ramstart
+ mem_ramsz
))) {
1599 memcpy (data
, &ramb
[addr
& mem_rammask
& ~3], 4);
1602 } else if ((addr
>= MEC_START
) && (addr
< MEC_END
)) {
1603 mexc
= mec_read(addr
, asi
, data
);
1605 set_sfsr(MEC_ACC
, addr
, asi
, 1);
1615 if ((addr
< 0x100000) ||
1616 ((addr
>= 0x80000000) && (addr
< 0x80100000))) {
1617 memcpy (data
, &romb
[addr
& ROM_MASK
& ~3], 4);
1620 } else if ((addr
>= 0x10000000) &&
1621 (addr
< (0x10000000 + (512 << (mec_iocr
& 0x0f)))) &&
1622 (mec_iocr
& 0x10)) {
1627 } else if (addr
< mem_romsz
) {
1628 memcpy (data
, &romb
[addr
& ~3], 4);
1632 } else if (addr
< mem_romsz
) {
1633 memcpy (data
, &romb
[addr
& ~3], 4);
1641 printf ("Memory exception at %x (illegal address)\n", addr
);
1642 set_sfsr(UIMP_ACC
, addr
, asi
, 1);
1648 memory_write(asi
, addr
, data
, sz
, ws
)
1666 printf("Inserted MEC error %d\n",errmec
);
1667 set_sfsr(errmec
, addr
, asi
, 0);
1668 if (errmec
== 5) mecparerror();
1669 if (errmec
== 6) iucomperr();
1675 if ((addr
>= mem_ramstart
) && (addr
< (mem_ramstart
+ mem_ramsz
))) {
1678 waddr
= (addr
& 0x7fffff) >> 2;
1679 for (i
= 0; i
< 2; i
++)
1681 (((asi
== 0xa) && (mec_wpr
[i
] & 1)) ||
1682 ((asi
== 0xb) && (mec_wpr
[i
] & 2))) &&
1683 ((waddr
>= mec_ssa
[i
]) && ((waddr
| (sz
== 3)) < mec_sea
[i
]));
1685 if (((mem_blockprot
) && (wphit
[0] || wphit
[1])) ||
1686 ((!mem_blockprot
) &&
1687 !((mec_wpr
[0] && wphit
[0]) || (mec_wpr
[1] && wphit
[1]))
1690 printf("Memory access protection error at 0x%08x\n", addr
);
1691 set_sfsr(PROT_EXC
, addr
, asi
, 0);
1696 waddr
= addr
& mem_rammask
;
1697 store_bytes (ramb
, waddr
, data
, sz
, ws
);
1699 } else if ((addr
>= MEC_START
) && (addr
< MEC_END
)) {
1700 if ((sz
!= 2) || (asi
!= 0xb)) {
1701 set_sfsr(MEC_ACC
, addr
, asi
, 0);
1705 mexc
= mec_write(addr
, *data
);
1707 set_sfsr(MEC_ACC
, addr
, asi
, 0);
1718 ((addr
< 0x100000) || ((addr
>= 0x80000000) && (addr
< 0x80100000)))) {
1720 *ws
= sz
== 3 ? 8 : 4;
1721 store_bytes (romb
, addr
, data
, sz
, ws
);
1723 } else if ((addr
>= 0x10000000) &&
1724 (addr
< (0x10000000 + (512 << (mec_iocr
& 0x0f)))) &&
1725 (mec_iocr
& 0x10)) {
1726 erareg
= *data
& 0x0e;
1730 } else if ((addr
< mem_romsz
) && (mec_memcfg
& 0x10000) && (wrp
) &&
1731 (((mec_memcfg
& 0x20000) && (sz
> 1)) ||
1732 (!(mec_memcfg
& 0x20000) && (sz
== 0)))) {
1734 *ws
= mem_romw_ws
+ 1;
1736 *ws
+= mem_romw_ws
+ STD_WS
;
1737 store_bytes (romb
, addr
, data
, sz
, ws
);
1741 } else if ((addr
< mem_romsz
) && (mec_memcfg
& 0x10000) && (wrp
) &&
1742 (((mec_memcfg
& 0x20000) && (sz
> 1)) ||
1743 (!(mec_memcfg
& 0x20000) && (sz
== 0)))) {
1745 *ws
= mem_romw_ws
+ 1;
1747 *ws
+= mem_romw_ws
+ STD_WS
;
1748 store_bytes (romb
, addr
, data
, sz
, ws
);
1756 set_sfsr(UIMP_ACC
, addr
, asi
, 0);
1760 static unsigned char *
1761 get_mem_ptr(addr
, size
)
1765 if ((addr
+ size
) < ROM_SZ
) {
1767 } else if ((addr
>= mem_ramstart
) && ((addr
+ size
) < mem_ramend
)) {
1768 return &ramb
[addr
& mem_rammask
];
1772 else if ((era
) && ((addr
<0x100000) ||
1773 ((addr
>= (unsigned) 0x80000000) && ((addr
+ size
) < (unsigned) 0x80100000)))) {
1774 return &romb
[addr
& ROM_MASK
];
1782 sis_memory_write(addr
, data
, length
)
1784 const unsigned char *data
;
1789 if ((mem
= get_mem_ptr(addr
, length
)) == ((char *) -1))
1792 memcpy(mem
, data
, length
);
1797 sis_memory_read(addr
, data
, length
)
1804 if ((mem
= get_mem_ptr(addr
, length
)) == ((char *) -1))
1807 memcpy(data
, mem
, length
);
1811 extern struct pstate sregs
;
1816 mec_write(MEC_WCR
, 0); /* zero waitstates */
1817 mec_write(MEC_TRAPD
, 0); /* turn off watch-dog */
1818 mec_write(MEC_RTC_SCALER
, sregs
.freq
- 1); /* generate 1 MHz RTC tick */
1819 mec_write(MEC_MEMCFG
, (3 << 18) | (4 << 10)); /* 1 MB ROM, 4 MB RAM */
1821 sregs
.psr
= 0x110010e0;
1822 sregs
.r
[30] = RAM_END
;
1823 sregs
.r
[14] = sregs
.r
[30] - 96 * 4;
1824 mec_mcr
|= 1; /* power-down enabled */
This page took 0.068441 seconds and 4 git commands to generate.