wok annotate linux/stuff/linux-header.u @ rev 18701

Up tazpkg(889)
author Aleksej Bobylev <al.bobylev@gmail.com>
date Wed Dec 16 12:18:23 2015 +0200 (2015-12-16)
parents e0cfbb41587f
children
rev   line source
pascal@17269 1 --- linux-3.2.53/arch/x86/boot/header.S
pascal@17269 2 +++ linux-3.2.53/arch/x86/boot/header.S
pascal@15203 3 @@ -7,12 +7,14 @@
slaxemulator@8085 4 * modified by more people than can be counted
slaxemulator@8085 5 *
pascal@12556 6 * Rewritten as a common file by H. Peter Anvin (Apr 2007)
pascal@16547 7 + * Rewritten by Pascal Bellard (Nov 2009)
slaxemulator@8085 8 *
slaxemulator@8085 9 * BIG FAT NOTE: We're in real mode using 64k segments. Therefore segment
slaxemulator@8085 10 * addresses must be multiplied by 16 to obtain their respective linear
pascal@15203 11 * addresses. To avoid confusion, linear addresses are written using leading
pascal@15203 12 * hex while segment addresses are written as segment:offset.
pascal@15203 13 *
pascal@15203 14 + * Assume protocol 2.00+ (kernel >= 1.3.73)
pascal@15203 15 */
pascal@15203 16
pascal@15203 17 #include <asm/segment.h>
pascal@15203 18 @@ -27,6 +29,8 @@
slaxemulator@8085 19
slaxemulator@8085 20 BOOTSEG = 0x07C0 /* original address of boot-sector */
slaxemulator@8085 21 SYSSEG = 0x1000 /* historical load address >> 4 */
slaxemulator@8085 22 +INITSEG = 0x9000 /* boot address >> 4 */
slaxemulator@8085 23 +SETUPSEG = 0x9020 /* setup address >> 4 */
slaxemulator@8085 24
slaxemulator@8085 25 #ifndef SVGA_MODE
slaxemulator@8085 26 #define SVGA_MODE ASK_VGA
pascal@17269 27 @@ -40,54 +44,752 @@
pascal@15203 28 #define ROOT_RDONLY 1
slaxemulator@8085 29 #endif
pascal@15203 30
pascal@15203 31 +setup_sects = 497
pascal@15203 32 +syssize = 500
pascal@17269 33 +vgamode = 506
pascal@15203 34 +cmd_line_ptr = 0x228
pascal@15203 35 +
pascal@15203 36 +/* some extra features */
pascal@16547 37 +#define EXE_SUPPORT real mode dos .exe file support
pascal@15203 38 +#define CMDLINE kernel >= 2.4
pascal@15203 39 +#define OLDCMDLINE kernel < 2.4
pascal@15203 40 +#define HELP display version for ? argument
pascal@15203 41 +#define MORETHAN16M up to 4Gb RAM, not 16Mb
pascal@15203 42 +#define KEYBOARDLESS_SUPPORT scan floppy swap each 5 seconds
pascal@15203 43 +
pascal@16547 44 +/* some limitations to reduce the code size */
pascal@17269 45 +//#define REALMODE_NOT_CHECKED exe crash when started in vm86
pascal@17269 46 +//#define FLOPPY_1440K_ONLY 1.44M floppies support only (no 720K, 1.68M, 2.88M...)
pascal@17269 47 +
pascal@17269 48 +#ifdef FLOPPY_ONLY
pascal@17269 49 +#undef EXE_SUPPORT
pascal@17269 50 +#undef FLOPPY_1440K_ONLY
pascal@17269 51 +#define EDIT_CMDLINE
pascal@17269 52 +#define CMDLINE_SUPPORT
pascal@17269 53 +#define MOVE_CMDLINE
pascal@17269 54 +#define INITRD_SUPPORT
pascal@17269 55 +#define INITRD_AUTOADDR
pascal@17269 56 +#endif
pascal@17269 57 +
pascal@17269 58 +#ifdef EXE_ONLY
pascal@17269 59 +#undef KEYBOARDLESS_SUPPORT
pascal@17269 60 +#define INITRD_SUPPORT
pascal@17269 61 +#define INITRD_KEYWORD
pascal@17269 62 +#define INITRD_AUTOADDR
pascal@17269 63 +#endif
pascal@15203 64 +
pascal@15203 65 .code16
pascal@15203 66 .section ".bstext", "ax"
slaxemulator@8085 67
slaxemulator@8085 68 .global bootsect_start
slaxemulator@8085 69 bootsect_start:
pascal@15203 70
pascal@15203 71 - # Normalize the start address
pascal@15203 72 - ljmp $BOOTSEG, $start2
pascal@15203 73 +stacktop = 0x9E00 # in 0x8000 .. 0xA000
pascal@17269 74 +zeroed = 48+10 # gdt + zeroed registers
pascal@17269 75 +.macro INIT_REGS
pascal@17269 76 + movw $stacktop-zeroed, %di # stacktop is an arbitrary value >=
pascal@17269 77 + # length of bootsect + length of
pascal@17269 78 + # setup + room for stack;
pascal@17269 79 + # 12 is disk parm size.
pascal@17269 80 + pushw $INITSEG
pascal@17269 81 + popw %ss # %ss contain INITSEG
pascal@17269 82 + movw %di, %sp # put stack at INITSEG:stacktop-...
pascal@17269 83 + pushw %ss
pascal@17269 84 + popw %es # %es = %ss = INITSEG
pascal@17269 85 + xorw %ax, %ax # %ax = 0
pascal@17269 86 +#if defined(CMDLINE)
pascal@17269 87 + movw $zeroed+1, %cx # clear gdt + offset, %ds, limits, cmdline=""
pascal@17269 88 + rep # don't worry about cld
pascal@17269 89 + stosb # already done above
pascal@17269 90 + decw %di
pascal@17269 91 +#else
pascal@17269 92 + movw $zeroed/2, %cx # clear gdt + offset, %ds, limits
pascal@17269 93 + rep # don't worry about cld
pascal@17269 94 + stosw # already done above
pascal@15203 95 +#endif
pascal@17269 96 + popw %bx # offset = 0
pascal@17269 97 +.endm
pascal@15203 98
pascal@15203 99 -start2:
pascal@15203 100 - movw %cs, %ax
pascal@15203 101 - movw %ax, %ds
pascal@15203 102 - movw %ax, %es
pascal@15203 103 - movw %ax, %ss
pascal@15203 104 - xorw %sp, %sp
pascal@15203 105 - sti
pascal@15203 106 - cld
pascal@17269 107 +#ifdef EXE_SUPPORT
pascal@17269 108 +#define CODESZ 0x8000
pascal@17269 109 +#define EXEADRS(x) x+0xE0
pascal@17269 110 + decw %bp // Magic number: MZ
pascal@17269 111 + popw %dx
pascal@17269 112 +#ifdef EXE_ONLY
pascal@17269 113 + .word 512 // Bytes on last page of file
pascal@17269 114 +#else
pascal@17269 115 + jmp fdstart // Bytes on last page of file
pascal@17269 116 +#endif
pascal@17269 117 + .word (CODESZ+511)/512 // Pages in file
pascal@17269 118 + .word 0 // Relocations
pascal@17269 119 + .word 2 // Size of header in paragraphs
pascal@17269 120 + .word 4096 // Minimum extra paragraphs needed
pascal@17269 121 + .word -1 // Maximum extra paragraphs needed
pascal@17269 122 + .word (CODESZ+15)/16 // Initial (relative) SS value
pascal@17269 123 + .word stacktop+4 // Initial SP value (+callf)
pascal@17269 124 + .word 0 // Checksum
pascal@17269 125 + .word EXEADRS(comstart) // Initial IP value
pascal@17269 126 + .word 0xFFF0 // Initial (relative) CS value
pascal@17269 127 +#ifdef EXE_ONLY
pascal@17269 128 +// .word 0x001C // File address of relocation table
pascal@17269 129 +// .word 0,0,0 // Overlay number
pascal@17269 130 + .ascii "(SliTaz)"
pascal@17269 131 +#else
pascal@17269 132 +swap_floppy:
pascal@17269 133 + .ascii "Next!"
pascal@17269 134 + .byte 7,13,0 # swap detection needs 13, 0
pascal@17269 135 +#endif
pascal@17269 136 +#ifdef OLDCMDLINE
pascal@17269 137 +# ifdef CMDLINE_SUPPORT
pascal@17269 138 + .word 0 # 0xA33F
pascal@17269 139 + .word 0 # stacktop
pascal@17269 140 +# else
pascal@17269 141 + .word 0xA33F
pascal@17269 142 + .word stacktop
pascal@17269 143 +# endif
pascal@17269 144 +#endif
pascal@17269 145 +#ifndef EXE_ONLY
pascal@17269 146 +fdstart:
pascal@17269 147 + pushw %dx
pascal@17269 148 +#endif
pascal@17269 149 +#endif
pascal@17269 150
pascal@17269 151 - movw $bugger_off_msg, %si
pascal@16547 152 +LOADSEG = 0x8000 # 0x1000 multiple, up to 512K zImage
pascal@16547 153 +LOADSZ = 0x10000
pascal@16547 154 +#ifdef EXE_SUPPORT
pascal@16547 155 +A20BUFFER = 0x68000 # a20 gate / himem.sys support
pascal@16547 156 +#define USEA20BUFFER
pascal@15203 157 +#endif
pascal@15203 158
pascal@17269 159 -msg_loop:
pascal@17269 160 +#ifndef EXE_ONLY
pascal@16547 161 +# bootsect_start:
pascal@17269 162 +#ifdef EXE_SUPPORT
pascal@17269 163 + call initregs
pascal@17269 164 + cwd # floppy = head = 0
pascal@17269 165 +#else
pascal@17269 166 + INIT_REGS
pascal@17269 167 +#endif
pascal@17269 168 + popw %ds # %ds = 0
pascal@17269 169 + movb setup_sects+0x7C00, %al # read bootsector + setup
pascal@17269 170 + incw %ax # %ax = setup_sects+bootsect
pascal@17269 171 + popw %fs # %fs = 0
pascal@17269 172 +
slaxemulator@8085 173 +# Many BIOS's default disk parameter tables will not recognize
slaxemulator@8085 174 +# multi-sector reads beyond the maximum sector number specified
slaxemulator@8085 175 +# in the default diskette parameter tables - this may mean 7
slaxemulator@8085 176 +# sectors in some cases.
slaxemulator@8085 177 +#
slaxemulator@8085 178 +# Since single sector reads are slow and out of the question,
slaxemulator@8085 179 +# we must take care of this by creating new parameter tables
slaxemulator@8085 180 +# (for the first disk) in RAM. We can set the maximum sector
slaxemulator@8085 181 +# count to 36 - the most we will encounter on an ED 2.88.
slaxemulator@8085 182 +#
slaxemulator@8085 183 +# High doesn't hurt. Low does. Let's use the max: 63
pascal@15203 184 +
pascal@12556 185 + ldsw 0x78(%bx), %si # %ds:%bx+0x78 is parameter table address
pascal@17269 186 + popw %di
slaxemulator@8085 187 + pushw %es
pascal@12556 188 + pushw %di
pascal@17269 189 +#ifdef CMDLINE_SUPPORT
pascal@17269 190 + movw $0, %bp # patched by installer (7C22)
pascal@17269 191 +skipcmdline:
pascal@17269 192 +#define cmd_line_ptr 0x22
pascal@17269 193 +#endif
slaxemulator@8085 194 + movb $6, %cl # copy 12 bytes
slaxemulator@8085 195 + rep # don't worry about cld
pascal@17269 196 + movsw # already done above
pascal@12556 197 + pushw %ss
slaxemulator@8085 198 + popw %ds # now %ds = %es = %ss = INITSEG
pascal@12556 199 + popl %fs:0x78(%bx) # update parameter table address
slaxemulator@8085 200 + movb $63, 0x4-12(%di) # patch sector count, %di = stacktop
slaxemulator@8085 201 + cli
slaxemulator@8085 202 +
slaxemulator@8085 203 + xchg %ax, %di # sector count
pascal@17269 204 +#ifndef FLOPPY_1440K_ONLY
slaxemulator@8085 205 + popw %ax # limits = 0
pascal@17269 206 +#endif
pascal@12556 207 + incw %cx # cylinder 0, sector 1, clear Z
slaxemulator@8085 208 + call read_first_sectors # read setup
pascal@17269 209 +#endif
pascal@15203 210 +loadsys:
slaxemulator@8085 211 + movw $0x200,%si
pascal@12556 212 +type_of_loader = 0x10
pascal@12556 213 +loadflags = 0x11
pascal@12556 214 +heap_end_ptr = 0x24
pascal@12556 215 + orw $0x8020, type_of_loader(%si) # loader type = 0x20 = bootsect-loader
pascal@12556 216 + movb $(stacktop-0x300)/256, heap_end_ptr+1(%si)
pascal@15203 217 + call puts_version # show which kernel we are loading
slaxemulator@8085 218 +
pascal@17269 219 +#ifdef CMDLINE_SUPPORT
pascal@17269 220 +# The cmdline can be entered and modifed at boot time.
pascal@17269 221 +# Only characters before the cursor are passed to the kernel.
pascal@17269 222 +
pascal@17269 223 + xorw %si, %si
pascal@17269 224 + orw cmd_line_ptr-7(%bx), %si
pascal@17269 225 + jz nocmdline
pascal@17269 226 + movw $0xA33F, cmd_line_ptr-2-7(%bx)
pascal@17269 227 + call puts
pascal@17269 228 +#if defined(MOVE_CMDLINE) || (defined(EDIT_CMDLINE) && defined(KEYBOARDLESS_SUPPORT))
pascal@17269 229 + pushw %di
pascal@17269 230 +#endif
pascal@17269 231 +#ifdef EDIT_CMDLINE
pascal@17269 232 +cmdlp:
pascal@17269 233 + movb $0x20, %al # clear end of line
pascal@17269 234 +cmdlpz:
pascal@17269 235 + call putc # with Space
pascal@17269 236 + subb $0x18, %al # and BackSpace
pascal@17269 237 + jnc cmdlpz
pascal@17269 238 + decw %si
pascal@17269 239 +cmdget:
pascal@17269 240 +#ifdef KEYBOARDLESS_SUPPORT
pascal@17269 241 + call wait4key
pascal@17269 242 +#else
pascal@17269 243 + int $0x16
pascal@17269 244 +#endif
pascal@17269 245 + cbw # %ah = 0, get keyboard character
pascal@17269 246 + cmpb $8, %al # BackSpace ?
pascal@17269 247 + je cmdbs
pascal@17269 248 + movb %al, (%si) # store char
pascal@17269 249 + lodsw # %si += 2
pascal@17269 250 +cmdbs:
pascal@17269 251 + cmpw %si, cmd_line_ptr-7(%bx)
pascal@17269 252 + je cmdget
pascal@17269 253 + call putc
pascal@17269 254 + cmpb $13, %al # Enter ?
pascal@17269 255 + jne cmdlp
pascal@17269 256 + movb %bh,-2(%si) # set end of string and remove CR
pascal@17269 257 +endcmdline:
pascal@17269 258 +#endif
pascal@17269 259 +#ifdef MOVE_CMDLINE
pascal@17269 260 + pushw %ss
pascal@17269 261 + popw %es
pascal@17269 262 + movw $0x8000, %di
pascal@17269 263 + movw %di, %si
pascal@17269 264 + xchgw %si, cmd_line_ptr-7(%bx)
pascal@17269 265 + movb $0x2, %ch
pascal@17269 266 + rep
pascal@17269 267 + movsb
pascal@17269 268 +#endif
pascal@17269 269 +#if defined(EDIT_CMDLINE) || (defined(MOVE_CMDLINE) && defined(KEYBOARD_TIMEOUT))
pascal@17269 270 + popw %di
pascal@17269 271 +#endif
pascal@17269 272 +nocmdline:
pascal@17269 273 +#endif
pascal@17269 274 +
pascal@12556 275 +# This routine loads the system at address LOADSEG, making sure
slaxemulator@8085 276 +# no 64kB boundaries are crossed. We try to load it as fast as
slaxemulator@8085 277 +# possible, loading whole tracks whenever we can.
pascal@15203 278 +
slaxemulator@8085 279 +ramdisk_image = 0x0218
slaxemulator@8085 280 +ramdisk_size = 0x021C
pascal@12556 281 +bootsect_src_limit = 16
pascal@12556 282 +bootsect_dst_limit = 24
pascal@12556 283 +bootsect_src_base = 18
pascal@15203 284 +bootsect_dst_base = 26 # bits 0..23
pascal@15203 285 +bootsect_dst_base_hi = 31 # bits 24..31
pascal@12556 286 + popw %bx # clear %bx
slaxemulator@8085 287 + movw %sp, %si # for bootsect_gdt
pascal@12556 288 +init_gdt:
pascal@12556 289 + decw bootsect_src_limit(%bx,%si) # max 64Kb
pascal@15203 290 + movw $0x9300+(LOADSEG/0x1000), bootsect_src_base+2(%bx,%si)
pascal@12556 291 + xorb $bootsect_dst_limit-bootsect_src_limit, %bl
pascal@12556 292 + jne init_gdt
pascal@17269 293 +#ifdef INITRD_SUPPORT
pascal@17269 294 +#ifdef INITRD_AUTOADDR
pascal@17269 295 + movb $0x88, %ah
pascal@17269 296 + int $0x15
pascal@17269 297 + jc NeedMoreRAM
pascal@17269 298 + cmpw $0xC000, %ax # more than 48M ?
pascal@17269 299 + jb NeedMoreRAM
pascal@17269 300 + movw $ramdisk_image+2, %bx
pascal@17269 301 + cmpw $0x100, (%bx) # already above 16M ?
pascal@17269 302 + ja NeedMoreRAM
pascal@17269 303 + movw $0x200, (%bx) # initramfs @ 32M
pascal@17269 304 +NeedMoreRAM:
pascal@17269 305 +#endif
pascal@17269 306 +#ifdef INITRD_KEYWORD
pascal@17269 307 +#ifdef INITRD_AUTOADDR
pascal@17269 308 + pushl -2(%bx)
pascal@17269 309 +#else
pascal@17269 310 + pushl ramdisk_image
pascal@17269 311 +#endif
pascal@17269 312 + pushw $stacktop # start of cmdline
pascal@17269 313 +#endif
pascal@17269 314 + movw $syssize, %bx
pascal@17269 315 + movb $5, %cl
pascal@17269 316 +code32_start = 0x214
pascal@17269 317 + movw code32_start+1, %ax # destination = 0x00100000 or 0x00010000
pascal@17269 318 +initrdlp:
pascal@17269 319 + movl (%bx), %ebx
pascal@17269 320 + decl %ebx
pascal@17269 321 + shrl %cl, %ebx
pascal@17269 322 +#else
pascal@12556 323 +code32_start = 0x214
pascal@12556 324 + movw code32_start+1, %ax # destination = 0x00100000 or 0x00010000
pascal@15203 325 + movl syssize, %ebx
pascal@12556 326 + decl %ebx
pascal@15203 327 + shrl $5, %ebx
pascal@17269 328 +#endif
pascal@16547 329 +#ifdef MORETHAN16M
pascal@15203 330 + incl %ebx
pascal@16547 331 +#else
pascal@16547 332 + incw %bx
pascal@16547 333 +#endif
pascal@16547 334 +#ifdef USEA20BUFFER
pascal@16547 335 + movw $0x00100000>>8, %di
pascal@16547 336 +#endif
slaxemulator@8085 337 +syslp:
pascal@16547 338 +#ifdef USEA20BUFFER
pascal@16547 339 + cmpw %ax, %di
pascal@16547 340 + jne nota20
pascal@16547 341 + xorw $(0x00100000+A20BUFFER)>>8, %ax
pascal@16547 342 +nota20:
pascal@16547 343 +#endif
pascal@12556 344 + movw %ax, bootsect_dst_base+1(%si)
pascal@16547 345 +#ifdef MORETHAN16M
pascal@16547 346 + movl $LOADSZ/512, %edi # size in sectors
pascal@16547 347 + subl %edi, %ebx
pascal@16547 348 +#else
pascal@15203 349 + movw $LOADSZ/512, %di # size in sectors
pascal@16547 350 + subw %di, %bx
pascal@16547 351 +#endif
slaxemulator@8085 352 + pushf
slaxemulator@8085 353 + jnc not_last
pascal@12556 354 + addw %bx, %di
slaxemulator@8085 355 +not_last:
slaxemulator@8085 356 + pushw %ax
slaxemulator@8085 357 + pushw %si
pascal@12556 358 + pushw %bx
pascal@12556 359 + xorw %bx,%bx
pascal@15203 360 + pushw $LOADSEG
pascal@15203 361 + popw %es
pascal@17269 362 +#ifdef EXE_ONLY
pascal@17269 363 + call read_sectors_dos
pascal@17269 364 +#else
pascal@15203 365 +patchcall:
pascal@12556 366 + call read_sectors # update %bp
pascal@17269 367 +#endif
pascal@12556 368 + popw %bx
slaxemulator@8085 369 + popw %si
pascal@17269 370 + movw %es, %cx # word count = LOADSZ/2 (= LOADSEG)
slaxemulator@8085 371 + movb $0x87, %ah
pascal@12556 372 + pushw %ss
pascal@12556 373 + popw %es # restore es
pascal@15203 374 + int $0x15 # max 16M, maybe more...
slaxemulator@8085 375 + popw %ax
pascal@17269 376 +#ifdef MORETHAN16M
pascal@17269 377 + addw $0x100, %ax # next dest (ax+=LOADSZ/256)
pascal@17269 378 + adcb %cl, bootsect_dst_base_hi(%si) # breaks 16M limit ?
pascal@17269 379 +#else
pascal@16547 380 + incb %ah # next dest (ax+=LOADSZ/256)
pascal@15203 381 +#endif
pascal@16547 382 +#ifdef USEA20BUFFER
pascal@16547 383 + movw $(LOADSZ+A20BUFFER)>>8, %di
pascal@16547 384 +#endif
slaxemulator@8085 385 + popf
slaxemulator@8085 386 + ja syslp
pascal@17269 387 +#ifdef INITRD_SUPPORT
pascal@17269 388 +initrdlp2:
pascal@17269 389 + movw ramdisk_image+1,%ax
pascal@17269 390 + movw $ramdisk_size,%bx
pascal@17269 391 + movb $9, %cl
pascal@17269 392 + cmpw %ax, bootsect_dst_base+1(%si)
pascal@17269 393 + jb initrdlp
pascal@17269 394 +#ifdef INITRD_KEYWORD
pascal@17269 395 + xorl %eax, %eax
pascal@17269 396 + xchgl %eax, (%bx)
pascal@17269 397 + addl $3, %eax
pascal@17269 398 + addl %eax, ramdisk_image-ramdisk_size(%bx)
pascal@17269 399 + andb $0xFC, ramdisk_image-ramdisk_size(%bx)
pascal@17269 400 + popw %si // current ptr in cmdline
pascal@17269 401 +kwchk:
pascal@17269 402 + movw $kwinitrd, %di
pascal@17269 403 +kwchk2:
pascal@17269 404 +#if 1
pascal@17269 405 + cmpl $0x3D616776, (%si) // look for vga=
pascal@17269 406 + jne notvga
pascal@17269 407 +#if 1
pascal@17269 408 + movw $0x312C, %ax
pascal@17269 409 + subw 4(%si), %ax // support -9 .. -1 only !
pascal@17269 410 + xchgb %al, %ah
pascal@17269 411 + cmpw $-8, %ax
pascal@17269 412 + jb notvga
pascal@17269 413 + decw %ax
pascal@17269 414 +#else
pascal@17269 415 + movb $'0', %al
pascal@17269 416 + subb 5(%si), %al // support -9 .. -1 only !
pascal@17269 417 + cbw
pascal@17269 418 +#endif
pascal@17269 419 + movw %ax, vgamode
pascal@17269 420 +notvga:
pascal@17269 421 +#endif
pascal@17269 422 + lodsb // look for initrd=
pascal@17269 423 + orb %al, %al
pascal@17269 424 + jz noinitrd
pascal@17269 425 + subb (%di), %al
pascal@17269 426 + //andb $0xDF, %al
pascal@17269 427 + jne kwchk
pascal@17269 428 + incw %di
pascal@17269 429 + cmpb (%di), %al
pascal@17269 430 + jne kwchk2
pascal@17269 431 + mov %si, %dx // %ds:%dx filename
pascal@17269 432 +chkeos:
pascal@17269 433 lodsb
pascal@17269 434 - andb %al, %al
pascal@17269 435 - jz bs_die
pascal@17269 436 + cmpb $0, %al
pascal@17269 437 + je gotoes
pascal@17269 438 + subb $0x20, %al
pascal@17269 439 + jne chkeos
pascal@17269 440 +gotoes:
pascal@17269 441 + decw %si
pascal@17269 442 + pushw (%si)
pascal@17269 443 + movb %al, (%si) // set eos
pascal@17269 444 + movb $0x3D, %ah // open, access = RO
pascal@17269 445 + int $0x21
pascal@17269 446 + popw (%si)
pascal@17269 447 + jc noinitrd
pascal@17269 448 + pushw %si // save ptr in cmdline
pascal@17269 449 + xchgw %ax, %bp // fd
pascal@17269 450 + movw $0x4202, %ax // lseek(SEEK_END)
pascal@17269 451 + movw %bp, %bx
pascal@17269 452 + xorw %cx, %cx
pascal@17269 453 + cwd
pascal@17269 454 + int $0x21
pascal@17269 455 + pushw %dx
pascal@17269 456 + pushw %ax
pascal@17269 457 + popl ramdisk_size
pascal@17269 458 + movw $0x4200, %ax // lseek(SEEK_SET)
pascal@17269 459 + xorw %cx, %cx
pascal@17269 460 + cwd
pascal@17269 461 + int $0x21 // set %ax = %dx = 0
pascal@17269 462 + jmp initrdlp2
pascal@17269 463 +noinitrd:
pascal@17269 464 + popl %eax // restore initial ramdisk address
pascal@17269 465 + movl %eax, %edx
pascal@17269 466 + xchgl %edx, ramdisk_image-ramdisk_size(%bx)
pascal@17269 467 + subl %eax, %edx
pascal@17269 468 + addl %edx, (%bx)
pascal@17269 469 +#endif
pascal@17269 470 +#endif
pascal@16547 471 +#ifdef USEA20BUFFER
pascal@16547 472 +#ifdef MORETHAN16M
pascal@17269 473 +#ifdef INITRD_SUPPORT
pascal@17269 474 + movb $0, bootsect_dst_base_hi(%si)
pascal@17269 475 +#else
pascal@16547 476 + movb %cl, bootsect_dst_base_hi(%si)
pascal@16547 477 +#endif
pascal@17269 478 +#endif
pascal@16547 479 + movb $0x10, bootsect_dst_base+2(%si)
pascal@16547 480 + movw $A20BUFFER/0x100, bootsect_src_base+1(%si)
pascal@16547 481 + movb $0x87, %ah
pascal@16547 482 + int $0x15
pascal@16547 483 +#endif
pascal@16547 484 +
slaxemulator@8085 485 +# This procedure turns off the floppy drive motor, so
slaxemulator@8085 486 +# that we enter the kernel in a known state, and
slaxemulator@8085 487 +# don't have to worry about it later.
pascal@15203 488 +
pascal@12556 489 +kill_motor:
pascal@12556 490 + xchgw %ax, %di # reset FDC (%di < 128)
pascal@12556 491 + int $0x13
slaxemulator@8085 492 +
slaxemulator@8085 493 +# After that (everything loaded), we jump to the setup-routine
slaxemulator@8085 494 +# loaded directly after the bootblock:
slaxemulator@8085 495 +# Segments are as follows: %ds = %ss = INITSEG
slaxemulator@8085 496 +
slaxemulator@8085 497 + ljmp $SETUPSEG, $0
slaxemulator@8085 498 +
slaxemulator@8085 499 +# read_sectors reads %di sectors into %es:0 buffer.
slaxemulator@8085 500 +# %es:0 is updated to the next memory location.
slaxemulator@8085 501 +# First, sectors are read sector by sector until
slaxemulator@8085 502 +# sector per track count is known. Then they are
slaxemulator@8085 503 +# read track by track.
slaxemulator@8085 504 +# Assume no error on first track.
slaxemulator@8085 505 +
pascal@17269 506 +#ifndef EXE_ONLY
pascal@17269 507 +
pascal@17269 508 +#define FLOPPY_CYLINDERS 80
pascal@17269 509 +#define FLOPPY_HEADS 2
slaxemulator@8085 510 +
slaxemulator@8085 511 +check_limits:
pascal@15203 512 +#ifndef FLOPPY_1440K_ONLY
pascal@15203 513 + popw %dx
slaxemulator@8085 514 + cmpb %al, %cl # max sector known ?
slaxemulator@8085 515 + ja next_head # no -> store it
pascal@15203 516 +#endif
slaxemulator@8085 517 + pushaw
slaxemulator@8085 518 + int $0x13 # reset controler
pascal@15203 519 + stc
pascal@15203 520 + call putcdot # print '-'
pascal@15203 521 +read_sectorslp:
slaxemulator@8085 522 + popaw
pascal@15203 523 +bdendlp:
slaxemulator@8085 524 + pushw %dx # some bios break dx...
pascal@15203 525 +#ifndef FLOPPY_1440K_ONLY
slaxemulator@8085 526 + pushw %ax # limits
slaxemulator@8085 527 + subb %cl, %al # sectors remaining in track
slaxemulator@8085 528 + ja tolastsect
slaxemulator@8085 529 + movb $1, %al # 1 sector mini
slaxemulator@8085 530 +tolastsect:
pascal@15203 531 +#else
pascal@17269 532 +#define FLOPPY_SECTORS 18
pascal@15203 533 + mov $FLOPPY_SECTORS+1, %al
pascal@15203 534 + subb %cl, %al # sectors remaining in track
pascal@17269 535 + cbw
pascal@15203 536 +#endif
slaxemulator@8085 537 + cmpw %di, %ax
slaxemulator@8085 538 + jb more1trk
slaxemulator@8085 539 + movw %di, %ax # sectors to read
slaxemulator@8085 540 +more1trk:
slaxemulator@8085 541 + pushw %ax # save context
slaxemulator@8085 542 + movb $2, %ah # cmd: read chs
slaxemulator@8085 543 + int $0x13
pascal@15203 544 +#ifndef FLOPPY_1440K_ONLY
pascal@15203 545 + popw %dx # save %ax
slaxemulator@8085 546 + popw %ax # limits
pascal@15203 547 +#else
pascal@15203 548 + popw %ax # restore context
slaxemulator@8085 549 + popw %dx
pascal@15203 550 +#endif
slaxemulator@8085 551 + jc check_limits
pascal@15203 552 +#ifndef FLOPPY_1440K_ONLY
slaxemulator@8085 553 + xchgw %ax, %bp
pascal@15203 554 + addw %dx,%cx # next sector
pascal@12556 555 + movw %cx, %gs
pascal@15203 556 + addb %dl,%bh
pascal@15203 557 + addb %dl,%bh # next location
pascal@15203 558 + subw %dx,%di # update sector counter
pascal@15203 559 + popw %dx
slaxemulator@8085 560 + jz putcdot
pascal@15203 561 +#else
pascal@15203 562 + addw %ax,%cx # next sector
pascal@15203 563 + movw %cx, %gs
pascal@15203 564 + addb %al,%bh
pascal@15203 565 + addb %al,%bh # next location
pascal@15203 566 + subw %ax,%di # update sector counter
pascal@15203 567 + jz putcdot
pascal@15203 568 +#endif
slaxemulator@8085 569 +read_sectors:
pascal@12556 570 + movw %gs, %cx
pascal@15203 571 +#ifndef FLOPPY_1440K_ONLY
pascal@12556 572 +# al is last sector+1
pascal@17269 573 +# ah is 0
slaxemulator@8085 574 + xchgw %ax, %bp
pascal@15203 575 +#endif
pascal@15203 576 +#ifndef FLOPPY_1440K_ONLY
slaxemulator@8085 577 + cmpb %al,%cl # reach sector limit ?
slaxemulator@8085 578 + jne bdendlp
slaxemulator@8085 579 +next_head:
slaxemulator@8085 580 + movb %cl,%al
pascal@15203 581 +#else
pascal@15203 582 + cmpb $FLOPPY_SECTORS+1,%cl # reach sector limit ?
pascal@15203 583 + jne bdendlp
pascal@15203 584 +#endif
pascal@17269 585 + movb $1, %cl # first sector
pascal@17269 586 +inc_head:
pascal@17269 587 + xorb %cl, %dh # next head
pascal@17269 588 + jne bdendlp # reach head limit ?
slaxemulator@8085 589 + incb %ch # next cylinder
slaxemulator@8085 590 +read_first_sectors:
pascal@15203 591 + cmpb $FLOPPY_CYLINDERS,%ch # reach cylinder limit ?
pascal@12556 592 + jne bdendlp
slaxemulator@8085 593 +next_floppy:
slaxemulator@8085 594 + movb $0,%ch # first cylinder
slaxemulator@8085 595 + pushaw
pascal@17269 596 +#ifdef FLOPPY_ONLY
pascal@17269 597 + movw $swap_floppy_tail,%si
pascal@17269 598 +next_digit:
pascal@17269 599 + decw %si
pascal@17269 600 + movb (%si), %al
pascal@17269 601 + incw %ax
pascal@17269 602 + aaa
pascal@17269 603 + movb %al, (%si)
pascal@17269 604 + jc next_digit
pascal@17269 605 +#endif
slaxemulator@8085 606 + movw $swap_floppy,%si
pascal@15203 607 +#ifdef KEYBOARDLESS_SUPPORT
slaxemulator@8085 608 + pushw %bx
pascal@12556 609 + call puts
slaxemulator@8085 610 + popw %bx
slaxemulator@8085 611 +waitfloppy:
slaxemulator@8085 612 + call wait
slaxemulator@8085 613 + jne waitfloppydone
slaxemulator@8085 614 + pushw %dx # some bios break dx...
slaxemulator@8085 615 + cbw
slaxemulator@8085 616 + int $0x13 # reset FDC
slaxemulator@8085 617 + movw $0x201,%ax
slaxemulator@8085 618 + int $0x13 # read first sector
slaxemulator@8085 619 + popw %dx
slaxemulator@8085 620 + rclb $1,%ah # floppy changed 06=>0D no error 00
slaxemulator@8085 621 + cmpb -2(%si), %ah # 0D then 00
slaxemulator@8085 622 + jne waitfloppy # no => try again
slaxemulator@8085 623 + incw %si
pascal@15203 624 + decw %ax # was 0001 ?
slaxemulator@8085 625 + jne waitfloppy
slaxemulator@8085 626 +waitfloppydone:
pascal@15203 627 +#else
pascal@15203 628 + call puts
pascal@15203 629 + cbw # %ah = 0, get keyboard character
pascal@17269 630 + int $0x16
pascal@15203 631 +#endif
slaxemulator@8085 632 + jmp read_sectorslp
pascal@17269 633 +#endif
pascal@17269 634 +
pascal@15203 635 +#ifdef EXE_SUPPORT
pascal@15203 636 +read_sectors_dos:
pascal@16547 637 + xorw %dx, %dx // write to %ds:%dx, not %es:%bx
pascal@16547 638 + call read_sectors_dosz
pascal@16547 639 +read_sectors_dosz:
pascal@15203 640 + pushw %es
pascal@15203 641 + popw %ds
pascal@15203 642 + movb $0x3F, %ah // read
pascal@15203 643 + movw %di, %cx
pascal@16547 644 + shlw $8, %cx // byte count / 2
pascal@15203 645 + movw %bp, %bx
pascal@15203 646 + int $0x21
pascal@16547 647 + xchgw %ax, %dx
pascal@15203 648 + pushw %ss
pascal@15203 649 + popw %ds
pascal@15203 650 +#endif
pascal@17269 651 +
slaxemulator@8085 652 +putcdot:
pascal@15203 653 + movb $'.'+3, %al // . = success, - = failure
slaxemulator@8085 654 +putclf:
pascal@15203 655 + sbbb $3, %al
slaxemulator@8085 656 +putc:
pascal@17269 657 movb $0xe, %ah
pascal@17269 658 - movw $7, %bx
pascal@17269 659 - int $0x10
pascal@17269 660 - jmp msg_loop
slaxemulator@8085 661 + movw $7, %bx # one dot each 64k
slaxemulator@8085 662 + int $0x10
slaxemulator@8085 663 + cmp $0xd, %al # CR ?
slaxemulator@8085 664 + je putclf
slaxemulator@8085 665 + ret
pascal@16547 666
pascal@17269 667 -bs_die:
pascal@17269 668 - # Allow the user to press a key, then reboot
pascal@17269 669 - xorw %ax, %ax
pascal@15203 670 +#ifdef KEYBOARDLESS_SUPPORT
slaxemulator@8085 671 +clock = 0x46C
slaxemulator@8085 672 +wait:
slaxemulator@8085 673 +wait4key:
slaxemulator@8085 674 + movw $clock, %di
slaxemulator@8085 675 +#define DELAY 5
pascal@15203 676 + movb $257-(DELAY*182)/10, %fs:(%di)
slaxemulator@8085 677 +waitkbd:
slaxemulator@8085 678 + movw $0x10D, %ax # test keyboard, timeout => CR
pascal@15203 679 + cmpb %fs:(%di),%ah
slaxemulator@8085 680 + je waitdone
pascal@17269 681 int $0x16
pascal@17269 682 - int $0x19
slaxemulator@8085 683 + jz waitkbd
slaxemulator@8085 684 + cbw
slaxemulator@8085 685 + int $0x16 # eat char
pascal@12556 686 + movw %di, %fs # disable timeout
slaxemulator@8085 687 + incw %di # clear Z
slaxemulator@8085 688 +waitdone:
slaxemulator@8085 689 + ret
pascal@15203 690 +#endif
pascal@17269 691
pascal@17269 692 - # int 0x19 should never return. In case it does anyway,
pascal@17269 693 - # invoke the BIOS reset code...
pascal@17269 694 - ljmp $0xf000,$0xfff0
pascal@15203 695 +#ifdef EXE_SUPPORT
pascal@15203 696 +comstart:
pascal@17269 697 +#ifndef EXE_ONLY
pascal@17269 698 + call initregs
pascal@17269 699 +#else
pascal@17269 700 + INIT_REGS
pascal@17269 701 +#endif
pascal@17269 702 + movb EXEADRS(setup_sects), %al # read bootsector + setup
pascal@17269 703 + incw %ax
pascal@15203 704 +#ifdef CMDLINE
pascal@15203 705 + movw $0x80, %si
pascal@17269 706 + movb (%si), %cl
pascal@17269 707 + incw %si
pascal@17269 708 +# ifdef OLDCMDLINE
pascal@17269 709 +# ifdef CMDLINE_SUPPORT
pascal@17269 710 + jcxz nocmdline
pascal@17269 711 + movw %di, EXEADRS(0x22)
pascal@17269 712 + movw $0xA33F, 0x7F(%si)
pascal@17269 713 +# endif
pascal@17269 714 +# endif
pascal@15203 715 + rep
pascal@15203 716 + movsb
pascal@17269 717 +nocmdline:
pascal@17269 718 + xchgw %ax, %di
pascal@15203 719 +# ifdef HELP
pascal@15203 720 + cmpb $'?', -1(%si)
pascal@15203 721 + movw $EXEADRS(0x200), %si
pascal@15203 722 + je puts_version
pascal@17269 723 +# ifndef REALMODE_NOT_CHECKED
pascal@15203 724 + smsww %ax
pascal@15203 725 + andb $1, %al
pascal@15203 726 + jne puts_version // real mode only...
pascal@17269 727 +# endif
pascal@15203 728 +# endif
pascal@15203 729 +#else
pascal@17269 730 + xchgw %ax, %di
pascal@15203 731 +#endif
pascal@15203 732 + movw 0x2C(%bx), %ds // DOS 3.0+
pascal@15203 733 +loop1:
pascal@15203 734 + incw %bx
pascal@15203 735 + cmpw %cx, (%bx)
pascal@15203 736 + jne loop1
pascal@15203 737 + leaw 4(%bx), %dx // %ds:%dx filename
pascal@17269 738 +#if !defined(REALMODE_NOT_CHECKED) && defined(CMDLINE) && defined(HELP)
pascal@15203 739 + movb $0x3D, %ah // open, access = RO
pascal@17269 740 +#else
pascal@17269 741 + movw $0x3D00, %ax // open, access = RO
pascal@17269 742 +#endif
pascal@15203 743 + int $0x21
pascal@15203 744 + jc dosexit
pascal@15203 745 + xchgw %ax, %bp // fd
pascal@15203 746 + call read_sectors_dos // update %ds
pascal@17269 747 +#ifndef EXE_ONLY
pascal@15203 748 + addb $read_sectors_dos-read_sectors, patchcall+1
pascal@17269 749 +#endif
pascal@15203 750 +#ifdef CMDLINE
pascal@15203 751 +# ifdef OLDCMDLINE
pascal@15203 752 + movw $0x202, %bx
pascal@17269 753 + cmpw %bx, 0x206-0x202(%bx) # new cmdline for version >= 0x202
pascal@15203 754 + jb oldcmdline
pascal@15203 755 + movw $INITSEG/16+stacktop/256, cmd_line_ptr+1-0x202(%bx)
pascal@15203 756 +# else
pascal@15203 757 + movw $INITSEG/16+stacktop/256, cmd_line_ptr+1
pascal@15203 758 +# endif
pascal@17269 759 +oldcmdline:
pascal@15203 760 +#endif
pascal@17269 761 +// ljmp $INITSEG, $loadsys
pascal@17269 762 + pushw %ds
pascal@17269 763 + .byte 0x6A, loadsys-bootsect_start
pascal@17270 764 + lretw
pascal@15203 765 +#endif
pascal@15203 766 +
pascal@16011 767 +#define kernel_version_offset 0xE
pascal@15203 768 +puts_version:
pascal@16011 769 + addw kernel_version_offset(%si),%si # starting protocol 2.00, Kernel 1.3.73
pascal@15203 770 +puts:
pascal@15203 771 + movb $0xd, %al # CR
pascal@15203 772 +putcs:
pascal@15203 773 + call putc
pascal@15203 774 + lodsb
pascal@15203 775 + cmpb $0, %al # end of string is any byte <= 0
pascal@15203 776 + jg putcs
pascal@15203 777 +dosexit:
pascal@15203 778 + ret
slaxemulator@8085 779
pascal@17269 780 - .section ".bsdata", "a"
pascal@17269 781 -bugger_off_msg:
pascal@17269 782 - .ascii "Direct booting from floppy is no longer supported.\r\n"
pascal@17269 783 - .ascii "Please use a boot loader program instead.\r\n"
pascal@17269 784 - .ascii "\n"
pascal@17269 785 - .ascii "Remove disk and press any key to reboot . . .\r\n"
pascal@17269 786 - .byte 0
pascal@17269 787 +#if !defined(FLOPPY_ONLY) && !defined(EXE_ONLY)
pascal@17269 788 +initregs:
pascal@17269 789 + popw %si
pascal@17269 790 + INIT_REGS
pascal@17269 791 + pushw %si # use new stack
pascal@17269 792 + ret
pascal@17269 793 +#endif
pascal@17269 794
pascal@17269 795 +#ifndef EXE_SUPPORT
pascal@17269 796 +swap_floppy:
pascal@17269 797 + .ascii "Insert floppy disk 001"
pascal@17269 798 +swap_floppy_tail:
pascal@17269 799 + .ascii " and press any key."
pascal@17269 800 + .byte 7,13,0 # swap detection needs 13, 0
pascal@17269 801 +#endif
pascal@17269 802
pascal@17269 803 +#ifdef INITRD_KEYWORD
pascal@17269 804 +kwinitrd:
pascal@17269 805 + .ascii "initrd="
pascal@17269 806 + .byte 0
pascal@17269 807 +#endif
slaxemulator@8085 808 # Kernel attributes; used by setup. This is part 1 of the
slaxemulator@8085 809 # header, from the old boot sector.
pascal@17269 810