diff options
Diffstat (limited to 'config.c')
-rw-r--r-- | config.c | 360 |
1 files changed, 149 insertions, 211 deletions
@@ -3,30 +3,36 @@ * Released under version 2 of the Gnu Public License. * By Chris Brady * ---------------------------------------------------- - * MemTest86+ V4.00 Specific code (GPL V2.0) + * MemTest86+ V5.00 Specific code (GPL V2.0) * By Samuel DEMEULEMEESTER, sdemeule@memtest.org * http://www.x86-secret.com - http://www.memtest.org */ #include "test.h" #include "screen_buffer.h" -#include "controller.h" #include "dmi.h" -#define ITER 20 extern int bail, beepmode; extern struct tseq tseq[]; extern short e820_nr; -extern char memsz_mode; -extern int find_ticks_for_pass(); -//void performance(); +void performance(); +extern volatile short cpu_mode; +extern volatile int test; +extern void find_chunks(); +extern volatile short start_seq; +extern short restart_flag; +extern short onepass; +extern short btflag; + +extern void get_list(int x, int y, int len, char *buf); char save[2][POP_H][POP_W]; char save2[2][POP2_H][POP2_W]; void get_config() { - int flag = 0, sflag = 0, i, prt = 0; - int reprint_screen = 0; + int flag = 0, sflag = 0, i, j, k, n, m, prt = 0; + int reprint_screen = 0; + char cp[64]; ulong page; popup(); @@ -35,14 +41,12 @@ void get_config() cprint(POP_Y+1, POP_X+2, "Settings:"); cprint(POP_Y+3, POP_X+6, "(1) Test Selection"); cprint(POP_Y+4, POP_X+6, "(2) Address Range"); - cprint(POP_Y+5, POP_X+6, "(3) Memory Sizing"); - cprint(POP_Y+6, POP_X+6, "(4) Error Report Mode"); - cprint(POP_Y+7, POP_X+6, "(5) Show DMI Memory Info"); - cprint(POP_Y+8, POP_X+6, "(6) ECC Mode"); - cprint(POP_Y+9, POP_X+6, "(7) Restart"); - cprint(POP_Y+10, POP_X+6, "(8) Refresh Screen"); - cprint(POP_Y+11, POP_X+6, "(9) Display SPD Data"); - cprint(POP_Y+12, POP_X+6, "(0) Continue"); + cprint(POP_Y+5, POP_X+6, "(3) Error Report Mode"); + cprint(POP_Y+6, POP_X+6, "(4) Core Selection"); + cprint(POP_Y+7, POP_X+6, "(5) Refresh Screen"); + cprint(POP_Y+8, POP_X+6, "(6) Display DMI Data"); + cprint(POP_Y+9, POP_X+6, "(7) Display SPD Data"); + cprint(POP_Y+11, POP_X+6, "(0) Continue"); /* Wait for key release */ /* Fooey! This nuts'es up the serial input. */ @@ -55,9 +59,8 @@ void get_config() cprint(POP_Y+3, POP_X+6, "(1) Default Tests"); cprint(POP_Y+4, POP_X+6, "(2) Skip Current Test"); cprint(POP_Y+5, POP_X+6, "(3) Select Test"); - cprint(POP_Y+6, POP_X+6, "(4) Select Bit Fade Test"); - //cprint(POP_Y+7, POP_X+6, "(5) Select Uncached Test"); - cprint(POP_Y+8, POP_X+6, "(0) Continue"); + cprint(POP_Y+6, POP_X+6, "(4) Enter Test List"); + cprint(POP_Y+7, POP_X+6, "(0) Cancel"); if (v->testsel < 0) { cprint(POP_Y+3, POP_X+5, ">"); } else { @@ -67,14 +70,14 @@ void get_config() while (!sflag) { switch(get_key()) { case 2: - /* Default */ - if (v->testsel >= 9) { - bail++; + /* Default - All tests */ + i = 0; + while (tseq[i].cpu_sel) { + tseq[i].sel = 1; + i++; } - v->testsel = -1; find_ticks_for_pass(); sflag++; - cprint(LINE_INFO, COL_TST, "Std"); break; case 3: /* Skip test */ @@ -87,47 +90,79 @@ void get_config() cprint(POP_Y+1, POP_X+3, "Test Selection:"); cprint(POP_Y+4, POP_X+5, - "Test Number [0-9]: "); - i = getval(POP_Y+4, POP_X+24, 0); - if (i <= 9) { - if (i != v->testsel) { - v->pass = -1; - v->test = -1; + "Test Number [1-11]: "); + n = getval(POP_Y+4, POP_X+24, 0) - 1; + if (n <= 11) + { + /* Deselect all tests */ + i = 0; + while (tseq[i].cpu_sel) { + tseq[i].sel = 0; + i++; + } + /* Now set the selection */ + tseq[n].sel = 1; + v->pass = -1; + test = n; + find_ticks_for_pass(); + sflag++; + bail++; } - v->testsel = i; - } - find_ticks_for_pass(); - sflag++; - bail++; - cprint(LINE_INFO, COL_TST, "#"); - dprint(LINE_INFO, COL_TST+1, i, 2, 1); break; case 5: - if (v->testsel != 9) { - v->pass = -1; - v->test = -1; + /* Enter a test list */ + popclear(); + cprint(POP_Y+1, POP_X+3, + "Enter a comma separated list"); + cprint(POP_Y+2, POP_X+3, + "of tests to execute:"); + cprint(POP_Y+5, POP_X+5, "List: "); + /* Deselect all tests */ + k = 0; + while (tseq[k].cpu_sel) { + tseq[k].sel = 0; + k++; } - v->testsel = 9; - find_ticks_for_pass(); - sflag++; - bail++; - cprint(LINE_INFO, COL_TST, "#"); - dprint(LINE_INFO, COL_TST+1, 9, 3, 1); - break; -/* - case 6: - if (v->testsel != 10) { - v->pass = -1; - v->test = -1; + + /* Get the list */ + for (i=0; i<64; i++) cp[i] = 0; + get_list(POP_Y+5, POP_X+10, 64, cp); + + /* Now enable all of the tests in the + * list */ + i = j = m = 0; + while (1) { + if (isdigit(cp[i])) { + n = cp[i]-'0'; + j = j*10 + n; + i++; + if (cp[i] == ',' || cp[i] == 0){ + if (j < k) { + tseq[j].sel = 1; + m++; + } + if (cp[i] == 0) break; + j = 0; + i++; + } + } } - v->testsel = 9+1; + + /* If we didn't select at least one + * test turn them all back on */ + if (m == 0) { + k = 0; + while (tseq[k].cpu_sel) { + tseq[k].sel = 1; + k++; + } + } + v->pass = -1; + test = n; find_ticks_for_pass(); sflag++; - bail++; - cprint(LINE_INFO, COL_TST, "#"); - dprint(LINE_INFO, COL_TST+1, 10, 3, 1); + bail++; break; -*/ case 11: case 57: sflag++; @@ -143,7 +178,7 @@ void get_config() cprint(POP_Y+3, POP_X+6, "(1) Set Lower Limit"); cprint(POP_Y+4, POP_X+6, "(2) Set Upper Limit"); cprint(POP_Y+5, POP_X+6, "(3) Test All Memory"); - cprint(POP_Y+6, POP_X+6, "(0) Continue"); + cprint(POP_Y+6, POP_X+6, "(0) Cancel"); wait_keyup(); while (!sflag) { switch(get_key()) { @@ -160,10 +195,11 @@ void get_config() page = getval(POP_Y+6, POP_X+9, 12); if (page + 1 <= v->plim_upper) { v->plim_lower = page; - v->test--; + test--; bail++; } adj_mem(); + find_chunks(); find_ticks_for_pass(); sflag++; break; @@ -180,20 +216,23 @@ void get_config() page = getval(POP_Y+6, POP_X+9, 12); if (page - 1 >= v->plim_lower) { v->plim_upper = page; - v->test--; bail++; + test--; } adj_mem(); + find_chunks(); find_ticks_for_pass(); sflag++; break; case 4: /* All of memory */ v->plim_lower = 0; - v->plim_upper = v->pmap[v->msegs - 1].end; - v->test--; + v->plim_upper = + v->pmap[v->msegs - 1].end; + test--; bail++; adj_mem(); + find_chunks(); find_ticks_for_pass(); sflag++; break; @@ -207,59 +246,20 @@ void get_config() popclear(); break; case 4: - /* 3 - Memory Sizing */ - popclear(); - cprint(POP_Y+1, POP_X+2, "Memory Sizing:"); - cprint(POP_Y+3, POP_X+6, "(1) BIOS - Std"); - cprint(POP_Y+4, POP_X+6, "(2) Probe"); - cprint(POP_Y+5, POP_X+6, "(0) Continue"); - if(!e820_nr){ - if (memsz_mode == SZ_MODE_BIOS) { - cprint(POP_Y+3, POP_X+5, ">"); - } else { - cprint(POP_Y+4, POP_X+5, ">"); - } - } - wait_keyup(); - while (!sflag) { - switch(get_key()) { - case 2: - memsz_mode = SZ_MODE_BIOS; - wait_keyup(); - restart(); - - break; - case 3: - memsz_mode = SZ_MODE_PROBE; - wait_keyup(); - restart(); - - break; - case 11: - case 57: - /* 0/CR - Continue */ - sflag++; - break; - } - } - popclear(); - break; - case 5: - /* 4 - Show error Mode */ + /* Error Mode */ popclear(); cprint(POP_Y+1, POP_X+2, "Printing Mode:"); cprint(POP_Y+3, POP_X+6, "(1) Error Summary"); cprint(POP_Y+4, POP_X+6, "(2) Individual Errors"); cprint(POP_Y+5, POP_X+6, "(3) BadRAM Patterns"); cprint(POP_Y+6, POP_X+6, "(4) Error Counts Only"); - cprint(POP_Y+7, POP_X+6, "(5) DMI Device Name"); - cprint(POP_Y+8, POP_X+6, "(6) Beep on Error"); - cprint(POP_Y+10, POP_X+6, "(0) Cancel"); + cprint(POP_Y+7, POP_X+6, "(5) Beep on Error"); + cprint(POP_Y+8, POP_X+6, "(0) Cancel"); cprint(POP_Y+3+v->printmode, POP_X+5, ">"); - if (beepmode) { cprint(POP_Y+8, POP_X+5, ">"); } + if (beepmode) { cprint(POP_Y+7, POP_X+5, ">"); } wait_keyup(); while (!sflag) { - switch(get_key()) { + switch(get_key()) { case 2: /* Error Summary */ v->printmode=PRINTMODE_SUMMARY; @@ -289,16 +289,10 @@ void get_config() sflag++; break; case 6: - /* Error Counts Only */ - v->printmode=PRINTMODE_DMI; - v->erri.hdr_flag = 0; - sflag++; - break; - case 7: /* Set Beep On Error mode */ beepmode = !beepmode; sflag++; - break; + break; case 11: case 57: /* 0/CR - Continue */ @@ -308,34 +302,42 @@ void get_config() } popclear(); break; - case 6: - /* Display DMI Memory Info */ - pop2up(); - print_dmi_info(); - pop2down(); - break; - case 7: - /* 6 - ECC Polling Mode */ + case 5: + /* CPU Mode */ + reprint_screen = 1; popclear(); - cprint(POP_Y+1, POP_X+2, "ECC Polling Mode:"); - cprint(POP_Y+3, POP_X+6, "(1) Recommended"); - cprint(POP_Y+4, POP_X+6, "(2) On"); - cprint(POP_Y+5, POP_X+6, "(3) Off"); - cprint(POP_Y+6, POP_X+6, "(0) Continue"); + cprint(POP_Y+1, POP_X+2, "CPU Selection Mode:"); + cprint(POP_Y+3, POP_X+6, "(1) Parallel (All)"); + cprint(POP_Y+4, POP_X+6, "(2) Round Robin (RRb)"); + cprint(POP_Y+5, POP_X+6, "(3) Sequential (Seq)"); + cprint(POP_Y+6, POP_X+6, "(0) Cancel"); + cprint(POP_Y+2+cpu_mode, POP_X+5, ">"); wait_keyup(); while(!sflag) { switch(get_key()) { case 2: - set_ecc_polling(-1); + if (cpu_mode != CPM_ALL) bail++; + cpu_mode = CPM_ALL; sflag++; + popdown(); + cprint(9,34,"All"); + popup(); break; case 3: - set_ecc_polling(1); + if (cpu_mode != CPM_RROBIN) bail++; + cpu_mode = CPM_RROBIN; sflag++; + popdown(); + cprint(9,34,"RRb"); + popup(); break; case 4: - set_ecc_polling(0); + if (cpu_mode != CPM_SEQ) bail++; + cpu_mode = CPM_SEQ; sflag++; + popdown(); + cprint(9,34,"Seq"); + popup(); break; case 11: case 57: @@ -346,15 +348,18 @@ void get_config() } popclear(); break; - case 8: - wait_keyup(); - restart(); - break; - case 9: + case 6: reprint_screen = 1; flag++; break; - case 10: + case 7: + /* Display DMI Memory Info */ + pop2up(); + print_dmi_info(); + pop2down(); + break; + case 8: + /* Display SPD Data */ popdown(); show_spd(); popup(); @@ -372,12 +377,11 @@ void get_config() if (prt) { printpatn(); } - if (reprint_screen){ - tty_print_screen(); - } + if (reprint_screen){ + tty_print_screen(); + } } - void popup() { int i, j; @@ -386,11 +390,11 @@ void popup() for (i=POP_Y; i<POP_Y + POP_H; i++) { for (j=POP_X; j<POP_X + POP_W; j++) { pp = (char *)(SCREEN_ADR + (i * 160) + (j * 2)); - save[0][i-POP_Y][j-POP_X] = *pp; /* Save screen */ - set_scrn_buf(i, j, ' '); - *pp = ' '; /* Clear */ + save[0][i-POP_Y][j-POP_X] = *pp; /* Save screen */ + set_scrn_buf(i, j, ' '); + *pp = ' '; /* Clear */ pp++; - save[1][i-POP_Y][j-POP_X] = *pp; + save[1][i-POP_Y][j-POP_X] = *pp; *pp = 0x07; /* Change Background to black */ } } @@ -406,7 +410,7 @@ void popdown() for (j=POP_X; j<POP_X + POP_W; j++) { pp = (char *)(SCREEN_ADR + (i * 160) + (j * 2)); *pp = save[0][i-POP_Y][j-POP_X]; /* Restore screen */ - set_scrn_buf(i, j, save[0][i-POP_Y][j-POP_X]); + set_scrn_buf(i, j, save[0][i-POP_Y][j-POP_X]); pp++; *pp = save[1][i-POP_Y][j-POP_X]; /* Restore color */ } @@ -423,14 +427,13 @@ void popclear() for (j=POP_X; j<POP_X + POP_W; j++) { pp = (char *)(SCREEN_ADR + (i * 160) + (j * 2)); *pp = ' '; /* Clear popup */ - set_scrn_buf(i, j, ' '); + set_scrn_buf(i, j, ' '); pp++; } } tty_print_region(POP_Y, POP_X, POP_Y+POP_H, POP_X+POP_W); } - void pop2up() { int i, j; @@ -483,16 +486,6 @@ void pop2clear() tty_print_region(POP2_Y, POP2_X, POP2_Y+POP2_H, POP2_X+POP2_W); } -void clear_screen() -{ - int i; - volatile char *pp; - - for(i=0, pp=(char *)(SCREEN_ADR); i<80*24; i++) { - *pp++ = ' '; - *pp++ = 0x07; - } -} void adj_mem(void) { @@ -536,58 +529,3 @@ void adj_mem(void) } } } - -/* -void performance() -{ - extern int l1_cache, l2_cache; - ulong speed; - int i; - - popclear(); - - cprint(POP_Y+1, POP_X+1, " Read Write Copy"); - cprint(POP_Y+3, POP_X+1, "L1 Cache:"); - speed=memspeed((ulong)mapping(0x100), (l1_cache/4)*1024, 500, MS_READ); - dprint(POP_Y+3, POP_X+10, speed, 6, 0); - speed=memspeed((ulong)mapping(0x100), (l1_cache/4)*1024, 50, MS_WRITE); - dprint(POP_Y+3, POP_X+17, speed, 6, 0); - speed=memspeed((ulong)mapping(0x100), (l1_cache/4)*1024, 50, MS_COPY); - dprint(POP_Y+3, POP_X+24, speed, 6, 0); - - if (l2_cache < l1_cache) { - i = l1_cache / 4 + l2_cache / 4; - } else { - i = l1_cache; - } - cprint(POP_Y+5, POP_X+1, "L2 Cache:"); - speed=memspeed((ulong)mapping(0x100), i*1024, 500, MS_READ); - dprint(POP_Y+5, POP_X+10, speed, 6, 0); - speed=memspeed((ulong)mapping(0x100), i*1024, 50, MS_WRITE); - dprint(POP_Y+5, POP_X+17, speed, 6, 0); - speed=memspeed((ulong)mapping(0x100), i*1024, 50, MS_COPY); - dprint(POP_Y+5, POP_X+24, speed, 6, 0); - - // Determine memory speed. To find the memory spped we use - // A block size that is 5x the sum of the L1 and L2 caches - i = (l2_cache + l1_cache) * 5; - - // Make sure that we have enough memory to do the test - if ((1 + (i * 2)) > (v->plim_upper << 2)) { - i = ((v->plim_upper <<2) - 1) / 2; - } - - - cprint(POP_Y+7, POP_X+1, "Memory:"); - speed=memspeed((ulong)mapping(0x100), i*1024, 500, MS_READ); - dprint(POP_Y+7, POP_X+10, speed, 6, 0); - speed=memspeed((ulong)mapping(0x100), i*1024, 50, MS_WRITE); - dprint(POP_Y+7, POP_X+17, speed, 6, 0); - speed=memspeed((ulong)mapping(0x100), i*1024, 50, MS_COPY); - dprint(POP_Y+7, POP_X+24, speed, 6, 0); - - wait_keyup(); - while (get_key() == 0); - popclear(); -} -*/ |