2
* GRUB -- GRand Unified Bootloader
3
* Copyright (C) 1999,2000,2001,2002,2003,2005,2006,2007 Free Software Foundation, Inc.
5
* GRUB is free software: you can redistribute it and/or modify
6
* it under the terms of the GNU General Public License as published by
7
* the Free Software Foundation, either version 3 of the License, or
8
* (at your option) any later version.
10
* GRUB is distributed in the hope that it will be useful,
11
* but WITHOUT ANY WARRANTY; without even the implied warranty of
12
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
* GNU General Public License for more details.
15
* You should have received a copy of the GNU General Public License
16
* along with GRUB. If not, see <http://www.gnu.org/licenses/>.
21
* Note: These functions defined in this file may be called from C.
22
* Be careful of that you must not modify some registers. Quote
23
* from gcc-2.95.2/gcc/config/i386/i386.h:
25
1 for registers not available across function calls.
26
These must include the FIXED_REGISTERS and also any
27
registers that can be used without being saved.
28
The latter must include the registers where values are returned
29
and the register where structure-value addresses are passed.
30
Aside from that, you can include as many other registers as you like.
32
ax,dx,cx,bx,si,di,bp,sp,st,st1,st2,st3,st4,st5,st6,st7,arg
33
{ 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }
37
* Note: GRUB is compiled with the options -mrtd and -mregparm=3.
38
* So the first three arguments are passed in %eax, %edx, and %ecx,
39
* respectively, and if a function has a fixed number of arguments
40
* and the number if greater than three, the function must return
41
* with "ret $N" where N is ((the number of arguments) - 3) * 4.
45
* This is the area for all of the special variables.
48
.p2align 2 /* force 4-byte alignment */
51
* void grub_linux_boot_zimage (void)
53
VARIABLE(grub_linux_prot_size)
55
VARIABLE(grub_linux_tmp_addr)
57
VARIABLE(grub_linux_real_addr)
60
FUNCTION(grub_linux_boot_zimage)
62
movl EXT_C(grub_linux_prot_size), %ecx
65
movl $GRUB_LINUX_BZIMAGE_ADDR, %esi
66
movl $GRUB_LINUX_ZIMAGE_ADDR, %edi
71
FUNCTION(grub_linux_boot_bzimage)
72
call EXT_C(grub_dl_unload_all)
74
movl EXT_C(grub_linux_real_addr), %ebx
76
/* copy the real mode code */
77
movl EXT_C(grub_linux_tmp_addr), %esi
79
movl $GRUB_LINUX_SETUP_MOVE_SIZE, %ecx
84
/* change %ebx to the segment address */
88
movw %ax, linux_setup_seg
90
/* XXX new stack pointer in safe area for calling functions */
92
call EXT_C(grub_stop_floppy)
94
/* final setup for linux boot */
100
movw $GRUB_LINUX_SETUP_STACK, %sp
116
* This starts the multiboot kernel.
119
FUNCTION(grub_multiboot_real_boot)
120
/* Push the entry address on the stack. */
122
/* Move the address of the multiboot information structure to ebx. */
125
/* Unload all modules and stop the floppy driver. */
126
call EXT_C(grub_dl_unload_all)
127
call EXT_C(grub_stop_floppy)
129
/* Interrupts should be disabled. */
132
/* Move the magic value into eax and jump to the kernel. */
133
movl $MULTIBOOT_MAGIC2,%eax
138
* This starts the multiboot 2 kernel.
141
FUNCTION(grub_multiboot2_real_boot)
142
/* Push the entry address on the stack. */
144
/* Move the address of the multiboot information structure to ebx. */
147
/* Unload all modules and stop the floppy driver. */
148
call EXT_C(grub_dl_unload_all)
149
call EXT_C(grub_stop_floppy)
151
/* Interrupts should be disabled. */
154
/* Move the magic value into eax and jump to the kernel. */
155
movl $MULTIBOOT2_BOOTLOADER_MAGIC,%eax