wok annotate syslinux/stuff/iso2exe/bootiso.S @ rev 17496

syslinux/iso2exe: check ISO md5 (again)
author Pascal Bellard <pascal.bellard@slitaz.org>
date Mon Jan 05 12:38:18 2015 +0100 (2015-01-05)
parents 6aed6fc5819d
children 00bb1e4137c6
rev   line source
pascal@13691 1 .text
pascal@13691 2 .code16
pascal@13691 3 .org 0
pascal@13691 4
pascal@13691 5 CODESZ = 0x8000 // 16 sectors = 32Kb
pascal@13972 6 #define EXEADRS(x) x+0xC0
pascal@14261 7 #define EXELOC(x) x-0x40
pascal@14261 8 #define EXESTR(x) x-0x7F40
pascal@13691 9
pascal@13691 10 .globl _start
pascal@13691 11 _start:
pascal@13691 12 decw %bp // Magic number: MZ
pascal@13691 13 popw %dx
pascal@13972 14 jmp start0 // Bytes on last page of file
pascal@13691 15 .word (CODESZ+511)/512 // Pages in file
pascal@13691 16 .word 0 // Relocations
pascal@13691 17 .word (end_header-_start)/16 // Size of header in paragraphs
pascal@13691 18 .word 4064-(CODESZ/16) // Minimum extra paragraphs needed
pascal@13691 19 .word 4064-(CODESZ/16) // Maximum extra paragraphs needed
pascal@13691 20 .word 0xFFF0 // Initial (relative) SS value
pascal@13691 21 .word 0xFFFE // Initial SP value
pascal@13691 22 .word 0 // Checksum
pascal@13729 23 .word EXEADRS(exestart) // Initial IP value
pascal@13691 24 .word 0xFFF0 // Initial (relative) CS value
pascal@13972 25 initramfssize:
pascal@13972 26 .word 0 // File address of relocation table
pascal@13972 27 id:
pascal@13691 28 .word 0 // Overlay number
pascal@17496 29 fdcnt: // File address of relocation table
pascal@14257 30 .byte 0 // Bootstrap floppy sector count
pascal@13691 31
pascal@13691 32 /////////////////////// Master Boot Record code //////////////////////////////
pascal@13691 33
pascal@17496 34 start0:
pascal@17496 35 pushw %dx // restore %sp
pascal@13972 36 incw %bp // restore %bp
pascal@17496 37 xorw %bx, %bx
pascal@17496 38 movw %bx, %ds
pascal@17496 39 movb $0x7C, %bh
pascal@17496 40 pushw %bx // return address
pascal@13691 41 pushaw
pascal@13691 42 movw %sp, %bp
pascal@17496 43 pushw %es // save %es:%di
pascal@13972 44 cld
pascal@17496 45 sti
pascal@13972 46 pushw %ds
pascal@13972 47 popw %es
pascal@13691 48 call setreg
pascal@13691 49 rep
pascal@13691 50 movsw
pascal@13972 51 movw $0x80, %dx
pascal@13691 52 ljmp $0, $0x0600+start2
pascal@13972 53
pascal@13972 54 .org 60
pascal@14261 55 .long 0x0080 // PE header offset
pascal@13972 56 end_header:
pascal@13972 57 chksum:
pascal@13972 58 .word 0
pascal@13972 59 comstart:
pascal@13972 60 .word 0
pascal@13691 61
pascal@17496 62 .org 68
pascal@17496 63 readsectorX: // read isolinux boot sector
pascal@17496 64 movb $0xA5, %cl // patched by installer
pascal@13699 65 readsector1:
pascal@17496 66 andb $0x83, %dl // disk and floppy disk
pascal@13699 67 movw %cx, (%bx)
pascal@13699 68 incw %cx
pascal@13699 69 movw $0x201, %ax
pascal@13699 70 int $0x13
pascal@13691 71 setreg:
pascal@13699 72 movw %bx, %si
pascal@13691 73 movw $0x0600, %di
pascal@13691 74 movw $0x0100, %cx
pascal@13691 75 return:
pascal@13691 76 ret
pascal@17496 77 dxloop:
pascal@13691 78 start2:
pascal@17496 79 call readsector1 // look for the boot device
pascal@13691 80 repe
pascal@13691 81 cmpsw
pascal@13691 82 je dxfound
pascal@17496 83 movb $0, %cl // ch = 0
pascal@17496 84 addb $0x7D, %dl // try every hard disk
pascal@17496 85 jno dxloop
pascal@13691 86 dxfound:
pascal@17496 87 call readsectorX // read isolinux boot sector
pascal@13691 88 movw %dx, 10(%bp)
pascal@14267 89 call checkboot
pascal@17496 90 .asciz "No isolinux bs"
pascal@14267 91
pascal@14267 92 .org 0x0080
pascal@14267 93 ////////////////////////////// EXE/PE header //////////////////////////////////
pascal@14267 94
pascal@14267 95 .org 0x01A0
pascal@14267 96 checkboot:
pascal@17496 97 cmpw %cx, (%bx)
pascal@14267 98 popw %si
pascal@17496 99 jc error // read fail or no isohydrid boot sector
pascal@13691 100 popw %es
pascal@13691 101 popa
pascal@17496 102 putsret:
pascal@17496 103 ret
pascal@17496 104 putstrlp:
pascal@14267 105 movw $7, %bx
pascal@14267 106 movb $0xE, %ah
pascal@14267 107 int $0x10
pascal@17496 108 error:
pascal@17496 109 lodsb
pascal@17496 110 cmp $1, %al
pascal@17496 111 jg putstrlp
pascal@17496 112 jz putsret
pascal@17496 113 putstr:
pascal@17496 114 movb $0x80, %ah
pascal@17496 115 xchgw %ax, %si
pascal@17496 116 jnc error
pascal@14267 117 halt:
pascal@14267 118 hlt
pascal@14267 119 jmp halt
pascal@14267 120 .org 0x01BE
pascal@14261 121
pascal@17496 122 .org 0x7F10
pascal@13691 123 ////////////////////////////// DOS EXE code ///////////////////////////////////
pascal@13691 124
pascal@13729 125 exestart:
pascal@13699 126 cld
pascal@13697 127 movw $0x100, %si
pascal@17461 128 movw -127(%si), %ax
pascal@17473 129 cmpb $0x2F, %al
pascal@17473 130 je ishelp
pascal@17473 131 cmpw $0x2F20, %ax
pascal@17473 132 ishelp:
pascal@17473 133 movw $0x3000+EXESTR(help), %ax
pascal@13729 134 cwd // clear dx
pascal@17454 135 pushw %dx // dos exit()
pascal@17454 136 je abort
pascal@17454 137 int $0x21 // get DOS version
pascal@17160 138 cmpb $3, %al
pascal@17160 139 movb $EXESTR(noDOS3), %al
pascal@17160 140 jb abort
pascal@14261 141 movw $(EXELOC(0x8000))/2, %cx
pascal@13697 142 chklp:
pascal@13697 143 lodsw
pascal@13697 144 addw %ax, %dx
pascal@13697 145 loop chklp
pascal@17160 146 chked:
pascal@17160 147 movw $0x1000+EXESTR(chkerr), %ax
pascal@17160 148 je tst386 // dx == 0 ?
pascal@13691 149 abort:
pascal@13691 150 puts:
pascal@17496 151 clc
pascal@17496 152 jmp putstr
pascal@13691 153
pascal@17160 154 tst386:
pascal@17160 155 pushfw // save flags
pascal@17160 156 // bits 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
pascal@17160 157 // flags 0 NT IOPL OF DF IF TF SF ZF 0 AF 0 PF 1 CF
pascal@17160 158 // movb $0x10, %ah
pascal@17160 159 pushw %ax
pascal@17160 160 popfw // < 286 : flags[12..15] are forced 1
pascal@17160 161 pushfw // = 286 : flags[12..15] are forced 0
pascal@17160 162 popw %bx // > 286 : only flags[15] is forced 0
pascal@17454 163 popfw // restore flags (IOPL)
pascal@17160 164 addb %ah, %bh // test F0 and 00 cases
pascal@17160 165 cmpb %ah, %bh
pascal@17160 166 movb $EXESTR(no386), %al
pascal@17160 167 #undef NEED386
pascal@17160 168 #ifdef NEED386
pascal@17160 169 jbe abort // C=8086/80186, Z=80286
pascal@17160 170 #else
pascal@17160 171 jbe is86 // C=8086/80186, Z=80286
pascal@17160 172 #endif
pascal@13691 173 is386:
pascal@17160 174 smsww %ax // not privileged
pascal@13691 175 andb $1, %al
pascal@13691 176 jne tstvcpi
pascal@17160 177 movl %cr0, %eax // privileged
pascal@14150 178 incl %eax
pascal@13713 179 movb $EXESTR(rmPaging), %al
pascal@14150 180 js abort
pascal@13713 181 movb $EXESTR(realmodemsg), %al
pascal@13691 182 realmode:
pascal@17160 183 is86:
pascal@13691 184 call puts
pascal@13691 185 movw $0x0100, %di
pascal@14261 186 movw comstart-end_header(%di), %si // .com address
pascal@13691 187 pushw %di
pascal@17473 188 movb $0x7C/2, %ch // 31K-31.5K, > com length
pascal@13691 189 rep
pascal@17473 190 movsw
pascal@13691 191 ret
pascal@13713 192
pascal@13713 193 VersionVCPI:
pascal@13713 194 cmpb $0x40, %dl // >= 4.0 ?
pascal@13713 195 jb NoVCPI
pascal@17496 196 xchgw %ax, %si // movb $EXESTR(vm86modemsg), %al
pascal@13713 197 jmp realmode
pascal@13713 198 tstvcpi:
pascal@13713 199 pushw %ds
pascal@17160 200 movw %dx, %ds // %dx = 0
pascal@13713 201 movw 0x67*4+2, %ds
pascal@13713 202 movw $10, %si
pascal@17473 203 lodsw
pascal@13713 204 xorw $0x4D45, %ax // EM(MX) or EM(MQ)
pascal@17473 205 lodsw
pascal@17473 206 lodsw
pascal@13713 207 popw %ds
pascal@14150 208 jne NoVCPI
pascal@17473 209 xorw $0x5858, %ax // XX(X0)
pascal@13713 210 movw $EXEADRS(CmdVCPI), %si
pascal@13713 211 ChkVCPI:
pascal@13713 212 NoVCPI:
pascal@13713 213 movb $EXESTR(ERRvcpi), %al
pascal@13713 214 jne abort
pascal@13713 215 lodsb
pascal@13713 216 shlw $8, %ax
pascal@13713 217 je VersionVCPI
pascal@13713 218 int $0x67
pascal@13713 219 testb %ah, %ah
pascal@14150 220 xchgw %ax, %dx
pascal@13713 221 jmp ChkVCPI
pascal@13713 222 CmdVCPI:
pascal@13713 223 .byte 0x40 // status
pascal@13713 224 .byte 0xDE // vcpi present ?
pascal@13713 225 .byte 0x46 // version
pascal@13713 226 .byte 0
pascal@13713 227
pascal@17496 228 vm86modemsg:
pascal@17473 229 // --------------- Must be in 7F40 7FFF range ------------------------
pascal@17496 230 .ascii "vm" // vm86
pascal@17496 231 .byte EXESTR(_86)
pascal@14261 232 ERRvcpi:
pascal@17496 233 .ascii "No VCPI-4.0/EMM" // No VCPI-4.0/EMM386
pascal@17496 234 .byte EXESTR(_386)
pascal@17496 235 noDOS3:
pascal@17496 236 .ascii "No DOS 3" // No DOS 3
pascal@17496 237 .byte EXESTR(eol)
pascal@14261 238 chkerr:
pascal@17496 239 .ascii "Broken c" // Broken code
pascal@17496 240 .byte EXESTR(ode)
pascal@14261 241 rmPaging:
pascal@17496 242 .ascii "Un" // Unreal mode
pascal@14261 243 realmodemsg:
pascal@17496 244 .ascii "real m" // real mode
pascal@17473 245 // --------------- Must be in 7FC0 7FFF range ------------------------
pascal@17496 246 ode:
pascal@17496 247 .ascii "od"
pascal@14261 248 eeol:
pascal@14261 249 .ascii "e"
pascal@14261 250 .byte EXESTR(eol)
pascal@17496 251 no386:
pascal@17496 252 .ascii "No " // No 386
pascal@17496 253 _386:
pascal@17496 254 .ascii "3"
pascal@17496 255 _86:
pascal@17496 256 .ascii "86"
pascal@17496 257 .byte EXESTR(eol)
pascal@17473 258 help:
pascal@17496 259 .ascii "SliTaz boot loader" // SliTaz boot loader
pascal@17473 260 eol:
pascal@17496 261 .ascii "\r\n"
pascal@17496 262 .byte 1
pascal@14261 263
pascal@17496 264 .space 16,0 // ISO md5
pascal@14261 265 .org 0x8000
pascal@14261 266 ////////////////////////// ISO9660 header /////////////////////////////////////