diff options
Diffstat (limited to 'memtestEDK/Memtest/SingleComponents/error.c')
-rw-r--r-- | memtestEDK/Memtest/SingleComponents/error.c | 629 |
1 files changed, 0 insertions, 629 deletions
diff --git a/memtestEDK/Memtest/SingleComponents/error.c b/memtestEDK/Memtest/SingleComponents/error.c deleted file mode 100644 index 4b4f1f0..0000000 --- a/memtestEDK/Memtest/SingleComponents/error.c +++ /dev/null @@ -1,629 +0,0 @@ -/* error.c - MemTest-86 Version 4.1 - * - * Released under version 2 of the Gnu Public License. - * By Chris Brady - */ -#include "stddef.h" -#include "stdint.h" -#include "test.h" -#include "config.h" -#include "cpuid.h" -#include "smp.h" -#include "dmi.h" -#include "controller.h" - -extern int dmi_err_cnts[MAX_DMI_MEMDEVS]; -extern int beepmode; -extern short dmi_initialized; -extern struct cpu_ident cpu_id; -extern struct barrier_s *barr; -extern int test_ticks, nticks; -extern struct tseq tseq[]; -extern volatile int test; -void poll_errors(); -extern int num_cpus; - -static void update_err_counts(void); -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 mt86_error(ulong *adr, ulong good, ulong bad) -{ - ulong xor; - - spin_lock(&barr->mutex); - - xor = good ^ bad; - -#ifdef USB_WAR - /* 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 - - 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 - * patterns does not make sense. Just report the error. - */ -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); -} - -/* - * Display address error message. - * Since this type of address error can also report data errors go - * ahead and generate BadRAM patterns. - */ -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); -} - -static void update_err_counts(void) -{ - if (beepmode){ - beep(600); - beep(1000); - } - - if (vv->pass && vv->ecount == 0) { - cprint(LINE_MSG, COL_MSG, - " "); - } - ++(vv->ecount); - tseq[test].errors++; -} - -static void print_err_counts(void) -{ - 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 */); - } -} - -/* - * Print an individual error - */ -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(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"); - 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 (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(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) -{ - ++(vv->ecc_ecount); - syn = syndrome; - chan = channel; - common_err((ulong *)page, offset, corrected, 0, 2); -} - -#ifdef PARITY_MEM -/* - * Print a parity error message - */ -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); -} -#endif - -/* - * Print the pattern array as a LILO boot option addressing BadRAM support. - */ -void printpatn (void) -{ - 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; - } -} - -/* - * Show progress by displaying elapsed time and update bar graphs - */ -short spin_idx[MAX_CPUS]; -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]]); - - - /* 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++; - 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 (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; - } - 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 (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" (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 != 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); - - if(vv->check_temp > 0 && !(vv->fail_safe & 4)) - { - coretemp(); - } - vv->each_sec = j; - } - } - - /* Poll for ECC errors */ - /* - poll_errors(); - */ -} |