2005-09-29 Yoshinori K. Okuji <okuji@enbug.org>
Make GRUB's kernel compliant to Multiboot Specification. * kern/i386/pc/startup.S (multiboot_header): New label. (multiboot_entry): Likewise. (multiboot_trampoline): Likewise. * include/grub/i386/pc/kernel.h (GRUB_KERNEL_MACHINE_RAW_SIZE): Increased to 0x4A0. * fs/xfs.c (grub_xfs_iterate_dir): Fix a syntax error. You may not put parentheses after a question mark. [!GRUB_UTIL] (my_mod): New variable. * util/grub-emu.c (main): Call grub_xfs_init and grub_xfs_fini.
This commit is contained in:
parent
b2499b29cd
commit
b4093103f8
5 changed files with 88 additions and 3 deletions
|
@ -104,6 +104,66 @@ VARIABLE(grub_prefix)
|
|||
|
||||
. = EXT_C(start) + 0x50
|
||||
|
||||
/*
|
||||
* Support for booting GRUB from a Multiboot boot loader (e.g. GRUB itself).
|
||||
* This uses the a.out kludge to load raw binary to the area starting at 1MB,
|
||||
* and relocates itself after loaded.
|
||||
*/
|
||||
multiboot_header:
|
||||
/* magic */
|
||||
.long 0x1BADB002
|
||||
/* flags */
|
||||
.long (1 << 16)
|
||||
/* checksum */
|
||||
.long -0x1BADB002 - (1 << 16)
|
||||
/* header addr */
|
||||
.long multiboot_header - _start + 0x100000 + 0x200
|
||||
/* load addr */
|
||||
.long 0x100000
|
||||
/* load end addr */
|
||||
.long 0
|
||||
/* bss end addr */
|
||||
.long 0
|
||||
/* entry addr */
|
||||
.long multiboot_entry - _start + 0x100000 + 0x200
|
||||
|
||||
multiboot_entry:
|
||||
.code32
|
||||
/* obtain the boot device */
|
||||
movl 12(%ebx), %edx
|
||||
|
||||
/* relocate the code */
|
||||
movl $(GRUB_KERNEL_MACHINE_RAW_SIZE + 0x200), %ecx
|
||||
addl EXT_C(grub_compressed_size) - _start + 0x100000 + 0x200, %ecx
|
||||
movl $0x100000, %esi
|
||||
movl $GRUB_BOOT_MACHINE_KERNEL_ADDR, %edi
|
||||
cld
|
||||
rep
|
||||
movsb
|
||||
/* jump to the real address */
|
||||
movl $multiboot_trampoline, %eax
|
||||
jmp *%eax
|
||||
|
||||
multiboot_trampoline:
|
||||
/* fill the boot information */
|
||||
movl %edx, %eax
|
||||
shrl $8, %eax
|
||||
xorl %ebx, %ebx
|
||||
cmpb $0xFF, %al
|
||||
je 1f
|
||||
movb %ah, %bl
|
||||
movl %ebx, EXT_C(grub_install_dos_part)
|
||||
1:
|
||||
cmpb $0xFF, %ah
|
||||
je 2f
|
||||
movb %al, %bl
|
||||
movl %ebx, EXT_C(grub_install_bsd_part)
|
||||
2:
|
||||
shrl $24, %edx
|
||||
/* enter the usual booting */
|
||||
call prot_to_real
|
||||
.code16
|
||||
|
||||
/* the real mode code continues... */
|
||||
codestart:
|
||||
cli /* we're not safe here! */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue