summaryrefslogtreecommitdiffstats
path: root/error.c
diff options
context:
space:
mode:
Diffstat (limited to 'error.c')
-rw-r--r--error.c1014
1 files changed, 508 insertions, 506 deletions
diff --git a/error.c b/error.c
index 4218d8c..4b4f1f0 100644
--- a/error.c
+++ b/error.c
@@ -28,49 +28,63 @@ static void print_err_counts(void);
static void common_err();
static int syn, chan, len=1;
+static void paint_line(int msg_line, unsigned vga_color) {
+ if (msg_line < 24) {
+ char* pp;
+ int i;
+ for(i=0, pp=(char *)((SCREEN_ADR+msg_line*160+1));
+ i<76; i++, pp+=2) {
+ *pp = vga_color;
+ }
+ }
+}
+
+/*
+ * Report an assertion failure. This is typically NOT a memory error.
+ */
+void assert_fail(const char* file, int line_no) {
+ spin_lock(&barr->mutex);
+
+ scroll();
+ cprint(vv->msg_line, 0, " *** INTERNAL ERROR *** line ");
+ dprint(vv->msg_line, 31, line_no, 5, 1);
+ cprint(vv->msg_line, 37, file);
+ paint_line(vv->msg_line, 0x0E /* yellow on black */);
+
+ spin_unlock(&barr->mutex);
+
+ // Ensure the message remains visible for a while
+ // before it scrolls away. Assert-fails should be rare
+ // and may indicate that subsequent result aren't valid.
+ sleep(60, 0, 0, 0);
+}
+
/*
* Display data error message. Don't display duplicate errors.
*/
-void error(ulong *adr, ulong good, ulong bad)
+void mt86_error(ulong *adr, ulong good, ulong bad)
{
-
- ulong xor;
+ ulong xor;
- spin_lock(&barr->mutex);
-
- xor = good ^ bad;
+ spin_lock(&barr->mutex);
+
+ xor = good ^ bad;
#ifdef USB_WAR
- /* Skip any errrors that appear to be due to the BIOS using location
- * 0x4e0 for USB keyboard support. This often happens with Intel
- * 810, 815 and 820 chipsets. It is possible that we will skip
- * a real error but the odds are very low.
- */
- if ((ulong)adr == 0x4e0 || (ulong)adr == 0x410) {
- return;
- }
+ /* Skip any errors that appear to be due to the BIOS using location
+ * 0x4e0 for USB keyboard support. This often happens with Intel
+ * 810, 815 and 820 chipsets. It is possible that we will skip
+ * a real error but the odds are very low.
+ */
+ if ((ulong)adr == 0x4e0 || (ulong)adr == 0x410) {
+ return;
+ }
#endif
- /* A sporadic bug exists in test #6, with SMP enabled, that
- * reports false positives on < 65K-0.5MB range. I was
- * not able to solve this. After investigations, it seems
- * related to a BIOS issue similiar to the one solved by
- * USB_WAR, but for MP Table.
- */
- /* Solved
- if (test == 6 && (ulong)adr <= 0x07FFFF && num_cpus > 1)
- {
- cprint(6,78,"-"); // Debug
- return;
- }
- */
-
- common_err(adr, good, bad, xor, 0);
- spin_unlock(&barr->mutex);
+ common_err(adr, good, bad, xor, 0);
+ spin_unlock(&barr->mutex);
}
-
-
/*
* Display address error message.
* Since this is strictly an address test, trying to create BadRAM
@@ -78,9 +92,9 @@ void error(ulong *adr, ulong good, ulong bad)
*/
void ad_err1(ulong *adr1, ulong *mask, ulong bad, ulong good)
{
- spin_lock(&barr->mutex);
- common_err(adr1, good, bad, (ulong)mask, 1);
- spin_unlock(&barr->mutex);
+ spin_lock(&barr->mutex);
+ common_err(adr1, good, bad, (ulong)mask, 1);
+ spin_unlock(&barr->mutex);
}
/*
@@ -90,49 +104,41 @@ void ad_err1(ulong *adr1, ulong *mask, ulong bad, ulong good)
*/
void ad_err2(ulong *adr, ulong bad)
{
- spin_lock(&barr->mutex);
- common_err(adr, (ulong)adr, bad, ((ulong)adr) ^ bad, 0);
- spin_unlock(&barr->mutex);
+ spin_lock(&barr->mutex);
+ common_err(adr, (ulong)adr, bad, ((ulong)adr) ^ bad, 0);
+ spin_unlock(&barr->mutex);
}
static void update_err_counts(void)
{
- if (beepmode){
- beep(600);
- beep(1000);
- }
+ if (beepmode){
+ beep(600);
+ beep(1000);
+ }
- if (v->pass && v->ecount == 0) {
- cprint(LINE_MSG, COL_MSG,
- " ");
- }
- ++(v->ecount);
- tseq[test].errors++;
-
+ if (vv->pass && vv->ecount == 0) {
+ cprint(LINE_MSG, COL_MSG,
+ " ");
+ }
+ ++(vv->ecount);
+ tseq[test].errors++;
}
static void print_err_counts(void)
{
- int i;
- char *pp;
-
- if ((v->ecount > 4096) && (v->ecount % 256 != 0)) return;
-
- dprint(LINE_INFO, 72, v->ecount, 6, 0);
-/*
- dprint(LINE_INFO, 56, v->ecc_ecount, 6, 0);
-*/
-
- /* Paint the error messages on the screen red to provide a vivid */
- /* indicator that an error has occured */
- if ((v->printmode == PRINTMODE_ADDRESSES ||
- v->printmode == PRINTMODE_PATTERNS) &&
- v->msg_line < 24) {
- for(i=0, pp=(char *)((SCREEN_ADR+v->msg_line*160+1));
- i<76; i++, pp+=2) {
- *pp = 0x47;
- }
- }
+ if ((vv->ecount > 4096) && (vv->ecount % 256 != 0)) return;
+
+ dprint(LINE_INFO, 72, vv->ecount, 6, 0);
+ /*
+ dprint(LINE_INFO, 56, vv->ecc_ecount, 6, 0);
+ */
+
+ /* Paint the error messages on the screen red to provide a vivid */
+ /* indicator that an error has occured */
+ if ((vv->printmode == PRINTMODE_ADDRESSES ||
+ vv->printmode == PRINTMODE_PATTERNS)) {
+ paint_line(vv->msg_line, 0x47 /* gray-on-red */);
+ }
}
/*
@@ -140,264 +146,264 @@ static void print_err_counts(void)
*/
void common_err( ulong *adr, ulong good, ulong bad, ulong xor, int type)
{
- int i, j, n, x, flag=0;
- ulong page, offset;
- int patnchg;
- ulong mb;
-
- update_err_counts();
-
- switch(v->printmode) {
- case PRINTMODE_SUMMARY:
- /* Don't do anything for a parity error. */
- if (type == 3) {
- return;
- }
-
- /* Address error */
- if (type == 1) {
- xor = good ^ bad;
- }
-
- /* Ecc correctable errors */
- if (type == 2) {
- /* the bad value is the corrected flag */
- if (bad) {
- v->erri.cor_err++;
- }
- page = (ulong)adr;
- offset = good;
- } else {
- page = page_of(adr);
- offset = (ulong)adr & 0xFFF;
- }
-
- /* Calc upper and lower error addresses */
- if (v->erri.low_addr.page > page) {
- v->erri.low_addr.page = page;
- v->erri.low_addr.offset = offset;
- flag++;
- } else if (v->erri.low_addr.page == page &&
- v->erri.low_addr.offset > offset) {
- v->erri.low_addr.offset = offset;
- v->erri.high_addr.offset = offset;
- flag++;
- } else if (v->erri.high_addr.page < page) {
- v->erri.high_addr.page = page;
- flag++;
- }
- if (v->erri.high_addr.page == page &&
- v->erri.high_addr.offset < offset) {
- v->erri.high_addr.offset = offset;
- flag++;
- }
-
- /* Calc bits in error */
- for (i=0, n=0; i<32; i++) {
- if (xor>>i & 1) {
- n++;
- }
- }
- v->erri.tbits += n;
- if (n > v->erri.max_bits) {
- v->erri.max_bits = n;
- flag++;
- }
- if (n < v->erri.min_bits) {
- v->erri.min_bits = n;
- flag++;
- }
- if (v->erri.ebits ^ xor) {
- flag++;
- }
- v->erri.ebits |= xor;
-
- /* Calc max contig errors */
- len = 1;
- if ((ulong)adr == (ulong)v->erri.eadr+4 ||
- (ulong)adr == (ulong)v->erri.eadr-4 ) {
- len++;
- }
- if (len > v->erri.maxl) {
- v->erri.maxl = len;
- flag++;
- }
- v->erri.eadr = (ulong)adr;
-
- if (v->erri.hdr_flag == 0) {
- clear_scroll();
- cprint(LINE_HEADER+0, 1, "Error Confidence Value:");
- cprint(LINE_HEADER+1, 1, " Lowest Error Address:");
- cprint(LINE_HEADER+2, 1, " Highest Error Address:");
- cprint(LINE_HEADER+3, 1, " Bits in Error Mask:");
- cprint(LINE_HEADER+4, 1, " Bits in Error - Total:");
- cprint(LINE_HEADER+4, 29, "Min: Max: Avg:");
- cprint(LINE_HEADER+5, 1, " Max Contiguous Errors:");
- x = 24;
- if (dmi_initialized) {
- for ( i=0; i < MAX_DMI_MEMDEVS;){
- n = LINE_HEADER+7;
- for (j=0; j<4; j++) {
- if (dmi_err_cnts[i] >= 0) {
- dprint(n, x, i, 2, 0);
- cprint(n, x+2, ": 0");
- }
- i++;
- n++;
- }
- x += 10;
- }
- }
+ int i, j, n, x, flag=0;
+ ulong page, offset;
+ int patnchg;
+ ulong mb;
+
+ update_err_counts();
+
+ switch(vv->printmode) {
+ case PRINTMODE_SUMMARY:
+ /* Don't do anything for a parity error. */
+ if (type == 3) {
+ return;
+ }
+
+ /* Address error */
+ if (type == 1) {
+ xor = good ^ bad;
+ }
+
+ /* Ecc correctable errors */
+ if (type == 2) {
+ /* the bad value is the corrected flag */
+ if (bad) {
+ vv->erri.cor_err++;
+ }
+ page = (ulong)adr;
+ offset = good;
+ } else {
+ page = page_of(adr);
+ offset = (ulong)adr & 0xFFF;
+ }
+
+ /* Calc upper and lower error addresses */
+ if (vv->erri.low_addr.page > page) {
+ vv->erri.low_addr.page = page;
+ vv->erri.low_addr.offset = offset;
+ flag++;
+ } else if (vv->erri.low_addr.page == page &&
+ vv->erri.low_addr.offset > offset) {
+ vv->erri.low_addr.offset = offset;
+ vv->erri.high_addr.offset = offset;
+ flag++;
+ } else if (vv->erri.high_addr.page < page) {
+ vv->erri.high_addr.page = page;
+ flag++;
+ }
+ if (vv->erri.high_addr.page == page &&
+ vv->erri.high_addr.offset < offset) {
+ vv->erri.high_addr.offset = offset;
+ flag++;
+ }
+
+ /* Calc bits in error */
+ for (i=0, n=0; i<32; i++) {
+ if (xor>>i & 1) {
+ n++;
+ }
+ }
+ vv->erri.tbits += n;
+ if (n > vv->erri.max_bits) {
+ vv->erri.max_bits = n;
+ flag++;
+ }
+ if (n < vv->erri.min_bits) {
+ vv->erri.min_bits = n;
+ flag++;
+ }
+ if (vv->erri.ebits ^ xor) {
+ flag++;
+ }
+ vv->erri.ebits |= xor;
+
+ /* Calc max contig errors */
+ len = 1;
+ if ((ulong)adr == (ulong)vv->erri.eadr+4 ||
+ (ulong)adr == (ulong)vv->erri.eadr-4 ) {
+ len++;
+ }
+ if (len > vv->erri.maxl) {
+ vv->erri.maxl = len;
+ flag++;
+ }
+ vv->erri.eadr = (ulong)adr;
+
+ if (vv->erri.hdr_flag == 0) {
+ clear_scroll();
+ cprint(LINE_HEADER+0, 1, "Error Confidence Value:");
+ cprint(LINE_HEADER+1, 1, " Lowest Error Address:");
+ cprint(LINE_HEADER+2, 1, " Highest Error Address:");
+ cprint(LINE_HEADER+3, 1, " Bits in Error Mask:");
+ cprint(LINE_HEADER+4, 1, " Bits in Error - Total:");
+ cprint(LINE_HEADER+4, 29, "Min: Max: Avg:");
+ cprint(LINE_HEADER+5, 1, " Max Contiguous Errors:");
+ x = 24;
+ if (dmi_initialized) {
+ for ( i=0; i < MAX_DMI_MEMDEVS;){
+ n = LINE_HEADER+7;
+ for (j=0; j<4; j++) {
+ if (dmi_err_cnts[i] >= 0) {
+ dprint(n, x, i, 2, 0);
+ cprint(n, x+2, ": 0");
+ }
+ i++;
+ n++;
+ }
+ x += 10;
+ }
+ }
- cprint(LINE_HEADER+0, 64, "Test Errors");
- v->erri.hdr_flag++;
- }
- if (flag) {
- /* Calc bits in error */
- for (i=0, n=0; i<32; i++) {
- if (v->erri.ebits>>i & 1) {
- n++;
- }
- }
- page = v->erri.low_addr.page;
- offset = v->erri.low_addr.offset;
- mb = page >> 8;
- hprint(LINE_HEADER+1, 25, page);
- hprint2(LINE_HEADER+1, 33, offset, 3);
- cprint(LINE_HEADER+1, 36, " - . MB");
- dprint(LINE_HEADER+1, 39, mb, 5, 0);
- dprint(LINE_HEADER+1, 45, ((page & 0xF)*10)/16, 1, 0);
- page = v->erri.high_addr.page;
- offset = v->erri.high_addr.offset;
- mb = page >> 8;
- hprint(LINE_HEADER+2, 25, page);
- hprint2(LINE_HEADER+2, 33, offset, 3);
- cprint(LINE_HEADER+2, 36, " - . MB");
- dprint(LINE_HEADER+2, 39, mb, 5, 0);
- dprint(LINE_HEADER+2, 45, ((page & 0xF)*10)/16, 1, 0);
- hprint(LINE_HEADER+3, 25, v->erri.ebits);
- dprint(LINE_HEADER+4, 25, n, 2, 1);
- dprint(LINE_HEADER+4, 34, v->erri.min_bits, 2, 1);
- dprint(LINE_HEADER+4, 42, v->erri.max_bits, 2, 1);
- dprint(LINE_HEADER+4, 50, v->erri.tbits/v->ecount, 2, 1);
- dprint(LINE_HEADER+5, 25, v->erri.maxl, 7, 1);
- x = 28;
- for ( i=0; i < MAX_DMI_MEMDEVS;){
- n = LINE_HEADER+7;
- for (j=0; j<4; j++) {
- if (dmi_err_cnts[i] > 0) {
- dprint (n, x, dmi_err_cnts[i], 7, 1);
- }
- i++;
- n++;
- }
- x += 10;
- }
+ cprint(LINE_HEADER+0, 64, "Test Errors");
+ vv->erri.hdr_flag++;
+ }
+ if (flag) {
+ /* Calc bits in error */
+ for (i=0, n=0; i<32; i++) {
+ if (vv->erri.ebits>>i & 1) {
+ n++;
+ }
+ }
+ page = vv->erri.low_addr.page;
+ offset = vv->erri.low_addr.offset;
+ mb = page >> 8;
+ hprint(LINE_HEADER+1, 25, page);
+ hprint2(LINE_HEADER+1, 33, offset, 3);
+ cprint(LINE_HEADER+1, 36, " - . MB");
+ dprint(LINE_HEADER+1, 39, mb, 5, 0);
+ dprint(LINE_HEADER+1, 45, ((page & 0xF)*10)/16, 1, 0);
+ page = vv->erri.high_addr.page;
+ offset = vv->erri.high_addr.offset;
+ mb = page >> 8;
+ hprint(LINE_HEADER+2, 25, page);
+ hprint2(LINE_HEADER+2, 33, offset, 3);
+ cprint(LINE_HEADER+2, 36, " - . MB");
+ dprint(LINE_HEADER+2, 39, mb, 5, 0);
+ dprint(LINE_HEADER+2, 45, ((page & 0xF)*10)/16, 1, 0);
+ hprint(LINE_HEADER+3, 25, vv->erri.ebits);
+ dprint(LINE_HEADER+4, 25, n, 2, 1);
+ dprint(LINE_HEADER+4, 34, vv->erri.min_bits, 2, 1);
+ dprint(LINE_HEADER+4, 42, vv->erri.max_bits, 2, 1);
+ dprint(LINE_HEADER+4, 50, vv->erri.tbits/vv->ecount, 2, 1);
+ dprint(LINE_HEADER+5, 25, vv->erri.maxl, 7, 1);
+ x = 28;
+ for ( i=0; i < MAX_DMI_MEMDEVS;){
+ n = LINE_HEADER+7;
+ for (j=0; j<4; j++) {
+ if (dmi_err_cnts[i] > 0) {
+ dprint (n, x, dmi_err_cnts[i], 7, 1);
+ }
+ i++;
+ n++;
+ }
+ x += 10;
+ }
- for (i=0; tseq[i].msg != NULL; i++) {
- dprint(LINE_HEADER+1+i, 66, i, 2, 0);
- dprint(LINE_HEADER+1+i, 68, tseq[i].errors, 8, 0);
- }
- }
- if (v->erri.cor_err) {
- dprint(LINE_HEADER+6, 25, v->erri.cor_err, 8, 1);
- }
- break;
-
- case PRINTMODE_ADDRESSES:
- /* Don't display duplicate errors */
- if ((ulong)adr == (ulong)v->erri.eadr &&
- xor == v->erri.exor) {
- return;
- }
- if (v->erri.hdr_flag == 0) {
- clear_scroll();
- cprint(LINE_HEADER, 0,
-"Tst Pass Failing Address Good Bad Err-Bits Count CPU");
- cprint(LINE_HEADER+1, 0,
-"--- ---- ----------------------- -------- -------- -------- ----- ----");
- v->erri.hdr_flag++;
- }
- /* Check for keyboard input */
- check_input();
- scroll();
+ for (i=0; tseq[i].msg != NULL; i++) {
+ dprint(LINE_HEADER+1+i, 66, i, 2, 0);
+ dprint(LINE_HEADER+1+i, 68, tseq[i].errors, 8, 0);
+ }
+ }
+ if (vv->erri.cor_err) {
+ dprint(LINE_HEADER+6, 25, vv->erri.cor_err, 8, 1);
+ }
+ break;
+
+ case PRINTMODE_ADDRESSES:
+ /* Don't display duplicate errors */
+ if ((ulong)adr == (ulong)vv->erri.eadr &&
+ xor == vv->erri.exor) {
+ return;
+ }
+ if (vv->erri.hdr_flag == 0) {
+ clear_scroll();
+ cprint(LINE_HEADER, 0,
+ "Tst Pass Failing Address Good Bad Err-Bits Count CPU");
+ cprint(LINE_HEADER+1, 0,
+ "--- ---- ----------------------- -------- -------- -------- ----- ----");
+ vv->erri.hdr_flag++;
+ }
+ /* Check for keyboard input */
+ check_input();
+ scroll();
- if ( type == 2 || type == 3) {
- page = (ulong)adr;
- offset = good;
- } else {
- page = page_of(adr);
- offset = ((unsigned long)adr) & 0xFFF;
- }
- mb = page >> 8;
- dprint(v->msg_line, 0, test+1, 3, 0);
- dprint(v->msg_line, 4, v->pass, 5, 0);
- hprint(v->msg_line, 11, page);
- hprint2(v->msg_line, 19, offset, 3);
- cprint(v->msg_line, 22, " - . MB");
- dprint(v->msg_line, 25, mb, 5, 0);
- dprint(v->msg_line, 31, ((page & 0xF)*10)/16, 1, 0);
-
- if (type == 3) {
- /* ECC error */
- cprint(v->msg_line, 36,
- bad?"corrected ": "uncorrected ");
- hprint2(v->msg_line, 60, syn, 4);
- cprint(v->msg_line, 68, "ECC");
- dprint(v->msg_line, 74, chan, 2, 0);
- } else if (type == 2) {
- cprint(v->msg_line, 36, "Parity error detected ");
- } else {
- hprint(v->msg_line, 36, good);
- hprint(v->msg_line, 46, bad);
- hprint(v->msg_line, 56, xor);
- dprint(v->msg_line, 66, v->ecount, 5, 0);
- dprint(v->msg_line, 74, smp_my_cpu_num(), 2,1);
- v->erri.exor = xor;
- }
- v->erri.eadr = (ulong)adr;
- print_err_counts();
- break;
-
- case PRINTMODE_PATTERNS:
- if (v->erri.hdr_flag == 0) {
- clear_scroll();
- v->erri.hdr_flag++;
- }
- /* Do not do badram patterns from test 0 or 5 */
- if (test == 0 || test == 5) {
- return;
- }
- /* Only do patterns for data errors */
- if ( type != 0) {
- return;
- }
- /* Process the address in the pattern administration */
- patnchg=insertaddress ((ulong) adr);
- if (patnchg) {
- printpatn();
- }
- break;
-
- case PRINTMODE_NONE:
- if (v->erri.hdr_flag == 0) {
- clear_scroll();
- v->erri.hdr_flag++;
- }
- break;
- }
+ if ( type == 2 || type == 3) {
+ page = (ulong)adr;
+ offset = good;
+ } else {
+ page = page_of(adr);
+ offset = ((unsigned long)adr) & 0xFFF;
+ }
+ mb = page >> 8;
+ dprint(vv->msg_line, 0, test+1, 3, 0);
+ dprint(vv->msg_line, 4, vv->pass, 5, 0);
+ hprint(vv->msg_line, 11, page);
+ hprint2(vv->msg_line, 19, offset, 3);
+ cprint(vv->msg_line, 22, " - . MB");
+ dprint(vv->msg_line, 25, mb, 5, 0);
+ dprint(vv->msg_line, 31, ((page & 0xF)*10)/16, 1, 0);
+
+ if (type == 3) {
+ /* ECC error */
+ cprint(vv->msg_line, 36,
+ bad?"corrected ": "uncorrected ");
+ hprint2(vv->msg_line, 60, syn, 4);
+ cprint(vv->msg_line, 68, "ECC");
+ dprint(vv->msg_line, 74, chan, 2, 0);
+ } else if (type == 2) {
+ cprint(vv->msg_line, 36, "Parity error detected ");
+ } else {
+ hprint(vv->msg_line, 36, good);
+ hprint(vv->msg_line, 46, bad);
+ hprint(vv->msg_line, 56, xor);
+ dprint(vv->msg_line, 66, vv->ecount, 5, 0);
+ dprint(vv->msg_line, 74, smp_my_cpu_num(), 2,1);
+ vv->erri.exor = xor;
+ }
+ vv->erri.eadr = (ulong)adr;
+ print_err_counts();
+ break;
+
+ case PRINTMODE_PATTERNS:
+ if (vv->erri.hdr_flag == 0) {
+ clear_scroll();
+ vv->erri.hdr_flag++;
+ }
+ /* Do not do badram patterns from test 0 or 5 */
+ if (test == 0 || test == 5) {
+ return;
+ }
+ /* Only do patterns for data errors */
+ if ( type != 0) {
+ return;
+ }
+ /* Process the address in the pattern administration */
+ patnchg=insertaddress ((ulong) adr);
+ if (patnchg) {
+ printpatn();
+ }
+ break;
+
+ case PRINTMODE_NONE:
+ if (vv->erri.hdr_flag == 0) {
+ clear_scroll();
+ vv->erri.hdr_flag++;
+ }
+ break;
+ }
}
/*
* Print an ecc error
*/
void print_ecc_err(unsigned long page, unsigned long offset,
- int corrected, unsigned short syndrome, int channel)
+ int corrected, unsigned short syndrome, int channel)
{
- ++(v->ecc_ecount);
- syn = syndrome;
- chan = channel;
- common_err((ulong *)page, offset, corrected, 0, 2);
+ ++(vv->ecc_ecount);
+ syn = syndrome;
+ chan = channel;
+ common_err((ulong *)page, offset, corrected, 0, 2);
}
#ifdef PARITY_MEM
@@ -406,14 +412,14 @@ void print_ecc_err(unsigned long page, unsigned long offset,
*/
void parity_err( unsigned long edi, unsigned long esi)
{
- unsigned long addr;
-
- if (test == 5) {
- addr = esi;
- } else {
- addr = edi;
- }
- common_err((ulong *)addr, addr & 0xFFF, 0, 0, 3);
+ unsigned long addr;
+
+ if (test == 5) {
+ addr = esi;
+ } else {
+ addr = edi;
+ }
+ common_err((ulong *)addr, addr & 0xFFF, 0, 0, 3);
}
#endif
@@ -422,34 +428,34 @@ void parity_err( unsigned long edi, unsigned long esi)
*/
void printpatn (void)
{
- int idx=0;
- int x;
-
- /* Check for keyboard input */
- check_input();
-
- if (v->numpatn == 0)
- return;
-
- scroll();
-
- cprint (v->msg_line, 0, "badram=");
- x=7;
-
- for (idx = 0; idx < v->numpatn; idx++) {
-
- if (x > 80-22) {
- scroll();
- x=7;
- }
- cprint (v->msg_line, x, "0x");
- hprint (v->msg_line, x+2, v->patn[idx].adr );
- cprint (v->msg_line, x+10, ",0x");
- hprint (v->msg_line, x+13, v->patn[idx].mask);
- if (idx+1 < v->numpatn)
- cprint (v->msg_line, x+21, ",");
- x+=22;
- }
+ int idx=0;
+ int x;
+
+ /* Check for keyboard input */
+ check_input();
+
+ if (vv->numpatn == 0)
+ return;
+
+ scroll();
+
+ cprint (vv->msg_line, 0, "badram=");
+ x=7;
+
+ for (idx = 0; idx < vv->numpatn; idx++) {
+
+ if (x > 80-22) {
+ scroll();
+ x=7;
+ }
+ cprint (vv->msg_line, x, "0x");
+ hprint (vv->msg_line, x+2, vv->patn[idx].adr );
+ cprint (vv->msg_line, x+10, ",0x");
+ hprint (vv->msg_line, x+13, vv->patn[idx].mask);
+ if (idx+1 < vv->numpatn)
+ cprint (vv->msg_line, x+21, ",");
+ x+=22;
+ }
}
/*
@@ -460,168 +466,164 @@ char spin[4] = {'|','/','-','\\'};
void do_tick(int me)
{
- int i, j, pct;
- ulong h, l, n, t;
- extern int mstr_cpu;
-
- if (++spin_idx[me] > 3) {
- spin_idx[me] = 0;
- }
- cplace(8, me+7, spin[spin_idx[me]]);
+ int i, j, pct;
+ ulong h, l, n, t;
+ extern int mstr_cpu;
+
+ if (++spin_idx[me] > 3) {
+ spin_idx[me] = 0;
+ }
+ cplace(8, me+7, spin[spin_idx[me]]);
- /* Check for keyboard input */
- if (me == mstr_cpu) {
- check_input();
- }
- /* A barrier here holds the other CPUs until the configuration
- * changes are done */
- s_barrier();
-
- /* Only the first selected CPU does the update */
- if (me != mstr_cpu) {
- return;
- }
-
- /* FIXME only print serial error messages from the tick handler */
- if (v->ecount) {
- print_err_counts();
- }
+ /* Check for keyboard input */
+ if (me == mstr_cpu) {
+ check_input();
+ }
+ /* A barrier here holds the other CPUs until the configuration
+ * changes are done */
+ s_barrier();
+
+ /* Only the first selected CPU does the update */
+ if (me != mstr_cpu) {
+ return;
+ }
+
+ /* FIXME only print serial error messages from the tick handler */
+ if (vv->ecount) {
+ print_err_counts();
+ }
- nticks++;
- v->total_ticks++;
-
- if (test_ticks) {
- pct = 100*nticks/test_ticks;
- if (pct > 100) {
- pct = 100;
- }
- } else {
- pct = 0;
- }
- dprint(2, COL_MID+4, pct, 3, 0);
- i = (BAR_SIZE * pct) / 100;
- while (i > v->tptr) {
- if (v->tptr >= BAR_SIZE) {
- break;
- }
- cprint(2, COL_MID+9+v->tptr, "#");
- v->tptr++;
- }
+ nticks++;
+ vv->total_ticks++;
+
+ if (test_ticks) {
+ pct = 100*nticks/test_ticks;
+ if (pct > 100) {
+ pct = 100;
+ }
+ } else {
+ pct = 0;
+ }
+ dprint(2, COL_MID+4, pct, 3, 0);
+ i = (BAR_SIZE * pct) / 100;
+ while (i > vv->tptr) {
+ if (vv->tptr >= BAR_SIZE) {
+ break;
+ }
+ cprint(2, COL_MID+9+vv->tptr, "#");
+ vv->tptr++;
+ }
- if (v->pass_ticks) {
- pct = 100*v->total_ticks/v->pass_ticks;
- if (pct > 100) {
- pct = 100;
- }
- } else {
- pct = 0;
+ if (vv->pass_ticks) {
+ pct = 100*vv->total_ticks/vv->pass_ticks;
+ if (pct > 100) {
+ pct = 100;
+ }
+ } else {
+ pct = 0;
+ }
+ dprint(1, COL_MID+4, pct, 3, 0);
+ i = (BAR_SIZE * pct) / 100;
+ while (i > vv->pptr) {
+ if (vv->pptr >= BAR_SIZE) {
+ break;
}
- dprint(1, COL_MID+4, pct, 3, 0);
- i = (BAR_SIZE * pct) / 100;
- while (i > v->pptr) {
- if (v->pptr >= BAR_SIZE) {
- break;
- }
- cprint(1, COL_MID+9+v->pptr, "#");
- v->pptr++;
- }
-
- if (v->ecount && v->printmode == PRINTMODE_SUMMARY) {
- /* Compute confidence score */
- pct = 0;
-
- /* If there are no errors within 1mb of start - end addresses */
- h = v->pmap[v->msegs - 1].end - 0x100;
- if (v->erri.low_addr.page > 0x100 &&
- v->erri.high_addr.page < h) {
- pct += 8;
- }
-
- /* Errors for only some tests */
- if (v->pass) {
- for (i=0, n=0; tseq[i].msg != NULL; i++) {
- if (tseq[i].errors == 0) {
- n++;
- }
- }
- pct += n*3;
- } else {
- for (i=0, n=0; i<test; i++) {
- if (tseq[i].errors == 0) {
- n++;
- }
- }
- pct += n*2;
+ cprint(1, COL_MID+9+vv->pptr, "#");
+ vv->pptr++;
+ }
+
+ if (vv->ecount && vv->printmode == PRINTMODE_SUMMARY) {
+ /* Compute confidence score */
+ pct = 0;
+
+ /* If there are no errors within 1mb of start - end addresses */
+ h = vv->pmap[vv->msegs - 1].end - 0x100;
+ if (vv->erri.low_addr.page > 0x100 &&
+ vv->erri.high_addr.page < h) {
+ pct += 8;
+ }
+
+ /* Errors for only some tests */
+ if (vv->pass) {
+ for (i=0, n=0; tseq[i].msg != NULL; i++) {
+ if (tseq[i].errors == 0) {
+ n++;
+ }
+ }
+ pct += n*3;
+ } else {
+ for (i=0, n=0; i<test; i++) {
+ if (tseq[i].errors == 0) {
+ n++;
+ }
+ }
+ pct += n*2;
- }
-
- /* Only some bits in error */
- n = 0;
- if (v->erri.ebits & 0xf) n++;
- if (v->erri.ebits & 0xf0) n++;
- if (v->erri.ebits & 0xf00) n++;
- if (v->erri.ebits & 0xf000) n++;
- if (v->erri.ebits & 0xf0000) n++;
- if (v->erri.ebits & 0xf00000) n++;
- if (v->erri.ebits & 0xf000000) n++;
- if (v->erri.ebits & 0xf0000000) n++;
- pct += (8-n)*2;
-
- /* Adjust the score */
- pct = pct*100/22;
-/*
- if (pct > 100) {
- pct = 100;
- }
-*/
- dprint(LINE_HEADER+0, 25, pct, 3, 1);
- }
+ }
+
+ /* Only some bits in error */
+ n = 0;
+ if (vv->erri.ebits & 0xf) n++;
+ if (vv->erri.ebits & 0xf0) n++;
+ if (vv->erri.ebits & 0xf00) n++;
+ if (vv->erri.ebits & 0xf000) n++;
+ if (vv->erri.ebits & 0xf0000) n++;
+ if (vv->erri.ebits & 0xf00000) n++;
+ if (vv->erri.ebits & 0xf000000) n++;
+ if (vv->erri.ebits & 0xf0000000) n++;
+ pct += (8-n)*2;
+
+ /* Adjust the score */
+ pct = pct*100/22;
+ /*
+ if (pct > 100) {
+ pct = 100;
+ }
+ */
+ dprint(LINE_HEADER+0, 25, pct, 3, 1);
+ }
- /* We can't do the elapsed time unless the rdtsc instruction
- * is supported
- */
- if (cpu_id.fid.bits.rdtsc) {
- asm __volatile__(
- "rdtsc":"=a" (l),"=d" (h));
- asm __volatile__ (
- "subl %2,%0\n\t"
- "sbbl %3,%1"
- :"=a" (l), "=d" (h)
- :"g" (v->startl), "g" (v->starth),
- "0" (l), "1" (h));
- t = h * ((unsigned)0xffffffff / v->clks_msec) / 1000;
- t += (l / v->clks_msec) / 1000;
- i = t % 60;
- j = i % 10;
+ /* We can't do the elapsed time unless the rdtsc instruction
+ * is supported
+ */
+ if (cpu_id.fid.bits.rdtsc) {
+ asm __volatile__(
+ "rdtsc":"=a" (l),"=d" (h));
+ asm __volatile__ (
+ "subl %2,%0\n\t"
+ "sbbl %3,%1"
+ :"=a" (l), "=d" (h)
+ :"g" (vv->startl), "g" (vv->starth),
+ "0" (l), "1" (h));
+ t = h * ((unsigned)0xffffffff / vv->clks_msec) / 1000;
+ t += (l / vv->clks_msec) / 1000;
+ i = t % 60;
+ j = i % 10;
- if(j != v->each_sec)
- {
+ if(j != vv->each_sec)
+ {
- dprint(LINE_TIME, COL_TIME+9, i % 10, 1, 0);
- dprint(LINE_TIME, COL_TIME+8, i / 10, 1, 0);
- t /= 60;
- i = t % 60;
- dprint(LINE_TIME, COL_TIME+6, i % 10, 1, 0);
- dprint(LINE_TIME, COL_TIME+5, i / 10, 1, 0);
- t /= 60;
- dprint(LINE_TIME, COL_TIME, t, 4, 0);
+ dprint(LINE_TIME, COL_TIME+9, i % 10, 1, 0);
+ dprint(LINE_TIME, COL_TIME+8, i / 10, 1, 0);
+ t /= 60;
+ i = t % 60;
+ dprint(LINE_TIME, COL_TIME+6, i % 10, 1, 0);
+ dprint(LINE_TIME, COL_TIME+5, i / 10, 1, 0);
+ t /= 60;
+ dprint(LINE_TIME, COL_TIME, t, 4, 0);
- if(v->check_temp > 0 && !(v->fail_safe & 4))
- {
- coretemp();
- }
- v->each_sec = j;
- }
-
- }
-
-
-
- /* Poll for ECC errors */
-/*
- poll_errors();
-*/
+ if(vv->check_temp > 0 && !(vv->fail_safe & 4))
+ {
+ coretemp();
+ }
+ vv->each_sec = j;
+ }
+ }
+
+ /* Poll for ECC errors */
+ /*
+ poll_errors();
+ */
}
-