Adding debian version 3.70~pre8+dfsg-1.
[syslinux-debian/hramrach.git] / gpxe / src / arch / i386 / prefix / lkrnprefix.S
bloba3774d1ab24bf47fb550d942e980cf755857c5b6
1 /*
2         Copyright (C) 2000, Entity Cyber, Inc.
4         Authors: Gary Byers (gb@thinguin.org)
5                  Marty Connor (mdc@thinguin.org)
7         This software may be used and distributed according to the terms
8         of the GNU Public License (GPL), incorporated herein by reference.
10         Description:    
12         This is just a little bit of code and data that can get prepended
13         to an Etherboot ROM image in order to allow LILO to load the
14         result as if it were a Linux kernel image.
16         A real Linux kernel image consists of a one-sector boot loader
17         (to load the image from a floppy disk), followed a few sectors
18         of setup code, followed by the kernel code itself.  There's
19         a table in the first sector (starting at offset 497) that indicates
20         how many sectors of setup code follow the first sector and which
21         contains some other parameters that aren't interesting in this
22         case.
24         When LILO loads the sectors that comprise a kernel image, it doesn't
25         execute the code in the first sector (since that code would try to
26         load the image from a floppy disk.)  The code in the first sector
27         below doesn't expect to get executed (and prints an error message
28         if it ever -is- executed.)  LILO's only interested in knowing the
29         number of setup sectors advertised in the table (at offset 497 in
30         the first sector.)
32         Etherboot doesn't require much in the way of setup code.
33         Historically, the Linux kernel required at least 4 sectors of
34         setup code.  Current versions of LILO look at the byte at
35         offset 497 in the first sector to indicate how many sectors
36         of setup code are contained in the image.
40 #define SETUPSECS 4             /* Minimal nr of setup-sectors */
41 #define PREFIXSIZE ((SETUPSECS+1)*512)
42 #define PREFIXPGH (PREFIXSIZE / 16 )
43 #define BOOTSEG  0x07C0         /* original address of boot-sector */
44 #define INITSEG  0x9000         /* we move boot here - out of the way */
45 #define SETUPSEG 0x9020         /* setup starts here */
46 #define SYSSEG   0x1000         /* system loaded at 0x10000 (65536). */
48         .text
49         .code16
50         .arch i386
51         .org    0
52         .section ".prefix", "ax", @progbits
53 /* 
54         This is a minimal boot sector.  If anyone tries to execute it (e.g., if
55         a .lilo file is dd'ed to a floppy), print an error message. 
58 bootsector: 
59         jmp     $BOOTSEG, $1f   /* reload cs:ip to match relocation addr */
61         movw    $0x2000, %di            /*  0x2000 is arbitrary value >= length
62                                             of bootsect + room for stack */
64         movw    $BOOTSEG, %ax
65         movw    %ax,%ds
66         movw    %ax,%es
68         cli
69         movw    %ax, %ss                /* put stack at BOOTSEG:0x2000. */
70         movw    %di,%sp
71         sti
73         movw    $why_end-why, %cx
74         movw    $why, %si
76         movw    $0x0007, %bx            /* page 0, attribute 7 (normal) */
77         movb    $0x0e, %ah              /* write char, tty mode */
78 prloop: 
79         lodsb
80         int     $0x10
81         loop    prloop
82 freeze: jmp     freeze
84 why:    .ascii  "This image cannot be loaded from a floppy disk.\r\n"
85 why_end: 
88         .org    497
89 setup_sects: 
90         .byte   SETUPSECS
91 root_flags: 
92         .word   0
93 syssize: 
94         .word   _load_size_pgh - PREFIXPGH
95 swap_dev: 
96         .word   0
97 ram_size: 
98         .word   0
99 vid_mode: 
100         .word   0
101 root_dev: 
102         .word   0
103 boot_flag: 
104         .word   0xAA55
107         .org    512
109         .section ".zinfo.fixup", "a"    /* Compressor fixup information */
110         .ascii  "SUBW"
111         .long   syssize
112         .long   16
113         .long   0
114         .previous
115         
117         We're now at the beginning of the second sector of the image -
118         where the setup code goes.
120         We don't need to do too much setup for Etherboot.
122         This code gets loaded at SETUPSEG:0.  It wants to start
123         executing the Etherboot image that's loaded at SYSSEG:0 and
124         whose entry point is SYSSEG:0.
126 setup_code:
127         /* Etherboot expects to be contiguous in memory once loaded.
128          * LILO doesn't do this, but since we don't need any
129          * information that's left in the prefix, it doesn't matter:
130          * we just have to ensure that %cs:0000 is where the start of
131          * the Etherboot image *would* be.
132          */
133         ljmp    $(SYSSEG-(PREFIXSIZE/16)), $run_etherboot
136         .org    PREFIXSIZE
138         We're now at the beginning of the kernel proper.
139  */
140 run_etherboot:
141         call    install
143         /* Jump to .text16 segment */
144         pushw   %ax
145         pushw   $1f
146         lret
147         .section ".text16", "awx", @progbits
149         pushl   $main
150         pushw   %cs
151         call    prot_call
152         popl    %eax /* discard */
154         /* Boot next device */
155         int $0x18