summaryrefslogtreecommitdiffstats
path: root/memtestEDK/Memtest/SingleComponents/config.c
diff options
context:
space:
mode:
Diffstat (limited to 'memtestEDK/Memtest/SingleComponents/config.c')
-rw-r--r--memtestEDK/Memtest/SingleComponents/config.c537
1 files changed, 537 insertions, 0 deletions
diff --git a/memtestEDK/Memtest/SingleComponents/config.c b/memtestEDK/Memtest/SingleComponents/config.c
new file mode 100644
index 0000000..47c2b71
--- /dev/null
+++ b/memtestEDK/Memtest/SingleComponents/config.c
@@ -0,0 +1,537 @@
+/* config.c - MemTest-86 Version 3.4
+ *
+ * Released under version 2 of the Gnu Public License.
+ * By Chris Brady
+ * ----------------------------------------------------
+ * 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 "dmi.h"
+#include "environment.h"
+
+
+#include <Library/UefiLib.h>
+
+extern int bail, beepmode;
+extern struct tseq tseq[];
+extern short e820_nr;
+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, j, k, n, m, prt = 0;
+ int reprint_screen = 0;
+ char cp[64];
+ ulong page;
+
+ popup();
+ wait_keyup();
+ while(!flag) {
+ 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) 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. */
+ sflag = 0;
+ switch(get_key()) {
+ case 2:
+ /* 1 - Test Selection */
+ popclear();
+ cprint(POP_Y+1, POP_X+2, "Test Selection:");
+ 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) Enter Test List");
+ cprint(POP_Y+7, POP_X+6, "(0) Cancel");
+ if (vv->testsel < 0) {
+ cprint(POP_Y+3, POP_X+5, ">");
+ } else {
+ cprint(POP_Y+5, POP_X+5, ">");
+ }
+ wait_keyup();
+ while (!sflag) {
+ switch(get_key()) {
+ case 2:
+ /* Default - All tests */
+ i = 0;
+ while (tseq[i].cpu_sel) {
+ tseq[i].sel = 1;
+ i++;
+ }
+ find_ticks_for_pass();
+ sflag++;
+ break;
+ case 3:
+ /* Skip test */
+ bail++;
+ sflag++;
+ break;
+ case 4:
+ /* Select test */
+ popclear();
+ cprint(POP_Y+1, POP_X+3,
+ "Test Selection:");
+ cprint(POP_Y+4, POP_X+5,
+ "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;
+ vv->pass = -1;
+ test = n;
+ find_ticks_for_pass();
+ sflag++;
+ bail++;
+ }
+ break;
+ case 5:
+ /* 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++;
+ }
+
+ /* 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 (mt86_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++;
+ }
+ }
+ }
+
+ /* 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++;
+ }
+ }
+ vv->pass = -1;
+ test = n;
+ find_ticks_for_pass();
+ sflag++;
+ bail++;
+ break;
+ case 11:
+ case 57:
+ sflag++;
+ break;
+ }
+ }
+ popclear();
+ break;
+ case 3:
+ /* 2 - Address Range */
+ popclear();
+ cprint(POP_Y+1, POP_X+2, "Test Address Range:");
+ 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) Cancel");
+ wait_keyup();
+ while (!sflag) {
+ switch(get_key()) {
+ case 2:
+ /* Lower Limit */
+ popclear();
+ cprint(POP_Y+2, POP_X+4,
+ "Lower Limit: ");
+ cprint(POP_Y+4, POP_X+4,
+ "Current: ");
+ aprint(POP_Y+4, POP_X+13, vv->plim_lower);
+ cprint(POP_Y+6, POP_X+4,
+ "New: ");
+ page = getval(POP_Y+6, POP_X+9, 12);
+ if (page + 1 <= vv->plim_upper) {
+ vv->plim_lower = page;
+ test--;
+ bail++;
+ }
+ adj_mem();
+ find_chunks();
+ find_ticks_for_pass();
+ sflag++;
+ break;
+ case 3:
+ /* Upper Limit */
+ popclear();
+ cprint(POP_Y+2, POP_X+4,
+ "Upper Limit: ");
+ cprint(POP_Y+4, POP_X+4,
+ "Current: ");
+ aprint(POP_Y+4, POP_X+13, vv->plim_upper);
+ cprint(POP_Y+6, POP_X+4,
+ "New: ");
+ page = getval(POP_Y+6, POP_X+9, 12);
+ if (page - 1 >= vv->plim_lower) {
+ vv->plim_upper = page;
+ bail++;
+ test--;
+ }
+ adj_mem();
+ find_chunks();
+ find_ticks_for_pass();
+ sflag++;
+ break;
+ case 4:
+ /* All of memory */
+ vv->plim_lower = 0;
+ vv->plim_upper =
+ vv->pmap[vv->msegs - 1].end;
+ test--;
+ bail++;
+ adj_mem();
+ find_chunks();
+ find_ticks_for_pass();
+ sflag++;
+ break;
+ case 11:
+ case 57:
+ /* 0/CR - Continue */
+ sflag++;
+ break;
+ }
+ }
+ popclear();
+ break;
+ case 4:
+ /* 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) Beep on Error");
+ cprint(POP_Y+8, POP_X+6, "(0) Cancel");
+ cprint(POP_Y+3+vv->printmode, POP_X+5, ">");
+ if (beepmode) { cprint(POP_Y+7, POP_X+5, ">"); }
+ wait_keyup();
+ while (!sflag) {
+ switch(get_key()) {
+ case 2:
+ /* Error Summary */
+ vv->printmode=PRINTMODE_SUMMARY;
+ vv->erri.eadr = 0;
+ vv->erri.hdr_flag = 0;
+ sflag++;
+ break;
+ case 3:
+ /* Separate Addresses */
+ vv->printmode=PRINTMODE_ADDRESSES;
+ vv->erri.eadr = 0;
+ vv->erri.hdr_flag = 0;
+ vv->msg_line = LINE_SCROLL-1;
+ sflag++;
+ break;
+ case 4:
+ /* BadRAM Patterns */
+ vv->printmode=PRINTMODE_PATTERNS;
+ vv->erri.hdr_flag = 0;
+ sflag++;
+ prt++;
+ break;
+ case 5:
+ /* Error Counts Only */
+ vv->printmode=PRINTMODE_NONE;
+ vv->erri.hdr_flag = 0;
+ sflag++;
+ break;
+ case 6:
+ /* Set Beep On Error mode */
+ beepmode = !beepmode;
+ sflag++;
+ break;
+ case 11:
+ case 57:
+ /* 0/CR - Continue */
+ sflag++;
+ break;
+ }
+ }
+ popclear();
+ break;
+ case 5:
+ /* CPU Mode */
+ reprint_screen = 1;
+ popclear();
+ 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:
+ if (cpu_mode != CPM_ALL) bail++;
+ cpu_mode = CPM_ALL;
+ sflag++;
+ popdown();
+ cprint(9,34,"All");
+ popup();
+ break;
+ case 3:
+ if (cpu_mode != CPM_RROBIN) bail++;
+ cpu_mode = CPM_RROBIN;
+ sflag++;
+ popdown();
+ cprint(9,34,"RRb");
+ popup();
+ break;
+ case 4:
+ if (cpu_mode != CPM_SEQ) bail++;
+ cpu_mode = CPM_SEQ;
+ sflag++;
+ popdown();
+ cprint(9,34,"Seq");
+ popup();
+ break;
+ case 11:
+ case 57:
+ /* 0/CR - Continue */
+ sflag++;
+ break;
+ }
+ }
+ popclear();
+ break;
+ case 6:
+ reprint_screen = 1;
+ flag++;
+ break;
+ case 7:
+ /* Display DMI Memory Info */
+ pop2up();
+ print_dmi_info();
+ pop2down();
+ break;
+ case 8:
+ /* Display SPD Data */
+ popdown();
+ show_spd();
+ popup();
+ sflag++;
+ break;
+ case 11:
+ case 57:
+ case 28:
+ /* 0/CR/SP - Continue */
+ flag++;
+ break;
+ }
+ }
+ popdown();
+ if (prt) {
+ printpatn();
+ }
+ if (reprint_screen){
+ tty_print_screen();
+ }
+}
+
+void popup()
+{
+ Print(L"start popup\n");
+ int i, j;
+ char *pp;
+
+ for (i=POP_Y; i<POP_Y + POP_H; i++) {
+ for (j=POP_X; j<POP_X + POP_W; j++) {
+ pp = (char *)(MAX_BLOCK_SIZE)(SCREEN_ADR + (i * 160) + (j * 2));
+ 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;
+ *pp = 0x07; /* Change Background to black */
+ }
+ }
+ tty_print_region(POP_Y, POP_X, POP_Y+POP_H, POP_X+POP_W);
+ Print(L"end popup\n");
+}
+
+void popdown()
+{
+ int i, j;
+ char *pp;
+
+ for (i=POP_Y; i<POP_Y + POP_H; i++) {
+ for (j=POP_X; j<POP_X + POP_W; j++) {
+ pp = (char *)(MAX_BLOCK_SIZE)(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]);
+ pp++;
+ *pp = save[1][i-POP_Y][j-POP_X]; /* Restore color */
+ }
+ }
+ tty_print_region(POP_Y, POP_X, POP_Y+POP_H, POP_X+POP_W);
+}
+
+void popclear()
+{
+ int i, j;
+ char *pp;
+
+ for (i=POP_Y; i<POP_Y + POP_H; i++) {
+ for (j=POP_X; j<POP_X + POP_W; j++) {
+ pp = (char *)(MAX_BLOCK_SIZE)(SCREEN_ADR + (i * 160) + (j * 2));
+ *pp = ' '; /* Clear popup */
+ 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;
+ char *pp;
+
+ for (i=POP2_Y; i<POP2_Y + POP2_H; i++) {
+ for (j=POP2_X; j<POP2_X + POP2_W; j++) {
+ pp = (char *)(MAX_BLOCK_SIZE)(SCREEN_ADR + (i * 160) + (j * 2));
+ save2[0][i-POP2_Y][j-POP2_X] = *pp; /* Save screen */
+ set_scrn_buf(i, j, ' ');
+ *pp = ' '; /* Clear */
+ pp++;
+ save2[1][i-POP2_Y][j-POP2_X] = *pp;
+ *pp = 0x07; /* Change Background to black */
+ }
+ }
+ tty_print_region(POP2_Y, POP2_X, POP2_Y+POP2_H, POP2_X+POP2_W);
+}
+
+void pop2down()
+{
+ int i, j;
+ char *pp;
+
+ for (i=POP2_Y; i<POP2_Y + POP2_H; i++) {
+ for (j=POP2_X; j<POP2_X + POP2_W; j++) {
+ pp = (char *)(MAX_BLOCK_SIZE)(SCREEN_ADR + (i * 160) + (j * 2));
+ *pp = save2[0][i-POP2_Y][j-POP2_X]; /* Restore screen */
+ set_scrn_buf(i, j, save2[0][i-POP2_Y][j-POP2_X]);
+ pp++;
+ *pp = save2[1][i-POP2_Y][j-POP2_X]; /* Restore color */
+ }
+ }
+ tty_print_region(POP2_Y, POP2_X, POP2_Y+POP2_H, POP2_X+POP2_W);
+}
+
+void pop2clear()
+{
+ int i, j;
+ char *pp;
+
+ for (i=POP2_Y; i<POP2_Y + POP2_H; i++) {
+ for (j=POP2_X; j<POP2_X + POP2_W; j++) {
+ pp = (char *)(MAX_BLOCK_SIZE)(SCREEN_ADR + (i * 160) + (j * 2));
+ *pp = ' '; /* Clear popup */
+ set_scrn_buf(i, j, ' ');
+ pp++;
+ }
+ }
+ tty_print_region(POP2_Y, POP2_X, POP2_Y+POP2_H, POP2_X+POP2_W);
+}
+
+
+void adj_mem(void)
+{
+ int i;
+
+ vv->selected_pages = 0;
+ for (i=0; i< vv->msegs; i++) {
+ /* Segment inside limits ? */
+ if (vv->pmap[i].start >= vv->plim_lower &&
+ vv->pmap[i].end <= vv->plim_upper) {
+ vv->selected_pages += (vv->pmap[i].end - vv->pmap[i].start);
+ continue;
+ }
+ /* Segment starts below limit? */
+ if (vv->pmap[i].start < vv->plim_lower) {
+ /* Also ends below limit? */
+ if (vv->pmap[i].end < vv->plim_lower) {
+ continue;
+ }
+
+ /* Ends past upper limit? */
+ if (vv->pmap[i].end > vv->plim_upper) {
+ vv->selected_pages +=
+ vv->plim_upper - vv->plim_lower;
+ } else {
+ /* Straddles lower limit */
+ vv->selected_pages +=
+ (vv->pmap[i].end - vv->plim_lower);
+ }
+ continue;
+ }
+ /* Segment ends above limit? */
+ if (vv->pmap[i].end > vv->plim_upper) {
+ /* Also starts above limit? */
+ if (vv->pmap[i].start > vv->plim_upper) {
+ continue;
+ }
+ /* Straddles upper limit */
+ vv->selected_pages +=
+ (vv->plim_upper - vv->pmap[i].start);
+ }
+ }
+}