[2054] | 1 | /* |
---|
| 2 | * bootsect.S Copyright (C) 1991, 1992 Linus Torvalds |
---|
| 3 | * |
---|
| 4 | * modified by Drew Eckhardt |
---|
| 5 | * modified by Bruce Evans (bde) |
---|
| 6 | * modified by Chris Noe (May 1999) (as86 -> gas) |
---|
| 7 | * gutted by H. Peter Anvin (Jan 2003) |
---|
| 8 | * |
---|
| 9 | * BIG FAT NOTE: We're in real mode using 64k segments. Therefore segment |
---|
| 10 | * addresses must be multiplied by 16 to obtain their respective linear |
---|
| 11 | * addresses. To avoid confusion, linear addresses are written using leading |
---|
| 12 | * hex while segment addresses are written as segment:offset. |
---|
| 13 | * |
---|
| 14 | */ |
---|
| 15 | |
---|
| 16 | #include <asm/boot.h> |
---|
| 17 | |
---|
| 18 | SETUPSECTS = 4 /* default nr of setup-sectors */ |
---|
| 19 | BOOTSEG = 0x07C0 /* original address of boot-sector */ |
---|
| 20 | INITSEG = DEF_INITSEG /* we move boot here - out of the way */ |
---|
| 21 | SETUPSEG = DEF_SETUPSEG /* setup starts here */ |
---|
| 22 | SYSSEG = DEF_SYSSEG /* system loaded at 0x10000 (65536) */ |
---|
| 23 | SYSSIZE = DEF_SYSSIZE /* system size: # of 16-byte clicks */ |
---|
| 24 | /* to be loaded */ |
---|
| 25 | ROOT_DEV = 0 /* ROOT_DEV is now written by "build" */ |
---|
| 26 | SWAP_DEV = 0 /* SWAP_DEV is now written by "build" */ |
---|
| 27 | |
---|
| 28 | #ifndef SVGA_MODE |
---|
| 29 | #define SVGA_MODE ASK_VGA |
---|
| 30 | #endif |
---|
| 31 | |
---|
| 32 | #ifndef RAMDISK |
---|
| 33 | #define RAMDISK 0 |
---|
| 34 | #endif |
---|
| 35 | |
---|
| 36 | #ifndef ROOT_RDONLY |
---|
| 37 | #define ROOT_RDONLY 1 |
---|
| 38 | #endif |
---|
| 39 | |
---|
| 40 | .code16 |
---|
| 41 | .text |
---|
| 42 | |
---|
| 43 | .global _start |
---|
| 44 | _start: |
---|
| 45 | |
---|
| 46 | # Normalize the start address |
---|
| 47 | jmpl $BOOTSEG, $start2 |
---|
| 48 | |
---|
| 49 | start2: |
---|
| 50 | movw %cs, %ax |
---|
| 51 | movw %ax, %ds |
---|
| 52 | movw %ax, %es |
---|
| 53 | movw %ax, %ss |
---|
| 54 | movw $0x7c00, %sp |
---|
| 55 | sti |
---|
| 56 | cld |
---|
| 57 | |
---|
| 58 | movw $bugger_off_msg, %si |
---|
| 59 | |
---|
| 60 | msg_loop: |
---|
| 61 | lodsb |
---|
| 62 | andb %al, %al |
---|
| 63 | jz die |
---|
| 64 | movb $0xe, %ah |
---|
| 65 | movw $7, %bx |
---|
| 66 | int $0x10 |
---|
| 67 | jmp msg_loop |
---|
| 68 | |
---|
| 69 | die: |
---|
| 70 | # Allow the user to press a key, then reboot |
---|
| 71 | xorw %ax, %ax |
---|
| 72 | int $0x16 |
---|
| 73 | int $0x19 |
---|
| 74 | |
---|
| 75 | # int 0x19 should never return. In case it does anyway, |
---|
| 76 | # invoke the BIOS reset code... |
---|
| 77 | ljmp $0xf000,$0xfff0 |
---|
| 78 | |
---|
| 79 | |
---|
| 80 | bugger_off_msg: |
---|
| 81 | .ascii "Direct booting from floppy is no longer supported.\r\n" |
---|
| 82 | .ascii "Please use a boot loader program instead.\r\n" |
---|
| 83 | .ascii "\n" |
---|
| 84 | .ascii "Remove disk and press any key to reboot . . .\r\n" |
---|
| 85 | .byte 0 |
---|
| 86 | |
---|
| 87 | |
---|
| 88 | # Kernel attributes; used by setup |
---|
| 89 | |
---|
| 90 | .org 497 |
---|
| 91 | setup_sects: .byte SETUPSECTS |
---|
| 92 | root_flags: .word ROOT_RDONLY |
---|
| 93 | syssize: .word SYSSIZE |
---|
| 94 | swap_dev: .word SWAP_DEV |
---|
| 95 | ram_size: .word RAMDISK |
---|
| 96 | vid_mode: .word SVGA_MODE |
---|
| 97 | root_dev: .word ROOT_DEV |
---|
| 98 | boot_flag: .word 0xAA55 |
---|