erc32.c 38 KB

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