diff --git a/conf/mips.rmk b/conf/mips.rmk
index face4127d..1776a5d18 100644
--- a/conf/mips.rmk
+++ b/conf/mips.rmk
@@ -30,4 +30,11 @@ relocator_mod_CFLAGS = $(COMMON_CFLAGS)
relocator_mod_ASFLAGS = $(COMMON_ASFLAGS)
relocator_mod_LDFLAGS = $(COMMON_LDFLAGS)
+pkglib_MODULES += multiboot2.mod
+multiboot2_mod_SOURCES = loader/i386/multiboot.c \
+ loader/i386/multiboot_mbi2.c
+multiboot2_mod_CFLAGS = $(COMMON_CFLAGS) -DGRUB_USE_MULTIBOOT2
+multiboot2_mod_LDFLAGS = $(COMMON_LDFLAGS)
+multiboot2_mod_ASFLAGS = $(COMMON_ASFLAGS)
+
include $(srcdir)/conf/common.mk
diff --git a/include/grub/i386/multiboot.h b/include/grub/i386/multiboot.h
index 8131e9477..1c711fad4 100644
--- a/include/grub/i386/multiboot.h
+++ b/include/grub/i386/multiboot.h
@@ -24,4 +24,18 @@ extern char *grub_multiboot_payload_orig;
extern grub_addr_t grub_multiboot_payload_dest;
extern grub_size_t grub_multiboot_payload_size;
+#define MULTIBOOT_INITIAL_STATE { .eax = MULTIBOOT_BOOTLOADER_MAGIC, \
+ .ecx = 0, \
+ .edx = 0, \
+ /* Set esp to some random location in low memory to avoid breaking */ \
+ /* non-compliant kernels. */ \
+ .esp = 0x7ff00 \
+ }
+#define MULTIBOOT_ENTRY_REGISTER eip
+#define MULTIBOOT_MBI_REGISTER ebx
+#define MULTIBOOT_ARCHITECTURE_CURRENT MULTIBOOT_ARCHITECTURE_I386
+
+#define MULTIBOOT_ELF32_MACHINE EM_386
+#define MULTIBOOT_ELF64_MACHINE EM_X86_64
+
#endif /* ! GRUB_MULTIBOOT_CPU_HEADER */
diff --git a/include/grub/mips/multiboot.h b/include/grub/mips/multiboot.h
new file mode 100644
index 000000000..a27229efe
--- /dev/null
+++ b/include/grub/mips/multiboot.h
@@ -0,0 +1,36 @@
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2002,2003,2004,2007,2008,2009 Free Software Foundation, Inc.
+ *
+ * GRUB is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GRUB is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GRUB. If not, see .
+ */
+
+#ifndef GRUB_MULTIBOOT_CPU_HEADER
+#define GRUB_MULTIBOOT_CPU_HEADER 1
+
+extern grub_uint32_t grub_multiboot_payload_eip;
+extern char *grub_multiboot_payload_orig;
+extern grub_addr_t grub_multiboot_payload_dest;
+extern grub_size_t grub_multiboot_payload_size;
+
+#define MULTIBOOT_INITIAL_STATE { .gpr[4] = MULTIBOOT_BOOTLOADER_MAGIC, \
+ .jumpreg = 1 }
+#define MULTIBOOT_ENTRY_REGISTER gpr[1]
+#define MULTIBOOT_MBI_REGISTER gpr[5]
+#define MULTIBOOT_ARCHITECTURE_CURRENT MULTIBOOT_ARCHITECTURE_MIPS32
+
+#define MULTIBOOT_ELF32_MACHINE EM_MIPS
+#define MULTIBOOT_ELF64_MACHINE EM_MIPS
+
+#endif /* ! GRUB_MULTIBOOT_CPU_HEADER */
diff --git a/include/multiboot2.h b/include/multiboot2.h
index 647109c0b..275debe75 100644
--- a/include/multiboot2.h
+++ b/include/multiboot2.h
@@ -61,7 +61,8 @@
#define MULTIBOOT_HEADER_TAG_FRAMEBUFFER 5
#define MULTIBOOT_HEADER_TAG_MODULE_ALIGN 6
-#define GRUB_MULTIBOOT_ARCHITECTURE_I386 0
+#define MULTIBOOT_ARCHITECTURE_I386 0
+#define MULTIBOOT_ARCHITECTURE_MIPS32 4
#define MULTIBOOT_HEADER_TAG_OPTIONAL 1
#define MULTIBOOT_CONSOLE_FLAGS_CONSOLE_REQUIRED 1
diff --git a/loader/i386/multiboot.c b/loader/i386/multiboot.c
index 99d1cf906..1a22cd3a6 100644
--- a/loader/i386/multiboot.c
+++ b/loader/i386/multiboot.c
@@ -41,7 +41,7 @@
#include
#include
#include
-#include
+#include
#include
#include
#include
@@ -121,16 +121,9 @@ grub_multiboot_boot (void)
{
grub_size_t mbi_size;
grub_err_t err;
- struct grub_relocator32_state state =
- {
- .eax = MULTIBOOT_BOOTLOADER_MAGIC,
- .ecx = 0,
- .edx = 0,
- .eip = grub_multiboot_payload_eip,
- /* Set esp to some random location in low memory to avoid breaking
- non-compliant kernels. */
- .esp = 0x7ff00
- };
+ struct grub_relocator32_state state = MULTIBOOT_INITIAL_STATE;
+
+ state.MULTIBOOT_ENTRY_REGISTER = grub_multiboot_payload_eip;
mbi_size = grub_multiboot_get_mbi_size ();
if (grub_multiboot_alloc_mbi < mbi_size)
@@ -143,7 +136,8 @@ grub_multiboot_boot (void)
grub_multiboot_alloc_mbi = mbi_size;
}
- state.ebx = grub_multiboot_payload_dest + grub_multiboot_pure_size;
+ state.MULTIBOOT_MBI_REGISTER = grub_multiboot_payload_dest
+ + grub_multiboot_pure_size;
err = grub_multiboot_make_mbi (grub_multiboot_payload_orig,
grub_multiboot_payload_dest,
grub_multiboot_pure_size, mbi_size);
diff --git a/loader/i386/multiboot_elfxx.c b/loader/i386/multiboot_elfxx.c
index 05fb2c1c1..92a52d3a8 100644
--- a/loader/i386/multiboot_elfxx.c
+++ b/loader/i386/multiboot_elfxx.c
@@ -18,13 +18,13 @@
#if defined(MULTIBOOT_LOAD_ELF32)
# define XX 32
-# define E_MACHINE EM_386
+# define E_MACHINE MULTIBOOT_ELF32_MACHINE
# define ELFCLASSXX ELFCLASS32
# define Elf_Ehdr Elf32_Ehdr
# define Elf_Phdr Elf32_Phdr
#elif defined(MULTIBOOT_LOAD_ELF64)
# define XX 64
-# define E_MACHINE EM_X86_64
+# define E_MACHINE MULTIBOOT_ELF64_MACHINE
# define ELFCLASSXX ELFCLASS64
# define Elf_Ehdr Elf64_Ehdr
# define Elf_Phdr Elf64_Phdr
diff --git a/loader/i386/multiboot_mbi2.c b/loader/i386/multiboot_mbi2.c
index 1910d656e..8b67f9383 100644
--- a/loader/i386/multiboot_mbi2.c
+++ b/loader/i386/multiboot_mbi2.c
@@ -90,7 +90,8 @@ grub_multiboot_load (grub_file_t file)
{
if (header->magic == MULTIBOOT_HEADER_MAGIC
&& !(header->magic + header->architecture
- + header->header_length + header->checksum))
+ + header->header_length + header->checksum)
+ && header->architecture == MULTIBOOT_ARCHITECTURE_CURRENT)
break;
}