mirror of
https://git.savannah.gnu.org/git/grub.git
synced 2026-10-22 07:12:39 +00:00
2008-11-07 Robert Millan <rmh@aybabtu.com>
* include/multiboot2.h (struct multiboot_header): Add `flags' member as
per specification.
* loader/multiboot2.c (grub_multiboot2): Fix Multiboot2 header check.
* loader/multiboot_loader.c (find_multi_boot2_header): New function
(based on find_multi_boot1_header).
(grub_rescue_cmd_multiboot_loader): Check for Multiboot2 header,
using find_multi_boot2_header(), and abort if neither Multiboot or
Multiboot headers were found.
This commit is contained in:
1 parent
9f3af64471
commit
c32ee8c9a8
4 files changed
+46
-8
No files matched your search
@@ -1,3 +1,14 @@
|
|||||||
|
2008-11-07 Robert Millan <rmh@aybabtu.com>
|
||||||
|
|
||||||
|
* include/multiboot2.h (struct multiboot_header): Add `flags' member as
|
||||||
|
per specification.
|
||||||
|
* loader/multiboot2.c (grub_multiboot2): Fix Multiboot2 header check.
|
||||||
|
* loader/multiboot_loader.c (find_multi_boot2_header): New function
|
||||||
|
(based on find_multi_boot1_header).
|
||||||
|
(grub_rescue_cmd_multiboot_loader): Check for Multiboot2 header,
|
||||||
|
using find_multi_boot2_header(), and abort if neither Multiboot or
|
||||||
|
Multiboot headers were found.
|
||||||
|
|
||||||
2008-11-07 Robert Millan <rmh@aybabtu.com>
|
2008-11-07 Robert Millan <rmh@aybabtu.com>
|
||||||
|
|
||||||
Modularize at_keyboard.mod:
|
Modularize at_keyboard.mod:
|
||||||
|
|||||||
@@ -46,6 +46,7 @@ typedef uint32_t multiboot_word;
|
|||||||
struct multiboot_header
|
struct multiboot_header
|
||||||
{
|
{
|
||||||
uint32_t magic;
|
uint32_t magic;
|
||||||
|
uint32_t flags;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct multiboot_tag_header
|
struct multiboot_tag_header
|
||||||
|
|||||||
+2
-2
@@ -342,8 +342,8 @@ grub_multiboot2 (int argc, char *argv[])
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Look for the multiboot header in the buffer. The header should
|
/* Look for the multiboot header in the buffer. The header should
|
||||||
be at least 12 bytes and aligned on a 4-byte boundary. */
|
be at least 8 bytes and aligned on a 8-byte boundary. */
|
||||||
for (p = buffer; p <= buffer + len - 12; p += 4)
|
for (p = buffer; p <= buffer + len - 8; p += 8)
|
||||||
{
|
{
|
||||||
header = (struct multiboot_header *) p;
|
header = (struct multiboot_header *) p;
|
||||||
if (header->magic == MULTIBOOT2_HEADER_MAGIC)
|
if (header->magic == MULTIBOOT2_HEADER_MAGIC)
|
||||||
|
|||||||
@@ -71,6 +71,34 @@ find_multi_boot1_header (grub_file_t file)
|
|||||||
return found_status;
|
return found_status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
find_multi_boot2_header (grub_file_t file)
|
||||||
|
{
|
||||||
|
struct multiboot_header *header;
|
||||||
|
char buffer[MULTIBOOT_SEARCH];
|
||||||
|
int found_status = 0;
|
||||||
|
grub_ssize_t len;
|
||||||
|
|
||||||
|
len = grub_file_read (file, buffer, MULTIBOOT_SEARCH);
|
||||||
|
if (len < 32)
|
||||||
|
return found_status;
|
||||||
|
|
||||||
|
/* Look for the multiboot header in the buffer. The header should
|
||||||
|
be at least 8 bytes and aligned on a 8-byte boundary. */
|
||||||
|
for (header = (struct multiboot_header *) buffer;
|
||||||
|
((char *) header <= buffer + len - 8) || (header = 0);
|
||||||
|
header = (struct multiboot_header *) ((char *) header + 8))
|
||||||
|
{
|
||||||
|
if (header->magic == MULTIBOOT2_HEADER_MAGIC)
|
||||||
|
{
|
||||||
|
found_status = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return found_status;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
grub_rescue_cmd_multiboot_loader (int argc, char *argv[])
|
grub_rescue_cmd_multiboot_loader (int argc, char *argv[])
|
||||||
{
|
{
|
||||||
@@ -96,14 +124,12 @@ grub_rescue_cmd_multiboot_loader (int argc, char *argv[])
|
|||||||
/* find which header is in the file */
|
/* find which header is in the file */
|
||||||
if (find_multi_boot1_header (file))
|
if (find_multi_boot1_header (file))
|
||||||
header_multi_ver_found = 1;
|
header_multi_ver_found = 1;
|
||||||
|
else if (find_multi_boot2_header (file))
|
||||||
|
header_multi_ver_found = 2;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* The behavior is that if you don't find a multiboot 1 header
|
grub_error (GRUB_ERR_BAD_OS, "Multiboot header not found");
|
||||||
use multiboot 2 loader (as you do not have to have a header
|
goto fail;
|
||||||
to use multiboot 2 */
|
|
||||||
grub_dprintf ("multiboot_loader", "No multiboot 1 header found. \n \
|
|
||||||
Using multiboot 2 loader\n");
|
|
||||||
header_multi_ver_found = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* close file before calling functions */
|
/* close file before calling functions */
|
||||||
|
|||||||
Reference in new issue
Block a user