Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 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 |
Domen Puncer | 125947f | 2005-05-05 16:16:15 -0700 | [diff] [blame^] | 66 | int $0x10 |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 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 |
Domen Puncer | 125947f | 2005-05-05 16:16:15 -0700 | [diff] [blame^] | 74 | |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 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 |