brucee@runx.ips.oz (Bruce Evans) (01/19/88)
The get_tot_mem routine in getutil.s writes on memory starting at 128K, without putting back the original values. This causes trouble as soon as the boot image (not counting fsck) grows above 128K. The bug is elusive because a different routine is likely to be corrupted every time the kernel is compiled (especially if print statements are added). It is ironic that my large boot image was caused by it including the debugger which was used to find the problem. Fix: use the new getutil.s included below. It was written for Xenix and is modified for Minix, but hasn't actually passed through asld. A related bug is that build falls over as soon as one of the pieces of the boot image (most likely the kernel) goes over 64K (possible with separate I & D). The variable tot_bytes needs to be changed to a long, and in a number of places where tot_bytes is added up, the arithmetic must be cast to use longs to avoid overflow. # This is a shell archive. Remove anything before this line, # then unpack it by saving it in a file and typing "sh file". # # Wrapped by brucee on Tue Jan 19 02:33:28 GMT+11:00 1988 # Contents: getutil.s # echo x - getutil.s sed 's/^@//' > "getutil.s" <<'@//E*O*F getutil.s//' .globl _get_base, _get_size, _get_tot_mem .globl endbss |*========================================================================* | utilities * |*========================================================================* _get_base: | return click at which prog starts mov ax,ds ret _get_size: | return prog size in bytes (text+data+bss) mov ax,#endbss | end is compiler label at end of bss ret | Find out how much memory the machine has, including vectors, kernel MM, etc. testlocation = 0 testpattern = 0xA5A4 _get_tot_mem: pushf push ds mov ax,cs | start search in 64K block after text seg add ax,#0x1000-1 | so this routine won't get overwritten and ax,#0xF000 mov bx,#testpattern | random bit pattern to write memory cli test_memory: mov ds,ax xchg bx,testlocation | write test pattern, remember original value xchg bx,testlocation | restore original value, read test pattern cmp bx,#testpattern | must agree if good real memory jne got_memory | if different, memory is unusable add ah,#0x10 | advance counter by 64K cmp ah,#0xA0 | stop seaching at 640K jb test_memory got_memory: pop ds popf ret @//E*O*F getutil.s// chmod u=rw,g=,o= getutil.s exit 0 Bruce Evans (brucee@runx.ips.oz)