Opened 8 years ago
Last modified 8 years ago
#15409 closed defect
MakeAlternativeSource bug — at Initial Version
Reported by: | gim | Owned by: | |
---|---|---|---|
Component: | other | Version: | VirtualBox 5.0.20 |
Keywords: | MakeAlternativeSource, BIOS, | Cc: | |
Guest type: | Linux | Host type: | all |
Description
Sometime MakeAlternatioveSource generates bad VBoxBiosAlternative.asm dissassebling:
... lea sp, [bp-002h] ; 8d 66 fe pop bx ; 5b pop bp ; 5d retn ; c3 retf ; cb xchg di, ax ; 97 xchg di, ax ; 97 cbw ; 98 fst qword [bx-06808h] ; dd 97 f8 97 xchg di, ax ; 97 cbw ; 98 and bx, word [bx+si-06769h] ; 23 98 97 98 sub byte [bx+si-06794h], bl ; 28 98 6c 98 insb ; 6c cbw ; 98 insb ; 6c cbw ; 98 <----- !!! cbw ; 67 98 <----- !!! insb ; 6c cbw ; 98 insb ; 6c cbw ; 98 pushaw ; 60 cbw ; 98 _apm_function: ; 0xf97a8 LB 0xf5 push bp ; 55 mov bp, sp ; 89 e5 push si ; 56 and byte [bp+018h], 0feh ; 80 66 18 fe mov ax, word [bp+012h] ; 8b 46 12 xor ah, ah ; 30 e4 cmp ax, strict word 0000eh ; 3d 0e 00 jnbe near 0986ch ; 0f 87 b0 00 mov bx, ax ; 89 c3 add bx, ax ; 01 c3 mov dx, word [bp+018h] ; 8b 56 18 ...
As you can see here same instructions but different bytes:
cbw ; 98 cbw ; 67 98
Thats because it's not code at all. It's offsets from switch-case table:
BIOS_F:978A CB 97 off_F978A dw offset loc_F97CB ; DATA XREF: BIOS_F:97C6r BIOS_F:978C 97 98 dw offset loc_F9897 BIOS_F:978E DD 97 dw offset loc_F97DD BIOS_F:9790 F8 97 dw offset loc_F97F8 BIOS_F:9792 97 98 dw offset loc_F9897 BIOS_F:9794 23 98 dw offset loc_F9823 BIOS_F:9796 97 98 dw offset loc_F9897 BIOS_F:9798 28 98 dw offset loc_F9828 BIOS_F:979A 6C 98 dw offset loc_F986C BIOS_F:979C 6C 98 dw offset loc_F986C BIOS_F:979E 6C 98 dw offset loc_F986C BIOS_F:97A0 67 98 dw offset loc_F9867 BIOS_F:97A2 6C 98 dw offset loc_F986C BIOS_F:97A4 6C 98 dw offset loc_F986C BIOS_F:97A6 60 98 dw offset loc_F9860 BIOS_F:97A8 ; --------------------------------------------------------------------------- BIOS_F:97A8 55 push bp BIOS_F:97A9 89 E5 mov bp, sp BIOS_F:97AB 56 push si BIOS_F:97AC 80 66 18 FE and byte ptr [bp+18h], 0FEh BIOS_F:97B0 8B 46 12 mov ax, [bp+12h] BIOS_F:97B3 30 E4 xor ah, ah BIOS_F:97B5 3D 0E 00 cmp ax, 0Eh BIOS_F:97B8 0F 87 B0 00 ja loc_F986C BIOS_F:97BC 89 C3 mov bx, ax BIOS_F:97BE 01 C3 add bx, ax BIOS_F:97C0 8B 56 18 mov dx, [bp+18h] BIOS_F:97C3 80 CA 01 or dl, 1 BIOS_F:97C6 2E FF A7 8A 97 jmp cs:off_F978A[bx]
It happens because dissasebler just ignore prefix opcode (0x67) for instruction cbw and not fails.
As a result when we build new BIOS by 'kmk update-pcbios-source' VBoxCmp fail with:
VBoxCmp out/linux.amd64/release/obj/VBoxPcBios/VBoxPcBios.rom out/linux.amd64/release/obj/VBoxPcBios/VBoxBiosAlternative.bin VBoxCmp: 0x0000097a0: 0x67 (103) != 0x98 (152) VBoxCmp: 0x0000097a1: 0x98 (152) != 0x6c (108) VBoxCmp: 0x0000097a2: 0x6c (108) != 0x98 (152) VBoxCmp: 0x0000097a3: 0x98 (152) != 0x6c (108) VBoxCmp: 0x0000097a4: 0x6c (108) != 0x98 (152)
...
Note:
See TracTickets
for help on using tickets.