~ubuntu-branches/ubuntu/jaunty/grub2/jaunty-proposed

« back to all changes in this revision

Viewing changes to boot/i386/pc/lnxboot.S

  • Committer: Bazaar Package Importer
  • Author(s): Robert Millan
  • Date: 2008-01-28 00:01:11 UTC
  • mfrom: (1.1.8 upstream)
  • Revision ID: james.westby@ubuntu.com-20080128000111-qolpe0u4qkf0xccc
Tags: 1.95+20080128-1
* New CVS snapshot.
  - Fixes bogus CLAIM problems on Apple firmware.  (Closes: #449135, #422729)
  - grub-probe performs sanity checks to make sure our filesystem drivers
    are usable.  (Closes: #462449)
  - patches/disable_ata.diff: Remove.  ATA module isn't auto-loaded in
    rescue floppies now.
  - patches/disable_xfs.diff: Remove.  See above (about grub-probe).
* Bring back grub-emu; it can help a lot with debugging feedback.
  - control
  - rules

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* -*-Asm-*- */
 
2
/*
 
3
 *  GRUB  --  GRand Unified Bootloader
 
4
 *  Copyright (C) 1999,2000,2001,2002,2005,2006,2007  Free Software Foundation, Inc.
 
5
 *
 
6
 *  GRUB is free software: you can redistribute it and/or modify
 
7
 *  it under the terms of the GNU General Public License as published by
 
8
 *  the Free Software Foundation, either version 3 of the License, or
 
9
 *  (at your option) any later version.
 
10
 *
 
11
 *  GRUB is distributed in the hope that it will be useful,
 
12
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 
13
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
14
 *  GNU General Public License for more details.
 
15
 *
 
16
 *  You should have received a copy of the GNU General Public License
 
17
 *  along with GRUB.  If not, see <http://www.gnu.org/licenses/>.
 
18
 */
 
19
 
 
20
#include <grub/boot.h>
 
21
#include <grub/machine/boot.h>
 
22
#include <grub/machine/kernel.h>
 
23
 
 
24
        .file   "lnxboot.S"
 
25
 
 
26
#define CODE_ADDR       0x6000
 
27
#define CODE_LENG       (code_end - start)
 
28
#define DATA_ADDR       ((GRUB_BOOT_MACHINE_KERNEL_ADDR) + 0x200)
 
29
 
 
30
#define BLCK_LENG       0x4000
 
31
 
 
32
        .text
 
33
 
 
34
        .code16
 
35
 
 
36
        .globl  start, _start
 
37
 
 
38
data_start:
 
39
        pushw   %cs
 
40
        popw    %ds
 
41
        xorl    %eax, %eax
 
42
        xorl    %ebx, %ebx
 
43
        call    data_next
 
44
 
 
45
data_next:
 
46
        popw    %bx
 
47
        movw    %cs, %ax
 
48
        shll    $4, %eax
 
49
        leal    0x200 + data_start - data_next(%ebx,%eax), %eax
 
50
        movzbl  setup_sects - data_next(%bx), %ecx
 
51
        shll    $9, %ecx
 
52
        addl    %ecx, %eax
 
53
        movl    %eax, code32_start - data_next(%bx)
 
54
 
 
55
        jmp     linux_next
 
56
 
 
57
        . = data_start + 0x1F1
 
58
 
 
59
setup_sects:
 
60
        .byte   (CODE_LENG >> 9)
 
61
root_flags:
 
62
        .word   0
 
63
syssize:
 
64
        .word   0
 
65
swap_dev:
 
66
        .word   0
 
67
ram_size:
 
68
        .word   0
 
69
vid_mode:
 
70
        .word   0
 
71
root_dev:
 
72
        .word   0
 
73
boot_flag:
 
74
        .word   0xAA55
 
75
 
 
76
start:
 
77
_start:
 
78
 
 
79
        jmp linux_code
 
80
 
 
81
        .ascii  "HdrS"                  // Header signature
 
82
        .word   0x0203                  // Header version number
 
83
 
 
84
realmode_swtch:
 
85
        .word   0, 0                    // default_switch, SETUPSEG
 
86
start_sys_seg:
 
87
        .word   0x1000                  // obsolete
 
88
version_ptr:
 
89
        .word   0                       // version string ptr
 
90
type_of_loader:
 
91
        .byte   0                       // Filled in by boot loader
 
92
loadflags:
 
93
        .byte   1                       // Please load high
 
94
setup_move_size:
 
95
        .word   0                       // Unused
 
96
code32_start:
 
97
        .long   0x100000                // 32-bit start address
 
98
ramdisk_image:
 
99
        .long   0                       // Loaded ramdisk image address
 
100
ramdisk_size:
 
101
        .long   0                       // Size of loaded ramdisk
 
102
bootsect_kludge:
 
103
        .word   0, 0
 
104
heap_end_ptr:
 
105
        .word   0
 
106
pad1:
 
107
        .word   0
 
108
cmd_line_ptr:
 
109
        .long   0                       // Command line
 
110
ramdisk_max:
 
111
        .long   0xffffffff              // Highest allowed ramdisk address
 
112
 
 
113
gdt:
 
114
        .long   0, 0, 0, 0              // Must be zero
 
115
        .word   0xffff                  // 64 K segment size
 
116
gdt_src1:
 
117
        .byte   0, 0 ,0                 // Low 24 bits of source addy
 
118
        .byte   0x93                    // Access rights
 
119
        .byte   0                       // Extended access rights
 
120
gdt_src2:
 
121
        .byte   0                       // High 8 bits of source addy
 
122
        .word   0xffff                  // 64 K segment size
 
123
gdt_dst1:
 
124
        .byte   0, 0, 0                 // Low 24 bits of target addy
 
125
        .byte   0x93                    // Access rights
 
126
        .byte   0                       // Extended access rights
 
127
gdt_dst2:
 
128
        .byte   0                       // High 8 bits of source addy
 
129
        .long   0, 0, 0, 0              // More space for the BIOS
 
130
 
 
131
reg_edx:
 
132
        .byte   0x80,0,0xFF,0xFF
 
133
 
 
134
data_leng:
 
135
        .long   0
 
136
 
 
137
linux_code:
 
138
 
 
139
        movw    %cs:(reg_edx - start), %dx
 
140
 
 
141
linux_next:
 
142
 
 
143
        call    normalize
 
144
 
 
145
normalize:
 
146
        popw    %bx
 
147
        subw    $(normalize - start), %bx
 
148
        shrw    $4, %bx
 
149
        movw    %cs, %ax
 
150
        addw    %bx, %ax
 
151
        pushw   %ax
 
152
        pushw   $(real_code - start)
 
153
        lret                            // jump to real_code
 
154
 
 
155
real_code:
 
156
        subw    $0x20, %ax
 
157
        movw    %ax, %ds
 
158
        movw    (setup_sects - data_start), %cx
 
159
        shlw    $7, %cx
 
160
 
 
161
        // Setup stack
 
162
 
 
163
        xorw    %si, %si
 
164
        movw    %si, %ss
 
165
        movw    $(CODE_ADDR), %sp
 
166
 
 
167
        pushl   %esi
 
168
        pushl   %edi
 
169
 
 
170
        // Move itself to 0:CODE_ADDR
 
171
 
 
172
        cld
 
173
        movw    %cs, %ax
 
174
        movw    %ax, %ds
 
175
        movw    $(CODE_ADDR >> 4), %ax
 
176
        movw    %ax, %es
 
177
        movw    %si, %di
 
178
 
 
179
        rep
 
180
        movsl
 
181
 
 
182
        ljmp    $(CODE_ADDR >> 4), $(real_code_2  - start)
 
183
 
 
184
real_code_2:
 
185
 
 
186
        pushw   %es
 
187
        popw    %ds
 
188
 
 
189
        movl    (ramdisk_image - start), %esi
 
190
        or      %esi, %esi
 
191
        jnz     1f
 
192
        movl    (code32_start - start), %esi
 
193
1:
 
194
 
 
195
        movl    $0x200, %ecx
 
196
        addl    %ecx, %esi
 
197
        movl    $DATA_ADDR, %edi
 
198
 
 
199
        call    move_memory
 
200
 
 
201
        movsbl  %dh, %eax
 
202
        movl    %eax, %ss:(DATA_ADDR + GRUB_KERNEL_MACHINE_INSTALL_DOS_PART)
 
203
 
 
204
        movsbl  (reg_edx + 2 - start), %eax
 
205
        movl    %eax, %ss:(DATA_ADDR + GRUB_KERNEL_MACHINE_INSTALL_BSD_PART)
 
206
 
 
207
        movl    %ss:(DATA_ADDR + GRUB_KERNEL_MACHINE_COMPRESSED_SIZE), %ecx
 
208
        addl    $(GRUB_KERNEL_MACHINE_RAW_SIZE - 0x200), %ecx
 
209
 
 
210
        call    move_memory
 
211
 
 
212
        popl    %edi
 
213
        popl    %esi
 
214
 
 
215
        ljmp    $(DATA_ADDR >> 4), $0
 
216
 
 
217
// Parameters:
 
218
//   esi: source address
 
219
//   edi: target address
 
220
//   ecx: number of bytes
 
221
move_memory:
 
222
        incl    %ecx
 
223
        andb    $0xFE, %cl
 
224
        pushw   %dx
 
225
1:
 
226
        pushl   %esi
 
227
        pushl   %edi
 
228
        pushl   %ecx
 
229
        cmpl    $BLCK_LENG, %ecx
 
230
        jbe     2f
 
231
        movl    $BLCK_LENG, %ecx
 
232
2:
 
233
        pushl   %ecx
 
234
 
 
235
        movl    %esi, %eax
 
236
        movw    %si, (gdt_src1 - start)
 
237
        shrl    $16, %eax
 
238
        movb    %al, (gdt_src1 + 2 - start)
 
239
        movb    %ah, (gdt_src2 - start)
 
240
 
 
241
        movl    %edi, %eax
 
242
        movw    %di, (gdt_dst1 - start)
 
243
        shrl    $16, %eax
 
244
        movb    %al, (gdt_dst1 + 2 - start)
 
245
        movb    %ah, (gdt_dst2 - start)
 
246
 
 
247
        movw    $(gdt - start), %si
 
248
        movb    $0x87, %ah
 
249
        shrw    $1, %cx
 
250
 
 
251
        int     $0x15
 
252
 
 
253
        popl    %eax
 
254
        popl    %ecx
 
255
        popl    %edi
 
256
        popl    %esi
 
257
 
 
258
        jnc     2f
 
259
        movw    $(err_int15_msg - start), %si
 
260
        jmp     fail
 
261
 
 
262
2:
 
263
 
 
264
        leal    (%esi, %eax), %esi
 
265
        leal    (%edi, %eax), %edi
 
266
        subl    %eax, %ecx
 
267
        jnz     1b
 
268
 
 
269
 
 
270
        popw    %dx
 
271
        ret
 
272
 
 
273
// Parameters:
 
274
//   si: message
 
275
fail:
 
276
        movb    $0x0e, %ah
 
277
        xorw    %bx, %bx
 
278
1:
 
279
        lodsb   (%si), %al
 
280
        int     $0x10
 
281
        cmpb    $0, %al
 
282
        jne     1b
 
283
1:      jmp     1b
 
284
 
 
285
err_int15_msg:
 
286
        .ascii  "move memory fails\0"
 
287
 
 
288
        . = (.  & (~0x1FF)) + 0x1FF
 
289
 
 
290
        .byte   0
 
291
 
 
292
code_end: