Windows NT 4.0 source code leak
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

801 lines
24 KiB

4 years ago
  1. #ident "@(#) NEC r98eif.c 1.16 95/03/17 11:56:21"
  2. /*++
  3. Copyright (c) 1994 Kobe NEC Software
  4. Module Name:
  5. r98eif.c
  6. Abstract:
  7. This module implements the Eif interrupt service routine for R98
  8. Author:
  9. Environment:
  10. Kernel mode
  11. Revision History:
  12. --*/
  13. /*
  14. ***********************************************************************
  15. *
  16. * S001 6/10 T.Samezima
  17. *
  18. * Del Compile err
  19. *
  20. ***********************************************************************
  21. *
  22. * S002 7/5 T.Samezima
  23. *
  24. * Chg CPU No set miss
  25. *
  26. ***********************************************************************
  27. *
  28. * S003 7/22 T.Samezima
  29. *
  30. * Add give the dummy read after IOB and SIC register read
  31. * for PMC3 bug
  32. *
  33. ***********************************************************************
  34. *
  35. * S004 8/23 T.Samezima
  36. *
  37. * Chg Condition change
  38. *
  39. ***********************************************************************
  40. *
  41. * S005 8/24 T.Samezima
  42. *
  43. * Chg Change a form of display on eif status
  44. * Define buffer name
  45. *
  46. ***********************************************************************
  47. *
  48. * S006 9/22 T.Samezima
  49. *
  50. * Add Execution owner flag
  51. * Lower the Irql level to TIMER_LEVEL. Because KdPrint
  52. * use to inter processor interrupt.
  53. *
  54. * Chg buffer size
  55. *
  56. ***********************************************************************
  57. *
  58. * S007 9/27 T.Samezima
  59. *
  60. * Chg Arg miss
  61. *
  62. ***********************************************************************
  63. *
  64. * S008 9/27 T.Samezima
  65. *
  66. * Chg Init value
  67. *
  68. * S009 10/25 T.Samezima
  69. * Add Variable of KeBugCheckEx()
  70. *
  71. * S00a 11/29 T.Samezima
  72. * Add Enable _R98DBG_
  73. *
  74. * S00b 12/07 T.Samezima
  75. * Chg print format.
  76. *
  77. * S00c 12/24 T.Samezima
  78. * Add ESM logic.
  79. * Del move EIFR_REGISTER define to r98reg.h
  80. *
  81. * S00d '95.01/11 T.Samezima
  82. * Add Disable EIF interrupt in wait loop.
  83. *
  84. * S00e '95.01/13 T.Samezima
  85. * Add Wait for all processers in wait loop.
  86. *
  87. * S00f '95.01/16-25 T.Samezima
  88. * Add Check ECC 1bit flag.
  89. *
  90. * S010 '95.03/10 T.Samezima
  91. * Add NMI switch check.
  92. *
  93. * S011 '95.03/14 T.Samezima
  94. * Add HalpLRErrorInterrupt()
  95. *
  96. */
  97. #include "halp.h"
  98. /* Start S001 */
  99. #include "bugcodes.h"
  100. #include "eisa.h"
  101. #include "stdio.h"
  102. /* End S001 */
  103. #define _R98DBG_ 1 // S00a
  104. // Start S005
  105. //
  106. // define buffer name
  107. //
  108. enum _EIF_BUFFER {
  109. PMC0_ERR=0, // 0
  110. PMC0_AERR,
  111. PMC1_ERR,
  112. PMC1_AERR,
  113. PMC2_ERR,
  114. PMC2_AERR, // 5
  115. PMC3_ERR,
  116. PMC3_AERR,
  117. PMC_EADRH,
  118. PMC_EADRL,
  119. IOB_IERR, // 10
  120. IOB_AMAH,
  121. IOB_AMAL,
  122. IOB_ANAH,
  123. IOB_ANAL,
  124. IOB_MPER, // 15
  125. IOB_EIFR,
  126. SIC_N0_EIF0,
  127. SIC_N1_EIF0,
  128. SIC_N0_EIF1,
  129. SIC_N1_EIF1, // 20
  130. SIC_N0_STS1,
  131. SIC_N1_STS1,
  132. SIC_N0_STS2,
  133. SIC_N1_STS2,
  134. SIC_N0_DSRG, // 25
  135. SIC_N1_DSRG,
  136. SIC_N2_EIF0,
  137. SIC_N3_EIF0,
  138. SIC_N2_EIF1,
  139. SIC_N3_EIF1, // 30
  140. SIC_N2_STS1,
  141. SIC_N3_STS1,
  142. SIC_N2_STS2,
  143. SIC_N3_STS2,
  144. SIC_N2_DSRG, // 35
  145. SIC_N3_DSRG,
  146. LR_ERRS,
  147. LR_PEAR,
  148. LR_AEAR,
  149. EISA_NMI, // 40
  150. MAXMUM_EIF_BUFFER
  151. };
  152. #if 0 // S00c
  153. typedef struct _EIFR_REGISTER {
  154. ULONG Reserved : 21;
  155. ULONG MPDISCN : 1;
  156. ULONG IOBERR : 1;
  157. ULONG Reserved2 : 1;
  158. ULONG EISANMI : 1;
  159. ULONG LRERR : 1;
  160. ULONG SIC1ERR : 1;
  161. ULONG SIC0ERR : 1;
  162. ULONG PMC3ERR : 1;
  163. ULONG PMC2ERR : 1;
  164. ULONG PMC1ERR : 1;
  165. ULONG PMC0ERR : 1;
  166. } EIFR_REGISTER, *PEIFR_REGISTER;
  167. #endif
  168. // End S005
  169. //
  170. // define buffer size
  171. //
  172. #define REG_BUFFER_SIZE MAXMUM_EIF_BUFFER // S005
  173. //
  174. // buffer
  175. //
  176. ULONG HalpEifRegisterBuffer[REG_BUFFER_SIZE];
  177. // Start S006
  178. //
  179. // Owner flag
  180. //
  181. volatile ULONG EifOwnFlg=0;
  182. // End S006
  183. volatile ULONG CpuCount=0; // S00e
  184. volatile ULONG EccOccurFlag[4]={0,0,0,0}; // S00f
  185. // S010 vvv
  186. #define NMI_BUFFER_SIZE 32
  187. volatile ULONG HalpNMIFlag=0;
  188. ULONG HalpNMIBuf[NMI_BUFFER_SIZE*4];
  189. // S010 ^^^
  190. // S011 vvv
  191. ULONG HalpLRErrorFlag=0;
  192. BOOLEAN
  193. HalpLRErrorInterrupt(
  194. VOID
  195. )
  196. {
  197. //
  198. // LR4360 error flag set.
  199. //
  200. HalpLRErrorFlag=1;
  201. //
  202. // Issue EIF interrupt.
  203. //
  204. WRITE_REGISTER_ULONG( 0xb9980100, 0x0082f000 );
  205. return TRUE;
  206. }
  207. // S011 ^^^
  208. VOID
  209. HalpHandleEif(
  210. VOID
  211. )
  212. /*++
  213. Routine Description:
  214. This routine manage the eif interrupt
  215. Arguments:
  216. None.
  217. Return Value:
  218. None.
  219. --*/
  220. {
  221. UCHAR charBuffer; // S001
  222. ULONG buffer;
  223. ULONG errsBuffer;
  224. UCHAR messageBuffer[REG_BUFFER_SIZE*12+16]; // S006
  225. ULONG counter;
  226. UCHAR EisaPort;
  227. ULONG port;
  228. ULONG cpuNo; // S006
  229. ULONG EifFlg=0; // S006, S007
  230. KIRQL oldIrql; // S006
  231. ULONG i; // S00f
  232. // Start S005
  233. #if defined(_R98DBG_)
  234. PEIFR_REGISTER eifrbuf;
  235. #endif
  236. // End S005
  237. //
  238. // Acquire eif interrupt spin lock.
  239. //
  240. KiAcquireSpinLock(&HalpEifInterruptLock);
  241. // Start S006
  242. //
  243. // Get CPU Number.
  244. //
  245. cpuNo=(PCR->Prcb)->Number;
  246. if(EifOwnFlg == 0) {
  247. // CpuCount=**((PULONG *)(&KeNumberProcessors)); // S00e, S00f
  248. EifOwnFlg = 1;
  249. EifFlg = 1;
  250. }
  251. // CpuCount--; // S00e, S00f
  252. KiReleaseSpinLock(&HalpEifInterruptLock);
  253. if(EifFlg == 0) {
  254. //#ifdef DBG
  255. WRITE_REGISTER_ULONG( &(PMC_CONTROL1)->MKRR.Long,
  256. 63-IPR_EIF_BIT_NO ); // S00d
  257. KeRaiseIrql(TIMER_LEVEL, &oldIrql);
  258. while( EifOwnFlg == 1 );
  259. KeLowerIrql(oldIrql);
  260. WRITE_REGISTER_ULONG( &(PMC_CONTROL1)->MKSR.Long,
  261. 63-IPR_EIF_BIT_NO ); // S00d
  262. //#else
  263. // while( EifOwnFlg == 1 );
  264. //#endif
  265. EccOccurFlag[cpuNo]=0; // S00f
  266. return;
  267. }
  268. // S00c vvv
  269. buffer = READ_REGISTER_ULONG( &( IOB_CONTROL )->EIFR.Long );
  270. if( (HalpNMIFlag == 0) && (HalpLRErrorFlag == 0) && // S010, S011
  271. ((((PEIFR_REGISTER)&buffer)->SIC0ERR == 1) ||
  272. (((PEIFR_REGISTER)&buffer)->SIC1ERR == 1)) ){
  273. buffer = HalpEccError(buffer);
  274. if(buffer == 1){
  275. // while( CpuCount != 0 ); // S00e
  276. // S00f vvv
  277. for( i=0; i<4; i++) {
  278. EccOccurFlag[i]=1;
  279. }
  280. EccOccurFlag[cpuNo]=0;
  281. // S00f ^^^
  282. EifOwnFlg = 0;
  283. return;
  284. }
  285. }
  286. // S00c ^^^
  287. // S00f vvv
  288. else if( (HalpNMIFlag == 0) && (HalpLRErrorFlag == 0) &&
  289. ((buffer & 0xff600000) == 0) && (EccOccurFlag[cpuNo] == 1) ){ // S010, S011
  290. EccOccurFlag[cpuNo]=0;
  291. EifOwnFlg = 0;
  292. return;
  293. }
  294. // S00f ^^^
  295. // S010 vvv
  296. if( HalpNMIFlag == 0 ) {
  297. HalDisplayString("\nEIF interrupt status: "); // S005
  298. #ifdef DBG
  299. sprintf( (char *)messageBuffer, "Exe CPU=No.%1d\n", cpuNo ); // S007
  300. #else
  301. sprintf( (char *)messageBuffer, "\n" ); // S007
  302. #endif
  303. HalDisplayString( (char *)messageBuffer );
  304. } else {
  305. HalDisplayString("\nNMI occur: \n");
  306. }
  307. // S010 ^^^
  308. // End S006
  309. //
  310. // Check LR4360 status.
  311. //
  312. errsBuffer = READ_REGISTER_ULONG( &( LR_CONTROL1 )->ERRS );
  313. if( (errsBuffer & ERRS_ERROR_BIT) != 0 ) {
  314. WRITE_REGISTER_ULONG( &( LR_CONTROL1 )->ERRS,
  315. ERRS_ERROR_BIT );
  316. }
  317. buffer = READ_REGISTER_ULONG( &( IOB_CONTROL )->SCFR.Long );
  318. IOB_DUMMY_READ; // S003
  319. //
  320. // get register value on ERR, AERR, EADRH and EADRL registers of PMC
  321. //
  322. for(counter=0 ; counter<REG_BUFFER_SIZE ; counter++) {
  323. HalpEifRegisterBuffer[counter]=0;
  324. }
  325. if( (buffer & SCFR_CPU0_CONNECT) == 0 ) { // S004
  326. /* Start S001 */
  327. HalpEifRegisterBuffer[PMC0_ERR] = READ_REGISTER_ULONG( // S005
  328. &( PMC_GLOBAL_CONTROL1_OR( 0<<PMC_CPU_SHIFT ) )->ERR.Long
  329. );
  330. HalpEifRegisterBuffer[PMC0_AERR] = READ_REGISTER_ULONG( // S005
  331. &( PMC_GLOBAL_CONTROL1_OR( 0<<PMC_CPU_SHIFT ) )->AERR.Long
  332. );
  333. /* End S001 */
  334. }
  335. if( (buffer & SCFR_CPU1_CONNECT) == 0 ) { // S004
  336. /* Start S001,S002 */
  337. HalpEifRegisterBuffer[PMC1_ERR] = READ_REGISTER_ULONG( // S005
  338. &( PMC_GLOBAL_CONTROL1_OR( 1<<PMC_CPU_SHIFT ) )->ERR.Long
  339. );
  340. HalpEifRegisterBuffer[PMC1_AERR] = READ_REGISTER_ULONG( // S005
  341. &( PMC_GLOBAL_CONTROL1_OR( 1<<PMC_CPU_SHIFT ) )->AERR.Long
  342. );
  343. /* End S001,S002 */
  344. }
  345. if( (buffer & SCFR_CPU2_CONNECT) == 0 ) { // S004
  346. /* Start S001,S002 */
  347. HalpEifRegisterBuffer[PMC2_ERR] = READ_REGISTER_ULONG( // S005
  348. &( PMC_GLOBAL_CONTROL1_OR( 2<<PMC_CPU_SHIFT ) )->ERR.Long
  349. );
  350. HalpEifRegisterBuffer[PMC2_AERR] = READ_REGISTER_ULONG( // S005
  351. &( PMC_GLOBAL_CONTROL1_OR( 2<<PMC_CPU_SHIFT ) )->AERR.Long
  352. );
  353. /* End S001,S002 */
  354. }
  355. if( (buffer & SCFR_CPU3_CONNECT) == 0 ) { // S004
  356. /* Start S001,S002 */
  357. HalpEifRegisterBuffer[PMC3_ERR] = READ_REGISTER_ULONG( // S005
  358. &( PMC_GLOBAL_CONTROL1_OR( 3<<PMC_CPU_SHIFT ) )->ERR.Long
  359. );
  360. HalpEifRegisterBuffer[PMC3_AERR] = READ_REGISTER_ULONG( // S005
  361. &( PMC_GLOBAL_CONTROL1_OR( 3<<PMC_CPU_SHIFT ) )->AERR.Long
  362. );
  363. /* End S001,S002 */
  364. }
  365. /* Start S001 */
  366. HalpEifRegisterBuffer[PMC_EADRH] = READ_REGISTER_ULONG( // S005
  367. &( PMC_CONTROL2 )->EADRH.Long
  368. );
  369. HalpEifRegisterBuffer[PMC_EADRL] = READ_REGISTER_ULONG( // S005
  370. &( PMC_CONTROL2 )->EADRL.Long
  371. );
  372. /* End S001 */
  373. //
  374. // get register value on IERR, AMAH, AMAL, ANAH, ANAL,MPER and EIFR
  375. // registers of IOB.
  376. //
  377. HalpEifRegisterBuffer[IOB_IERR] = READ_REGISTER_ULONG( // S005
  378. &( IOB_CONTROL )->IERR.Long,
  379. );
  380. IOB_DUMMY_READ; // S003
  381. HalpEifRegisterBuffer[IOB_AMAH] = READ_REGISTER_ULONG( // S005
  382. &( IOB_CONTROL )->AMAH.Long,
  383. );
  384. IOB_DUMMY_READ; // S003
  385. HalpEifRegisterBuffer[IOB_AMAL] = READ_REGISTER_ULONG( // S005
  386. &( IOB_CONTROL )->AMAL.Long,
  387. );
  388. IOB_DUMMY_READ; // S003
  389. HalpEifRegisterBuffer[IOB_ANAH] = READ_REGISTER_ULONG( // S005
  390. &( IOB_CONTROL )->ANAH.Long,
  391. );
  392. IOB_DUMMY_READ; // S003
  393. HalpEifRegisterBuffer[IOB_ANAL] = READ_REGISTER_ULONG( // S005
  394. &( IOB_CONTROL )->ANAL.Long,
  395. );
  396. IOB_DUMMY_READ; // S003
  397. HalpEifRegisterBuffer[IOB_MPER] = READ_REGISTER_ULONG( // S005
  398. &( IOB_CONTROL )->MPER.Long,
  399. );
  400. IOB_DUMMY_READ; // S003
  401. HalpEifRegisterBuffer[IOB_EIFR] = READ_REGISTER_ULONG( // S005
  402. &( IOB_CONTROL )->EIFR.Long,
  403. );
  404. IOB_DUMMY_READ; // S003
  405. //
  406. // get register value on EIF0, EIF1, STS1, STS2 and DSRG registers of SIC.
  407. //
  408. if( (buffer & SCFR_SIC_SET0_CONNECT) == 0 ) { // S004
  409. /* Start S001 */
  410. HalpEifRegisterBuffer[SIC_N0_EIF0] = READ_REGISTER_ULONG( // S005
  411. &( SIC_ERR_CONTROL_OR( SIC_NO0_OFFSET ) )->EIF0.Long,
  412. );
  413. SIC_DUMMY_READ; // S003
  414. HalpEifRegisterBuffer[SIC_N1_EIF0] = READ_REGISTER_ULONG( // S005
  415. &( SIC_ERR_CONTROL_OR( SIC_NO1_OFFSET ) )->EIF0.Long,
  416. );
  417. SIC_DUMMY_READ; // S003
  418. HalpEifRegisterBuffer[SIC_N0_EIF1] = READ_REGISTER_ULONG( // S005
  419. &( SIC_ERR_CONTROL_OR( SIC_NO0_OFFSET ) )->EIF1.Long,
  420. );
  421. SIC_DUMMY_READ; // S003
  422. HalpEifRegisterBuffer[SIC_N1_EIF1] = READ_REGISTER_ULONG( // S005
  423. &( SIC_ERR_CONTROL_OR( SIC_NO1_OFFSET ) )->EIF1.Long,
  424. );
  425. SIC_DUMMY_READ; // S003
  426. HalpEifRegisterBuffer[SIC_N0_STS1] = READ_REGISTER_ULONG( // S005
  427. &( SIC_ERR_CONTROL_OR( SIC_NO0_OFFSET ) )->STS1.Long,
  428. );
  429. SIC_DUMMY_READ; // S003
  430. HalpEifRegisterBuffer[SIC_N1_STS1] = READ_REGISTER_ULONG( // S005
  431. &( SIC_ERR_CONTROL_OR( SIC_NO1_OFFSET ) )->STS1.Long,
  432. );
  433. SIC_DUMMY_READ; // S003
  434. HalpEifRegisterBuffer[SIC_N0_STS2] = READ_REGISTER_ULONG( // S005
  435. &( SIC_ERR_CONTROL_OR( SIC_NO0_OFFSET ) )->STS2.Long,
  436. );
  437. SIC_DUMMY_READ; // S003
  438. HalpEifRegisterBuffer[SIC_N1_STS2] = READ_REGISTER_ULONG( // S005
  439. &( SIC_ERR_CONTROL_OR( SIC_NO1_OFFSET ) )->STS2.Long,
  440. );
  441. SIC_DUMMY_READ; // S003
  442. HalpEifRegisterBuffer[SIC_N0_DSRG] = READ_REGISTER_ULONG( // S005
  443. &( SIC_DATA_CONTROL_OR( SIC_NO0_OFFSET ) )->DSRG.Long,
  444. );
  445. SIC_DUMMY_READ; // S003
  446. HalpEifRegisterBuffer[SIC_N1_DSRG] = READ_REGISTER_ULONG( // S005
  447. &( SIC_DATA_CONTROL_OR( SIC_NO1_OFFSET ) )->DSRG.Long,
  448. );
  449. SIC_DUMMY_READ; // S003
  450. /* End S001 */
  451. }
  452. if( (buffer & SCFR_SIC_SET1_CONNECT) == 0 ) { // S004
  453. /* Start S001 */
  454. HalpEifRegisterBuffer[SIC_N2_EIF0] = READ_REGISTER_ULONG( // S005
  455. &( SIC_ERR_CONTROL_OR( SIC_NO2_OFFSET ) )->EIF0.Long,
  456. );
  457. SIC_DUMMY_READ; // S003
  458. HalpEifRegisterBuffer[SIC_N3_EIF0] = READ_REGISTER_ULONG( // S005
  459. &( SIC_ERR_CONTROL_OR( SIC_NO3_OFFSET ) )->EIF0.Long,
  460. );
  461. SIC_DUMMY_READ; // S003
  462. HalpEifRegisterBuffer[SIC_N2_EIF1] = READ_REGISTER_ULONG( // S005
  463. &( SIC_ERR_CONTROL_OR( SIC_NO2_OFFSET ) )->EIF1.Long,
  464. );
  465. SIC_DUMMY_READ; // S003
  466. HalpEifRegisterBuffer[SIC_N3_EIF1] = READ_REGISTER_ULONG( // S005
  467. &( SIC_ERR_CONTROL_OR( SIC_NO3_OFFSET ) )->EIF1.Long,
  468. );
  469. SIC_DUMMY_READ; // S003
  470. HalpEifRegisterBuffer[SIC_N2_STS1] = READ_REGISTER_ULONG( // S005
  471. &( SIC_ERR_CONTROL_OR( SIC_NO2_OFFSET ) )->STS1.Long,
  472. );
  473. SIC_DUMMY_READ; // S003
  474. HalpEifRegisterBuffer[SIC_N3_STS1] = READ_REGISTER_ULONG( // S005
  475. &( SIC_ERR_CONTROL_OR( SIC_NO3_OFFSET ) )->STS1.Long,
  476. );
  477. SIC_DUMMY_READ; // S003
  478. HalpEifRegisterBuffer[SIC_N2_STS2] = READ_REGISTER_ULONG( // S005
  479. &( SIC_ERR_CONTROL_OR( SIC_NO2_OFFSET ) )->STS2.Long,
  480. );
  481. SIC_DUMMY_READ; // S003
  482. HalpEifRegisterBuffer[SIC_N3_STS2] = READ_REGISTER_ULONG( // S005
  483. &( SIC_ERR_CONTROL_OR( SIC_NO3_OFFSET ) )->STS2.Long,
  484. );
  485. SIC_DUMMY_READ; // S003
  486. HalpEifRegisterBuffer[SIC_N2_DSRG] = READ_REGISTER_ULONG( // S005
  487. &( SIC_DATA_CONTROL_OR( SIC_NO2_OFFSET ) )->DSRG.Long,
  488. );
  489. SIC_DUMMY_READ; // S003
  490. HalpEifRegisterBuffer[SIC_N3_DSRG] = READ_REGISTER_ULONG( // S005
  491. &( SIC_DATA_CONTROL_OR( SIC_NO3_OFFSET ) )->DSRG.Long,
  492. );
  493. SIC_DUMMY_READ; // S003
  494. /* End S001 */
  495. }
  496. //
  497. // get register value on ERRS, PEAR and AEAR registers of LR4360.
  498. //
  499. HalpEifRegisterBuffer[LR_ERRS] = errsBuffer; // S005
  500. HalpEifRegisterBuffer[LR_PEAR] = READ_REGISTER_ULONG( // S005
  501. &( LR_PCI_DEV_REG_CONTROL )->PEAR,
  502. );
  503. HalpEifRegisterBuffer[LR_AEAR] = READ_REGISTER_ULONG( // S005
  504. &( LR_PCI_DEV_REG_CONTROL )->AEAR,
  505. );
  506. //
  507. // Display EISA Nmi status.
  508. //
  509. charBuffer = READ_REGISTER_UCHAR( &((PEISA_CONTROL)HalpEisaControlBase )->NmiStatus);
  510. HalpEifRegisterBuffer[EISA_NMI] = charBuffer << 24; // S001, S005
  511. charBuffer = READ_REGISTER_UCHAR(
  512. &( (PEISA_CONTROL)HalpEisaControlBase )->ExtendedNmiResetControl
  513. );
  514. HalpEifRegisterBuffer[EISA_NMI] |= charBuffer << 16; // S001, S005
  515. //
  516. // Look for any Eisa expansion board. See if it asserted NMI.
  517. //
  518. for (EisaPort = 0; EisaPort <= 0xf; EisaPort++) {
  519. port = (EisaPort << 12) + 0xC80;
  520. port += (ULONG) HalpEisaControlBase;
  521. WRITE_PORT_UCHAR ((PUCHAR) port, 0xff);
  522. charBuffer = READ_PORT_UCHAR ((PUCHAR) port);
  523. if ((charBuffer & 0x80) == 0) {
  524. //
  525. // Found valid Eisa board, Check to see if it's
  526. // if IOCHKERR is asserted.
  527. //
  528. charBuffer = READ_PORT_UCHAR ((PUCHAR) port+4);
  529. if (charBuffer & 0x2) {
  530. HalpEifRegisterBuffer[EISA_NMI] |= EisaPort; // S005
  531. }
  532. }
  533. }
  534. #ifdef DBG // R98TEMP
  535. KdPrint(("HAL: EIF Interrupt\n"));
  536. #endif // R98TEMP
  537. // Start S005
  538. for( counter=0 ; counter<REG_BUFFER_SIZE ; counter++) {
  539. sprintf( (char *)messageBuffer, "0x%08lX,", HalpEifRegisterBuffer[counter] );
  540. HalDisplayString( (char *)messageBuffer );
  541. #ifdef DBG // R98TEMP
  542. KdPrint(( (char *)messageBuffer ));
  543. #endif // R98TEMP
  544. if( (counter % 7) == 6 ) {
  545. sprintf( (char *)messageBuffer, "\n");
  546. HalDisplayString( (char *)messageBuffer );
  547. #ifdef DBG // R98TEMP
  548. KdPrint(( (char *)messageBuffer ));
  549. #endif // R98TEMP
  550. }
  551. }
  552. #if defined(_R98DBG_)
  553. sprintf( (char *)messageBuffer, "\n");
  554. HalDisplayString( (char *)messageBuffer );
  555. KdPrint(( (char *)messageBuffer ));
  556. HalpChangePanicFlag( 16, 0x01, 0x10); // S00c
  557. eifrbuf = (PEIFR_REGISTER)(&(HalpEifRegisterBuffer[IOB_EIFR]));
  558. if( eifrbuf->PMC0ERR == 1){
  559. sprintf( (char *)messageBuffer,
  560. "EIF Interrupt from PMC0: ERR=0x%08lX, AERR=0x%08lX\n"
  561. " EADRH=0x%08lX, EADRL=0x%08lX\n",
  562. HalpEifRegisterBuffer[PMC0_ERR],
  563. HalpEifRegisterBuffer[PMC0_AERR],
  564. HalpEifRegisterBuffer[PMC_EADRH],
  565. HalpEifRegisterBuffer[PMC_EADRL]
  566. );
  567. HalDisplayString( (char *)messageBuffer );
  568. KdPrint(( (char *)messageBuffer ));
  569. }
  570. if( eifrbuf->PMC1ERR == 1){
  571. sprintf( (char *)messageBuffer,
  572. "EIF Interrupt from PMC1: ERR=0x%08lX, AERR=0x%08lX\n"
  573. " EADRH=0x%08lX, EADRL=0x%08lX\n",
  574. HalpEifRegisterBuffer[PMC1_ERR],
  575. HalpEifRegisterBuffer[PMC1_AERR],
  576. HalpEifRegisterBuffer[PMC_EADRH],
  577. HalpEifRegisterBuffer[PMC_EADRL]
  578. );
  579. HalDisplayString( (char *)messageBuffer );
  580. KdPrint(( (char *)messageBuffer ));
  581. }
  582. if( eifrbuf->PMC2ERR == 1){
  583. sprintf( (char *)messageBuffer,
  584. "EIF Interrupt from PMC2: ERR=0x%08lX, AERR=0x%08lX\n"
  585. " EADRH=0x%08lX, EADRL=0x%08lX\n",
  586. HalpEifRegisterBuffer[PMC2_ERR],
  587. HalpEifRegisterBuffer[PMC2_AERR],
  588. HalpEifRegisterBuffer[PMC_EADRH],
  589. HalpEifRegisterBuffer[PMC_EADRL]
  590. );
  591. HalDisplayString( (char *)messageBuffer );
  592. KdPrint(( (char *)messageBuffer ));
  593. }
  594. if( eifrbuf->PMC3ERR == 1){
  595. sprintf( (char *)messageBuffer,
  596. "EIF Interrupt from PMC3: ERR=0x%08lX, AERR=0x%08lX\n"
  597. " EADRH=0x%08lX, EADRL=0x%08lX\n",
  598. HalpEifRegisterBuffer[PMC3_ERR],
  599. HalpEifRegisterBuffer[PMC3_AERR],
  600. HalpEifRegisterBuffer[PMC_EADRH],
  601. HalpEifRegisterBuffer[PMC_EADRL]
  602. );
  603. HalDisplayString( (char *)messageBuffer );
  604. KdPrint(( (char *)messageBuffer ));
  605. }
  606. if( eifrbuf->SIC0ERR == 1){
  607. sprintf( (char *)messageBuffer,
  608. "EIF Interrupt from SIC SET0\n"
  609. " No0 Status: EIF0=0x%08lX, EIF1=0x%08lX, DSRG=0x%08lX\n"
  610. " STS1=0x%08lX, STS2=0x%08lX\n"
  611. " No1 Status: EIF0=0x%08lX, EIF1=0x%08lX, DSRG=0x%08lX\n"
  612. " STS1=0x%08lX, STS2=0x%08lX\n",
  613. HalpEifRegisterBuffer[SIC_N0_EIF0],
  614. HalpEifRegisterBuffer[SIC_N0_EIF1],
  615. HalpEifRegisterBuffer[SIC_N0_DSRG],
  616. HalpEifRegisterBuffer[SIC_N0_STS1],
  617. HalpEifRegisterBuffer[SIC_N0_STS2],
  618. HalpEifRegisterBuffer[SIC_N1_EIF0],
  619. HalpEifRegisterBuffer[SIC_N1_EIF1],
  620. HalpEifRegisterBuffer[SIC_N1_DSRG],
  621. HalpEifRegisterBuffer[SIC_N1_STS1],
  622. HalpEifRegisterBuffer[SIC_N1_STS2]
  623. );
  624. HalDisplayString( (char *)messageBuffer );
  625. KdPrint(( (char *)messageBuffer ));
  626. }
  627. if( eifrbuf->SIC1ERR == 1){
  628. sprintf( (char *)messageBuffer,
  629. "EIF Interrupt from SIC SET1\n"
  630. " No2 Status: EIF0=0x%08lX, EIF1=0x%08lX, DSRG=0x%08lX\n"
  631. " STS1=0x%08lX, STS2=0x%08lX\n"
  632. " No3 Status: EIF0=0x%08lX, EIF1=0x%08lX, DSRG=0x%08lX\n"
  633. " STS1=0x%08lX, STS2=0x%08lX\n",
  634. HalpEifRegisterBuffer[SIC_N2_EIF0],
  635. HalpEifRegisterBuffer[SIC_N2_EIF1],
  636. HalpEifRegisterBuffer[SIC_N2_DSRG],
  637. HalpEifRegisterBuffer[SIC_N2_STS1],
  638. HalpEifRegisterBuffer[SIC_N2_STS2],
  639. HalpEifRegisterBuffer[SIC_N3_EIF0],
  640. HalpEifRegisterBuffer[SIC_N3_EIF1],
  641. HalpEifRegisterBuffer[SIC_N3_DSRG],
  642. HalpEifRegisterBuffer[SIC_N3_STS1],
  643. HalpEifRegisterBuffer[SIC_N3_STS2]
  644. );
  645. HalDisplayString( (char *)messageBuffer );
  646. KdPrint(( (char *)messageBuffer ));
  647. }
  648. if( HalpLRErrorFlag == 1 ){ // S011
  649. sprintf( (char *)messageBuffer,
  650. "LR4360 Error Acknowledge Interrupt:\n" // S011
  651. " ERRS=0x%08lX, PEAR=0x%08lX, AEAR=0x%08lX\n", // S011
  652. HalpEifRegisterBuffer[LR_ERRS],
  653. HalpEifRegisterBuffer[LR_PEAR],
  654. HalpEifRegisterBuffer[LR_AEAR]
  655. );
  656. HalDisplayString( (char *)messageBuffer );
  657. KdPrint(( (char *)messageBuffer ));
  658. }
  659. if( (eifrbuf->IOBERR == 1) || (eifrbuf->MPDISCN == 1) ){
  660. sprintf( (char *)messageBuffer,
  661. "EIF Interrupt from IOB: IERR=0x%08lX, AMAH=0x%08lX, AMAL=0x%08lX\n"
  662. " ANAH=0x%08lX, ANAL=0x%08lX, EIFR=0x%08lX, MPER=0x%08lX\n",
  663. HalpEifRegisterBuffer[IOB_IERR],
  664. HalpEifRegisterBuffer[IOB_AMAH],
  665. HalpEifRegisterBuffer[IOB_AMAL],
  666. HalpEifRegisterBuffer[IOB_ANAH],
  667. HalpEifRegisterBuffer[IOB_ANAL],
  668. HalpEifRegisterBuffer[IOB_EIFR],
  669. HalpEifRegisterBuffer[IOB_MPER]
  670. );
  671. HalDisplayString( (char *)messageBuffer );
  672. KdPrint(( (char *)messageBuffer ));
  673. }
  674. if( eifrbuf->EISANMI == 1){
  675. sprintf( (char *)messageBuffer,
  676. "EIF Interrupt from EISA NMI: NmiStatus=0x%02lX\n"
  677. " ExtendedNmiResetControl=0x%02lX, Port=%d\n",
  678. ((HalpEifRegisterBuffer[EISA_NMI] >> 24) & 0xff),
  679. ((HalpEifRegisterBuffer[EISA_NMI] >> 16) & 0xff),
  680. (HalpEifRegisterBuffer[EISA_NMI] & 0xff)
  681. );
  682. HalDisplayString( (char *)messageBuffer );
  683. KdPrint(( (char *)messageBuffer ));
  684. }
  685. // S010 vvv
  686. if( (HalpNMIFlag & 0x0000008) != 0 ) {
  687. sprintf( (char *)messageBuffer,
  688. "NMI from MRC\n"
  689. );
  690. HalDisplayString( (char *)messageBuffer );
  691. KdPrint(( (char *)messageBuffer ));
  692. }
  693. // S010 ^^^
  694. #endif
  695. // End S005
  696. EifOwnFlg == 0;
  697. KeBugCheckEx(NMI_HARDWARE_FAILURE,
  698. HalpEifRegisterBuffer[IOB_EIFR],
  699. HalpNMIFlag, // S010
  700. HalpLRErrorFlag ? HalpEifRegisterBuffer[LR_ERRS] : 0, // S011
  701. 0
  702. ); // S009
  703. }