This shows you the differences between two versions of the page.
— |
blog:pushbx:2024:0204_various_freedos_boot_sector_loaders_memory_overlap_cases [2024-02-04 12:47:25 +0100 Feb Sun] (current) ecm created |
||
---|---|---|---|
Line 1: | Line 1: | ||
+ | ====== Various FreeDOS boot sector loaders memory overlap cases ====== | ||
+ | |||
+ | I created several test cases to figure out how some of the FreeDOS loaders can exhibit memory overlap in some conditions. I uploaded all the files involved (except for the repos, qemu, and NASM) to https:// | ||
+ | |||
+ | ===== Common preparation ===== | ||
+ | |||
+ | * Install qemu ('' | ||
+ | * Get '' | ||
+ | * Get '' | ||
+ | * Get '' | ||
+ | * Get '' | ||
+ | * Get the repos for lmacros, ldosboot, ldosmbr, bootimg from https:// | ||
+ | * Get the repo for the kernel from https:// | ||
+ | * Create '' | ||
+ | * Create the files '' | ||
+ | |||
+ | < | ||
+ | disktest$ unzip -jq ~/ | ||
+ | disktest$ unzip -jq ~/ | ||
+ | disktest$ dd if=/ | ||
+ | 128+0 records in | ||
+ | 128+0 records out | ||
+ | 131072 bytes (131 kB, 128 KiB) copied, 0.000498291 s, 263 MB/s | ||
+ | disktest$ dd if=/ | ||
+ | 128+0 records in | ||
+ | 128+0 records out | ||
+ | 131072 bytes (131 kB, 128 KiB) copied, 0.000682236 s, 192 MB/s | ||
+ | disktest$ dd if=../ | ||
+ | 169+0 records in | ||
+ | 169+0 records out | ||
+ | 86528 bytes (87 kB, 84 KiB) copied, 0.00103689 s, 83.4 MB/s | ||
+ | disktest$ dd if=../ | ||
+ | 169+0 records in | ||
+ | 169+0 records out | ||
+ | 86528 bytes (87 kB, 84 KiB) copied, 0.00120152 s, 72.0 MB/s | ||
+ | disktest$ cat fdconfig.sys | ||
+ | switches=/f | ||
+ | files=128 | ||
+ | device=a: | ||
+ | shell=a: | ||
+ | disktest$ file fdconfig.sys | ||
+ | fdconfig.sys: | ||
+ | disktest$ cat makk128.bat | ||
+ | c:instsect c: / | ||
+ | c:instsect c: / | ||
+ | disktest$ file makk128.bat | ||
+ | makk128.bat: | ||
+ | disktest$ cat callmakk.bat | ||
+ | call c: | ||
+ | quit | ||
+ | disktest$ file callmakk.bat | ||
+ | callmakk.bat: | ||
+ | disktest$ | ||
+ | </ | ||
+ | |||
+ | ===== Assemble loaders ===== | ||
+ | |||
+ | Assemble the boot sector loaders in the kernel repo, using the revision created by https:// | ||
+ | |||
+ | < | ||
+ | kernel/ | ||
+ | kernel/ | ||
+ | kernel/ | ||
+ | kernel/ | ||
+ | </ | ||
+ | |||
+ | |||
+ | ===== Prepare hard disk images ===== | ||
+ | |||
+ | Preparing a FAT12 image looks like this: | ||
+ | |||
+ | '' | ||
+ | |||
+ | Preparing a FAT32 image with the 386+ LBA loader looks like this (note the changed BPE and output filename): | ||
+ | |||
+ | '' | ||
+ | |||
+ | Preparing a FAT32 image with the 386+ LBA loader and the padded directory looks like this (note the :: | ||
+ | |||
+ | '' | ||
+ | |||
+ | The same commands are used to create k128f323.img and k128f324.img, | ||
+ | |||
+ | |||
+ | ==== Preparation of all hard disk images ==== | ||
+ | |||
+ | All the preparation for creating the boot images: | ||
+ | |||
+ | < | ||
+ | disktest$ nasm -I ../ | ||
+ | disktest$ nasm -I ../ | ||
+ | ../ | ||
+ | disktest$ nasm -I ../ | ||
+ | ../ | ||
+ | disktest$ nasm -I ../ | ||
+ | ../ | ||
+ | disktest$ nasm -I ../ | ||
+ | ../ | ||
+ | disktest$ | ||
+ | </ | ||
+ | |||
+ | |||
+ | ==== Create the chain files ==== | ||
+ | |||
+ | To create the boot sector loader chain files for k128f12.img (the FAT12 image): | ||
+ | |||
+ | '' | ||
+ | |||
+ | The parameter after '' | ||
+ | |||
+ | |||
+ | ===== Running the loaders ===== | ||
+ | |||
+ | ==== Prepare the serial terminal ==== | ||
+ | |||
+ | To use the serial I/O of lDebug on a Linux host, you can run socat as in: | ||
+ | |||
+ | '' | ||
+ | |||
+ | Then picocom like: '' | ||
+ | |||
+ | |||
+ | ==== Running qemu ==== | ||
+ | |||
+ | Finally, run qemu like so: | ||
+ | |||
+ | '' | ||
+ | |||
+ | (Replace the parameter after '' | ||
+ | |||
+ | |||
+ | ==== Running the chainloaders ==== | ||
+ | |||
+ | Once the lDebug command line prompts for input (with a '' | ||
+ | |||
+ | At the lDebug prompt, enter '' | ||
+ | |||
+ | |||
+ | ===== FAT12: Higher /L segments will overwrite the cluster list ===== | ||
+ | |||
+ | The FAT12 loader (in k128f12.img) will run as expected by default. However, if the load segment (FreeDOS SYS /L switch) is set to a larger value than the usual 60h or 70h, such as 200h, then the loader will corrupt its cluster list once it has read the full first cluster of the kernel file. If the kernel file is padded with zeros then the cluster list will be corrupted with zeroes, which happen to be the End Of Chain marker. However, if the file contains other data such as all-1s in the trail then the cluster list will be corrupted differently, | ||
+ | |||
+ | < | ||
+ | -boot protocol chain hda1/ | ||
+ | -e cs:7C5C | ||
+ | 0000: | ||
+ | </ | ||
+ | |||
+ | Patch the /L parameter address to 200h:0 rather than 60h:0. | ||
+ | |||
+ | < | ||
+ | -p 10 silent 1 | ||
+ | AX=1FE0 BX=0080 CX=0000 DX=0080 SP=7BA0 BP=7C00 SI=7E00 DI=7E00 | ||
+ | DS=1FE0 ES=1FE0 SS=1FE0 CS=1FE0 IP=7C66 NV UP EI PL ZR NA PE NC | ||
+ | 1FE0:7C66 885624 | ||
+ | </ | ||
+ | |||
+ | Skip the initial relocation of the loader, to allow to use breakpoints next. | ||
+ | |||
+ | < | ||
+ | -g 7CE3 | ||
+ | AX=0002 BX=0000 CX=0000 DX=0080 SP=7BA0 BP=7C00 SI=7DFC DI=0000 | ||
+ | DS=1FE0 ES=0200 SS=1FE0 CS=1FE0 IP=7CE3 NV UP EI PL ZR NA PE NC | ||
+ | 1FE0:7CE3 50 push ax | ||
+ | </ | ||
+ | |||
+ | Skip to where the directory scan has found the file. | ||
+ | |||
+ | < | ||
+ | -p | ||
+ | AX=0002 BX=0000 CX=0000 DX=0080 SP=7B9E BP=7C00 SI=7DFC DI=0000 | ||
+ | DS=1FE0 ES=0200 SS=1FE0 CS=1FE0 IP=7CE4 NV UP EI PL ZR NA PE NC | ||
+ | 1FE0:7CE4 C45E5A | ||
+ | - | ||
+ | AX=0002 BX=0000 CX=0000 DX=0080 SP=7B9E BP=7C00 SI=7DFC DI=0000 | ||
+ | DS=1FE0 ES=0200 SS=1FE0 CS=1FE0 IP=7CE7 NV UP EI PL ZR NA PE NC | ||
+ | 1FE0:7CE7 8B7E16 | ||
+ | - | ||
+ | AX=0002 BX=0000 CX=0000 DX=0080 SP=7B9E BP=7C00 SI=7DFC DI=0001 | ||
+ | DS=1FE0 ES=0200 SS=1FE0 CS=1FE0 IP=7CEA NV UP EI PL ZR NA PE NC | ||
+ | 1FE0:7CEA 8B46D2 | ||
+ | - | ||
+ | AX=0025 BX=0000 CX=0000 DX=0080 SP=7B9E BP=7C00 SI=7DFC DI=0001 | ||
+ | DS=1FE0 ES=0200 SS=1FE0 CS=1FE0 IP=7CED NV UP EI PL ZR NA PE NC | ||
+ | 1FE0:7CED 8B56D4 | ||
+ | - | ||
+ | AX=0025 BX=0000 CX=0000 DX=0000 SP=7B9E BP=7C00 SI=7DFC DI=0001 | ||
+ | DS=1FE0 ES=0200 SS=1FE0 CS=1FE0 IP=7CF0 NV UP EI PL ZR NA PE NC | ||
+ | 1FE0:7CF0 E86C00 | ||
+ | - | ||
+ | AX=0020 BX=0000 CX=0004 DX=0080 SP=7B9E BP=7C00 SI=7DFC DI=0000 | ||
+ | DS=1FE0 ES=0220 SS=1FE0 CS=1FE0 IP=7CF3 NV UP EI PL ZR NA PE NC | ||
+ | 1FE0:7CF3 58 pop ax | ||
+ | - | ||
+ | AX=0002 BX=0000 CX=0004 DX=0080 SP=7BA0 BP=7C00 SI=7DFC DI=0000 | ||
+ | DS=1FE0 ES=0220 SS=1FE0 CS=1FE0 IP=7CF4 NV UP EI PL ZR NA PE NC | ||
+ | 1FE0:7CF4 1E push ds | ||
+ | - | ||
+ | AX=0002 BX=0000 CX=0004 DX=0080 SP=7B9E BP=7C00 SI=7DFC DI=0000 | ||
+ | DS=1FE0 ES=0220 SS=1FE0 CS=1FE0 IP=7CF5 NV UP EI PL ZR NA PE NC | ||
+ | 1FE0:7CF5 07 pop es | ||
+ | - | ||
+ | AX=0002 BX=0000 CX=0004 DX=0080 SP=7BA0 BP=7C00 SI=7DFC DI=0000 | ||
+ | DS=1FE0 ES=1FE0 SS=1FE0 CS=1FE0 IP=7CF6 NV UP EI PL ZR NA PE NC | ||
+ | 1FE0:7CF6 8E5E5C | ||
+ | - | ||
+ | AX=0002 BX=0000 CX=0004 DX=0080 SP=7BA0 BP=7C00 SI=7DFC DI=0000 | ||
+ | DS=0200 ES=1FE0 SS=1FE0 CS=1FE0 IP=7CF9 NV UP EI PL ZR NA PE NC | ||
+ | 1FE0:7CF9 BF0020 | ||
+ | - | ||
+ | AX=0002 BX=0000 CX=0004 DX=0080 SP=7BA0 BP=7C00 SI=7DFC DI=2000 | ||
+ | DS=0200 ES=1FE0 SS=1FE0 CS=1FE0 IP=7CFC NV UP EI PL ZR NA PE NC | ||
+ | 1FE0:7CFC AB stosw | ||
+ | - | ||
+ | AX=0002 BX=0000 CX=0004 DX=0080 SP=7BA0 BP=7C00 SI=7DFC DI=2002 | ||
+ | DS=0200 ES=1FE0 SS=1FE0 CS=1FE0 IP=7CFD NV UP EI PL ZR NA PE NC | ||
+ | 1FE0:7CFD 89C6 mov si, ax | ||
+ | - | ||
+ | AX=0002 BX=0000 CX=0004 DX=0080 SP=7BA0 BP=7C00 SI=0002 DI=2002 | ||
+ | DS=0200 ES=1FE0 SS=1FE0 CS=1FE0 IP=7CFF NV UP EI PL ZR NA PE NC | ||
+ | 1FE0:7CFF 01F6 add si, si | ||
+ | - | ||
+ | AX=0002 BX=0000 CX=0004 DX=0080 SP=7BA0 BP=7C00 SI=0004 DI=2002 | ||
+ | DS=0200 ES=1FE0 SS=1FE0 CS=1FE0 IP=7D01 NV UP EI PL NZ NA PO NC | ||
+ | 1FE0:7D01 01C6 add si, ax | ||
+ | - | ||
+ | AX=0002 BX=0000 CX=0004 DX=0080 SP=7BA0 BP=7C00 SI=0006 DI=2002 | ||
+ | DS=0200 ES=1FE0 SS=1FE0 CS=1FE0 IP=7D03 NV UP EI PL NZ NA PE NC | ||
+ | 1FE0:7D03 D1EE shr si, 1 | ||
+ | - | ||
+ | AX=0002 BX=0000 CX=0004 DX=0080 SP=7BA0 BP=7C00 SI=0003 DI=2002 | ||
+ | DS=0200 ES=1FE0 SS=1FE0 CS=1FE0 IP=7D05 NV UP EI PL NZ NA PE NC | ||
+ | 1FE0:7D05 AD lodsw | ||
+ | - | ||
+ | AX=FFFF BX=0000 CX=0004 DX=0080 SP=7BA0 BP=7C00 SI=0005 DI=2002 | ||
+ | DS=0200 ES=1FE0 SS=1FE0 CS=1FE0 IP=7D06 NV UP EI PL NZ NA PE NC | ||
+ | 1FE0:7D06 7304 jae | ||
+ | - | ||
+ | AX=FFFF BX=0000 CX=0004 DX=0080 SP=7BA0 BP=7C00 SI=0005 DI=2002 | ||
+ | DS=0200 ES=1FE0 SS=1FE0 CS=1FE0 IP=7D0C NV UP EI PL NZ NA PE NC | ||
+ | 1FE0:7D0C 80E40F | ||
+ | - | ||
+ | AX=0FFF BX=0000 CX=0004 DX=0080 SP=7BA0 BP=7C00 SI=0005 DI=2002 | ||
+ | DS=0200 ES=1FE0 SS=1FE0 CS=1FE0 IP=7D0F NV UP EI PL NZ NA PE NC | ||
+ | 1FE0:7D0F 3DF80F | ||
+ | - | ||
+ | AX=0FFF BX=0000 CX=0004 DX=0080 SP=7BA0 BP=7C00 SI=0005 DI=2002 | ||
+ | DS=0200 ES=1FE0 SS=1FE0 CS=1FE0 IP=7D12 NV UP EI PL NZ NA PO NC | ||
+ | 1FE0:7D12 72E8 jb 7CFC not jumping | ||
+ | - | ||
+ | AX=0FFF BX=0000 CX=0004 DX=0080 SP=7BA0 BP=7C00 SI=0005 DI=2002 | ||
+ | DS=0200 ES=1FE0 SS=1FE0 CS=1FE0 IP=7D14 NV UP EI PL NZ NA PO NC | ||
+ | 1FE0:7D14 31C0 xor ax, ax | ||
+ | - | ||
+ | AX=0000 BX=0000 CX=0004 DX=0080 SP=7BA0 BP=7C00 SI=0005 DI=2002 | ||
+ | DS=0200 ES=1FE0 SS=1FE0 CS=1FE0 IP=7D16 NV UP EI PL ZR NA PE NC | ||
+ | 1FE0:7D16 AB stosw | ||
+ | - | ||
+ | AX=0000 BX=0000 CX=0004 DX=0080 SP=7BA0 BP=7C00 SI=0005 DI=2004 | ||
+ | DS=0200 ES=1FE0 SS=1FE0 CS=1FE0 IP=7D17 NV UP EI PL ZR NA PE NC | ||
+ | 1FE0:7D17 0E push cs | ||
+ | - | ||
+ | AX=0000 BX=0000 CX=0004 DX=0080 SP=7B9E BP=7C00 SI=0005 DI=2004 | ||
+ | DS=0200 ES=1FE0 SS=1FE0 CS=1FE0 IP=7D18 NV UP EI PL ZR NA PE NC | ||
+ | 1FE0:7D18 1F pop ds | ||
+ | - | ||
+ | AX=0000 BX=0000 CX=0004 DX=0080 SP=7BA0 BP=7C00 SI=0005 DI=2004 | ||
+ | DS=1FE0 ES=1FE0 SS=1FE0 CS=1FE0 IP=7D19 NV UP EI PL ZR NA PE NC | ||
+ | 1FE0:7D19 C45E5A | ||
+ | - | ||
+ | AX=0000 BX=0000 CX=0004 DX=0080 SP=7BA0 BP=7C00 SI=0005 DI=2004 | ||
+ | DS=1FE0 ES=0200 SS=1FE0 CS=1FE0 IP=7D1C NV UP EI PL ZR NA PE NC | ||
+ | 1FE0:7D1C BE0020 | ||
+ | - | ||
+ | AX=0000 BX=0000 CX=0004 DX=0080 SP=7BA0 BP=7C00 SI=2000 DI=2004 | ||
+ | DS=1FE0 ES=0200 SS=1FE0 CS=1FE0 IP=7D1F NV UP EI PL ZR NA PE NC | ||
+ | 1FE0:7D1F AD lodsw | ||
+ | - | ||
+ | AX=0002 BX=0000 CX=0004 DX=0080 SP=7BA0 BP=7C00 SI=2002 DI=2004 | ||
+ | DS=1FE0 ES=0200 SS=1FE0 CS=1FE0 IP=7D20 NV UP EI PL ZR NA PE NC | ||
+ | 1FE0:7D20 09C0 or ax, ax | ||
+ | - | ||
+ | AX=0002 BX=0000 CX=0004 DX=0080 SP=7BA0 BP=7C00 SI=2002 DI=2004 | ||
+ | DS=1FE0 ES=0200 SS=1FE0 CS=1FE0 IP=7D22 NV UP EI PL NZ NA PO NC | ||
+ | 1FE0:7D22 7505 jnz | ||
+ | - | ||
+ | AX=0002 BX=0000 CX=0004 DX=0080 SP=7BA0 BP=7C00 SI=2002 DI=2004 | ||
+ | DS=1FE0 ES=0200 SS=1FE0 CS=1FE0 IP=7D29 NV UP EI PL NZ NA PO NC | ||
+ | 1FE0:7D29 48 dec ax | ||
+ | - | ||
+ | AX=0001 BX=0000 CX=0004 DX=0080 SP=7BA0 BP=7C00 SI=2002 DI=2004 | ||
+ | DS=1FE0 ES=0200 SS=1FE0 CS=1FE0 IP=7D2A NV UP EI PL NZ NA PO NC | ||
+ | 1FE0:7D2A 48 dec ax | ||
+ | - | ||
+ | AX=0000 BX=0000 CX=0004 DX=0080 SP=7BA0 BP=7C00 SI=2002 DI=2004 | ||
+ | DS=1FE0 ES=0200 SS=1FE0 CS=1FE0 IP=7D2B NV UP EI PL ZR NA PE NC | ||
+ | 1FE0:7D2B 8B7E0D | ||
+ | - | ||
+ | AX=0000 BX=0000 CX=0004 DX=0080 SP=7BA0 BP=7C00 SI=2002 DI=0100 | ||
+ | DS=1FE0 ES=0200 SS=1FE0 CS=1FE0 IP=7D2E NV UP EI PL ZR NA PE NC | ||
+ | 1FE0:7D2E 4F dec di | ||
+ | - | ||
+ | AX=0000 BX=0000 CX=0004 DX=0080 SP=7BA0 BP=7C00 SI=2002 DI=00FF | ||
+ | DS=1FE0 ES=0200 SS=1FE0 CS=1FE0 IP=7D2F NV UP EI PL NZ AC PE NC | ||
+ | 1FE0:7D2F 81E7FF00 | ||
+ | - | ||
+ | AX=0000 BX=0000 CX=0004 DX=0080 SP=7BA0 BP=7C00 SI=2002 DI=00FF | ||
+ | DS=1FE0 ES=0200 SS=1FE0 CS=1FE0 IP=7D33 NV UP EI PL NZ NA PE NC | ||
+ | 1FE0:7D33 47 inc di | ||
+ | - | ||
+ | AX=0000 BX=0000 CX=0004 DX=0080 SP=7BA0 BP=7C00 SI=2002 DI=0100 | ||
+ | DS=1FE0 ES=0200 SS=1FE0 CS=1FE0 IP=7D34 NV UP EI PL NZ AC PE NC | ||
+ | 1FE0:7D34 F7E7 mul di | ||
+ | - | ||
+ | AX=0000 BX=0000 CX=0004 DX=0000 SP=7BA0 BP=7C00 SI=2002 DI=0100 | ||
+ | DS=1FE0 ES=0200 SS=1FE0 CS=1FE0 IP=7D36 NV UP EI PL ZR NA PE NC | ||
+ | 1FE0:7D36 0346DA | ||
+ | - | ||
+ | AX=0035 BX=0000 CX=0004 DX=0000 SP=7BA0 BP=7C00 SI=2002 DI=0100 | ||
+ | DS=1FE0 ES=0200 SS=1FE0 CS=1FE0 IP=7D39 NV UP EI PL NZ NA PE NC | ||
+ | 1FE0:7D39 1356DC | ||
+ | - | ||
+ | AX=0035 BX=0000 CX=0004 DX=0000 SP=7BA0 BP=7C00 SI=2002 DI=0100 | ||
+ | DS=1FE0 ES=0200 SS=1FE0 CS=1FE0 IP=7D3C NV UP EI PL ZR NA PE NC | ||
+ | 1FE0:7D3C E82000 | ||
+ | -p | ||
+ | AX=0020 BX=0000 CX=0004 DX=0080 SP=7BA0 BP=7C00 SI=2002 DI=0000 | ||
+ | DS=1FE0 ES=2200 SS=1FE0 CS=1FE0 IP=7D3F NV UP EI PL ZR NA PE NC | ||
+ | 1FE0:7D3F EBDE jmp 7D1F | ||
+ | - | ||
+ | AX=0020 BX=0000 CX=0004 DX=0080 SP=7BA0 BP=7C00 SI=2002 DI=0000 | ||
+ | DS=1FE0 ES=2200 SS=1FE0 CS=1FE0 IP=7D1F NV UP EI PL ZR NA PE NC | ||
+ | 1FE0:7D1F AD lodsw | ||
+ | -h linear es:0 | ||
+ | 00022000 | ||
+ | -h linear ds:si | ||
+ | 00021E02 | ||
+ | -t | ||
+ | AX=0000 BX=0000 CX=0004 DX=0080 SP=7BA0 BP=7C00 SI=2004 DI=0000 | ||
+ | DS=1FE0 ES=2200 SS=1FE0 CS=1FE0 IP=7D20 NV UP EI PL ZR NA PE NC | ||
+ | 1FE0:7D20 09C0 or ax, ax | ||
+ | </ | ||
+ | |||
+ | The linear of '' | ||
+ | |||
+ | < | ||
+ | -boot protocol chain hda1/ | ||
+ | -e cs:7C5C | ||
+ | 0000: | ||
+ | -p 10 silent 1 | ||
+ | AX=1FE0 BX=0080 CX=0000 DX=0080 SP=7BA0 BP=7C00 SI=7E00 DI=7E00 | ||
+ | DS=1FE0 ES=1FE0 SS=1FE0 CS=1FE0 IP=7C66 NV UP EI PL ZR NA PE NC | ||
+ | 1FE0:7C66 885624 | ||
+ | -g 7D1F | ||
+ | AX=0000 BX=0000 CX=0004 DX=0080 SP=7BA0 BP=7C00 SI=2000 DI=2004 | ||
+ | DS=1FE0 ES=0200 SS=1FE0 CS=1FE0 IP=7D1F NV UP EI PL ZR NA PE NC | ||
+ | 1FE0:7D1F AD lodsw | ||
+ | - | ||
+ | AX=0020 BX=0000 CX=0004 DX=0080 SP=7BA0 BP=7C00 SI=2002 DI=0000 | ||
+ | DS=1FE0 ES=2200 SS=1FE0 CS=1FE0 IP=7D1F NV UP EI PL ZR NA PE NC | ||
+ | 1FE0:7D1F AD lodsw | ||
+ | -h linear es:0 | ||
+ | 00022000 | ||
+ | -h linear ds:si | ||
+ | 00021E02 | ||
+ | -t | ||
+ | AX=FFFF BX=0000 CX=0004 DX=0080 SP=7BA0 BP=7C00 SI=2004 DI=0000 | ||
+ | DS=1FE0 ES=2200 SS=1FE0 CS=1FE0 IP=7D20 NV UP EI PL ZR NA PE NC | ||
+ | 1FE0:7D20 09C0 or ax, ax | ||
+ | - | ||
+ | </ | ||
+ | |||
+ | Same test case, except this time with the file ending in all-1s. It is plainly visible that the corrupted cluster list entry reads as 0FFFFh, which is invalid. Continuing the run with a G command to lDebug at this point results in the " | ||
+ | |||
+ | The cutoff value of the /L load segment is that it works if the segment is 1E0h or lower, and fails if it is 1E1h or higher. This is also visible above in that the second cluster list entry is loaded from linear 21E02h which is just above the file data if an 128 KiB file is loaded to 1E00h (segmented 1E0h:0). | ||
+ | |||
+ | < | ||
+ | lDebug connected to serial port. Enter KEEP to confirm. | ||
+ | = keep | ||
+ | -boot protocol chain hda1/ | ||
+ | -d cs:ip | ||
+ | 0000: | ||
+ | 0000: | ||
+ | 0000: | ||
+ | 0000: | ||
+ | 0000: | ||
+ | 0000: | ||
+ | 0000: | ||
+ | 0000: | ||
+ | -e 0:7C5C as words 1E0 | ||
+ | -g | ||
+ | Boot load called | ||
+ | </ | ||
+ | |||
+ | This works, the qemu terminal displays the lDDebug prompt. | ||
+ | |||
+ | < | ||
+ | -boot protocol chain hda1/ | ||
+ | -e 0:7C5C as words 1E1 | ||
+ | -g | ||
+ | Boot load called | ||
+ | - | ||
+ | </ | ||
+ | |||
+ | This does not work, the qemu terminal displays the " | ||
+ | |||
+ | |||
+ | ===== FAT32: 128 KiB file will be corrupted by FAT sector read ===== | ||
+ | |||
+ | This requires using k128f321.img or k128f323.img, | ||
+ | |||
+ | < | ||
+ | -boot protocol chain hda1/ | ||
+ | -p 10 silent 1 | ||
+ | AX=1FE0 BX=0080 CX=0000 DX=0080 SP=7BE0 BP=7C00 SI=7E00 DI=7E00 | ||
+ | DS=1FE0 ES=1FE0 SS=1FE0 CS=1FE0 IP=7C82 NV UP EI PL ZR NA PE NC | ||
+ | 1FE0:7C82 885640 | ||
+ | </ | ||
+ | |||
+ | Skip the initial relocation. | ||
+ | |||
+ | < | ||
+ | - | ||
+ | AX=1FE0 BX=0080 CX=0000 DX=0080 SP=7BE0 BP=7C00 SI=7E00 DI=7E00 | ||
+ | DS=1FE0 ES=1FE0 SS=1FE0 CS=1FE0 IP=7C85 NV UP EI PL ZR NA PE NC | ||
+ | 1FE0:7C85 BEC67D | ||
+ | - | ||
+ | AX=1FE0 BX=0080 CX=0000 DX=0080 SP=7BE0 BP=7C00 SI=7DC6 DI=7E00 | ||
+ | DS=1FE0 ES=1FE0 SS=1FE0 CS=1FE0 IP=7C88 NV UP EI PL ZR NA PE NC | ||
+ | 1FE0:7C88 E8F900 | ||
+ | - | ||
+ | AX=0E00 BX=0000 CX=0000 DX=0080 SP=7BE0 BP=7C00 SI=7DD7 DI=7E00 | ||
+ | DS=1FE0 ES=1FE0 SS=1FE0 CS=1FE0 IP=7C8B NV UP EI PL ZR NA PE NC | ||
+ | 1FE0:7C8B 6631C0 | ||
+ | - | ||
+ | AX=0000 BX=0000 CX=0000 DX=0080 SP=7BE0 BP=7C00 SI=7DD7 DI=7E00 | ||
+ | DS=1FE0 ES=1FE0 SS=1FE0 CS=1FE0 IP=7C8E NV UP EI PL ZR NA PE NC | ||
+ | 1FE0:7C8E 66894644 | ||
+ | - | ||
+ | AX=0000 BX=0000 CX=0000 DX=0080 SP=7BE0 BP=7C00 SI=7DD7 DI=7E00 | ||
+ | DS=1FE0 ES=1FE0 SS=1FE0 CS=1FE0 IP=7C92 NV UP EI PL ZR NA PE NC | ||
+ | 1FE0:7C92 8B460E | ||
+ | - | ||
+ | AX=0010 BX=0000 CX=0000 DX=0080 SP=7BE0 BP=7C00 SI=7DD7 DI=7E00 | ||
+ | DS=1FE0 ES=1FE0 SS=1FE0 CS=1FE0 IP=7C95 NV UP EI PL ZR NA PE NC | ||
+ | 1FE0:7C95 6603461C | ||
+ | - | ||
+ | AX=0034 BX=0000 CX=0000 DX=0080 SP=7BE0 BP=7C00 SI=7DD7 DI=7E00 | ||
+ | DS=1FE0 ES=1FE0 SS=1FE0 CS=1FE0 IP=7C99 NV UP EI PL NZ NA PO NC | ||
+ | 1FE0:7C99 66894648 | ||
+ | - | ||
+ | AX=0034 BX=0000 CX=0000 DX=0080 SP=7BE0 BP=7C00 SI=7DD7 DI=7E00 | ||
+ | DS=1FE0 ES=1FE0 SS=1FE0 CS=1FE0 IP=7C9D NV UP EI PL NZ NA PO NC | ||
+ | 1FE0:7C9D 6689464C | ||
+ | - | ||
+ | AX=0034 BX=0000 CX=0000 DX=0080 SP=7BE0 BP=7C00 SI=7DD7 DI=7E00 | ||
+ | DS=1FE0 ES=1FE0 SS=1FE0 CS=1FE0 IP=7CA1 NV UP EI PL NZ NA PO NC | ||
+ | 1FE0:7CA1 668B4610 | ||
+ | - | ||
+ | AX=0002 BX=0000 CX=0000 DX=0080 SP=7BE0 BP=7C00 SI=7DD7 DI=7E00 | ||
+ | DS=1FE0 ES=1FE0 SS=1FE0 CS=1FE0 IP=7CA5 NV UP EI PL NZ NA PO NC | ||
+ | 1FE0:7CA5 66F76E24 | ||
+ | - | ||
+ | AX=0002 BX=0000 CX=0000 DX=0000 SP=7BE0 BP=7C00 SI=7DD7 DI=7E00 | ||
+ | DS=1FE0 ES=1FE0 SS=1FE0 CS=1FE0 IP=7CA9 NV UP EI PL NZ NA PO NC | ||
+ | 1FE0:7CA9 6601464C | ||
+ | - | ||
+ | AX=0002 BX=0000 CX=0000 DX=0000 SP=7BE0 BP=7C00 SI=7DD7 DI=7E00 | ||
+ | DS=1FE0 ES=1FE0 SS=1FE0 CS=1FE0 IP=7CAD NV UP EI PL NZ NA PE NC | ||
+ | 1FE0:7CAD B80002 | ||
+ | - | ||
+ | AX=0200 BX=0000 CX=0000 DX=0000 SP=7BE0 BP=7C00 SI=7DD7 DI=7E00 | ||
+ | DS=1FE0 ES=1FE0 SS=1FE0 CS=1FE0 IP=7CB0 NV UP EI PL NZ NA PE NC | ||
+ | 1FE0:7CB0 3B460B | ||
+ | - | ||
+ | AX=0200 BX=0000 CX=0000 DX=0000 SP=7BE0 BP=7C00 SI=7DD7 DI=7E00 | ||
+ | DS=1FE0 ES=1FE0 SS=1FE0 CS=1FE0 IP=7CB3 NV UP EI PL ZR NA PE NC | ||
+ | 1FE0:7CB3 7408 jz 7CBD jumping | ||
+ | - | ||
+ | AX=0200 BX=0000 CX=0000 DX=0000 SP=7BE0 BP=7C00 SI=7DD7 DI=7E00 | ||
+ | DS=1FE0 ES=1FE0 SS=1FE0 CS=1FE0 IP=7CBD NV UP EI PL ZR NA PE NC | ||
+ | 1FE0:7CBD 668B462C | ||
+ | - | ||
+ | AX=0002 BX=0000 CX=0000 DX=0000 SP=7BE0 BP=7C00 SI=7DD7 DI=7E00 | ||
+ | DS=1FE0 ES=1FE0 SS=1FE0 CS=1FE0 IP=7CC1 NV UP EI PL ZR NA PE NC | ||
+ | 1FE0:7CC1 6650 push eax | ||
+ | - | ||
+ | AX=0002 BX=0000 CX=0000 DX=0000 SP=7BDC BP=7C00 SI=7DD7 DI=7E00 | ||
+ | DS=1FE0 ES=1FE0 SS=1FE0 CS=1FE0 IP=7CC3 NV UP EI PL ZR NA PE NC | ||
+ | 1FE0:7CC3 E89600 | ||
+ | - | ||
+ | AX=0036 BX=0000 CX=0000 DX=0100 SP=7BDC BP=7C00 SI=7DD7 DI=7E00 | ||
+ | DS=1FE0 ES=1FE0 SS=1FE0 CS=1FE0 IP=7CC6 NV UP EI PL NZ NA PE NC | ||
+ | 1FE0:7CC6 724F jb 7D17 not jumping | ||
+ | - | ||
+ | AX=0036 BX=0000 CX=0000 DX=0100 SP=7BDC BP=7C00 SI=7DD7 DI=7E00 | ||
+ | DS=1FE0 ES=1FE0 SS=1FE0 CS=1FE0 IP=7CC8 NV UP EI PL NZ NA PE NC | ||
+ | 1FE0:7CC8 C45E76 | ||
+ | - | ||
+ | AX=0036 BX=0000 CX=0000 DX=0100 SP=7BDC BP=7C00 SI=7DD7 DI=7E00 | ||
+ | DS=1FE0 ES=0060 SS=1FE0 CS=1FE0 IP=7CCB NV UP EI PL NZ NA PE NC | ||
+ | 1FE0:7CCB E8BC00 | ||
+ | - | ||
+ | AX=0037 BX=0200 CX=0000 DX=0100 SP=7BDC BP=7C00 SI=7DD7 DI=7E00 | ||
+ | DS=1FE0 ES=0060 SS=1FE0 CS=1FE0 IP=7CCE NV UP EI PL NZ NA PE NC | ||
+ | 1FE0:7CCE 31FF xor di, di | ||
+ | - | ||
+ | AX=0037 BX=0200 CX=0000 DX=0100 SP=7BDC BP=7C00 SI=7DD7 DI=0000 | ||
+ | DS=1FE0 ES=0060 SS=1FE0 CS=1FE0 IP=7CD0 NV UP EI PL ZR NA PE NC | ||
+ | 1FE0:7CD0 B90B00 | ||
+ | - | ||
+ | AX=0037 BX=0200 CX=000B DX=0100 SP=7BDC BP=7C00 SI=7DD7 DI=0000 | ||
+ | DS=1FE0 ES=0060 SS=1FE0 CS=1FE0 IP=7CD3 NV UP EI PL ZR NA PE NC | ||
+ | 1FE0:7CD3 BEF17D | ||
+ | - | ||
+ | AX=0037 BX=0200 CX=000B DX=0100 SP=7BDC BP=7C00 SI=7DF1 DI=0000 | ||
+ | DS=1FE0 ES=0060 SS=1FE0 CS=1FE0 IP=7CD6 NV UP EI PL ZR NA PE NC | ||
+ | 1FE0:7CD6 F3A6 repe cmpsb | ||
+ | - | ||
+ | AX=0037 BX=0200 CX=0000 DX=0100 SP=7BDC BP=7C00 SI=7DFC DI=000B | ||
+ | DS=1FE0 ES=0060 SS=1FE0 CS=1FE0 IP=7CD8 NV UP EI PL ZR NA PE NC | ||
+ | 1FE0:7CD8 7415 jz 7CEF jumping | ||
+ | -gt | ||
+ | AX=0037 BX=0200 CX=0000 DX=0100 SP=7BDC BP=7C00 SI=7DFC DI=000B | ||
+ | DS=1FE0 ES=0060 SS=1FE0 CS=1FE0 IP=7CEF NV UP EI PL ZR NA PE NC | ||
+ | 1FE0:7CEF 26FF7509 | ||
+ | </ | ||
+ | |||
+ | Skip until the directory scan has found its match. | ||
+ | |||
+ | < | ||
+ | -p | ||
+ | AX=0037 BX=0200 CX=0000 DX=0100 SP=7BDA BP=7C00 SI=7DFC DI=000B | ||
+ | DS=1FE0 ES=0060 SS=1FE0 CS=1FE0 IP=7CF3 NV UP EI PL ZR NA PE NC | ||
+ | 1FE0:7CF3 26FF750F | ||
+ | - | ||
+ | AX=0037 BX=0200 CX=0000 DX=0100 SP=7BD8 BP=7C00 SI=7DFC DI=000B | ||
+ | DS=1FE0 ES=0060 SS=1FE0 CS=1FE0 IP=7CF7 NV UP EI PL ZR NA PE NC | ||
+ | 1FE0:7CF7 6658 pop eax | ||
+ | - | ||
+ | AX=0003 BX=0200 CX=0000 DX=0100 SP=7BDC BP=7C00 SI=7DFC DI=000B | ||
+ | DS=1FE0 ES=0060 SS=1FE0 CS=1FE0 IP=7CF9 NV UP EI PL ZR NA PE NC | ||
+ | 1FE0:7CF9 29DB sub bx, bx | ||
+ | - | ||
+ | AX=0003 BX=0000 CX=0000 DX=0100 SP=7BDC BP=7C00 SI=7DFC DI=000B | ||
+ | DS=1FE0 ES=0060 SS=1FE0 CS=1FE0 IP=7CFB NV UP EI PL ZR NA PE NC | ||
+ | 1FE0:7CFB 6650 push eax | ||
+ | - | ||
+ | AX=0003 BX=0000 CX=0000 DX=0100 SP=7BD8 BP=7C00 SI=7DFC DI=000B | ||
+ | DS=1FE0 ES=0060 SS=1FE0 CS=1FE0 IP=7CFD NV UP EI PL ZR NA PE NC | ||
+ | 1FE0:7CFD E85C00 | ||
+ | - | ||
+ | AX=0136 BX=0000 CX=0000 DX=0100 SP=7BD8 BP=7C00 SI=7DFC DI=000B | ||
+ | DS=1FE0 ES=0060 SS=1FE0 CS=1FE0 IP=7D00 NV UP EI PL NZ NA PE NC | ||
+ | 1FE0:7D00 720D jb 7D0F not jumping | ||
+ | - | ||
+ | AX=0136 BX=0000 CX=0000 DX=0100 SP=7BD8 BP=7C00 SI=7DFC DI=000B | ||
+ | DS=1FE0 ES=0060 SS=1FE0 CS=1FE0 IP=7D02 NV UP EI PL NZ NA PE NC | ||
+ | 1FE0:7D02 E88500 | ||
+ | - | ||
+ | AX=0137 BX=0200 CX=0000 DX=0100 SP=7BD8 BP=7C00 SI=7DFC DI=000B | ||
+ | DS=1FE0 ES=0060 SS=1FE0 CS=1FE0 IP=7D05 NV UP EI PL NZ NA PE NC | ||
+ | 1FE0:7D05 4A dec dx | ||
+ | - | ||
+ | AX=0137 BX=0200 CX=0000 DX=00FF SP=7BD8 BP=7C00 SI=7DFC DI=000B | ||
+ | DS=1FE0 ES=0060 SS=1FE0 CS=1FE0 IP=7D06 NV UP EI PL NZ AC PE NC | ||
+ | 1FE0:7D06 75FA jnz | ||
+ | -gnt | ||
+ | AX=0236 BX=0000 CX=0000 DX=0000 SP=7BD8 BP=7C00 SI=7DFC DI=000B | ||
+ | DS=1FE0 ES=2060 SS=1FE0 CS=1FE0 IP=7D08 NV UP EI PL ZR NA PE NC | ||
+ | 1FE0:7D08 6658 pop eax | ||
+ | -t | ||
+ | AX=0003 BX=0000 CX=0000 DX=0000 SP=7BDC BP=7C00 SI=7DFC DI=000B | ||
+ | DS=1FE0 ES=2060 SS=1FE0 CS=1FE0 IP=7D0A NV UP EI PL ZR NA PE NC | ||
+ | 1FE0:7D0A E81600 | ||
+ | - | ||
+ | AX=0003 BX=0000 CX=0000 DX=0000 SP=7BDA BP=7C00 SI=7DFC DI=000B | ||
+ | DS=1FE0 ES=2060 SS=1FE0 CS=1FE0 IP=7D23 NV UP EI PL ZR NA PE NC | ||
+ | 1FE0:7D23 06 push es | ||
+ | - | ||
+ | AX=0003 BX=0000 CX=0000 DX=0000 SP=7BD8 BP=7C00 SI=7DFC DI=000B | ||
+ | DS=1FE0 ES=2060 SS=1FE0 CS=1FE0 IP=7D24 NV UP EI PL ZR NA PE NC | ||
+ | 1FE0:7D24 57 push di | ||
+ | - | ||
+ | AX=0003 BX=0000 CX=0000 DX=0000 SP=7BD6 BP=7C00 SI=7DFC DI=000B | ||
+ | DS=1FE0 ES=2060 SS=1FE0 CS=1FE0 IP=7D25 NV UP EI PL ZR NA PE NC | ||
+ | 1FE0:7D25 53 push bx | ||
+ | - | ||
+ | AX=0003 BX=0000 CX=0000 DX=0000 SP=7BD4 BP=7C00 SI=7DFC DI=000B | ||
+ | DS=1FE0 ES=2060 SS=1FE0 CS=1FE0 IP=7D26 NV UP EI PL ZR NA PE NC | ||
+ | 1FE0:7D26 89C7 mov di, ax | ||
+ | - | ||
+ | AX=0003 BX=0000 CX=0000 DX=0000 SP=7BD4 BP=7C00 SI=7DFC DI=0003 | ||
+ | DS=1FE0 ES=2060 SS=1FE0 CS=1FE0 IP=7D28 NV UP EI PL ZR NA PE NC | ||
+ | 1FE0:7D28 C1E702 | ||
+ | - | ||
+ | AX=0003 BX=0000 CX=0000 DX=0000 SP=7BD4 BP=7C00 SI=7DFC DI=000C | ||
+ | DS=1FE0 ES=2060 SS=1FE0 CS=1FE0 IP=7D2B NV UP EI PL NZ NA PE NC | ||
+ | 1FE0:7D2B 50 push ax | ||
+ | - | ||
+ | AX=0003 BX=0000 CX=0000 DX=0000 SP=7BD2 BP=7C00 SI=7DFC DI=000C | ||
+ | DS=1FE0 ES=2060 SS=1FE0 CS=1FE0 IP=7D2C NV UP EI PL NZ NA PE NC | ||
+ | 1FE0:7D2C 8B460B | ||
+ | - | ||
+ | AX=0200 BX=0000 CX=0000 DX=0000 SP=7BD2 BP=7C00 SI=7DFC DI=000C | ||
+ | DS=1FE0 ES=2060 SS=1FE0 CS=1FE0 IP=7D2F NV UP EI PL NZ NA PE NC | ||
+ | 1FE0:7D2F 48 dec ax | ||
+ | - | ||
+ | AX=01FF BX=0000 CX=0000 DX=0000 SP=7BD2 BP=7C00 SI=7DFC DI=000C | ||
+ | DS=1FE0 ES=2060 SS=1FE0 CS=1FE0 IP=7D30 NV UP EI PL NZ AC PE NC | ||
+ | 1FE0:7D30 21C7 and di, ax | ||
+ | - | ||
+ | AX=01FF BX=0000 CX=0000 DX=0000 SP=7BD2 BP=7C00 SI=7DFC DI=000C | ||
+ | DS=1FE0 ES=2060 SS=1FE0 CS=1FE0 IP=7D32 NV UP EI PL NZ NA PE NC | ||
+ | 1FE0:7D32 58 pop ax | ||
+ | - | ||
+ | AX=0003 BX=0000 CX=0000 DX=0000 SP=7BD4 BP=7C00 SI=7DFC DI=000C | ||
+ | DS=1FE0 ES=2060 SS=1FE0 CS=1FE0 IP=7D33 NV UP EI PL NZ NA PE NC | ||
+ | 1FE0:7D33 66C1E807 | ||
+ | - | ||
+ | AX=0000 BX=0000 CX=0000 DX=0000 SP=7BD4 BP=7C00 SI=7DFC DI=000C | ||
+ | DS=1FE0 ES=2060 SS=1FE0 CS=1FE0 IP=7D37 NV UP EI PL ZR NA PE NC | ||
+ | 1FE0:7D37 66034648 | ||
+ | - | ||
+ | AX=0034 BX=0000 CX=0000 DX=0000 SP=7BD4 BP=7C00 SI=7DFC DI=000C | ||
+ | DS=1FE0 ES=2060 SS=1FE0 CS=1FE0 IP=7D3B NV UP EI PL NZ NA PO NC | ||
+ | 1FE0:7D3B BB0020 | ||
+ | - | ||
+ | AX=0034 BX=2000 CX=0000 DX=0000 SP=7BD4 BP=7C00 SI=7DFC DI=000C | ||
+ | DS=1FE0 ES=2060 SS=1FE0 CS=1FE0 IP=7D3E NV UP EI PL NZ NA PO NC | ||
+ | 1FE0:7D3E 8EC3 mov es, bx | ||
+ | - | ||
+ | AX=0034 BX=2000 CX=0000 DX=0000 SP=7BD4 BP=7C00 SI=7DFC DI=000C | ||
+ | DS=1FE0 ES=2000 SS=1FE0 CS=1FE0 IP=7D40 NV UP EI PL NZ NA PO NC | ||
+ | 1FE0:7D40 29DB sub bx, bx | ||
+ | -p | ||
+ | AX=0034 BX=0000 CX=0000 DX=0000 SP=7BD4 BP=7C00 SI=7DFC DI=000C | ||
+ | DS=1FE0 ES=2000 SS=1FE0 CS=1FE0 IP=7D42 NV UP EI PL ZR NA PE NC | ||
+ | 1FE0:7D42 663B4644 | ||
+ | - | ||
+ | AX=0034 BX=0000 CX=0000 DX=0000 SP=7BD4 BP=7C00 SI=7DFC DI=000C | ||
+ | DS=1FE0 ES=2000 SS=1FE0 CS=1FE0 IP=7D46 NV UP EI PL NZ NA PO NC | ||
+ | 1FE0:7D46 7407 jz 7D4F not jumping | ||
+ | </ | ||
+ | |||
+ | This comparison checks whether the requested FAT sector has been read yet. In this case, it has not (no FAT sector at all is loaded yet) so the branch is not taken, so as to read in the FAT sector next. | ||
+ | |||
+ | < | ||
+ | - | ||
+ | AX=0034 BX=0000 CX=0000 DX=0000 SP=7BD4 BP=7C00 SI=7DFC DI=000C | ||
+ | DS=1FE0 ES=2000 SS=1FE0 CS=1FE0 IP=7D48 NV UP EI PL NZ NA PO NC | ||
+ | 1FE0:7D48 66894644 | ||
+ | - | ||
+ | AX=0034 BX=0000 CX=0000 DX=0000 SP=7BD4 BP=7C00 SI=7DFC DI=000C | ||
+ | DS=1FE0 ES=2000 SS=1FE0 CS=1FE0 IP=7D4C NV UP EI PL NZ NA PO NC | ||
+ | 1FE0:7D4C E83B00 | ||
+ | -p | ||
+ | AX=0035 BX=0200 CX=0000 DX=0000 SP=7BD4 BP=7C00 SI=7DFC DI=000C | ||
+ | DS=1FE0 ES=2000 SS=1FE0 CS=1FE0 IP=7D4F NV UP EI PL NZ NA PE NC | ||
+ | 1FE0:7D4F 268065030F | ||
+ | - | ||
+ | AX=0035 BX=0200 CX=0000 DX=0000 SP=7BD4 BP=7C00 SI=7DFC DI=000C | ||
+ | DS=1FE0 ES=2000 SS=1FE0 CS=1FE0 IP=7D54 NV UP EI PL NZ NA PE NC | ||
+ | 1FE0:7D54 26668B05 | ||
+ | </ | ||
+ | |||
+ | The sector having been read, this loads the correct FAT entry from the sector. | ||
+ | |||
+ | < | ||
+ | - | ||
+ | AX=FFFF BX=0200 CX=0000 DX=0000 SP=7BD4 BP=7C00 SI=7DFC DI=000C | ||
+ | DS=1FE0 ES=2000 SS=1FE0 CS=1FE0 IP=7D58 NV UP EI PL NZ NA PE NC | ||
+ | 1FE0:7D58 5B pop bx | ||
+ | - | ||
+ | AX=FFFF BX=0000 CX=0000 DX=0000 SP=7BD6 BP=7C00 SI=7DFC DI=000C | ||
+ | DS=1FE0 ES=2000 SS=1FE0 CS=1FE0 IP=7D59 NV UP EI PL NZ NA PE NC | ||
+ | 1FE0:7D59 5F pop di | ||
+ | - | ||
+ | AX=FFFF BX=0000 CX=0000 DX=0000 SP=7BD8 BP=7C00 SI=7DFC DI=000B | ||
+ | DS=1FE0 ES=2000 SS=1FE0 CS=1FE0 IP=7D5A NV UP EI PL NZ NA PE NC | ||
+ | 1FE0:7D5A 07 pop es | ||
+ | - | ||
+ | AX=FFFF BX=0000 CX=0000 DX=0000 SP=7BDA BP=7C00 SI=7DFC DI=000B | ||
+ | DS=1FE0 ES=2060 SS=1FE0 CS=1FE0 IP=7D5B NV UP EI PL NZ NA PE NC | ||
+ | 1FE0:7D5B C3 retn | ||
+ | - | ||
+ | AX=FFFF BX=0000 CX=0000 DX=0000 SP=7BDC BP=7C00 SI=7DFC DI=000B | ||
+ | DS=1FE0 ES=2060 SS=1FE0 CS=1FE0 IP=7D0D NV UP EI PL NZ NA PE NC | ||
+ | 1FE0:7D0D EBEC jmp 7CFB | ||
+ | - | ||
+ | AX=FFFF BX=0000 CX=0000 DX=0000 SP=7BDC BP=7C00 SI=7DFC DI=000B | ||
+ | DS=1FE0 ES=2060 SS=1FE0 CS=1FE0 IP=7CFB NV UP EI PL NZ NA PE NC | ||
+ | 1FE0:7CFB 6650 push eax | ||
+ | - | ||
+ | AX=FFFF BX=0000 CX=0000 DX=0000 SP=7BD8 BP=7C00 SI=7DFC DI=000B | ||
+ | DS=1FE0 ES=2060 SS=1FE0 CS=1FE0 IP=7CFD NV UP EI PL NZ NA PE NC | ||
+ | 1FE0:7CFD E85C00 | ||
+ | - | ||
+ | AX=FFFF BX=0000 CX=0000 DX=0000 SP=7BD8 BP=7C00 SI=7DFC DI=000B | ||
+ | DS=1FE0 ES=2060 SS=1FE0 CS=1FE0 IP=7D00 NV UP EI PL NZ NA PO CY | ||
+ | 1FE0:7D00 720D jb 7D0F jumping | ||
+ | - | ||
+ | AX=FFFF BX=0000 CX=0000 DX=0000 SP=7BD8 BP=7C00 SI=7DFC DI=000B | ||
+ | DS=1FE0 ES=2060 SS=1FE0 CS=1FE0 IP=7D0F NV UP EI PL NZ NA PO CY | ||
+ | 1FE0:7D0F 8A5640 | ||
+ | - | ||
+ | AX=FFFF BX=0000 CX=0000 DX=0080 SP=7BD8 BP=7C00 SI=7DFC DI=000B | ||
+ | DS=1FE0 ES=2060 SS=1FE0 CS=1FE0 IP=7D12 NV UP EI PL NZ NA PO CY | ||
+ | 1FE0:7D12 88D3 mov bl, dl | ||
+ | - | ||
+ | AX=FFFF BX=0080 CX=0000 DX=0080 SP=7BD8 BP=7C00 SI=7DFC DI=000B | ||
+ | DS=1FE0 ES=2060 SS=1FE0 CS=1FE0 IP=7D14 NV UP EI PL NZ NA PO CY | ||
+ | 1FE0:7D14 FF6E76 | ||
+ | - | ||
+ | AX=FFFF BX=0080 CX=0000 DX=0080 SP=7BD8 BP=7C00 SI=7DFC DI=000B | ||
+ | DS=1FE0 ES=2060 SS=1FE0 CS=0060 IP=0000 NV UP EI PL NZ NA PO CY | ||
+ | 0060:0000 4D dec bp | ||
+ | -d 2000:0 l 100 | ||
+ | 2000: | ||
+ | 2000: | ||
+ | 2000: | ||
+ | 2000: | ||
+ | 2000: | ||
+ | 2000: | ||
+ | 2000: | ||
+ | 2000: | ||
+ | 2000: | ||
+ | 2000: | ||
+ | 2000: | ||
+ | 2000: | ||
+ | 2000: | ||
+ | 2000: | ||
+ | 2000: | ||
+ | 2000: | ||
+ | - | ||
+ | </ | ||
+ | |||
+ | The file data in the area 600h to below 20600h is corrupted with the FAT sector data at 20000h to 201FFh. | ||
+ | |||
+ | |||
+ | The same test with the trailing all-1s file makes it clearer that the file data is corrupted: | ||
+ | |||
+ | < | ||
+ | -boot protocol chain hda1/ | ||
+ | -p 10 silent 1 | ||
+ | AX=1FE0 BX=0080 CX=0000 DX=0080 SP=7BE0 BP=7C00 SI=7E00 DI=7E00 | ||
+ | DS=1FE0 ES=1FE0 SS=1FE0 CS=1FE0 IP=7C82 NV UP EI PL ZR NA PE NC | ||
+ | 1FE0:7C82 885640 | ||
+ | -g 7D14 | ||
+ | AX=FFFF BX=0080 CX=0000 DX=0080 SP=7BD8 BP=7C00 SI=7DFC DI=002B | ||
+ | DS=1FE0 ES=2060 SS=1FE0 CS=1FE0 IP=7D14 NV UP EI PL NZ NA PO CY | ||
+ | 1FE0:7D14 FF6E76 | ||
+ | -d 2000:0 l 210 | ||
+ | 2000: | ||
+ | 2000: | ||
+ | 2000: | ||
+ | 2000: | ||
+ | 2000: | ||
+ | 2000: | ||
+ | 2000: | ||
+ | 2000: | ||
+ | 2000: | ||
+ | 2000: | ||
+ | 2000: | ||
+ | 2000: | ||
+ | 2000: | ||
+ | 2000: | ||
+ | 2000: | ||
+ | 2000: | ||
+ | 2000: | ||
+ | 2000: | ||
+ | 2000: | ||
+ | 2000: | ||
+ | 2000: | ||
+ | 2000: | ||
+ | 2000: | ||
+ | 2000: | ||
+ | 2000: | ||
+ | 2000: | ||
+ | 2000: | ||
+ | 2000: | ||
+ | 2000: | ||
+ | 2000: | ||
+ | 2000: | ||
+ | 2000: | ||
+ | 2000: | ||
+ | - | ||
+ | </ | ||
+ | |||
+ | The entire area of 20000h to below 20600h should be filled with 0FFh bytes. However, the FAT sector corrupts this area. | ||
+ | |||
+ | |||
+ | Using k128f323.img (the CHS 8086 FAT32 loader, without directory padding) the same error can be discovered: | ||
+ | |||
+ | < | ||
+ | -boot protocol chain hda1/ | ||
+ | -p 10 silent 1 | ||
+ | AX=1FE0 BX=0080 CX=0000 DX=0F80 SP=7BE0 BP=7C00 SI=7E00 DI=7E00 | ||
+ | DS=1FE0 ES=1FE0 SS=1FE0 CS=1FE0 IP=7C82 NV UP EI PL ZR NA PE NC | ||
+ | 1FE0:7C82 885640 | ||
+ | -g 7D77 | ||
+ | AX=FFFF BX=0000 CX=0111 DX=0FFF SP=7BD0 BP=7C00 SI=7DFC DI=0010 | ||
+ | DS=1FE0 ES=2060 SS=1FE0 CS=1FE0 IP=7D77 NV UP EI PL NZ NA PO CY | ||
+ | 1FE0:7D77 8A5640 | ||
+ | -d 2000:0 l 210 | ||
+ | 2000: | ||
+ | 2000: | ||
+ | 2000: | ||
+ | 2000: | ||
+ | 2000: | ||
+ | 2000: | ||
+ | 2000: | ||
+ | 2000: | ||
+ | 2000: | ||
+ | 2000: | ||
+ | 2000: | ||
+ | 2000: | ||
+ | 2000: | ||
+ | 2000: | ||
+ | 2000: | ||
+ | 2000: | ||
+ | 2000: | ||
+ | 2000: | ||
+ | 2000: | ||
+ | 2000: | ||
+ | 2000: | ||
+ | 2000: | ||
+ | 2000: | ||
+ | 2000: | ||
+ | 2000: | ||
+ | 2000: | ||
+ | 2000: | ||
+ | 2000: | ||
+ | 2000: | ||
+ | 2000: | ||
+ | 2000: | ||
+ | 2000: | ||
+ | 2000: | ||
+ | - | ||
+ | </ | ||
+ | |||
+ | |||
+ | ===== FAT32: 128 KiB file will corrupt FAT sector buffer ===== | ||
+ | |||
+ | This test, in turn, requires using the images that are formatted with the directory padding, that is k128f322.img or k128f324.img. The former ends up like so: | ||
+ | |||
+ | < | ||
+ | lDebug connected to serial port. Enter KEEP to confirm. | ||
+ | = keep | ||
+ | -boot protocol chain hda1/ | ||
+ | -p 10 silent 1 | ||
+ | AX=1FE0 BX=0080 CX=0000 DX=0080 SP=7BE0 BP=7C00 SI=7E00 DI=7E00 | ||
+ | DS=1FE0 ES=1FE0 SS=1FE0 CS=1FE0 IP=7C82 NV UP EI PL ZR NA PE NC | ||
+ | 1FE0:7C82 885640 | ||
+ | </ | ||
+ | |||
+ | As before, skip the relocation. | ||
+ | |||
+ | < | ||
+ | -g 7D42 | ||
+ | AX=0034 BX=0000 CX=000A DX=0000 SP=7BD8 BP=7C00 SI=7DF2 DI=0008 | ||
+ | DS=1FE0 ES=2000 SS=1FE0 CS=1FE0 IP=7D42 NV UP EI PL ZR NA PE NC | ||
+ | 1FE0:7D42 663B4644 | ||
+ | </ | ||
+ | |||
+ | This is the first time that next_cluster is called. It is caused by the root directory scanning continuing past the first root cluster, which we filled with empty deleted directory entries. No FAT sector is buffered yet, so past this comparison the function will load the first FAT sector. | ||
+ | |||
+ | < | ||
+ | -g 7D42 | ||
+ | AX=0034 BX=0000 CX=0000 DX=0000 SP=7BD4 BP=7C00 SI=7DFC DI=0010 | ||
+ | DS=1FE0 ES=2000 SS=1FE0 CS=1FE0 IP=7D42 NV UP EI PL ZR NA PE NC | ||
+ | 1FE0:7D42 663B4644 | ||
+ | </ | ||
+ | |||
+ | This is the second time that next_cluster is called. In this case, it wants to read the FAT entry that corresponds to the first data cluster of the kernel file. As the FAT sector was already read prior, the variable matches the FAT sector to load. Therefore, the sector is not loaded again as it is expected that it was preserved. | ||
+ | |||
+ | |||
+ | < | ||
+ | -t | ||
+ | AX=0034 BX=0000 CX=0000 DX=0000 SP=7BD4 BP=7C00 SI=7DFC DI=0010 | ||
+ | DS=1FE0 ES=2000 SS=1FE0 CS=1FE0 IP=7D46 NV UP EI PL ZR NA PE NC | ||
+ | 1FE0:7D46 7407 jz 7D4F jumping | ||
+ | - | ||
+ | AX=0034 BX=0000 CX=0000 DX=0000 SP=7BD4 BP=7C00 SI=7DFC DI=0010 | ||
+ | DS=1FE0 ES=2000 SS=1FE0 CS=1FE0 IP=7D4F NV UP EI PL ZR NA PE NC | ||
+ | 1FE0:7D4F 268065030F | ||
+ | - | ||
+ | AX=0034 BX=0000 CX=0000 DX=0000 SP=7BD4 BP=7C00 SI=7DFC DI=0010 | ||
+ | DS=1FE0 ES=2000 SS=1FE0 CS=1FE0 IP=7D54 NV UP EI PL ZR NA PE NC | ||
+ | 1FE0:7D54 26668B05 | ||
+ | - | ||
+ | AX=0000 BX=0000 CX=0000 DX=0000 SP=7BD4 BP=7C00 SI=7DFC DI=0010 | ||
+ | DS=1FE0 ES=2000 SS=1FE0 CS=1FE0 IP=7D58 NV UP EI PL ZR NA PE NC | ||
+ | 1FE0:7D58 5B pop bx | ||
+ | - | ||
+ | </ | ||
+ | |||
+ | Turns out the FAT sector was actually overwritten by the file data, so when using the file with the trailing all-0s the code will read a zero as the content of the FAT entry. This is wrong, and results in a hang. | ||
+ | |||
+ | |||
+ | The same error can be observed with k128f324.img (the 8086 CHS loader): | ||
+ | |||
+ | < | ||
+ | lDebug connected to serial port. Enter KEEP to confirm. | ||
+ | = keep | ||
+ | -boot protocol chain hda1/ | ||
+ | -p 10 silent 1 | ||
+ | AX=1FE0 BX=0080 CX=0000 DX=0080 SP=7BE0 BP=7C00 SI=7E00 DI=7E00 | ||
+ | DS=1FE0 ES=1FE0 SS=1FE0 CS=1FE0 IP=7C82 NV UP EI PL ZR NA PE NC | ||
+ | 1FE0:7C82 885640 | ||
+ | </ | ||
+ | |||
+ | As before, skip the relocation. | ||
+ | |||
+ | < | ||
+ | -g 7D5A | ||
+ | AX=0034 BX=0000 CX=0000 DX=0000 SP=7BDA BP=7C00 SI=7DF2 DI=0008 | ||
+ | DS=1FE0 ES=2000 SS=1FE0 CS=1FE0 IP=7D5A NV UP EI PL ZR NA PE NC | ||
+ | 1FE0:7D5A 3B4648 | ||
+ | -t | ||
+ | AX=0034 BX=0000 CX=0000 DX=0000 SP=7BDA BP=7C00 SI=7DF2 DI=0008 | ||
+ | DS=1FE0 ES=2000 SS=1FE0 CS=1FE0 IP=7D5D NV UP EI PL NZ NA PO NC | ||
+ | 1FE0:7D5D 7505 jnz | ||
+ | - | ||
+ | AX=0034 BX=0000 CX=0000 DX=0000 SP=7BDA BP=7C00 SI=7DF2 DI=0008 | ||
+ | DS=1FE0 ES=2000 SS=1FE0 CS=1FE0 IP=7D64 NV UP EI PL NZ NA PO NC | ||
+ | 1FE0:7D64 894648 | ||
+ | - | ||
+ | AX=0034 BX=0000 CX=0000 DX=0000 SP=7BDA BP=7C00 SI=7DF2 DI=0008 | ||
+ | DS=1FE0 ES=2000 SS=1FE0 CS=1FE0 IP=7D67 NV UP EI PL NZ NA PO NC | ||
+ | 1FE0:7D67 89564A | ||
+ | - | ||
+ | AX=0034 BX=0000 CX=0000 DX=0000 SP=7BDA BP=7C00 SI=7DF2 DI=0008 | ||
+ | DS=1FE0 ES=2000 SS=1FE0 CS=1FE0 IP=7D6A NV UP EI PL NZ NA PO NC | ||
+ | 1FE0:7D6A E83D00 | ||
+ | </ | ||
+ | |||
+ | No FAT sector is loaded yet during root directory traversal. As the directory entry is not found in the first cluster, the next root cluster is loaded. | ||
+ | |||
+ | < | ||
+ | -g 7D5A | ||
+ | AX=0034 BX=0000 CX=0000 DX=0000 SP=7BD0 BP=7C00 SI=7DFC DI=0010 | ||
+ | DS=1FE0 ES=2000 SS=1FE0 CS=1FE0 IP=7D5A NV UP EI PL ZR NA PE NC | ||
+ | 1FE0:7D5A 3B4648 | ||
+ | -t | ||
+ | AX=0034 BX=0000 CX=0000 DX=0000 SP=7BD0 BP=7C00 SI=7DFC DI=0010 | ||
+ | DS=1FE0 ES=2000 SS=1FE0 CS=1FE0 IP=7D5D NV UP EI PL ZR NA PE NC | ||
+ | 1FE0:7D5D 7505 jnz | ||
+ | - | ||
+ | AX=0034 BX=0000 CX=0000 DX=0000 SP=7BD0 BP=7C00 SI=7DFC DI=0010 | ||
+ | DS=1FE0 ES=2000 SS=1FE0 CS=1FE0 IP=7D5F NV UP EI PL ZR NA PE NC | ||
+ | 1FE0:7D5F 3B564A | ||
+ | - | ||
+ | AX=0034 BX=0000 CX=0000 DX=0000 SP=7BD0 BP=7C00 SI=7DFC DI=0010 | ||
+ | DS=1FE0 ES=2000 SS=1FE0 CS=1FE0 IP=7D62 NV UP EI PL ZR NA PE NC | ||
+ | 1FE0:7D62 7409 jz 7D6D jumping | ||
+ | - | ||
+ | AX=0034 BX=0000 CX=0000 DX=0000 SP=7BD0 BP=7C00 SI=7DFC DI=0010 | ||
+ | DS=1FE0 ES=2000 SS=1FE0 CS=1FE0 IP=7D6D NV UP EI PL ZR NA PE NC | ||
+ | 1FE0:7D6D 5B pop bx | ||
+ | - | ||
+ | AX=0034 BX=0000 CX=0000 DX=0000 SP=7BD2 BP=7C00 SI=7DFC DI=0010 | ||
+ | DS=1FE0 ES=2000 SS=1FE0 CS=1FE0 IP=7D6E NV UP EI PL ZR NA PE NC | ||
+ | 1FE0:7D6E 268B05 | ||
+ | - | ||
+ | AX=0000 BX=0000 CX=0000 DX=0000 SP=7BD2 BP=7C00 SI=7DFC DI=0010 | ||
+ | DS=1FE0 ES=2000 SS=1FE0 CS=1FE0 IP=7D71 NV UP EI PL ZR NA PE NC | ||
+ | 1FE0:7D71 268B5502 | ||
+ | - | ||
+ | AX=0000 BX=0000 CX=0000 DX=0000 SP=7BD2 BP=7C00 SI=7DFC DI=0010 | ||
+ | DS=1FE0 ES=2000 SS=1FE0 CS=1FE0 IP=7D75 NV UP EI PL ZR NA PE NC | ||
+ | 1FE0:7D75 07 pop es | ||
+ | - | ||
+ | </ | ||
+ | |||
+ | The FAT sector is expected to be already loaded, but it was corrupted by the file data. Continuing after this will result in a division error interrupt from a '' | ||
+ | |||
+ | |||
+ | ===== Conclusion on FAT32 large file loader overlap ===== | ||
+ | |||
+ | The large file overlap only occurs if the file, rounded up to a cluster boundary, reaches close to 128 KiB. To be precise, a rounded up file size up to 129_536 Bytes (126.5 KiB) will not run into problems with the default /L load segment of 60h. If the cluster size is 128 KiB, the file will always run into problems. If it is 64 KiB, then a file larger than 64 KiB will run into problems. If it is 32 KiB, then a file larger than 96 KiB will run into problems. And so on. | ||
+ | |||
+ | The nature of the overlap is determined by which FAT sectors are read, and when. To simplify the example, assume a 128 KiB cluster size and that the file has only one cluster (as in our test cases). If the first cluster of the file has its FAT entry in another sector than the last root directory FAT entry read, then the loader will read the new FAT sector and find the appropriate entry in it. This is also true if the root directory scan only accessed the first cluster of the root directory, as in that case no FAT sector is read by the scan at all. | ||
+ | |||
+ | In this case, the trailing file data will be corrupted by the FAT sector, but the FAT sector is not corrupted. For a cluster size of 128 KiB, this case is very likely because 4_096 directory entries will fit in the first root cluster. (In the example tests, I had to pad the root directory with as many entries to force the directory scan to load a FAT sector.) If the actual file size is not larger than 126.5 KiB and the 128 KiB read occurs only because of rounding up to the cluster size, then the corruption is benign as it does not affect the actual file data read by the loader. Otherwise, the trail of the file data is corrupted. | ||
+ | |||
+ | If the root directory scan did load a FAT sector and the same FAT sector is needed throughout until after more than 126.5 KiB of file data have been read, then the FAT sector is corrupted and the exact behaviour that results depends on the loader, what exact FAT entry it tries to read, and what trailing data from the file read has overwritten the FAT sector. | ||
+ | |||
+ | Using a higher /L load segment than 60h will shrink the allowed rounded up size of the file before it runs into problems. For example, with ''/ | ||
+ | |||
+ | File sizes beyond 128 KiB will generally always be a problem and might overwrite any of the data structures, including the stack of the loader. The code is located in the 512 Bytes starting at 1FE0h:7C00h or linear 27A00h, while the stack lives below this address. So a read that corrupts the code would also corrupt the stack first, at which point a crash is almost entirely inevitable. | ||
+ | |||
+ | {{tag> | ||
+ | |||
+ | |||
+ | ~~DISCUSSION~~ | ||