Linux-2.6.12-rc2
[safe/jmp/linux-2.6] / arch / i386 / boot / bootsect.S
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