summaryrefslogtreecommitdiffstats
path: root/config.c
diff options
context:
space:
mode:
Diffstat (limited to 'config.c')
-rw-r--r--config.c360
1 files changed, 149 insertions, 211 deletions
diff --git a/config.c b/config.c
index 6d29004..18d8887 100644
--- a/config.c
+++ b/config.c
@@ -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();
-}
-*/