wok-next rev 15188
Add memtest-serial
author | Pascal Bellard <pascal.bellard@slitaz.org> |
---|---|
date | Sun Aug 25 18:09:21 2013 +0000 (2013-08-25) |
parents | 95c2e3f416e2 |
children | 20fd4e3d8970 |
files | memtest-serial/receipt.serial memtest/receipt memtest/stuff/bootloader.S memtest/stuff/pack memtest/stuff/unpack.S |
line diff
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/memtest-serial/receipt.serial Sun Aug 25 18:09:21 2013 +0000 1.3 @@ -0,0 +1,25 @@ 1.4 +# SliTaz package receipt. 1.5 + 1.6 +PACKAGE="memtest-serial" 1.7 +VERSION="4.20" 1.8 +CATEGORY="base-system" 1.9 +SHORT_DESC="Memory failures detection tool using serial port." 1.10 +MAINTAINER="pascal.bellard@slitaz.org" 1.11 +LICENSE="GPL" 1.12 +WEB_SITE="http://www.memtest.org/" 1.13 +WANTED="memtest" 1.14 + 1.15 +# Rules to gen a SliTaz package suitable for Tazpkg. 1.16 +genpkg_rules() 1.17 +{ 1.18 + mkdir -p $fs/boot 1.19 + cp $src/memtest.packed-115200 $fs/boot/memtest 1.20 +} 1.21 + 1.22 +# Pre and post install commands for Tazpkg. 1.23 +post_install() 1.24 +{ 1.25 + cat <<EOT 1.26 +Output to vga and serial port. Default kernel cmdline: console=ttyS0,115200e8 1.27 +EOT 1.28 +}
2.1 --- a/memtest/receipt Sat Aug 24 15:12:52 2013 +0300 2.2 +++ b/memtest/receipt Sun Aug 25 18:09:21 2013 +0000 2.3 @@ -19,9 +19,11 @@ 2.4 cd $src 2.5 make 2.6 cp $stuff/*.S $stuff/pack . 2.7 - cc -o unpack.o -Wa,-a=unpack.lst -c unpack.S 2.8 - objcopy -O binary unpack.o unpack.bin 2.9 - ./pack --build unpack.bin 2.10 + for i in bootloader unpack ; do 2.11 + cc -o $i.o -Wa,-a=$i.lst -c $i.S 2.12 + objcopy -O binary $i.o $i.bin 2.13 + done 2.14 + ./pack --build bootloader.bin unpack.bin 2.15 ./pack memtest.bin memtest.packed 2.16 sed -i -e 's/SERIAL_CONSOLE_DEFAULT 0/SERIAL_CONSOLE_DEFAULT 1/' \ 2.17 -e 's/SERIAL_BAUD_RATE 9600/SERIAL_BAUD_RATE 115200/' config.h 2.18 @@ -35,13 +37,5 @@ 2.19 genpkg_rules() 2.20 { 2.21 mkdir -p $fs/boot 2.22 - cp $src/memtest.packed-115200 $fs/boot/memtest 2.23 + cp $src/memtest.packed $fs/boot/memtest 2.24 } 2.25 - 2.26 -# Pre and post install commands for Tazpkg. 2.27 -post_install() 2.28 -{ 2.29 - cat <<EOT 2.30 -Output to vga and serial port. Default kernel cmdline: console=ttyS0,115200e8 2.31 -EOT 2.32 -}
3.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 3.2 +++ b/memtest/stuff/bootloader.S Sun Aug 25 18:09:21 2013 +0000 3.3 @@ -0,0 +1,389 @@ 3.4 +SYSSEG = 0x1000 3.5 +INITSEG = 0x9000 3.6 +SETUPSEG = 0x9020 3.7 + 3.8 +setup_sects = 497 3.9 +syssize = 500 3.10 + 3.11 + .text 3.12 + .code16 3.13 + .org 0 3.14 + .globl _start 3.15 +_start: 3.16 + 3.17 +#define CODESZ 512 3.18 + 3.19 +/* some extra features */ 3.20 +#define EXE_SUPPORT real mode dos .exe file support 3.21 +#define CMDLINE 0x9E00 3.22 +#define HELP store help message for /? argument 3.23 +#define CHECK_REALMODE does not support vm86 3.24 + 3.25 +/* some contraints to reduce the size */ 3.26 +//#define FLOPPY_1440K_ONLY 1.44M floppies support only 3.27 +#define NO_CURSOR_DEFINITION 3.28 + 3.29 +#ifdef EXE_SUPPORT 3.30 +#define EXEADRS(x) x+0xE0 3.31 +stacktop = 0x9E00 # in 0x8000 .. 0xA000 3.32 + decw %bp // Magic number: MZ 3.33 + popw %dx 3.34 + jmp start // Bytes on last page of file 3.35 + .word (CODESZ+511)/512 // Pages in file 3.36 + .word 0 // Relocations 3.37 + .word (end_header-_start)/16 // Size of header in paragraphs 3.38 + .word 4096 // Minimum extra paragraphs needed 3.39 + .word -1 // Maximum extra paragraphs needed 3.40 + .word (CODESZ+15)/16 // Initial (relative) SS value 3.41 + .word stacktop // Initial SP value 3.42 + .word 0 // Checksum 3.43 + .word EXEADRS(comstart) // Initial IP value 3.44 + .word 0xFFF0 // Initial (relative) CS value 3.45 +// .word 0x001C // File address of relocation table 3.46 +// .word 0,0,0 // Overlay number 3.47 + .ascii "(SliTaz)" 3.48 +end_header: 3.49 +comstart: 3.50 +#ifdef CMDLINE 3.51 + .word 0xA33A // CMP AH,[BP+DI+stacktop] 3.52 + .word stacktop 3.53 +#else 3.54 +#undef HELP 3.55 +#endif 3.56 + cld # assume nothing 3.57 + pushw $INITSEG 3.58 + popw %es 3.59 +#ifdef CMDLINE 3.60 + movw %sp, %di 3.61 + movw $0x80, %si 3.62 + lodsb 3.63 + cbw 3.64 + xchgw %ax, %cx 3.65 + jcxz nocmdline 3.66 + movb $0x3F, 0x7F(%si) 3.67 +skipspace: 3.68 + lodsb 3.69 + cmpb $0x20, %al 3.70 + je skipspace 3.71 + decw %si 3.72 + rep 3.73 + movsb 3.74 +# ifdef HELP 3.75 +# define PUTS 3.76 + movw $EXEADRS(helpmsg), %si 3.77 + cmpb $'/', %al 3.78 + je puts 3.79 +# endif 3.80 +nocmdline: 3.81 +#endif 3.82 +#ifdef CHECK_REALMODE 3.83 +#define PUTS 3.84 + movw $EXEADRS(realmode_expected), %si 3.85 + pushfw // save flags 3.86 + // bits 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 3.87 + // flags 0 NT IOPL OF DF IF TF SF ZF 0 AF 0 PF 1 CF 3.88 + movb $0x10, %ah // DF = IF = TF = 0 3.89 + pushw %ax 3.90 + popfw // < 286 : flags[12..15] are forced 1 3.91 + pushfw // = 286 : flags[12..15] are forced 0 3.92 + popw %cx // > 286 : only flags[15] is forced 0 3.93 + popfw // restore flags 3.94 + addb %ah, %ch // test F0 and 00 cases 3.95 + cmpb %ah, %ch 3.96 + jbe puts // C=8086/80186, Z=80286 3.97 + smsww %ax 3.98 + andb $1, %al 3.99 + jne puts 3.100 +#endif 3.101 + movw $0x100, %si 3.102 + movw $end_header, %di 3.103 + movb EXEADRS(setup_sects), %ch 3.104 + movb $(512-(end_header-_start))/2, %cl 3.105 + rep 3.106 + movsw 3.107 + ljmp $INITSEG, $movesys 3.108 +start: 3.109 + pushw %dx 3.110 + xorw %dx, %dx 3.111 +#else 3.112 +#undef HELP 3.113 +#undef CMDLINE 3.114 +#undef CHECK_REALMODE 3.115 +#endif 3.116 + cld # assume nothing 3.117 +stacktop = 0x9E00 # in 0x8000 .. 0xA000 3.118 +zeroed = 12 # zeroed registers 3.119 + movw $stacktop-12-zeroed, %di # stacktop is an arbitrary value >= 3.120 + # length of bootsect + length of 3.121 + # setup + room for stack; 3.122 + # 12 is disk parm size. 3.123 + pushw $INITSEG 3.124 + popw %ss # %ss contain INITSEG 3.125 + movw %di, %sp # put stack at INITSEG:stacktop-... 3.126 + 3.127 +# Many BIOS's default disk parameter tables will not recognize 3.128 +# multi-sector reads beyond the maximum sector number specified 3.129 +# in the default diskette parameter tables - this may mean 7 3.130 +# sectors in some cases. 3.131 +# 3.132 +# Since single sector reads are slow and out of the question, 3.133 +# we must take care of this by creating new parameter tables 3.134 +# (for the first disk) in RAM. We can set the maximum sector 3.135 +# count to 36 - the most we will encounter on an ED 2.88. 3.136 +# 3.137 +# High doesn't hurt. Low does. Let's use the max: 63 3.138 + 3.139 + pushw %ss 3.140 + popw %es # %es = %ss = INITSEG 3.141 + xorw %ax, %ax # %ax = 0 3.142 + movw $zeroed/2, %cx # clear gdt + offset, %ds, limits 3.143 + rep # don't worry about cld 3.144 + stosw # already done above 3.145 + popw %bx # offset = 0 3.146 + popw %ds # %ds = 0 3.147 + popw %fs # %fs = 0 3.148 + 3.149 + movb setup_sects+0x7C00, %al # read bootsector + setup (%ds = 0) 3.150 + incw %ax 3.151 + 3.152 + ldsw 0x78(%bx), %si # %ds:%bx+0x78 is parameter table address 3.153 + pushw %es 3.154 + pushw %di 3.155 + movb $6, %cl # copy 12 bytes 3.156 + rep # don't worry about cld 3.157 + movsw # already done above 3.158 + pushw %ss 3.159 + popw %ds # now %ds = %es = %ss = INITSEG 3.160 + popl %fs:0x78(%bx) # update parameter table address 3.161 + movb $63, 0x4-12(%di) # patch sector count, %di = stacktop 3.162 + cli 3.163 + 3.164 + xchg %ax, %di # sector count 3.165 + popw %ax # limits = 0 3.166 + incw %cx # cylinder 0, sector 1, clear Z 3.167 + call read_first_sectors # read setup 3.168 + 3.169 +# This routine loads the system at address LOADSEG, making sure 3.170 +# no 64kB boundaries are crossed. We try to load it as fast as 3.171 +# possible, loading whole tracks whenever we can. 3.172 + 3.173 + popw %bx # clear %bx 3.174 + movw syssize, %di 3.175 + addw $(512/16)-1, %di 3.176 + shrw $9-4, %di 3.177 + movw $SYSSEG, %cx 3.178 + call read_sectorsCX 3.179 + 3.180 +# This procedure turns off the floppy drive motor, so 3.181 +# that we enter the kernel in a known state, and 3.182 +# don't have to worry about it later. 3.183 + 3.184 +kill_motor: 3.185 + xchgw %ax, %di # reset FDC (%di < 128) 3.186 + int $0x13 3.187 + 3.188 +# After that (everything loaded), we jump to the setup-routine 3.189 +# loaded directly after the bootblock: 3.190 +# Segments are as follows: %ds = %ss = INITSEG 3.191 + 3.192 +jmp_setup: 3.193 + ljmp $SETUPSEG, $0 3.194 + 3.195 +#ifdef PUTS 3.196 +#define PUTC 3.197 +puts: 3.198 + lodsb 3.199 + orb %al, %al 3.200 + je exit 3.201 + call putc 3.202 + jmp puts 3.203 +#endif 3.204 +#ifdef EXE_SUPPORT 3.205 +movesys: 3.206 + pushw %es 3.207 + popw %ss 3.208 + movw EXEADRS(syssize), %bp // %ds untouched 3.209 + movw $SYSSEG, %ax 3.210 + movw %ds, %bx 3.211 + cwd 3.212 + incw %dx 3.213 + cmpw %ax, %bx 3.214 + jnc forward 3.215 + negw %dx 3.216 + addw %bp, %ax 3.217 + addw %bp, %bx 3.218 +forward: 3.219 + movw %ax, %es 3.220 + movw %bx, %ds 3.221 + xorw %di, %di 3.222 + movb $8, %cl 3.223 + rep 3.224 + movsw 3.225 + subw $16, %si 3.226 + addw %dx, %ax 3.227 + addw %dx, %bx 3.228 + decw %bp 3.229 + jns forward 3.230 +#ifndef NO_CURSOR_DEFINITION 3.231 + movb $1, %ah 3.232 + movb $0, %bh 3.233 + movb $0x20, %ch // 0x2000 3.234 + int $0x10 3.235 +#endif 3.236 + pushw %ss 3.237 + popw %ds 3.238 + jmp jmp_setup 3.239 +#endif 3.240 +putcdot: 3.241 +#ifdef PUTC 3.242 + movb $0x2E, %al 3.243 +putc: 3.244 + movb $0xE, %ah 3.245 + movw $7, %bx 3.246 + int $0x10 3.247 +#endif 3.248 +exit: 3.249 + ret 3.250 + 3.251 + 3.252 +# read_sectors reads %di sectors into %es:0 buffer. 3.253 +# %es:0 is updated to the next memory location. 3.254 +# First, sectors are read sector by sector until 3.255 +# sector per track count is known. Then they are 3.256 +# read track by track. 3.257 +# Assume no error on first track. 3.258 + 3.259 +#ifdef FLOPPY_1440K_ONLY 3.260 +#define FLOPPY_HEADS 2 /* 2 heads */ 3.261 +#define FLOPPY_SECTORS 18 /* 18 sectors */ 3.262 +#else 3.263 +#define FLOPPY_HEADS 2 /* 2 heads minimum */ 3.264 +#define FLOPPY_SECTORS 9 /* 9 sectors minimum */ 3.265 +#endif 3.266 + 3.267 +check_limits: 3.268 +#ifndef FLOPPY_1440K_ONLY 3.269 + popw %dx 3.270 +#ifdef FLOPPY_SECTORS 3.271 + cmpb $FLOPPY_SECTORS+1, %cl # minimum sector count 3.272 + jb check_head 3.273 +#endif 3.274 + cmpb %al, %cl # max sector known ? 3.275 + ja next_head # no -> store it 3.276 +check_head: 3.277 +#ifdef FLOPPY_HEADS 3.278 + cmpb $FLOPPY_HEADS, %dh # 2 heads minimum 3.279 + jb check_cylinder 3.280 +#endif 3.281 + cmpb %ah, %dh # max head known ? 3.282 + ja next_cylinder # no -> store it 3.283 +check_cylinder: 3.284 +#endif 3.285 + pushaw 3.286 +#ifndef FLOPPY_1440K_ONLY 3.287 + cbw # %ah = 0 3.288 +#endif 3.289 + int $0x13 # reset controler 3.290 + popaw 3.291 + movb $1, %al # sector by sector... 3.292 +read_sectorslp: 3.293 + pushw %dx # some bios break dx... 3.294 +#ifndef FLOPPY_1440K_ONLY 3.295 + pushw %ax # limits 3.296 + subb %cl, %al # sectors remaining in track 3.297 + ja tolastsect 3.298 + movb $1, %al # 1 sector mini 3.299 +tolastsect: 3.300 +#else 3.301 + mov $FLOPPY_SECTORS+1, %al 3.302 + subb %cl, %al # sectors remaining in track 3.303 +#endif 3.304 + cbw 3.305 + cmpw %di, %ax 3.306 + jb more1trk 3.307 + movw %di, %ax # sectors to read 3.308 +more1trk: 3.309 + pushw %ax # save context 3.310 + movb $2, %ah # cmd: read chs 3.311 + int $0x13 3.312 +#ifndef FLOPPY_1440K_ONLY 3.313 + popw %dx # save %ax 3.314 + popw %ax # limits 3.315 +#else 3.316 + popw %ax # restore context 3.317 + popw %dx 3.318 +#endif 3.319 + jc check_limits 3.320 +#ifndef FLOPPY_1440K_ONLY 3.321 + xchgw %ax, %bp 3.322 + addw %dx,%cx # next sector 3.323 + movw %cx, %gs 3.324 + movw %es, %cx 3.325 + pushw %dx 3.326 + shlw $5, %dx 3.327 + addw %dx, %cx 3.328 + popw %dx 3.329 + subw %dx,%di # update sector counter 3.330 + popw %dx 3.331 +read_sectorsCX: 3.332 + movw %cx, %es # next location 3.333 + jz putcdot 3.334 +#else 3.335 + addw %ax,%cx # next sector 3.336 + movw %cx, %gs 3.337 + movw %es, %cx 3.338 + pushw %ax 3.339 + shlw $5, %ax 3.340 + addw %ax, %cx 3.341 + popw %ax 3.342 + subw %ax,%di # update sector counter 3.343 +read_sectorsCX: 3.344 + movw %cx, %es # next location 3.345 + jz putcdot 3.346 +#endif 3.347 +read_sectors: 3.348 + movw %gs, %cx 3.349 +#ifndef FLOPPY_1440K_ONLY 3.350 +# al is last sector+1 3.351 +# ah is last cylinder+1 3.352 + xchgw %ax, %bp 3.353 +#endif 3.354 +#ifndef FLOPPY_1440K_ONLY 3.355 + cmpb %al,%cl # reach sector limit ? 3.356 + jne bdendlp 3.357 +next_head: 3.358 + movb %cl,%al 3.359 +#else 3.360 + cmpb $FLOPPY_SECTORS+1,%cl # reach sector limit ? 3.361 + jne bdendlp 3.362 +#endif 3.363 + incb %dh # next head 3.364 + movb $1,%cl # first sector 3.365 +#ifndef FLOPPY_1440K_ONLY 3.366 + cmpb %ah, %dh # reach head limit ? 3.367 + jne bdendlp 3.368 +next_cylinder: 3.369 + movb %dh,%ah 3.370 +#else 3.371 + cmpb %cl,%dh # reach head limit ? 3.372 + je bdendlp 3.373 +#endif 3.374 +# NOTE : support 256 cylinders max 3.375 + incb %ch # next cylinder 3.376 +read_first_sectors: 3.377 + movb $0,%dh # first head 3.378 +bdendlp: 3.379 + jmp read_sectorslp 3.380 + 3.381 +#ifdef CHECK_REALMODE 3.382 +realmode_expected: 3.383 + .ascii "386 real mode only." 3.384 + .byte 13,10,0 3.385 +#endif 3.386 +#ifdef HELP 3.387 +helpmsg: 3.388 + .ascii "No help available." 3.389 + .byte 13,10 3.390 + .byte 0 3.391 +#endif 3.392 + .org 497
4.1 --- a/memtest/stuff/pack Sat Aug 24 15:12:52 2013 +0300 4.2 +++ b/memtest/stuff/pack Sun Aug 25 18:09:21 2013 +0000 4.3 @@ -1,12 +1,15 @@ 4.4 #!/bin/sh 4.5 if [ "$1" == "--build" ]; then 4.6 - bin=${2:-unpack.bin} 4.7 + set -- ${2:-bootloader.bin} ${3:-unpack.bin} 4.8 cat >> $0 <<EOM 4.9 -$(gzip -9 < $bin | uuencode -m -) 4.10 +$(dd if=$1 bs=512 count=1 conv=sync | cat - $2 | gzip -9 | uuencode -m -) 4.11 EOT 4.12 EOM 4.13 - getip=$(grep -s getip ${bin/.bin/.lst}|sed '$!d;s/.*t:\([^ ]*\).*/\1/') 4.14 + getip=$(grep -s getip ${2/.bin/.lst}|sed '$!d;s/.*t:\([^ ]*\).*/\1/') 4.15 sed -i "s/XXX/$((515+0x${getip:-5}))/" $0 4.16 + helpmsg=$(sed '/helpmsg:/!d{n;s/ [0-9]* \([^ ]*\).*/\1/}' ${1/.bin/.lst} | sed '$!d') 4.17 + sed -i "s/YYY/$((0x$helpmsg))/" $0 4.18 + sed -i "s/ZZZ/$((496-0x$helpmsg))/" $0 4.19 sed -i '/--build/,/^fi/d' $0 4.20 exit 4.21 fi 4.22 @@ -14,7 +17,7 @@ 4.23 store() 4.24 { 4.25 n=$1 4.26 - for i in $(seq 1 $4); do 4.27 + for i in $(seq 1 ${4:-2}); do 4.28 printf '\\\\x%02X' $(($n & 255)) 4.29 n=$(($n >> 8)) 4.30 done | xargs echo -en | dd conv=notrunc bs=1 of=$2 seek=$3 4.31 @@ -27,16 +30,25 @@ 4.32 4.33 main() 4.34 { 4.35 - dd if=$1 bs=512 count=1 >$2 4.36 - uudecode | gunzip >>$2 4.37 + uudecode | gunzip >$2 4.38 + dd if=$1 bs=1 skip=497 seek=497 count=15 of=$2 conv=notrunc 4.39 setup="$(echo $(od -j 497 -N 1 -dAn $1))" 4.40 syssize="$(echo $(od -j 500 -N 2 -dAn $1))" 4.41 dd if=$1 bs=512 count=$setup skip=1 | compress >>$2 4.42 dd if=$1 bs=16 count=$syssize skip=$((32*(1+$setup))) | compress >>$2 4.43 size=$(stat -c %s $2) 4.44 - store $((($size-512)/16)) $2 XXX 2 4.45 - store $((($size-2560)/16)) $2 500 2 4.46 + store $((($size-512)/16)) $2 XXX 4.47 + store $((($size-2560)/16)) $2 500 4.48 store 4 $2 497 1 4.49 + store $((($size+511)/512)) $2 4 4.50 + store $((($size+15)/16)) $2 14 4.51 + echo -en "$3" | dd conv=notrunc bs=1 seek=YYY of=$2 count=ZZZ 4.52 } 4.53 4.54 -main $1 $2 2>/dev/null <<EOT 4.55 +HELP="$(unix2dos <<EOT 4.56 +Memtest86+ is an endless advanced memory diagnostic tool released under the 4.57 +terms of the Gnu Public License (GPL). 4.58 + 4.59 +EOT 4.60 +)" 4.61 +main $1 ${2:-$1.packed} "${3:-$HELP}" 2>/dev/null <<EOT
5.1 --- a/memtest/stuff/unpack.S Sat Aug 24 15:12:52 2013 +0300 5.2 +++ b/memtest/stuff/unpack.S Sun Aug 25 18:09:21 2013 +0000 5.3 @@ -1,9 +1,15 @@ 5.4 -#define TOP 0x8FD00 5.5 +#define TOP (0x90000+_start-end) 5.6 #define SYSTEM 0x10000 5.7 #define SETUP 4 5.8 +#define SYSSIZE 0x1F4 5.9 +#define SETUPSIZE 0x1F1 5.10 5.11 -#define CHANGE_STACK 1 5.12 -#define LINUX_HEADER 0 5.13 +#define CHANGE_STACK 0 5.14 +#define LINUX_HEADER 0 5.15 +#define UPDATE_SYSSIZE 1 5.16 +#define HARDCODED_SYSSIZE 1 5.17 +#define HARDCODED_SETUPSIZE 1 5.18 +#define HARDCODED_IP 1 5.19 5.20 .text 5.21 .code16 5.22 @@ -29,74 +35,103 @@ 5.23 #endif 5.24 pushf 5.25 pushw %cs 5.26 +#if HARDCODED_IP 5.27 + pushw $0 5.28 +#else 5.29 call getip 5.30 getip: 5.31 +#endif 5.32 pushal 5.33 - movw $0, %bx // packed sizes 5.34 +#if HARDCODED_SYSSIZE 5.35 +packed_syssize: 5.36 + movw $0, %bx // system size 5.37 +#else 5.38 + movw SYSSIZE, %bx 5.39 +#endif 5.40 +#if HARDCODED_SETUPSIZE == 0 5.41 + xorw %dx, %dx 5.42 + movb SETUPSIZE, %dh 5.43 +#endif 5.44 +#if HARDCODED_IP 5.45 + xorw %si, %si 5.46 +#else 5.47 movw %sp, %bp 5.48 #define START_IP 32(%bp) 5.49 + subw $getip-_start, START_IP 5.50 + movw START_IP, %si 5.51 +#endif 5.52 pushw %ds 5.53 pushw %es 5.54 - subw $getip-_start, START_IP 5.55 5.56 cld 5.57 +#if CHANGE_STACK 5.58 +STKSZ=0x9000-0x0990 5.59 + movw $(TOP-STKSZ)/16, %ax 5.60 +#else 5.61 + movw $TOP/16, %ax 5.62 +#endif 5.63 + movw %ax, %es 5.64 + pushw %es // moved 5.65 + .byte 0x6A, moved-_start // unpack code 5.66 pushw %cs 5.67 popw %ds 5.68 - movw $TOP/16, %ax 5.69 - movw %ax, %es 5.70 - subw %bx, %ax // moved packed data 5.71 - movw START_IP, %si 5.72 - movw $moved-_start, %di 5.73 - addw %si, %di 5.74 - pushw %ds // save setup seg 5.75 - pushw %es // moved 5.76 - pushw %di // unpack code 5.77 - movw %si, %di 5.78 + xorw %di, %di 5.79 movw $end-_start, %cx 5.80 + pushw %si 5.81 rep 5.82 movsb // move upack code to $TOP 5.83 - pushw %si // data offset 5.84 + 5.85 + leaw SYSTEM/16(%bx), %bp 5.86 +movlp: 5.87 + decw %bp 5.88 + movw %bp, %ds 5.89 + decw %ax 5.90 movw %ax, %es 5.91 - movw $SETUP*512, %cx 5.92 - subw $SETUP*32, %bx 5.93 xorw %si, %si 5.94 xorw %di, %di 5.95 - rep 5.96 - movsb // move header part 5.97 - pushw $SYSTEM/16 5.98 - popw %ds 5.99 -movlp: 5.100 - xorw %si, %si 5.101 - movw $8, %cx 5.102 + movb $8, %cl 5.103 rep 5.104 movsw // move system part 5.105 - subw $16, %di 5.106 - movw %ds, %cx 5.107 - incw %cx 5.108 - movw %cx, %ds 5.109 - movw %es, %cx 5.110 - incw %cx 5.111 - movw %cx, %es 5.112 decw %bx 5.113 - jns movlp 5.114 - popw %si // data offset 5.115 - movw %ax, %ds 5.116 + jnz movlp 5.117 + 5.118 + pushw %cs 5.119 + popw %ds 5.120 + popw %si 5.121 + xorw %di, %di 5.122 +#if HARDCODED_SETUPSIZE 5.123 + movb $SETUP, %ch 5.124 + subw $SETUP*32, %ax 5.125 +#else 5.126 + movb %dh, %ch 5.127 + shrw $3, %dx 5.128 + subw %dx, %ax 5.129 +#endif 5.130 + movw %ax, %es 5.131 + pushw %si 5.132 + rep 5.133 + movsw // move header part 5.134 + 5.135 + pushw %es 5.136 + popw %ds 5.137 + movw $end-_start, %si 5.138 + pushw %cs 5.139 + popw %es // restore setup seg 5.140 + popw %di 5.141 retf 5.142 5.143 moved: 5.144 - popw %es // restore setup seg 5.145 - movw START_IP, %di 5.146 #if CHANGE_STACK 5.147 - movw $0xFFFE, %ax 5.148 + movw $STKSZ, %ax // trick: %ss = %sp 5.149 movw %ss, %bx 5.150 - pushw $0 5.151 + pushw %ax 5.152 popw %ss 5.153 xchgw %ax, %sp 5.154 pushw %bx // %ss 5.155 pushw %ax // %sp 5.156 #endif 5.157 + pushw %bp // SYSTEM/16 5.158 call unpack // unpack setup 5.159 - pushw $SYSTEM/16 5.160 popw %es 5.161 xorw %di,%di 5.162 call unpack // unpack system 5.163 @@ -105,8 +140,23 @@ 5.164 popw %ss 5.165 xchgw %ax, %sp 5.166 #endif 5.167 +#if UPDATE_SYSSIZE 5.168 +# if HARDCODED_SYSSIZE 5.169 +original_syssize: 5.170 + movw $0, %ax 5.171 +# else 5.172 + addw $15, %di 5.173 + shrw $4, %di 5.174 + movw %es, %ax 5.175 + addw %di, %ax 5.176 + subw $SYSTEM/16, %ax 5.177 +# endif 5.178 +#endif 5.179 popw %es 5.180 popw %ds 5.181 +#if UPDATE_SYSSIZE 5.182 + movw %ax, SYSSIZE 5.183 +#endif 5.184 popal 5.185 iret 5.186