This should help spot bugs due to bad initialization.master
@@ -1,3 +1,4 @@ | |||||
#include <stdlib.h> | |||||
#include <stdio.h> | #include <stdio.h> | ||||
#include <string.h> | #include <string.h> | ||||
#include "vm.h" | #include "vm.h" | ||||
@@ -284,8 +285,6 @@ VM* VM_init() { | |||||
return NULL; | return NULL; | ||||
} | } | ||||
fseek(blkfp, 0, SEEK_SET); | fseek(blkfp, 0, SEEK_SET); | ||||
// initialize memory | |||||
memset(vm.mem, 0, 0x10000); | |||||
FILE *bfp = fopen(FBIN_PATH, "r"); | FILE *bfp = fopen(FBIN_PATH, "r"); | ||||
if (!bfp) { | if (!bfp) { | ||||
fprintf(stderr, "Can't open forth.bin\n"); | fprintf(stderr, "Can't open forth.bin\n"); | ||||
@@ -298,6 +297,13 @@ VM* VM_init() { | |||||
c = getc(bfp); | c = getc(bfp); | ||||
} | } | ||||
fclose(bfp); | fclose(bfp); | ||||
// initialize rest of memory with random data. Many, many bugs we've seen in | |||||
// Collapse OS were caused by bad initialization and weren't reproducable | |||||
// in CVM because it has a neat zeroed-out memory. Let's make bugs easier | |||||
// to spot. | |||||
while (i<0x10000) { | |||||
vm.mem[i++] = random(); | |||||
} | |||||
vm.SP = SP_ADDR; | vm.SP = SP_ADDR; | ||||
vm.RS = RS_ADDR; | vm.RS = RS_ADDR; | ||||
vm.minSP = SP_ADDR; | vm.minSP = SP_ADDR; | ||||
@@ -6,23 +6,24 @@ RS_ADDR 0x80 - CONSTANT SYSVARS | |||||
VARIABLE ORG | VARIABLE ORG | ||||
CREATE BIN( 0 , | CREATE BIN( 0 , | ||||
: PC H@ ORG @ - ; | : PC H@ ORG @ - ; | ||||
155 LOAD ( ALLOT0 ) | |||||
262 LOAD ( xcomp ) | 262 LOAD ( xcomp ) | ||||
270 LOAD ( xcomp overrides ) | 270 LOAD ( xcomp overrides ) | ||||
H@ ORG ! | H@ ORG ! | ||||
ORG @ 0x0b + HERE ! | |||||
0x0b ALLOT0 | |||||
0 C, 0 C, ( EXIT ) | 0 C, 0 C, ( EXIT ) | ||||
ORG @ 0x23 + HERE ! | |||||
0x16 ALLOT0 | |||||
0 C, 0x05 C, ( (n) ) | 0 C, 0x05 C, ( (n) ) | ||||
ORG @ 0x2b + HERE ! | |||||
0x6 ALLOT0 | |||||
0 C, 0x06 C, ( (s) ) | 0 C, 0x06 C, ( (s) ) | ||||
ORG @ 0x33 + HERE ! | |||||
0x6 ALLOT0 | |||||
0 C, 0x04 C, ( 2>R ) | 0 C, 0x04 C, ( 2>R ) | ||||
ORG @ 0x3b + HERE ! | |||||
0x6 ALLOT0 | |||||
0 C, 0x01 C, ( (br) ) | 0 C, 0x01 C, ( (br) ) | ||||
ORG @ 0x3f + HERE ! | |||||
0x2 ALLOT0 | |||||
0 C, 0x02 C, ( (?br) ) | 0 C, 0x02 C, ( (?br) ) | ||||
ORG @ 0x43 + HERE ! | |||||
0x2 ALLOT0 | |||||
0 C, 0x03 C, ( (loop) ) | 0 C, 0x03 C, ( (loop) ) | ||||
( END OF STABLE ABI ) | ( END OF STABLE ABI ) | ||||
H@ 4 + XCURRENT ! ( make next CODE have 0 prev field ) | H@ 4 + XCURRENT ! ( make next CODE have 0 prev field ) | ||||