# HG changeset patch # User Pascal Bellard # Date 1676359248 0 # Node ID e92394c9bae5bf102937fa4e097cea8cb709d137 # Parent be6d30fe521d0dc14ebfc7a09e5561b278b1798b memtest: 386/1M support diff -r be6d30fe521d -r e92394c9bae5 memtest/receipt --- a/memtest/receipt Mon Feb 13 17:17:56 2023 +0000 +++ b/memtest/receipt Tue Feb 14 07:20:48 2023 +0000 @@ -75,7 +75,7 @@ objdump -t boot/startup.o | \ awk '/patch/ { print "sed -i \"s|" $5 "|0x" $1 "|\" ../boot/setup.S" }' | sh make memtest.bin - tune_lzma memtest.bin 161,mf=bt2 LC 3 PB 2 + tune_lzma memtest.bin 208,mf=bt2 LC 3 PB 2 } diff -r be6d30fe521d -r e92394c9bae5 memtest/stuff/memtest86+-6-386.patch --- a/memtest/stuff/memtest86+-6-386.patch Mon Feb 13 17:17:56 2023 +0000 +++ b/memtest/stuff/memtest86+-6-386.patch Tue Feb 14 07:20:48 2023 +0000 @@ -83,8 +83,8 @@ + xorb %dl, %al + and $0x20, %al + jz 1f -+ movw $0x1000, %ax -+ movw %ax, %ds ++ pushw $0x1000 ++ popw %ds + movb $0xa8, %al # testb $imm %al opcode + movw %ax, patch1 + movw %ax, patch2 @@ -147,3 +147,56 @@ __asm__ __volatile__ ("\t" "wbinvd\n" : /* no outputs */ +--- app/main.c ++++ app/main.c +@@ -75,6 +75,7 @@ + + static volatile int init_state = 0; + ++static uintptr_t low_load_limit = LOW_LOAD_LIMIT; + static uintptr_t low_load_addr; + static uintptr_t high_load_addr; + +@@ -205,6 +206,9 @@ + + cpuid_init(); + ++ if (cpuid_info.version.family <= 4) // down to 1MB memory size support ++ low_load_limit = SIZE_C(256,KB); // must be a multiple of the page size ++ + // Nothing before this should access the boot parameters, in case they are located above 4GB. + // This is the first region we map, so it is guaranteed not to fail. + boot_params_addr = map_region(boot_params_addr, sizeof(boot_params_t), true); +@@ -282,8 +286,8 @@ + + size_t program_size = (_stacks - _start) + BSP_STACK_SIZE + (num_enabled_cpus - 1) * AP_STACK_SIZE; + +- bool load_addr_ok = set_load_addr(& low_load_addr, program_size, 0x1000, LOW_LOAD_LIMIT) +- && set_load_addr(&high_load_addr, program_size, LOW_LOAD_LIMIT, HIGH_LOAD_LIMIT); ++ bool load_addr_ok = set_load_addr(& low_load_addr, program_size, 0x1000, low_load_limit) ++ && set_load_addr(&high_load_addr, program_size, low_load_limit, HIGH_LOAD_LIMIT); + + trace(0, "program size %ikB", (int)(program_size / 1024)); + trace(0, " low_load_addr %0*x", 2*sizeof(uintptr_t), low_load_addr); +@@ -420,7 +424,7 @@ + // Relocation may disrupt the test. + window_num = 1; + } +- if (window_num == 0 && pm_limit_lower >= LOW_LOAD_LIMIT) { ++ if (window_num == 0 && pm_limit_lower >= low_load_limit) { + // Avoid unnecessary relocation. + window_num = 1; + } +@@ -443,10 +447,10 @@ + switch (window_num) { + case 0: + window_start = 0; +- window_end = (LOW_LOAD_LIMIT >> PAGE_SHIFT); ++ window_end = (low_load_limit >> PAGE_SHIFT); + break; + case 1: +- window_start = (LOW_LOAD_LIMIT >> PAGE_SHIFT); ++ window_start = (low_load_limit >> PAGE_SHIFT); + window_end = VM_WINDOW_SIZE; + break; + default: