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
17
ChangeLog
17
ChangeLog
|
@ -1,3 +1,20 @@
|
||||||
|
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.
|
||||||
|
|
||||||
2005-09-28 Marco Gerards <mgerards@xs4all.nl>
|
2005-09-28 Marco Gerards <mgerards@xs4all.nl>
|
||||||
|
|
||||||
Adds support for the XFS filesystem. Btrees are not supported
|
Adds support for the XFS filesystem. Btrees are not supported
|
||||||
|
|
10
fs/xfs.c
10
fs/xfs.c
|
@ -119,6 +119,11 @@ struct grub_xfs_data
|
||||||
struct grub_fshelp_node diropen;
|
struct grub_fshelp_node diropen;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#ifndef GRUB_UTIL
|
||||||
|
static grub_dl_t my_mod;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* Filetype information as used in inodes. */
|
/* Filetype information as used in inodes. */
|
||||||
|
@ -300,6 +305,7 @@ grub_xfs_iterate_dir (grub_fshelp_node_t dir,
|
||||||
grub_fshelp_node_t node))
|
grub_fshelp_node_t node))
|
||||||
{
|
{
|
||||||
struct grub_fshelp_node *diro = (struct grub_fshelp_node *) dir;
|
struct grub_fshelp_node *diro = (struct grub_fshelp_node *) dir;
|
||||||
|
auto int call_hook (grub_uint64_t ino, char *filename);
|
||||||
|
|
||||||
int call_hook (grub_uint64_t ino, char *filename)
|
int call_hook (grub_uint64_t ino, char *filename)
|
||||||
{
|
{
|
||||||
|
@ -370,8 +376,8 @@ grub_xfs_iterate_dir (grub_fshelp_node_t dir,
|
||||||
|
|
||||||
de = ((struct grub_xfs_dir_entry *)
|
de = ((struct grub_xfs_dir_entry *)
|
||||||
(((char *) de)+ sizeof (struct grub_xfs_dir_entry) + de->len
|
(((char *) de)+ sizeof (struct grub_xfs_dir_entry) + de->len
|
||||||
+ (smallino ? (sizeof (grub_uint32_t)
|
+ (smallino ? sizeof (grub_uint32_t)
|
||||||
: sizeof (grub_uint64_t))) - 1));
|
: sizeof (grub_uint64_t))) - 1);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -39,7 +39,7 @@
|
||||||
#define GRUB_KERNEL_MACHINE_PREFIX 0x1c
|
#define GRUB_KERNEL_MACHINE_PREFIX 0x1c
|
||||||
|
|
||||||
/* The size of the first region which won't be compressed. */
|
/* The size of the first region which won't be compressed. */
|
||||||
#define GRUB_KERNEL_MACHINE_RAW_SIZE 0x440
|
#define GRUB_KERNEL_MACHINE_RAW_SIZE 0x4A0
|
||||||
|
|
||||||
#ifndef ASM_FILE
|
#ifndef ASM_FILE
|
||||||
|
|
||||||
|
|
|
@ -104,6 +104,66 @@ VARIABLE(grub_prefix)
|
||||||
|
|
||||||
. = EXT_C(start) + 0x50
|
. = 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... */
|
/* the real mode code continues... */
|
||||||
codestart:
|
codestart:
|
||||||
cli /* we're not safe here! */
|
cli /* we're not safe here! */
|
||||||
|
|
|
@ -196,6 +196,7 @@ main (int argc, char *argv[])
|
||||||
|
|
||||||
/* Initialize the default modules. */
|
/* Initialize the default modules. */
|
||||||
grub_iso9660_init ();
|
grub_iso9660_init ();
|
||||||
|
grub_xfs_init ();
|
||||||
grub_fat_init ();
|
grub_fat_init ();
|
||||||
grub_ext2_init ();
|
grub_ext2_init ();
|
||||||
grub_ufs_init ();
|
grub_ufs_init ();
|
||||||
|
@ -241,6 +242,7 @@ main (int argc, char *argv[])
|
||||||
grub_hfs_fini ();
|
grub_hfs_fini ();
|
||||||
grub_jfs_fini ();
|
grub_jfs_fini ();
|
||||||
grub_fat_fini ();
|
grub_fat_fini ();
|
||||||
|
grub_xfs_fini ();
|
||||||
grub_boot_fini ();
|
grub_boot_fini ();
|
||||||
grub_cmp_fini ();
|
grub_cmp_fini ();
|
||||||
grub_cat_fini ();
|
grub_cat_fini ();
|
||||||
|
|
Loading…
Reference in a new issue