[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: booting kernel of NetBSD (Re: UFS (FFS) support seems broken in grub
From: |
Bean |
Subject: |
Re: booting kernel of NetBSD (Re: UFS (FFS) support seems broken in grub2) |
Date: |
Sat, 26 Jan 2008 23:01:49 +0800 |
this is the patch, problems found:
1, the mbi structure is not initialized to all zeros, this means some
important member, like mods_count, will contain trash.
2, the entry point in the header is virtual address, we need to
translate it to physical address.
* loader/i386/pc/multiboot.c (grub_multiboot_load_elf32): Get physical
address of entry.
(grub_multiboot_load_elf64): Likewise.
(grub_multiboot): Initialize mbi structure.
diff --git a/loader/i386/pc/multiboot.c b/loader/i386/pc/multiboot.c
index fa6346e..2fd2b24 100644
--- a/loader/i386/pc/multiboot.c
+++ b/loader/i386/pc/multiboot.c
@@ -96,6 +96,7 @@ grub_multiboot_load_elf32 (grub_file_t file, void *buffer)
{
Elf32_Ehdr *ehdr = (Elf32_Ehdr *) buffer;
Elf32_Phdr *phdr;
+ grub_addr_t real_entry = 0;
int i;
if (ehdr->e_ident[EI_CLASS] != ELFCLASS32)
@@ -144,9 +145,16 @@ grub_multiboot_load_elf32 (grub_file_t file, void *buffer)
if (phdr->p_filesz < phdr->p_memsz)
grub_memset ((char *) phdr->p_paddr + phdr->p_filesz, 0,
phdr->p_memsz - phdr->p_filesz);
+
+ if ((entry >= phdr->p_vaddr) &&
+ (entry < phdr->p_vaddr + phdr->p_memsz))
+ real_entry = entry + phdr->p_paddr - phdr->p_vaddr;
}
}
-
+
+ if (real_entry)
+ entry = real_entry;
+
return grub_errno;
}
@@ -164,6 +172,7 @@ grub_multiboot_load_elf64 (grub_file_t file, void *buffer)
{
Elf64_Ehdr *ehdr = (Elf64_Ehdr *) buffer;
Elf64_Phdr *phdr;
+ grub_addr_t real_entry = 0;
int i;
if (ehdr->e_ident[EI_CLASS] != ELFCLASS64)
@@ -226,9 +235,16 @@ grub_multiboot_load_elf64 (grub_file_t file, void *buffer)
+ phdr->p_filesz),
0,
phdr->p_memsz - phdr->p_filesz);
+
+ if ((entry >= phdr->p_vaddr) &&
+ (entry < phdr->p_vaddr + phdr->p_memsz))
+ real_entry = entry + phdr->p_paddr - phdr->p_vaddr;
}
}
-
+
+ if (real_entry)
+ entry = real_entry;
+
return grub_errno;
}
@@ -306,6 +322,8 @@ grub_multiboot (int argc, char *argv[])
if (! mbi)
goto fail;
+ grub_memset (mbi, 0, sizeof (struct grub_multiboot_info));
+
mbi->flags = MULTIBOOT_INFO_MEMORY;
/* Convert from bytes to kilobytes. */
--
Bean
- Re: UFS (FFS) support seems broken in grub2, (continued)
- Re: UFS (FFS) support seems broken in grub2, Marco Gerards, 2008/01/24
- Re: UFS (FFS) support seems broken in grub2, walt, 2008/01/24
- booting kernel of NetBSD (Re: UFS (FFS) support seems broken in grub2), Robert Millan, 2008/01/24
- Re: booting kernel of NetBSD (Re: UFS (FFS) support seems broken in grub2), Robert Millan, 2008/01/24
- Re: booting kernel of NetBSD (Re: UFS (FFS) support seems broken in grub2), walt, 2008/01/24
- Re: booting kernel of NetBSD (Re: UFS (FFS) support seems broken in grub2), Robert Millan, 2008/01/24
- Re: booting kernel of NetBSD (Re: UFS (FFS) support seems broken in grub2),
Bean <=
- Re: booting kernel of NetBSD (Re: UFS (FFS) support seems broken in grub2), Robert Millan, 2008/01/26
- Re: booting kernel of NetBSD (Re: UFS (FFS) support seems broken in grub2), walt, 2008/01/26
- Re: booting kernel of NetBSD (Re: UFS (FFS) support seems broken in grub2), Bean, 2008/01/26
- Re: booting kernel of NetBSD (Re: UFS (FFS) support seems broken in grub2), Bean, 2008/01/26
- Re: booting kernel of NetBSD (Re: UFS (FFS) support seems broken in grub2), Robert Millan, 2008/01/26
- Re: booting kernel of NetBSD (Re: UFS (FFS) support seems broken in grub2), Robert Millan, 2008/01/26
- Re: booting kernel of NetBSD (Re: UFS (FFS) support seems broken in grub2), walt, 2008/01/26
- Re: booting kernel of NetBSD (Re: UFS (FFS) support seems broken in grub2), Bean, 2008/01/26
- Re: booting kernel of NetBSD (Re: UFS (FFS) support seems broken in grub2), walt, 2008/01/27
- Re: booting kernel of NetBSD (Re: UFS (FFS) support seems broken in grub2), Bean, 2008/01/27