wok annotate memtest/stuff/bootloader.S @ rev 19941

memtest: remove help command line, useless
author Pascal Bellard <pascal.bellard@slitaz.org>
date Thu May 04 12:47:15 2017 +0200 (2017-05-04)
parents e4d1fb5556df
children 9ca81337dc6e
rev   line source
pascal@19941 1 // Image/zImage boot sector
pascal@19941 2
pascal@15188 3 SYSSEG = 0x1000
pascal@15188 4 INITSEG = 0x9000
pascal@15188 5 SETUPSEG = 0x9020
pascal@19941 6 setup_sects = 497
pascal@19941 7 syssize = 500
pascal@15188 8
pascal@15188 9 .text
pascal@15188 10 .code16
pascal@15188 11 .org 0
pascal@15188 12 .globl _start
pascal@15188 13 _start:
pascal@15188 14
pascal@19399 15 #define CODESZ 512 /* patched by installer */
pascal@15188 16
pascal@15188 17 /* some extra features */
pascal@15188 18 #define EXE_SUPPORT real mode dos .exe file support
pascal@19941 19 #define CMDLINE 0x9E00
pascal@19941 20 #define VCPI VCPI 4.0 support
pascal@19399 21 #define SHUTDOWNDOS shutdown DOS services
pascal@15188 22
pascal@15188 23 /* some contraints to reduce the size */
pascal@19941 24 //#define FLOPPY_1440K_ONLY 1.44M floppies support only -33
pascal@19941 25 //#define FLOPPY_HAS_2_SIDES hardcoded heads count to 2 -13
pascal@19941 26 //#define MOVE_MAX_SYSSIZE always memcpy 512Kb -2
pascal@19941 27 //#define NO_CURSOR_DEFINITION -8
pascal@19941 28 //#define NO_CMDLINE_SHRINK remove heading spaces ? -6
pascal@19941 29 //#define NO_DOTS show progression dots ? -8
pascal@15188 30
pascal@15188 31 #ifdef EXE_SUPPORT
pascal@19399 32 #define EXEADRS(x) (x+0xE0)
pascal@19941 33 #define FLAT20(x) (x+16*INITSEG)
pascal@19941 34
pascal@19941 35 .macro trace_int19
pascal@19941 36 pushl $4
pascal@19941 37 popw %si
pascal@19941 38 popw %ds
pascal@19400 39 pushl (%si)
pascal@19941 40 movl $step19+(INITSEG<<16), (%si)
pascal@19399 41 pushfw
pascal@19399 42 popw %ax
pascal@19399 43 incb %ah # set TF
pascal@19399 44 pushw %ax
pascal@19399 45 popfw
pascal@19400 46 ljmp *4*0x19-4(%si)
pascal@19941 47 .endm
pascal@19941 48
pascal@19941 49 stacktop = 0x9E00 # in 0x8000 .. 0xA000
pascal@19941 50 decw %bp // Magic number: MZ
pascal@19941 51 popw %dx
pascal@19941 52 jmp start // Bytes on last page of file
pascal@19941 53 .word (CODESZ+511)/512 // Pages in file INSTALLER
pascal@19941 54 .word 0 // Relocations
pascal@19941 55 .word (end_header-_start)/16 // Size of header in paragraphs
pascal@19941 56 .word (CODESZ+stacktop+15)/16 // Minimum extra paragraphs needed INSTALLER
pascal@19941 57 .word -1 // Maximum extra paragraphs needed
pascal@19941 58 .word (CODESZ+15)/16 // Initial (relative) SS value INSTALLER
pascal@19941 59 .word stacktop // Initial SP value
pascal@19941 60 .word 0 // Checksum INSTALLER?
pascal@19941 61 .word EXEADRS(comstart) // Initial IP value
pascal@19941 62 .word 0xFFF0 // Initial (relative) CS value
pascal@19941 63 // .word 0x001C // File address of relocation table
pascal@19941 64 // .word 0,0,0 // Overlay number
pascal@19399 65 #endif
pascal@15188 66 start:
pascal@15188 67 cld # assume nothing
pascal@19941 68 xorw %ax, %ax # %ax = 0
pascal@15188 69 zeroed = 12 # zeroed registers
pascal@19941 70 stacktop = 0x9E00 # in 0x8000 .. 0xA000 (+zeroed+12)
pascal@19941 71 pushw $INITSEG
pascal@19941 72 popw %ss # %ss contain INITSEG
pascal@19941 73 pushw %ss
pascal@19941 74 end_header:
pascal@19941 75 popw %es # %es = %ss = INITSEG
pascal@19941 76 # cmdline offset at 0x22
pascal@19941 77 movw $stacktop, %di # stacktop is an arbitrary value >=
pascal@15188 78 # length of bootsect + length of
pascal@15188 79 # setup + room for stack;
pascal@15188 80 # 12 is disk parm size.
pascal@15188 81 movw %di, %sp # put stack at INITSEG:stacktop-...
pascal@19941 82 #ifdef EXE_SUPPORT
pascal@19941 83 cwd # %dx = 0
pascal@19941 84 #endif
pascal@15188 85
pascal@15188 86 # Many BIOS's default disk parameter tables will not recognize
pascal@15188 87 # multi-sector reads beyond the maximum sector number specified
pascal@15188 88 # in the default diskette parameter tables - this may mean 7
pascal@15188 89 # sectors in some cases.
pascal@15188 90 #
pascal@15188 91 # Since single sector reads are slow and out of the question,
pascal@15188 92 # we must take care of this by creating new parameter tables
pascal@15188 93 # (for the first disk) in RAM. We can set the maximum sector
pascal@15188 94 # count to 36 - the most we will encounter on an ED 2.88.
pascal@15188 95 #
pascal@15188 96 # High doesn't hurt. Low does. Let's use the max: 63
pascal@15188 97
pascal@15188 98 movw $zeroed/2, %cx # clear gdt + offset, %ds, limits
pascal@15188 99 rep # don't worry about cld
pascal@15188 100 stosw # already done above
pascal@15188 101 popw %bx # offset = 0
pascal@15188 102 popw %ds # %ds = 0
pascal@15188 103 popw %fs # %fs = 0
pascal@15188 104
pascal@15188 105 movb setup_sects+0x7C00, %al # read bootsector + setup (%ds = 0)
pascal@15188 106 incw %ax
pascal@15188 107
pascal@15188 108 ldsw 0x78(%bx), %si # %ds:%bx+0x78 is parameter table address
pascal@15188 109 pushw %es
pascal@15188 110 pushw %di
pascal@15188 111 movb $6, %cl # copy 12 bytes
pascal@15188 112 rep # don't worry about cld
pascal@15188 113 movsw # already done above
pascal@15188 114 pushw %ss
pascal@15188 115 popw %ds # now %ds = %es = %ss = INITSEG
pascal@15188 116 popl %fs:0x78(%bx) # update parameter table address
pascal@15188 117 movb $63, 0x4-12(%di) # patch sector count, %di = stacktop
pascal@15188 118 cli
pascal@15188 119
pascal@15188 120 xchg %ax, %di # sector count
pascal@15188 121 popw %ax # limits = 0
pascal@15188 122 incw %cx # cylinder 0, sector 1, clear Z
pascal@15188 123 call read_first_sectors # read setup
pascal@15188 124
pascal@15188 125 # This routine loads the system at address LOADSEG, making sure
pascal@15188 126 # no 64kB boundaries are crossed. We try to load it as fast as
pascal@15188 127 # possible, loading whole tracks whenever we can.
pascal@15188 128
pascal@19941 129 #ifndef NO_DOTS
pascal@15188 130 popw %bx # clear %bx
pascal@19941 131 #endif
pascal@15188 132 movw syssize, %di
pascal@17223 133 decw %di
pascal@15188 134 shrw $9-4, %di
pascal@17223 135 incw %di
pascal@15188 136 movw $SYSSEG, %cx
pascal@15188 137 call read_sectorsCX
pascal@15188 138
pascal@15188 139 # This procedure turns off the floppy drive motor, so
pascal@15188 140 # that we enter the kernel in a known state, and
pascal@15188 141 # don't have to worry about it later.
pascal@15188 142
pascal@15188 143 kill_motor:
pascal@15188 144 xchgw %ax, %di # reset FDC (%di < 128)
pascal@15188 145 int $0x13
pascal@15188 146
pascal@15188 147 # After that (everything loaded), we jump to the setup-routine
pascal@15188 148 # loaded directly after the bootblock:
pascal@15188 149 # Segments are as follows: %ds = %ss = INITSEG
pascal@15188 150
pascal@15188 151 jmp_setup:
pascal@15188 152 ljmp $SETUPSEG, $0
pascal@15188 153
pascal@15188 154 #ifdef EXE_SUPPORT
pascal@19399 155 #ifdef SHUTDOWNDOS
pascal@19399 156 doiret:
pascal@19399 157 iret
pascal@19399 158 step19:
pascal@19399 159 pushw %si
pascal@19399 160 pushw %ds
pascal@19399 161 movw %sp, %si
pascal@19399 162 ldsw %ss:4(%si), %si
pascal@19399 163 cmpw $0x19CD, (%si)
pascal@19399 164 popw %ds
pascal@19399 165 popw %si
pascal@19399 166 jne doiret
pascal@19399 167 xorw %si, %si
pascal@19402 168 movw %si, %ds
pascal@19401 169 pushw %cs
pascal@19401 170 popw %ss
pascal@19400 171 movw $stacktop-4-16, %sp
pascal@19399 172 popl 4(%si)
pascal@19399 173 popaw
pascal@19399 174 #endif
pascal@19941 175 movesys: // %ax = SYSSEG, %bx = DS, %si
pascal@19941 176 //movw %cs:syssize, %bp
pascal@19941 177 movw $0x8000, %bp
pascal@19193 178 shrw $4, %si
pascal@19193 179 addw %si, %bx
pascal@17223 180 subw %ax, %bx
pascal@15188 181 jnc forward
pascal@15188 182 addw %bp, %ax
pascal@15188 183 forward:
pascal@15188 184 movw %ax, %es
pascal@17223 185 movw %ax, %dx
pascal@17223 186 addw %bx, %dx
pascal@17223 187 movw %dx, %ds
pascal@17223 188 sbbw %dx, %dx // %dx = 0 : -1
pascal@17223 189 cmc // C = 1 : 0
pascal@17223 190 adcw %dx, %ax
pascal@19193 191 xorw %si, %si
pascal@15188 192 xorw %di, %di
pascal@15188 193 movb $8, %cl
pascal@15188 194 rep
pascal@15188 195 movsw
pascal@15188 196 decw %bp
pascal@15188 197 jns forward
pascal@15188 198 #ifndef NO_CURSOR_DEFINITION
pascal@15188 199 movb $1, %ah
pascal@15188 200 movb $0, %bh
pascal@15188 201 movb $0x20, %ch // 0x2000
pascal@15188 202 int $0x10
pascal@15188 203 #endif
pascal@15188 204 pushw %ss
pascal@15188 205 popw %ds
pascal@15188 206 jmp jmp_setup
pascal@19941 207 comstart:
pascal@19941 208 cld # assume nothing
pascal@19941 209 pushw $INITSEG
pascal@19941 210 popw %es
pascal@19941 211 #ifdef CMDLINE
pascal@19941 212 movw %sp, %di
pascal@19941 213 movw $0x80, %si
pascal@19941 214 lodsb
pascal@19941 215 cbw
pascal@19941 216 xchgw %ax, %cx
pascal@19941 217 jcxz nocmdline
pascal@19941 218 movw $0xA33F, 0x7F(%si)
pascal@19941 219 # ifndef NO_CMDLINE_SHRINK
pascal@19941 220 skipspace:
pascal@19941 221 lodsb
pascal@19941 222 cmpb $0x20, %al
pascal@19941 223 je skipspace
pascal@19941 224 decw %si
pascal@19941 225 # endif
pascal@19941 226 rep
pascal@19941 227 movsb
pascal@19941 228 nocmdline:
pascal@15188 229 #endif
pascal@19941 230 movb $(512-(end_header-_start))/2, %cl
pascal@19941 231 movb EXEADRS(setup_sects), %ch
pascal@19941 232 movw $0x100, %si
pascal@19941 233 movw $end_header, %di
pascal@19941 234 rep
pascal@19941 235 movsw
pascal@19941 236 movw $SYSSEG, %ax
pascal@19941 237 movw %ds, %bx
pascal@19941 238 pushw %es
pascal@19941 239 popw %ss
pascal@19941 240 #ifndef SHUTDOWNDOS
pascal@19941 241 pushw %es
pascal@19941 242 pushw $movesys
pascal@15188 243 #endif
pascal@19941 244 #ifdef VCPI
pascal@19941 245 # ifndef SHUTDOWNDOS
pascal@19941 246 pushw %es
pascal@19941 247 pushw %ds
pascal@19941 248 # endif
pascal@19941 249 pushaw
pascal@19941 250 smsww %ax
pascal@19941 251 andb $1, %al
pascal@19941 252 je isrm
pascal@19941 253 movw $EXEADRS(gdt_vcpi),%si
pascal@19941 254 pushw $pagebuf/16
pascal@19941 255 popw %es
pascal@19941 256 movl $pagebuf+3,%es:0x1000
pascal@19941 257 xorw %di,%di
pascal@19941 258 call_vcpi:
pascal@19941 259 movb $0xDE,%ah // DE01, EBX = getiface(DS:SI, ES:DI)
pascal@19941 260 int $0x67
pascal@19941 261 movl $FLAT20(sw2pm_params),%esi
pascal@19941 262 movb $0x0C,%al // DE0C switchpm(ESI)
pascal@19941 263 cli
pascal@19941 264 jmp call_vcpi
pascal@19941 265 pm_code:
pascal@19941 266 movl %cr0,%eax
pascal@19941 267 andl $0x7FFFFFFE,%eax
pascal@19941 268 movl %eax,%cr0
pascal@19941 269 movl %eax,%cr3
pascal@19941 270 isrm:
pascal@19941 271 # ifdef SHUTDOWNDOS
pascal@19941 272 trace_int19
pascal@19941 273 # else
pascal@19941 274 lssw %cs:EXEADRS(saved_ss_sp),%sp
pascal@19941 275 popaw
pascal@19941 276 popw %ds
pascal@19941 277 popw %es
pascal@19941 278 retf
pascal@19941 279 # endif
pascal@19941 280 #else
pascal@19941 281 # ifdef SHUTDOWNDOS
pascal@19941 282 pushaw
pascal@19941 283 trace_int19
pascal@19941 284 # endif
pascal@19941 285 retf
pascal@19941 286 #endif
pascal@19941 287 #endif
pascal@15188 288
pascal@15188 289 # read_sectors reads %di sectors into %es:0 buffer.
pascal@15188 290 # %es:0 is updated to the next memory location.
pascal@15188 291 # First, sectors are read sector by sector until
pascal@15188 292 # sector per track count is known. Then they are
pascal@15188 293 # read track by track.
pascal@15188 294 # Assume no error on first track.
pascal@15188 295
pascal@15188 296 #ifdef FLOPPY_1440K_ONLY
pascal@19941 297 #define FLOPPY_HAS_2_SIDES hardcore heads count to 2
pascal@15188 298 #define FLOPPY_SECTORS 18 /* 18 sectors */
pascal@15188 299 #else
pascal@15188 300 #define FLOPPY_HEADS 2 /* 2 heads minimum */
pascal@15188 301 #define FLOPPY_SECTORS 9 /* 9 sectors minimum */
pascal@15188 302 #endif
pascal@15188 303
pascal@19941 304 return:
pascal@19941 305 #ifndef NO_DOTS
pascal@19941 306 movw $0xE2E,%ax
pascal@19941 307 movb $7,%bl
pascal@19941 308 int $0x10
pascal@19941 309 #endif
pascal@19941 310 ret
pascal@19941 311
pascal@15188 312 check_limits:
pascal@15188 313 #ifndef FLOPPY_1440K_ONLY
pascal@15188 314 popw %dx
pascal@15188 315 #ifdef FLOPPY_SECTORS
pascal@15188 316 cmpb $FLOPPY_SECTORS+1, %cl # minimum sector count
pascal@15188 317 jb check_head
pascal@15188 318 #endif
pascal@15188 319 cmpb %al, %cl # max sector known ?
pascal@15188 320 ja next_head # no -> store it
pascal@19941 321 #ifndef FLOPPY_HAS_2_SIDES
pascal@15188 322 check_head:
pascal@15188 323 #ifdef FLOPPY_HEADS
pascal@15188 324 cmpb $FLOPPY_HEADS, %dh # 2 heads minimum
pascal@15188 325 jb check_cylinder
pascal@15188 326 #endif
pascal@15188 327 cmpb %ah, %dh # max head known ?
pascal@15188 328 ja next_cylinder # no -> store it
pascal@15188 329 check_cylinder:
pascal@15188 330 #endif
pascal@19941 331 #endif
pascal@15188 332 pushaw
pascal@15188 333 #ifndef FLOPPY_1440K_ONLY
pascal@15188 334 cbw # %ah = 0
pascal@15188 335 #endif
pascal@15188 336 int $0x13 # reset controler
pascal@15188 337 popaw
pascal@15188 338 movb $1, %al # sector by sector...
pascal@15188 339 read_sectorslp:
pascal@15188 340 pushw %dx # some bios break dx...
pascal@15188 341 #ifndef FLOPPY_1440K_ONLY
pascal@15188 342 pushw %ax # limits
pascal@15188 343 subb %cl, %al # sectors remaining in track
pascal@15188 344 ja tolastsect
pascal@15188 345 movb $1, %al # 1 sector mini
pascal@15188 346 tolastsect:
pascal@15188 347 #else
pascal@19402 348 movb $FLOPPY_SECTORS+1, %al
pascal@15188 349 subb %cl, %al # sectors remaining in track
pascal@15188 350 #endif
pascal@15188 351 cbw
pascal@15188 352 cmpw %di, %ax
pascal@15188 353 jb more1trk
pascal@15188 354 movw %di, %ax # sectors to read
pascal@15188 355 more1trk:
pascal@15188 356 pushw %ax # save context
pascal@15188 357 movb $2, %ah # cmd: read chs
pascal@15188 358 int $0x13
pascal@15188 359 #ifndef FLOPPY_1440K_ONLY
pascal@15188 360 popw %dx # save %ax
pascal@15188 361 popw %ax # limits
pascal@15188 362 #else
pascal@15188 363 popw %ax # restore context
pascal@15188 364 popw %dx
pascal@15188 365 #endif
pascal@15188 366 jc check_limits
pascal@15188 367 #ifndef FLOPPY_1440K_ONLY
pascal@15188 368 xchgw %ax, %bp
pascal@15188 369 addw %dx,%cx # next sector
pascal@15188 370 movw %cx, %gs
pascal@15188 371 movw %es, %cx
pascal@15188 372 pushw %dx
pascal@15188 373 shlw $5, %dx
pascal@15188 374 addw %dx, %cx
pascal@15188 375 popw %dx
pascal@15188 376 subw %dx,%di # update sector counter
pascal@15188 377 popw %dx
pascal@15188 378 #else
pascal@15188 379 addw %ax,%cx # next sector
pascal@15188 380 movw %cx, %gs
pascal@15188 381 movw %es, %cx
pascal@15188 382 pushw %ax
pascal@15188 383 shlw $5, %ax
pascal@15188 384 addw %ax, %cx
pascal@15188 385 popw %ax
pascal@15188 386 subw %ax,%di # update sector counter
pascal@19941 387 #endif
pascal@15188 388 read_sectorsCX:
pascal@15188 389 movw %cx, %es # next location
pascal@19941 390 jz return
pascal@15188 391 read_sectors:
pascal@15188 392 movw %gs, %cx
pascal@15188 393 #ifndef FLOPPY_1440K_ONLY
pascal@15188 394 # al is last sector+1
pascal@15188 395 # ah is last cylinder+1
pascal@15188 396 xchgw %ax, %bp
pascal@15188 397 #endif
pascal@15188 398 #ifndef FLOPPY_1440K_ONLY
pascal@15188 399 cmpb %al,%cl # reach sector limit ?
pascal@15188 400 jne bdendlp
pascal@15188 401 next_head:
pascal@15188 402 movb %cl,%al
pascal@15188 403 #else
pascal@15188 404 cmpb $FLOPPY_SECTORS+1,%cl # reach sector limit ?
pascal@15188 405 jne bdendlp
pascal@15188 406 #endif
pascal@19941 407 movb $1,%cl # first sector
pascal@19941 408 #ifndef FLOPPY_HAS_2_SIDES
pascal@15188 409 incb %dh # next head
pascal@15188 410 cmpb %ah, %dh # reach head limit ?
pascal@15188 411 jne bdendlp
pascal@15188 412 next_cylinder:
pascal@15188 413 movb %dh,%ah
pascal@19941 414 movb $0,%dh # first head
pascal@15188 415 #else
pascal@19941 416 xorb %cl,%dh # next head
pascal@19941 417 jne bdendlp # reach head limit ?
pascal@15188 418 #endif
pascal@15188 419 # NOTE : support 256 cylinders max
pascal@15188 420 incb %ch # next cylinder
pascal@15188 421 read_first_sectors:
pascal@15188 422 bdendlp:
pascal@15188 423 jmp read_sectorslp
pascal@15188 424
pascal@19941 425 #ifdef VCPI
pascal@19941 426 pagebuf = 0x98000
pascal@19920 427 tss = gdt_abs-40
pascal@19920 428 gdt = gdt_abs-32
pascal@19920 429 gdt_null = gdt_abs-32
pascal@19920 430 gdt_vcpi = gdt_abs-24
pascal@19920 431 gdt_vcpi2 = gdt_abs-16
pascal@19920 432 gdt_vcpi3 = gdt_abs-8
pascal@19920 433 gdt_abs:
pascal@19941 434 .word 0xFFFF
pascal@19941 435 .long 0x92000000
pascal@19941 436 .byte 0xCF,0
pascal@19920 437 gdt_code:
pascal@19920 438 .word 0xFFFF
pascal@19920 439 gdt_code_base:
pascal@19941 440 .long 0x9A000000+FLAT20(0)
pascal@19920 441 .byte 0x8F,0
pascal@19920 442 gdt_tss:
pascal@19920 443 .word 0x00FF
pascal@19920 444 gdt_tss_base:
pascal@19941 445 .long 0x89000000+FLAT20(tss)
pascal@19920 446 .byte 0,0
pascal@19920 447 gdtr:
pascal@19920 448 gdt_lim:
pascal@19920 449 .word 0xFFFF
pascal@19920 450 gdt_base:
pascal@19941 451 .long FLAT20(gdt)
pascal@19920 452 sw2pm_params:
pascal@19920 453 sw2pm_cr3:
pascal@19920 454 .long pagebuf+0x1000
pascal@19920 455 sw2pm_gdtr_ptr:
pascal@19941 456 .long FLAT20(gdtr)
pascal@19920 457 sw2pm_idtr_ptr:
pascal@19941 458 .long FLAT20(idtr)
pascal@19920 459 sw2pm_ldtr:
pascal@19920 460 .word 0
pascal@19920 461 sw2pm_tr:
pascal@19920 462 SEL_TSS = gdt_tss-gdt_null
pascal@19920 463 .word SEL_TSS
pascal@19920 464 sw2pm_jumpaddr:
pascal@19941 465 .long pm_code
pascal@19920 466 SEL_CODE = gdt_code-gdt_null
pascal@19920 467 .word SEL_CODE
pascal@19920 468 idtr:
pascal@19920 469 idt_lim:
pascal@19920 470 .word 0x03FF
pascal@19920 471 idt_base:
pascal@19920 472 .long 0
pascal@19941 473 # ifndef SHUTDOWNDOS
pascal@19941 474 saved_ss_sp:
pascal@19941 475 .word stacktop-4-16-4,INITSEG
pascal@19941 476 # endif
pascal@19920 477 #endif
pascal@19941 478
pascal@15188 479 helpmsg:
pascal@19941 480 .ascii "SliTaz zImage boot"
pascal@19941 481 .org 497
pascal@19920 482 helpend: