* [Patch] Move multiboot helpers out of the kernel
@ 2009-02-11 10:42 phcoder
2009-03-13 23:35 ` phcoder
0 siblings, 1 reply; 9+ messages in thread
From: phcoder @ 2009-02-11 10:42 UTC (permalink / raw)
To: The development of GRUB 2
[-- Attachment #1: Type: text/plain, Size: 718 bytes --]
Hello. multiboot helpers have no real reason to stay in kernel. So here
is the proposition to move them out of it to _multiboot.mod.
Changelog:
2009-02-11 Vladimir Serbinenko <phcoder@gmail.com>
Move multiboot helper out of kernel
* conf/i386-pc.rmk: Add loader/i386/multiboot.S to
_multiboot.mod
* conf/i386-coreboot.rmk: Likewise
* conf/i386-ieee1275.rmk: Likewise
* kern/i386/loader.S: Move multiboot helpers from here...
* loader/i386/multiboot.S: ...moved here
* include/grub/i386/loader.h: Move declarations of multiboot
helpers from here...
* include/grub/i386/multiboot.h: ...moved here
* loader/i386/pc/multiboot.c: Added include of
grub/cpu/multiboot.h
Thanks
Vladimir 'phcoder' Serbinenko
[-- Attachment #2: mb.patch --]
[-- Type: text/x-diff, Size: 11265 bytes --]
Index: conf/i386-pc.rmk
===================================================================
--- conf/i386-pc.rmk (revision 1989)
+++ conf/i386-pc.rmk (working copy)
@@ -236,11 +248,13 @@
# For _multiboot.mod.
_multiboot_mod_SOURCES = loader/i386/pc/multiboot.c \
+ loader/i386/multiboot.S \
loader/i386/pc/multiboot2.c \
loader/multiboot2.c \
loader/multiboot_loader.c
_multiboot_mod_CFLAGS = $(COMMON_CFLAGS)
_multiboot_mod_LDFLAGS = $(COMMON_LDFLAGS)
+_multiboot_mod_ASFLAGS = $(COMMON_ASFLAGS)
# For multiboot.mod.
multiboot_mod_SOURCES = loader/multiboot_loader_normal.c
Index: conf/i386-coreboot.rmk
===================================================================
--- conf/i386-coreboot.rmk (revision 1989)
+++ conf/i386-coreboot.rmk (working copy)
@@ -150,10 +150,12 @@
# For _multiboot.mod.
_multiboot_mod_SOURCES = loader/i386/pc/multiboot.c \
loader/i386/pc/multiboot2.c \
+ loader/i386/multiboot.S \
loader/multiboot2.c \
loader/multiboot_loader.c
_multiboot_mod_CFLAGS = $(COMMON_CFLAGS)
_multiboot_mod_LDFLAGS = $(COMMON_LDFLAGS)
+_multiboot_mod_ASFLAGS = $(COMMON_ASFLAGS)
# For multiboot.mod.
multiboot_mod_SOURCES = loader/multiboot_loader_normal.c
Index: conf/i386-ieee1275.rmk
===================================================================
--- conf/i386-ieee1275.rmk (revision 1989)
+++ conf/i386-ieee1275.rmk (working copy)
@@ -124,10 +124,12 @@
# For _multiboot.mod.
_multiboot_mod_SOURCES = loader/ieee1275/multiboot2.c \
+ loader/i386/multiboot.S \
loader/multiboot2.c \
loader/multiboot_loader.c
_multiboot_mod_CFLAGS = $(COMMON_CFLAGS)
_multiboot_mod_LDFLAGS = $(COMMON_LDFLAGS)
+_multiboot_mod_ASFLAGS = $(COMMON_ASFLAGS)
# For multiboot.mod.
multiboot_mod_SOURCES = loader/multiboot_loader_normal.c
Index: kern/i386/loader.S
===================================================================
--- kern/i386/loader.S (revision 1989)
+++ kern/i386/loader.S (working copy)
@@ -117,104 +117,3 @@
linux_setup_seg:
.word 0
.code32
-
-
-/*
- * This starts the multiboot kernel.
- */
-
-VARIABLE(grub_multiboot_payload_size)
- .long 0
-VARIABLE(grub_multiboot_payload_orig)
- .long 0
-VARIABLE(grub_multiboot_payload_dest)
- .long 0
-VARIABLE(grub_multiboot_payload_entry_offset)
- .long 0
-
-/*
- * The relocators below understand the following parameters:
- * ecx: Size of the block to be copied.
- * esi: Where to copy from (always lowest address, even if we're relocating
- * backwards).
- * edi: Where to copy to (likewise).
- * edx: Offset of the entry point (relative to the beginning of the block).
- */
-VARIABLE(grub_multiboot_forward_relocator)
- /* Add entry offset. */
- addl %edi, %edx
-
- /* Forward copy. */
- cld
- rep
- movsb
-
- jmp *%edx
-VARIABLE(grub_multiboot_forward_relocator_end)
-
-VARIABLE(grub_multiboot_backward_relocator)
- /* Add entry offset (before %edi is mangled). */
- addl %edi, %edx
-
- /* Backward movsb is implicitly off-by-one. compensate that. */
- decl %esi
- decl %edi
-
- /* Backward copy. */
- std
- addl %ecx, %esi
- addl %ecx, %edi
- rep
- movsb
-
- jmp *%edx
-VARIABLE(grub_multiboot_backward_relocator_end)
-
-FUNCTION(grub_multiboot_real_boot)
- /* Push the entry address on the stack. */
- pushl %eax
- /* Move the address of the multiboot information structure to ebx. */
- movl %edx,%ebx
-
- /* Unload all modules and stop the floppy driver. */
- call EXT_C(grub_dl_unload_all)
- call EXT_C(grub_stop_floppy)
-
- /* Interrupts should be disabled. */
- cli
-
- /* Where do we copy what from. */
- movl EXT_C(grub_multiboot_payload_size), %ecx
- movl EXT_C(grub_multiboot_payload_orig), %esi
- movl EXT_C(grub_multiboot_payload_dest), %edi
- movl EXT_C(grub_multiboot_payload_entry_offset), %edx
-
- /* Move the magic value into eax. */
- movl $MULTIBOOT_MAGIC2, %eax
-
- /* Jump to the relocator. */
- popl %ebp
- jmp *%ebp
-
-/*
- * This starts the multiboot 2 kernel.
- */
-
-FUNCTION(grub_multiboot2_real_boot)
- /* Push the entry address on the stack. */
- pushl %eax
- /* Move the address of the multiboot information structure to ebx. */
- movl %edx,%ebx
-
- /* Unload all modules and stop the floppy driver. */
- call EXT_C(grub_dl_unload_all)
- call EXT_C(grub_stop_floppy)
-
- /* Interrupts should be disabled. */
- cli
-
- /* Move the magic value into eax and jump to the kernel. */
- movl $MULTIBOOT2_BOOTLOADER_MAGIC,%eax
- popl %ecx
- jmp *%ecx
-
Index: include/grub/i386/multiboot.h
===================================================================
--- include/grub/i386/multiboot.h (revision 0)
+++ include/grub/i386/multiboot.h (revision 0)
@@ -0,0 +1,24 @@
+#ifndef GRUB_MULTIBOOT_CPU_HEADER
+#define GRUB_MULTIBOOT_CPU_HEADER 1
+
+/* The asm part of the multiboot loader. */
+void grub_multiboot_real_boot (grub_addr_t entry,
+ struct grub_multiboot_info *mbi)
+ __attribute__ ((noreturn));
+void grub_multiboot2_real_boot (grub_addr_t entry,
+ struct grub_multiboot_info *mbi)
+ __attribute__ ((noreturn));
+
+extern grub_addr_t grub_multiboot_payload_orig;
+extern grub_addr_t grub_multiboot_payload_dest;
+extern grub_size_t grub_multiboot_payload_size;
+extern grub_uint32_t grub_multiboot_payload_entry_offset;
+
+extern grub_uint8_t grub_multiboot_forward_relocator;
+extern grub_uint8_t grub_multiboot_forward_relocator_end;
+extern grub_uint8_t grub_multiboot_backward_relocator;
+extern grub_uint8_t grub_multiboot_backward_relocator_end;
+
+#define RELOCATOR_SIZEOF(x) (&grub_multiboot_##x##_relocator_end - &grub_multiboot_##x##_relocator)
+
+#endif /* ! GRUB_MULTIBOOT_CPU_HEADER */
Index: include/grub/i386/loader.h
===================================================================
--- include/grub/i386/loader.h (revision 1989)
+++ include/grub/i386/loader.h (working copy)
@@ -22,7 +22,6 @@
#include <grub/types.h>
#include <grub/err.h>
#include <grub/symbol.h>
-#include <grub/multiboot.h>
extern grub_uint32_t EXPORT_VAR(grub_linux_prot_size);
extern char *EXPORT_VAR(grub_linux_tmp_addr);
@@ -33,31 +32,15 @@
grub_err_t EXPORT_FUNC(grub_linux_boot) (void);
-/* The asm part of the multiboot loader. */
-void EXPORT_FUNC(grub_multiboot_real_boot) (grub_addr_t entry,
- struct grub_multiboot_info *mbi)
- __attribute__ ((noreturn));
-void EXPORT_FUNC(grub_multiboot2_real_boot) (grub_addr_t entry,
- struct grub_multiboot_info *mbi)
- __attribute__ ((noreturn));
void EXPORT_FUNC(grub_unix_real_boot) (grub_addr_t entry, ...)
__attribute__ ((cdecl,noreturn));
-extern grub_addr_t EXPORT_VAR(grub_multiboot_payload_orig);
-extern grub_addr_t EXPORT_VAR(grub_multiboot_payload_dest);
-extern grub_size_t EXPORT_VAR(grub_multiboot_payload_size);
-extern grub_uint32_t EXPORT_VAR(grub_multiboot_payload_entry_offset);
-
/* It is necessary to export these functions, because normal mode commands
reuse rescue mode commands. */
void grub_rescue_cmd_linux (int argc, char *argv[]);
void grub_rescue_cmd_initrd (int argc, char *argv[]);
-extern grub_uint8_t EXPORT_VAR(grub_multiboot_forward_relocator);
-extern grub_uint8_t EXPORT_VAR(grub_multiboot_forward_relocator_end);
-extern grub_uint8_t EXPORT_VAR(grub_multiboot_backward_relocator);
-extern grub_uint8_t EXPORT_VAR(grub_multiboot_backward_relocator_end);
+void EXPORT_FUNC(grub_stop_floppy) (void);
-#define RELOCATOR_SIZEOF(x) (&grub_multiboot_##x##_relocator_end - &grub_multiboot_##x##_relocator)
#endif /* ! GRUB_LOADER_CPU_HEADER */
Index: loader/i386/multiboot.S
===================================================================
--- loader/i386/multiboot.S (revision 0)
+++ loader/i386/multiboot.S (revision 0)
@@ -0,0 +1,97 @@
+#include <grub/symbol.h>
+#include <multiboot.h>
+#include <multiboot2.h>
+
+ .p2align 2 /* force 4-byte alignment */
+
+/*
+ * This starts the multiboot kernel.
+ */
+
+VARIABLE(grub_multiboot_payload_size)
+ .long 0
+VARIABLE(grub_multiboot_payload_orig)
+ .long 0
+VARIABLE(grub_multiboot_payload_dest)
+ .long 0
+VARIABLE(grub_multiboot_payload_entry_offset)
+ .long 0
+
+/*
+ * The relocators below understand the following parameters:
+ * ecx: Size of the block to be copied.
+ * esi: Where to copy from (always lowest address, even if we're relocating
+ * backwards).
+ * edi: Where to copy to (likewise).
+ * edx: Offset of the entry point (relative to the beginning of the block).
+ */
+
+VARIABLE(grub_multiboot_forward_relocator)
+ /* Add entry offset. */
+ addl %edi, %edx
+
+ /* Forward copy. */
+ cld
+ rep
+ movsb
+
+ jmp *%edx
+VARIABLE(grub_multiboot_forward_relocator_end)
+
+VARIABLE(grub_multiboot_backward_relocator)
+ /* Add entry offset (before %edi is mangled). */
+ addl %edi, %edx
+
+ /* Backward movsb is implicitly off-by-one. compensate that. */
+ decl %esi
+ decl %edi
+
+ /* Backward copy. */
+ std
+ addl %ecx, %esi
+ addl %ecx, %edi
+ rep
+ movsb
+
+ jmp *%edx
+VARIABLE(grub_multiboot_backward_relocator_end)
+
+FUNCTION(grub_multiboot_real_boot)
+ /* Push the entry address on the stack. */
+ pushl %eax
+ /* Move the address of the multiboot information structure to ebx. */
+ movl %edx,%ebx
+
+ /* Interrupts should be disabled. */
+ cli
+
+ /* Where do we copy what from. */
+ movl EXT_C(grub_multiboot_payload_size), %ecx
+ movl EXT_C(grub_multiboot_payload_orig), %esi
+ movl EXT_C(grub_multiboot_payload_dest), %edi
+ movl EXT_C(grub_multiboot_payload_entry_offset), %edx
+
+ /* Move the magic value into eax. */
+ movl $MULTIBOOT_MAGIC2, %eax
+
+ /* Jump to the relocator. */
+ popl %ebp
+ jmp *%ebp
+
+/*
+ * This starts the multiboot 2 kernel.
+ */
+
+FUNCTION(grub_multiboot2_real_boot)
+ /* Push the entry address on the stack. */
+ pushl %eax
+ /* Move the address of the multiboot information structure to ebx. */
+ movl %edx,%ebx
+
+ /* Interrupts should be disabled. */
+ cli
+
+ /* Move the magic value into eax and jump to the kernel. */
+ movl $MULTIBOOT2_BOOTLOADER_MAGIC,%eax
+ popl %ecx
+ jmp *%ecx
Index: loader/i386/pc/multiboot.c
===================================================================
--- loader/i386/pc/multiboot.c (revision 1989)
+++ loader/i386/pc/multiboot.c (working copy)
@@ -32,6 +32,7 @@
#include <grub/multiboot.h>
#include <grub/machine/init.h>
#include <grub/machine/memory.h>
+#include <grub/cpu/multiboot.h>
#include <grub/elf.h>
#include <grub/aout.h>
#include <grub/file.h>
@@ -52,6 +53,7 @@
static grub_err_t
grub_multiboot_boot (void)
{
+ grub_stop_floppy ();
grub_multiboot_real_boot (entry, mbi);
/* Not reached. */
Index: loader/i386/pc/multiboot2.c
===================================================================
--- loader/i386/pc/multiboot2.c (revision 1989)
+++ loader/i386/pc/multiboot2.c (working copy)
@@ -73,6 +73,7 @@
void
grub_mb2_arch_boot (grub_addr_t entry, void *tags)
{
+ grub_stop_floppy ();
grub_multiboot2_real_boot (entry, tags);
}
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [Patch] Move multiboot helpers out of the kernel
2009-02-11 10:42 [Patch] Move multiboot helpers out of the kernel phcoder
@ 2009-03-13 23:35 ` phcoder
2009-03-14 14:48 ` Robert Millan
2009-03-21 23:08 ` Robert Millan
0 siblings, 2 replies; 9+ messages in thread
From: phcoder @ 2009-03-13 23:35 UTC (permalink / raw)
To: The development of GRUB 2
[-- Attachment #1: Type: text/plain, Size: 1475 bytes --]
Rediffed
2009-03-14 Vladimir Serbinenko <phcoder@gmail.com>
Move multiboot helper out of kernel
* conf/i386-pc.rmk: Add loader/i386/multiboot_helper.S to
_multiboot.mod
* conf/i386-coreboot.rmk: Likewise
* conf/i386-ieee1275.rmk: Likewise
* kern/i386/loader.S: Move multiboot helpers from here...
* loader/i386/multiboot_helper.S: ...moved here
* include/grub/i386/loader.h: Move declarations of multiboot
helpers from here...
* include/grub/i386/multiboot.h: ...moved here
* loader/i386/multiboot.c: Added include of
grub/cpu/multiboot.h
phcoder wrote:
> Hello. multiboot helpers have no real reason to stay in kernel. So here
> is the proposition to move them out of it to _multiboot.mod.
> Changelog:
> 2009-02-11 Vladimir Serbinenko <phcoder@gmail.com>
>
> Move multiboot helper out of kernel
>
> * conf/i386-pc.rmk: Add loader/i386/multiboot.S to
> _multiboot.mod
> * conf/i386-coreboot.rmk: Likewise
> * conf/i386-ieee1275.rmk: Likewise
> * kern/i386/loader.S: Move multiboot helpers from here...
> * loader/i386/multiboot.S: ...moved here
> * include/grub/i386/loader.h: Move declarations of multiboot
> helpers from here...
> * include/grub/i386/multiboot.h: ...moved here
> * loader/i386/pc/multiboot.c: Added include of
> grub/cpu/multiboot.h
>
> Thanks
> Vladimir 'phcoder' Serbinenko
>
--
Regards
Vladimir 'phcoder' Serbinenko
[-- Attachment #2: mb.patch --]
[-- Type: text/x-diff, Size: 12854 bytes --]
Index: conf/i386-pc.rmk
===================================================================
--- conf/i386-pc.rmk (revision 2030)
+++ conf/i386-pc.rmk (working copy)
@@ -238,11 +238,13 @@
# For _multiboot.mod.
_multiboot_mod_SOURCES = loader/i386/multiboot.c \
+ loader/i386/multiboot_helper.S \
loader/i386/pc/multiboot2.c \
loader/multiboot2.c \
loader/multiboot_loader.c
_multiboot_mod_CFLAGS = $(COMMON_CFLAGS)
_multiboot_mod_LDFLAGS = $(COMMON_LDFLAGS)
+_multiboot_mod_ASFLAGS = $(COMMON_ASFLAGS)
# For multiboot.mod.
multiboot_mod_SOURCES = loader/multiboot_loader_normal.c
Index: conf/i386-coreboot.rmk
===================================================================
--- conf/i386-coreboot.rmk (revision 2030)
+++ conf/i386-coreboot.rmk (working copy)
@@ -151,10 +151,12 @@
# For _multiboot.mod.
_multiboot_mod_SOURCES = loader/i386/multiboot.c \
loader/i386/pc/multiboot2.c \
+ loader/i386/multiboot_helper.S \
loader/multiboot2.c \
loader/multiboot_loader.c
_multiboot_mod_CFLAGS = $(COMMON_CFLAGS)
_multiboot_mod_LDFLAGS = $(COMMON_LDFLAGS)
+_multiboot_mod_ASFLAGS = $(COMMON_ASFLAGS)
# For multiboot.mod.
multiboot_mod_SOURCES = loader/multiboot_loader_normal.c
Index: conf/i386-ieee1275.rmk
===================================================================
--- conf/i386-ieee1275.rmk (revision 2030)
+++ conf/i386-ieee1275.rmk (working copy)
@@ -126,10 +126,12 @@
# For _multiboot.mod.
_multiboot_mod_SOURCES = loader/ieee1275/multiboot2.c \
+ loader/i386/multiboot_helper.S \
loader/multiboot2.c \
loader/multiboot_loader.c
_multiboot_mod_CFLAGS = $(COMMON_CFLAGS)
_multiboot_mod_LDFLAGS = $(COMMON_LDFLAGS)
+_multiboot_mod_ASFLAGS = $(COMMON_ASFLAGS)
# For multiboot.mod.
multiboot_mod_SOURCES = loader/multiboot_loader_normal.c
Index: kern/i386/loader.S
===================================================================
--- kern/i386/loader.S (revision 2030)
+++ kern/i386/loader.S (working copy)
@@ -118,107 +118,7 @@
.word 0
.code32
-
/*
- * This starts the multiboot kernel.
- */
-
-VARIABLE(grub_multiboot_payload_size)
- .long 0
-VARIABLE(grub_multiboot_payload_orig)
- .long 0
-VARIABLE(grub_multiboot_payload_dest)
- .long 0
-VARIABLE(grub_multiboot_payload_entry_offset)
- .long 0
-
-/*
- * The relocators below understand the following parameters:
- * ecx: Size of the block to be copied.
- * esi: Where to copy from (always lowest address, even if we're relocating
- * backwards).
- * edi: Where to copy to (likewise).
- * edx: Offset of the entry point (relative to the beginning of the block).
- */
-VARIABLE(grub_multiboot_forward_relocator)
- /* Add entry offset. */
- addl %edi, %edx
-
- /* Forward copy. */
- cld
- rep
- movsb
-
- jmp *%edx
-VARIABLE(grub_multiboot_forward_relocator_end)
-
-VARIABLE(grub_multiboot_backward_relocator)
- /* Add entry offset (before %edi is mangled). */
- addl %edi, %edx
-
- /* Backward movsb is implicitly off-by-one. compensate that. */
- decl %esi
- decl %edi
-
- /* Backward copy. */
- std
- addl %ecx, %esi
- addl %ecx, %edi
- rep
- movsb
-
- jmp *%edx
-VARIABLE(grub_multiboot_backward_relocator_end)
-
-FUNCTION(grub_multiboot_real_boot)
- /* Push the entry address on the stack. */
- pushl %eax
- /* Move the address of the multiboot information structure to ebx. */
- movl %edx,%ebx
-
- /* Unload all modules and stop the floppy driver. */
- call EXT_C(grub_dl_unload_all)
- call EXT_C(grub_stop_floppy)
-
- /* Interrupts should be disabled. */
- cli
-
- /* Where do we copy what from. */
- movl EXT_C(grub_multiboot_payload_size), %ecx
- movl EXT_C(grub_multiboot_payload_orig), %esi
- movl EXT_C(grub_multiboot_payload_dest), %edi
- movl EXT_C(grub_multiboot_payload_entry_offset), %edx
-
- /* Move the magic value into eax. */
- movl $MULTIBOOT_MAGIC2, %eax
-
- /* Jump to the relocator. */
- popl %ebp
- jmp *%ebp
-
-/*
- * This starts the multiboot 2 kernel.
- */
-
-FUNCTION(grub_multiboot2_real_boot)
- /* Push the entry address on the stack. */
- pushl %eax
- /* Move the address of the multiboot information structure to ebx. */
- movl %edx,%ebx
-
- /* Unload all modules and stop the floppy driver. */
- call EXT_C(grub_dl_unload_all)
- call EXT_C(grub_stop_floppy)
-
- /* Interrupts should be disabled. */
- cli
-
- /* Move the magic value into eax and jump to the kernel. */
- movl $MULTIBOOT2_BOOTLOADER_MAGIC,%eax
- popl %ecx
- jmp *%ecx
-
-/*
* Use cdecl calling convention for *BSD kernels.
*/
Index: include/grub/i386/loader.h
===================================================================
--- include/grub/i386/loader.h (revision 2030)
+++ include/grub/i386/loader.h (working copy)
@@ -22,7 +22,6 @@
#include <grub/types.h>
#include <grub/err.h>
#include <grub/symbol.h>
-#include <grub/multiboot.h>
extern grub_uint32_t EXPORT_VAR(grub_linux_prot_size);
extern char *EXPORT_VAR(grub_linux_tmp_addr);
@@ -33,31 +32,15 @@
grub_err_t EXPORT_FUNC(grub_linux_boot) (void);
-/* The asm part of the multiboot loader. */
-void EXPORT_FUNC(grub_multiboot_real_boot) (grub_addr_t entry,
- struct grub_multiboot_info *mbi)
- __attribute__ ((noreturn));
-void EXPORT_FUNC(grub_multiboot2_real_boot) (grub_addr_t entry,
- struct grub_multiboot_info *mbi)
- __attribute__ ((noreturn));
void EXPORT_FUNC(grub_unix_real_boot) (grub_addr_t entry, ...)
__attribute__ ((cdecl,noreturn));
-extern grub_addr_t EXPORT_VAR(grub_multiboot_payload_orig);
-extern grub_addr_t EXPORT_VAR(grub_multiboot_payload_dest);
-extern grub_size_t EXPORT_VAR(grub_multiboot_payload_size);
-extern grub_uint32_t EXPORT_VAR(grub_multiboot_payload_entry_offset);
-
/* It is necessary to export these functions, because normal mode commands
reuse rescue mode commands. */
void grub_rescue_cmd_linux (int argc, char *argv[]);
void grub_rescue_cmd_initrd (int argc, char *argv[]);
-extern grub_uint8_t EXPORT_VAR(grub_multiboot_forward_relocator);
-extern grub_uint8_t EXPORT_VAR(grub_multiboot_forward_relocator_end);
-extern grub_uint8_t EXPORT_VAR(grub_multiboot_backward_relocator);
-extern grub_uint8_t EXPORT_VAR(grub_multiboot_backward_relocator_end);
+void EXPORT_FUNC(grub_stop_floppy) (void);
-#define RELOCATOR_SIZEOF(x) (&grub_multiboot_##x##_relocator_end - &grub_multiboot_##x##_relocator)
#endif /* ! GRUB_LOADER_CPU_HEADER */
Index: include/grub/i386/multiboot.h
===================================================================
--- include/grub/i386/multiboot.h (revision 0)
+++ include/grub/i386/multiboot.h (revision 0)
@@ -0,0 +1,42 @@
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 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 <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef GRUB_MULTIBOOT_CPU_HEADER
+#define GRUB_MULTIBOOT_CPU_HEADER 1
+
+/* The asm part of the multiboot loader. */
+void grub_multiboot_real_boot (grub_addr_t entry,
+ struct grub_multiboot_info *mbi)
+ __attribute__ ((noreturn));
+void grub_multiboot2_real_boot (grub_addr_t entry,
+ struct grub_multiboot_info *mbi)
+ __attribute__ ((noreturn));
+
+extern grub_addr_t grub_multiboot_payload_orig;
+extern grub_addr_t grub_multiboot_payload_dest;
+extern grub_size_t grub_multiboot_payload_size;
+extern grub_uint32_t grub_multiboot_payload_entry_offset;
+
+extern grub_uint8_t grub_multiboot_forward_relocator;
+extern grub_uint8_t grub_multiboot_forward_relocator_end;
+extern grub_uint8_t grub_multiboot_backward_relocator;
+extern grub_uint8_t grub_multiboot_backward_relocator_end;
+
+#define RELOCATOR_SIZEOF(x) (&grub_multiboot_##x##_relocator_end - &grub_multiboot_##x##_relocator)
+
+#endif /* ! GRUB_MULTIBOOT_CPU_HEADER */
Index: loader/i386/multiboot.c
===================================================================
--- loader/i386/multiboot.c (revision 2030)
+++ loader/i386/multiboot.c (working copy)
@@ -32,6 +32,7 @@
#include <grub/multiboot.h>
#include <grub/machine/init.h>
#include <grub/machine/memory.h>
+#include <grub/cpu/multiboot.h>
#include <grub/elf.h>
#include <grub/aout.h>
#include <grub/file.h>
@@ -53,6 +54,8 @@
static grub_err_t
grub_multiboot_boot (void)
{
+ grub_stop_floppy ();
+
grub_multiboot_real_boot (entry, mbi_dest);
/* Not reached. */
Index: loader/i386/pc/multiboot2.c
===================================================================
--- loader/i386/pc/multiboot2.c (revision 2030)
+++ loader/i386/pc/multiboot2.c (working copy)
@@ -73,6 +73,7 @@
void
grub_mb2_arch_boot (grub_addr_t entry, void *tags)
{
+ grub_stop_floppy ();
grub_multiboot2_real_boot (entry, tags);
}
Index: loader/i386/multiboot_helper.S
===================================================================
--- loader/i386/multiboot_helper.S (revision 0)
+++ loader/i386/multiboot_helper.S (revision 0)
@@ -0,0 +1,115 @@
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 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 <http://www.gnu.org/licenses/>.
+ */
+
+#include <grub/symbol.h>
+#include <multiboot.h>
+#include <multiboot2.h>
+
+ .p2align 2 /* force 4-byte alignment */
+
+/*
+ * This starts the multiboot kernel.
+ */
+
+VARIABLE(grub_multiboot_payload_size)
+ .long 0
+VARIABLE(grub_multiboot_payload_orig)
+ .long 0
+VARIABLE(grub_multiboot_payload_dest)
+ .long 0
+VARIABLE(grub_multiboot_payload_entry_offset)
+ .long 0
+
+/*
+ * The relocators below understand the following parameters:
+ * ecx: Size of the block to be copied.
+ * esi: Where to copy from (always lowest address, even if we're relocating
+ * backwards).
+ * edi: Where to copy to (likewise).
+ * edx: Offset of the entry point (relative to the beginning of the block).
+ */
+
+VARIABLE(grub_multiboot_forward_relocator)
+ /* Add entry offset. */
+ addl %edi, %edx
+
+ /* Forward copy. */
+ cld
+ rep
+ movsb
+
+ jmp *%edx
+VARIABLE(grub_multiboot_forward_relocator_end)
+
+VARIABLE(grub_multiboot_backward_relocator)
+ /* Add entry offset (before %edi is mangled). */
+ addl %edi, %edx
+
+ /* Backward movsb is implicitly off-by-one. compensate that. */
+ decl %esi
+ decl %edi
+
+ /* Backward copy. */
+ std
+ addl %ecx, %esi
+ addl %ecx, %edi
+ rep
+ movsb
+
+ jmp *%edx
+VARIABLE(grub_multiboot_backward_relocator_end)
+
+FUNCTION(grub_multiboot_real_boot)
+ /* Push the entry address on the stack. */
+ pushl %eax
+ /* Move the address of the multiboot information structure to ebx. */
+ movl %edx,%ebx
+
+ /* Interrupts should be disabled. */
+ cli
+
+ /* Where do we copy what from. */
+ movl EXT_C(grub_multiboot_payload_size), %ecx
+ movl EXT_C(grub_multiboot_payload_orig), %esi
+ movl EXT_C(grub_multiboot_payload_dest), %edi
+ movl EXT_C(grub_multiboot_payload_entry_offset), %edx
+
+ /* Move the magic value into eax. */
+ movl $MULTIBOOT_MAGIC2, %eax
+
+ /* Jump to the relocator. */
+ popl %ebp
+ jmp *%ebp
+
+/*
+ * This starts the multiboot 2 kernel.
+ */
+
+FUNCTION(grub_multiboot2_real_boot)
+ /* Push the entry address on the stack. */
+ pushl %eax
+ /* Move the address of the multiboot information structure to ebx. */
+ movl %edx,%ebx
+
+ /* Interrupts should be disabled. */
+ cli
+
+ /* Move the magic value into eax and jump to the kernel. */
+ movl $MULTIBOOT2_BOOTLOADER_MAGIC,%eax
+ popl %ecx
+ jmp *%ecx
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [Patch] Move multiboot helpers out of the kernel
2009-03-13 23:35 ` phcoder
@ 2009-03-14 14:48 ` Robert Millan
2009-03-14 17:52 ` phcoder
2009-03-21 23:08 ` Robert Millan
1 sibling, 1 reply; 9+ messages in thread
From: Robert Millan @ 2009-03-14 14:48 UTC (permalink / raw)
To: The development of GRUB 2
On Sat, Mar 14, 2009 at 12:35:09AM +0100, phcoder wrote:
> Index: conf/i386-ieee1275.rmk
> ===================================================================
> --- conf/i386-ieee1275.rmk (revision 2030)
> +++ conf/i386-ieee1275.rmk (working copy)
> @@ -126,10 +126,12 @@
>
> # For _multiboot.mod.
> _multiboot_mod_SOURCES = loader/ieee1275/multiboot2.c \
> + loader/i386/multiboot_helper.S \
multiboot_helper.S is not being used on i386-ieee1275 AFAICT
> - /* Unload all modules and stop the floppy driver. */
> - call EXT_C(grub_dl_unload_all)
grub_dl_unload_all() just disappeared. Is this intentional? I
tend to agree that grub_dl_unload_all() is a waste of time, but
this should be discussed separately.
> - call EXT_C(grub_stop_floppy)
grub_stop_floppy() was moved to grub_multiboot_boot(). I think
grub_machine_fini() would be the more appropiate place. I'm not
sure why it was in those asm snippets to begin with (does someone
know?).
Also, grub_unix_real_boot() completely disappeared with your patch.
This seems to break *BSD.
--
Robert Millan
The DRM opt-in fallacy: "Your data belongs to us. We will decide when (and
how) you may access your data; but nobody's threatening your freedom: we
still allow you to remove your data and not access it at all."
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [Patch] Move multiboot helpers out of the kernel
2009-03-14 14:48 ` Robert Millan
@ 2009-03-14 17:52 ` phcoder
2009-03-15 15:34 ` Robert Millan
0 siblings, 1 reply; 9+ messages in thread
From: phcoder @ 2009-03-14 17:52 UTC (permalink / raw)
To: The development of GRUB 2
Robert Millan wrote:
> On Sat, Mar 14, 2009 at 12:35:09AM +0100, phcoder wrote:
>> Index: conf/i386-ieee1275.rmk
>> ===================================================================
>> --- conf/i386-ieee1275.rmk (revision 2030)
>> +++ conf/i386-ieee1275.rmk (working copy)
>> @@ -126,10 +126,12 @@
>>
>> # For _multiboot.mod.
>> _multiboot_mod_SOURCES = loader/ieee1275/multiboot2.c \
>> + loader/i386/multiboot_helper.S \
>
> multiboot_helper.S is not being used on i386-ieee1275 AFAICT
How can it be if multiboot.c is the same for pc and ieee1275?
>
>> - /* Unload all modules and stop the floppy driver. */
>> - call EXT_C(grub_dl_unload_all)
>
> grub_dl_unload_all() just disappeared. Is this intentional? I
> tend to agree that grub_dl_unload_all() is a waste of time, but
> this should be discussed separately.
It is intentional because multiboot_real_boot is now in a module so we
can't unload it
>
>> - call EXT_C(grub_stop_floppy)
>
> grub_stop_floppy() was moved to grub_multiboot_boot(). I think
> grub_machine_fini() would be the more appropiate place. I'm not
> sure why it was in those asm snippets to begin with (does someone
> know?).
>
I'll have a look at it
> Also, grub_unix_real_boot() completely disappeared with your patch.
> This seems to break *BSD.
>
Last patch doesn't remove grub_unix_real_boot
--
Regards
Vladimir 'phcoder' Serbinenko
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [Patch] Move multiboot helpers out of the kernel
2009-03-14 17:52 ` phcoder
@ 2009-03-15 15:34 ` Robert Millan
2009-03-21 22:51 ` phcoder
0 siblings, 1 reply; 9+ messages in thread
From: Robert Millan @ 2009-03-15 15:34 UTC (permalink / raw)
To: The development of GRUB 2
On Sat, Mar 14, 2009 at 06:52:55PM +0100, phcoder wrote:
> Robert Millan wrote:
>> On Sat, Mar 14, 2009 at 12:35:09AM +0100, phcoder wrote:
>>> Index: conf/i386-ieee1275.rmk
>>> ===================================================================
>>> --- conf/i386-ieee1275.rmk (revision 2030)
>>> +++ conf/i386-ieee1275.rmk (working copy)
>>> @@ -126,10 +126,12 @@
>>> # For _multiboot.mod.
>>> _multiboot_mod_SOURCES = loader/ieee1275/multiboot2.c \
>>> + loader/i386/multiboot_helper.S \
>>
>> multiboot_helper.S is not being used on i386-ieee1275 AFAICT
>
> How can it be if multiboot.c is the same for pc and ieee1275?
$ grep multiboot.c conf/*.rmk
conf/i386-coreboot.rmk:_multiboot_mod_SOURCES = loader/i386/multiboot.c \
conf/i386-pc.rmk:_multiboot_mod_SOURCES = loader/i386/multiboot.c \
>> grub_dl_unload_all() just disappeared. Is this intentional? I
>> tend to agree that grub_dl_unload_all() is a waste of time, but
>> this should be discussed separately.
>
> It is intentional because multiboot_real_boot is now in a module so we
> can't unload it
Ok then, I'm fine with disabling the unload. What does everybody else
think?
--
Robert Millan
The DRM opt-in fallacy: "Your data belongs to us. We will decide when (and
how) you may access your data; but nobody's threatening your freedom: we
still allow you to remove your data and not access it at all."
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [Patch] Move multiboot helpers out of the kernel
2009-03-15 15:34 ` Robert Millan
@ 2009-03-21 22:51 ` phcoder
0 siblings, 0 replies; 9+ messages in thread
From: phcoder @ 2009-03-21 22:51 UTC (permalink / raw)
To: The development of GRUB 2
Robert Millan wrote:
> On Sat, Mar 14, 2009 at 06:52:55PM +0100, phcoder wrote:
>> Robert Millan wrote:
>>> On Sat, Mar 14, 2009 at 12:35:09AM +0100, phcoder wrote:
>>>> Index: conf/i386-ieee1275.rmk
>>>> ===================================================================
>>>> --- conf/i386-ieee1275.rmk (revision 2030)
>>>> +++ conf/i386-ieee1275.rmk (working copy)
>>>> @@ -126,10 +126,12 @@
>>>> # For _multiboot.mod.
>>>> _multiboot_mod_SOURCES = loader/ieee1275/multiboot2.c \
>>>> + loader/i386/multiboot_helper.S \
>>> multiboot_helper.S is not being used on i386-ieee1275 AFAICT
>> How can it be if multiboot.c is the same for pc and ieee1275?
>
> $ grep multiboot.c conf/*.rmk
> conf/i386-coreboot.rmk:_multiboot_mod_SOURCES = loader/i386/multiboot.c \
> conf/i386-pc.rmk:_multiboot_mod_SOURCES = loader/i386/multiboot.c \
>
void
grub_mb2_arch_boot (grub_addr_t entry_addr, void *tags)
{
#if defined(__powerpc__)
kernel_entry_t entry = (kernel_entry_t) entry_addr;
entry (MULTIBOOT2_BOOTLOADER_MAGIC, tags, grub_ieee1275_entry_fn, 0, 0);
#elif defined(__i386__)
grub_multiboot2_real_boot (entry_addr, tags);
#else
#error
#endif
}
As you see it uses grub_multiboot2_real_boot
>>> grub_dl_unload_all() just disappeared. Is this intentional? I
>>> tend to agree that grub_dl_unload_all() is a waste of time, but
>>> this should be discussed separately.
>> It is intentional because multiboot_real_boot is now in a module so we
>> can't unload it
>
> Ok then, I'm fine with disabling the unload. What does everybody else
> think?
>
--
Regards
Vladimir 'phcoder' Serbinenko
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [Patch] Move multiboot helpers out of the kernel
2009-03-13 23:35 ` phcoder
2009-03-14 14:48 ` Robert Millan
@ 2009-03-21 23:08 ` Robert Millan
2009-03-22 0:15 ` phcoder
1 sibling, 1 reply; 9+ messages in thread
From: Robert Millan @ 2009-03-21 23:08 UTC (permalink / raw)
To: The development of GRUB 2
Is this the last patch? I rechecked this thread, but might have
missed something.
On Sat, Mar 14, 2009 at 12:35:09AM +0100, phcoder wrote:
> Rediffed
> 2009-03-14 Vladimir Serbinenko <phcoder@gmail.com>
>
> Move multiboot helper out of kernel
>
> * conf/i386-pc.rmk: Add loader/i386/multiboot_helper.S to
> _multiboot.mod
This should be like:
* conf/i386-pc.rmk (_multiboot_mod_SOURCES): Add
`loader/i386/multiboot_helper.S'.
Also, the addition of _multiboot_mod_ASFLAGS isn't mentioned.
--
Robert Millan
The DRM opt-in fallacy: "Your data belongs to us. We will decide when (and
how) you may access your data; but nobody's threatening your freedom: we
still allow you to remove your data and not access it at all."
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [Patch] Move multiboot helpers out of the kernel
2009-03-21 23:08 ` Robert Millan
@ 2009-03-22 0:15 ` phcoder
2009-03-22 12:29 ` Robert Millan
0 siblings, 1 reply; 9+ messages in thread
From: phcoder @ 2009-03-22 0:15 UTC (permalink / raw)
To: The development of GRUB 2
[-- Attachment #1: Type: text/plain, Size: 1276 bytes --]
Fixed. I temporarily left grub_stop_floppy in linux code.
2009-03-22 Vladimir Serbinenko <phcoder@gmail.com>
Move multiboot helper out of kernel
* conf/i386-pc.rmk (multiboot_mod_SOURCES): Add
loader/i386/multiboot_helper.S
* conf/i386-coreboot.rmk: Likewise
* conf/i386-ieee1275.rmk: Likewise
* kern/i386/loader.S: Move multiboot helpers from here...
* loader/i386/multiboot_helper.S: ...moved here
* include/grub/i386/loader.h: Move declarations of multiboot
helpers from here...
* include/grub/i386/multiboot.h: ...moved here
* loader/i386/multiboot.c: Added include of
grub/cpu/multiboot.h
Robert Millan wrote:
> Is this the last patch? I rechecked this thread, but might have
> missed something.
>
> On Sat, Mar 14, 2009 at 12:35:09AM +0100, phcoder wrote:
>> Rediffed
>> 2009-03-14 Vladimir Serbinenko <phcoder@gmail.com>
>>
>> Move multiboot helper out of kernel
>>
>> * conf/i386-pc.rmk: Add loader/i386/multiboot_helper.S to
>> _multiboot.mod
>
> This should be like:
>
> * conf/i386-pc.rmk (_multiboot_mod_SOURCES): Add
> `loader/i386/multiboot_helper.S'.
>
> Also, the addition of _multiboot_mod_ASFLAGS isn't mentioned.
>
--
Regards
Vladimir 'phcoder' Serbinenko
[-- Attachment #2: mb.patch --]
[-- Type: text/x-diff, Size: 13115 bytes --]
diff --git a/conf/i386-coreboot.rmk b/conf/i386-coreboot.rmk
index 0b4f216..53595de 100644
--- a/conf/i386-coreboot.rmk
+++ b/conf/i386-coreboot.rmk
@@ -145,11 +145,13 @@ serial_mod_LDFLAGS = $(COMMON_LDFLAGS)
# For multiboot.mod.
multiboot_mod_SOURCES = loader/i386/multiboot.c \
+ loader/i386/multiboot_helper.S \
loader/i386/pc/multiboot2.c \
loader/multiboot2.c \
loader/multiboot_loader.c
multiboot_mod_CFLAGS = $(COMMON_CFLAGS)
multiboot_mod_LDFLAGS = $(COMMON_LDFLAGS)
+multiboot_mod_ASFLAGS = $(COMMON_ASFLAGS)
# For aout.mod.
aout_mod_SOURCES = loader/aout.c
diff --git a/conf/i386-ieee1275.rmk b/conf/i386-ieee1275.rmk
index dbcbb4a..a84b5aa 100644
--- a/conf/i386-ieee1275.rmk
+++ b/conf/i386-ieee1275.rmk
@@ -127,10 +127,12 @@ normal_mod_LDFLAGS = $(COMMON_LDFLAGS)
# For multiboot.mod.
multiboot_mod_SOURCES = loader/ieee1275/multiboot2.c \
+ loader/i386/multiboot_helper.S \
loader/multiboot2.c \
loader/multiboot_loader.c
multiboot_mod_CFLAGS = $(COMMON_CFLAGS)
multiboot_mod_LDFLAGS = $(COMMON_LDFLAGS)
+multiboot_mod_ASFLAGS = $(COMMON_ASFLAGS)
# For aout.mod.
aout_mod_SOURCES = loader/aout.c
diff --git a/conf/i386-pc.rmk b/conf/i386-pc.rmk
index cc845ed..60d5182 100644
--- a/conf/i386-pc.rmk
+++ b/conf/i386-pc.rmk
@@ -228,11 +228,13 @@ serial_mod_LDFLAGS = $(COMMON_LDFLAGS)
# For multiboot.mod.
multiboot_mod_SOURCES = loader/i386/multiboot.c \
+ loader/i386/multiboot_helper.S \
loader/i386/pc/multiboot2.c \
loader/multiboot2.c \
loader/multiboot_loader.c
multiboot_mod_CFLAGS = $(COMMON_CFLAGS)
multiboot_mod_LDFLAGS = $(COMMON_LDFLAGS)
+multiboot_mod_ASFLAGS = $(COMMON_ASFLAGS)
# For vbe.mod.
vbe_mod_SOURCES = video/i386/pc/vbe.c video/i386/pc/vbeblit.c \
diff --git a/include/grub/i386/loader.h b/include/grub/i386/loader.h
index df8b4e3..3052030 100644
--- a/include/grub/i386/loader.h
+++ b/include/grub/i386/loader.h
@@ -1,6 +1,6 @@
/*
* GRUB -- GRand Unified Bootloader
- * Copyright (C) 2002,2003,2004,2007,2008 Free Software Foundation, Inc.
+ * 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
@@ -22,7 +22,6 @@
#include <grub/types.h>
#include <grub/err.h>
#include <grub/symbol.h>
-#include <grub/multiboot.h>
extern grub_uint32_t EXPORT_VAR(grub_linux_prot_size);
extern char *EXPORT_VAR(grub_linux_tmp_addr);
@@ -33,26 +32,7 @@ extern grub_size_t EXPORT_VAR(grub_os_area_size);
grub_err_t EXPORT_FUNC(grub_linux_boot) (void);
-/* The asm part of the multiboot loader. */
-void EXPORT_FUNC(grub_multiboot_real_boot) (grub_addr_t entry,
- struct grub_multiboot_info *mbi)
- __attribute__ ((noreturn));
-void EXPORT_FUNC(grub_multiboot2_real_boot) (grub_addr_t entry,
- struct grub_multiboot_info *mbi)
- __attribute__ ((noreturn));
void EXPORT_FUNC(grub_unix_real_boot) (grub_addr_t entry, ...)
__attribute__ ((cdecl,noreturn));
-extern grub_addr_t EXPORT_VAR(grub_multiboot_payload_orig);
-extern grub_addr_t EXPORT_VAR(grub_multiboot_payload_dest);
-extern grub_size_t EXPORT_VAR(grub_multiboot_payload_size);
-extern grub_uint32_t EXPORT_VAR(grub_multiboot_payload_entry_offset);
-
-extern grub_uint8_t EXPORT_VAR(grub_multiboot_forward_relocator);
-extern grub_uint8_t EXPORT_VAR(grub_multiboot_forward_relocator_end);
-extern grub_uint8_t EXPORT_VAR(grub_multiboot_backward_relocator);
-extern grub_uint8_t EXPORT_VAR(grub_multiboot_backward_relocator_end);
-
-#define RELOCATOR_SIZEOF(x) (&grub_multiboot_##x##_relocator_end - &grub_multiboot_##x##_relocator)
-
#endif /* ! GRUB_LOADER_CPU_HEADER */
diff --git a/include/grub/i386/multiboot.h b/include/grub/i386/multiboot.h
new file mode 100644
index 0000000..ea68640
--- /dev/null
+++ b/include/grub/i386/multiboot.h
@@ -0,0 +1,42 @@
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 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 <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef GRUB_MULTIBOOT_CPU_HEADER
+#define GRUB_MULTIBOOT_CPU_HEADER 1
+
+/* The asm part of the multiboot loader. */
+void grub_multiboot_real_boot (grub_addr_t entry,
+ struct grub_multiboot_info *mbi)
+ __attribute__ ((noreturn));
+void grub_multiboot2_real_boot (grub_addr_t entry,
+ struct grub_multiboot_info *mbi)
+ __attribute__ ((noreturn));
+
+extern grub_addr_t grub_multiboot_payload_orig;
+extern grub_addr_t grub_multiboot_payload_dest;
+extern grub_size_t grub_multiboot_payload_size;
+extern grub_uint32_t grub_multiboot_payload_entry_offset;
+
+extern grub_uint8_t grub_multiboot_forward_relocator;
+extern grub_uint8_t grub_multiboot_forward_relocator_end;
+extern grub_uint8_t grub_multiboot_backward_relocator;
+extern grub_uint8_t grub_multiboot_backward_relocator_end;
+
+#define RELOCATOR_SIZEOF(x) (&grub_multiboot_##x##_relocator_end - &grub_multiboot_##x##_relocator)
+
+#endif /* ! GRUB_MULTIBOOT_CPU_HEADER */
diff --git a/kern/i386/coreboot/init.c b/kern/i386/coreboot/init.c
index 9978d4a..1348488 100644
--- a/kern/i386/coreboot/init.c
+++ b/kern/i386/coreboot/init.c
@@ -146,6 +146,7 @@ grub_machine_fini (void)
{
grub_at_keyboard_fini ();
grub_vga_text_fini ();
+ grub_stop_floppy ();
}
/* Return the end of the core image. */
diff --git a/kern/i386/loader.S b/kern/i386/loader.S
index cacbbea..0e8ded6 100644
--- a/kern/i386/loader.S
+++ b/kern/i386/loader.S
@@ -118,106 +118,6 @@ linux_setup_seg:
.word 0
.code32
-
-/*
- * This starts the multiboot kernel.
- */
-
-VARIABLE(grub_multiboot_payload_size)
- .long 0
-VARIABLE(grub_multiboot_payload_orig)
- .long 0
-VARIABLE(grub_multiboot_payload_dest)
- .long 0
-VARIABLE(grub_multiboot_payload_entry_offset)
- .long 0
-
-/*
- * The relocators below understand the following parameters:
- * ecx: Size of the block to be copied.
- * esi: Where to copy from (always lowest address, even if we're relocating
- * backwards).
- * edi: Where to copy to (likewise).
- * edx: Offset of the entry point (relative to the beginning of the block).
- */
-VARIABLE(grub_multiboot_forward_relocator)
- /* Add entry offset. */
- addl %edi, %edx
-
- /* Forward copy. */
- cld
- rep
- movsb
-
- jmp *%edx
-VARIABLE(grub_multiboot_forward_relocator_end)
-
-VARIABLE(grub_multiboot_backward_relocator)
- /* Add entry offset (before %edi is mangled). */
- addl %edi, %edx
-
- /* Backward movsb is implicitly off-by-one. compensate that. */
- decl %esi
- decl %edi
-
- /* Backward copy. */
- std
- addl %ecx, %esi
- addl %ecx, %edi
- rep
- movsb
-
- jmp *%edx
-VARIABLE(grub_multiboot_backward_relocator_end)
-
-FUNCTION(grub_multiboot_real_boot)
- /* Push the entry address on the stack. */
- pushl %eax
- /* Move the address of the multiboot information structure to ebx. */
- movl %edx,%ebx
-
- /* Unload all modules and stop the floppy driver. */
- call EXT_C(grub_dl_unload_all)
- call EXT_C(grub_stop_floppy)
-
- /* Interrupts should be disabled. */
- cli
-
- /* Where do we copy what from. */
- movl EXT_C(grub_multiboot_payload_size), %ecx
- movl EXT_C(grub_multiboot_payload_orig), %esi
- movl EXT_C(grub_multiboot_payload_dest), %edi
- movl EXT_C(grub_multiboot_payload_entry_offset), %edx
-
- /* Move the magic value into eax. */
- movl $MULTIBOOT_MAGIC2, %eax
-
- /* Jump to the relocator. */
- popl %ebp
- jmp *%ebp
-
-/*
- * This starts the multiboot 2 kernel.
- */
-
-FUNCTION(grub_multiboot2_real_boot)
- /* Push the entry address on the stack. */
- pushl %eax
- /* Move the address of the multiboot information structure to ebx. */
- movl %edx,%ebx
-
- /* Unload all modules and stop the floppy driver. */
- call EXT_C(grub_dl_unload_all)
- call EXT_C(grub_stop_floppy)
-
- /* Interrupts should be disabled. */
- cli
-
- /* Move the magic value into eax and jump to the kernel. */
- movl $MULTIBOOT2_BOOTLOADER_MAGIC,%eax
- popl %ecx
- jmp *%ecx
-
/*
* Use cdecl calling convention for *BSD kernels.
*/
@@ -225,7 +125,6 @@ FUNCTION(grub_multiboot2_real_boot)
FUNCTION(grub_unix_real_boot)
call EXT_C(grub_dl_unload_all)
- call EXT_C(grub_stop_floppy)
/* Interrupts should be disabled. */
cli
diff --git a/kern/i386/pc/init.c b/kern/i386/pc/init.c
index 1d6d22f..6191412 100644
--- a/kern/i386/pc/init.c
+++ b/kern/i386/pc/init.c
@@ -223,6 +223,7 @@ void
grub_machine_fini (void)
{
grub_console_fini ();
+ grub_stop_floppy ();
}
/* Return the end of the core image. */
diff --git a/loader/i386/multiboot.c b/loader/i386/multiboot.c
index 4c01d87..27042a5 100644
--- a/loader/i386/multiboot.c
+++ b/loader/i386/multiboot.c
@@ -32,6 +32,7 @@
#include <grub/multiboot.h>
#include <grub/machine/init.h>
#include <grub/machine/memory.h>
+#include <grub/cpu/multiboot.h>
#include <grub/elf.h>
#include <grub/aout.h>
#include <grub/file.h>
diff --git a/loader/i386/multiboot_helper.S b/loader/i386/multiboot_helper.S
new file mode 100644
index 0000000..1e71120
--- /dev/null
+++ b/loader/i386/multiboot_helper.S
@@ -0,0 +1,115 @@
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 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 <http://www.gnu.org/licenses/>.
+ */
+
+#include <grub/symbol.h>
+#include <multiboot.h>
+#include <multiboot2.h>
+
+ .p2align 2 /* force 4-byte alignment */
+
+/*
+ * This starts the multiboot kernel.
+ */
+
+VARIABLE(grub_multiboot_payload_size)
+ .long 0
+VARIABLE(grub_multiboot_payload_orig)
+ .long 0
+VARIABLE(grub_multiboot_payload_dest)
+ .long 0
+VARIABLE(grub_multiboot_payload_entry_offset)
+ .long 0
+
+/*
+ * The relocators below understand the following parameters:
+ * ecx: Size of the block to be copied.
+ * esi: Where to copy from (always lowest address, even if we're relocating
+ * backwards).
+ * edi: Where to copy to (likewise).
+ * edx: Offset of the entry point (relative to the beginning of the block).
+ */
+
+VARIABLE(grub_multiboot_forward_relocator)
+ /* Add entry offset. */
+ addl %edi, %edx
+
+ /* Forward copy. */
+ cld
+ rep
+ movsb
+
+ jmp *%edx
+VARIABLE(grub_multiboot_forward_relocator_end)
+
+VARIABLE(grub_multiboot_backward_relocator)
+ /* Add entry offset (before %edi is mangled). */
+ addl %edi, %edx
+
+ /* Backward movsb is implicitly off-by-one. compensate that. */
+ decl %esi
+ decl %edi
+
+ /* Backward copy. */
+ std
+ addl %ecx, %esi
+ addl %ecx, %edi
+ rep
+ movsb
+
+ jmp *%edx
+VARIABLE(grub_multiboot_backward_relocator_end)
+
+FUNCTION(grub_multiboot_real_boot)
+ /* Push the entry address on the stack. */
+ pushl %eax
+ /* Move the address of the multiboot information structure to ebx. */
+ movl %edx,%ebx
+
+ /* Interrupts should be disabled. */
+ cli
+
+ /* Where do we copy what from. */
+ movl EXT_C(grub_multiboot_payload_size), %ecx
+ movl EXT_C(grub_multiboot_payload_orig), %esi
+ movl EXT_C(grub_multiboot_payload_dest), %edi
+ movl EXT_C(grub_multiboot_payload_entry_offset), %edx
+
+ /* Move the magic value into eax. */
+ movl $MULTIBOOT_MAGIC2, %eax
+
+ /* Jump to the relocator. */
+ popl %ebp
+ jmp *%ebp
+
+/*
+ * This starts the multiboot 2 kernel.
+ */
+
+FUNCTION(grub_multiboot2_real_boot)
+ /* Push the entry address on the stack. */
+ pushl %eax
+ /* Move the address of the multiboot information structure to ebx. */
+ movl %edx,%ebx
+
+ /* Interrupts should be disabled. */
+ cli
+
+ /* Move the magic value into eax and jump to the kernel. */
+ movl $MULTIBOOT2_BOOTLOADER_MAGIC,%eax
+ popl %ecx
+ jmp *%ecx
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [Patch] Move multiboot helpers out of the kernel
2009-03-22 0:15 ` phcoder
@ 2009-03-22 12:29 ` Robert Millan
0 siblings, 0 replies; 9+ messages in thread
From: Robert Millan @ 2009-03-22 12:29 UTC (permalink / raw)
To: The development of GRUB 2
Committed.
On Sun, Mar 22, 2009 at 01:15:03AM +0100, phcoder wrote:
> Fixed. I temporarily left grub_stop_floppy in linux code.
> 2009-03-22 Vladimir Serbinenko <phcoder@gmail.com>
>
> Move multiboot helper out of kernel
>
> * conf/i386-pc.rmk (multiboot_mod_SOURCES): Add
> loader/i386/multiboot_helper.S
> * conf/i386-coreboot.rmk: Likewise
> * conf/i386-ieee1275.rmk: Likewise
> * kern/i386/loader.S: Move multiboot helpers from here...
> * loader/i386/multiboot_helper.S: ...moved here
> * include/grub/i386/loader.h: Move declarations of multiboot
> helpers from here...
> * include/grub/i386/multiboot.h: ...moved here
> * loader/i386/multiboot.c: Added include of
> grub/cpu/multiboot.h
>
> Robert Millan wrote:
>> Is this the last patch? I rechecked this thread, but might have
>> missed something.
>>
>> On Sat, Mar 14, 2009 at 12:35:09AM +0100, phcoder wrote:
>>> Rediffed
>>> 2009-03-14 Vladimir Serbinenko <phcoder@gmail.com>
>>>
>>> Move multiboot helper out of kernel
>>>
>>> * conf/i386-pc.rmk: Add loader/i386/multiboot_helper.S to
>>> _multiboot.mod
>>
>> This should be like:
>>
>> * conf/i386-pc.rmk (_multiboot_mod_SOURCES): Add
>> `loader/i386/multiboot_helper.S'.
>>
>> Also, the addition of _multiboot_mod_ASFLAGS isn't mentioned.
>>
>
>
> --
>
> Regards
> Vladimir 'phcoder' Serbinenko
> diff --git a/conf/i386-coreboot.rmk b/conf/i386-coreboot.rmk
> index 0b4f216..53595de 100644
> --- a/conf/i386-coreboot.rmk
> +++ b/conf/i386-coreboot.rmk
> @@ -145,11 +145,13 @@ serial_mod_LDFLAGS = $(COMMON_LDFLAGS)
>
> # For multiboot.mod.
> multiboot_mod_SOURCES = loader/i386/multiboot.c \
> + loader/i386/multiboot_helper.S \
> loader/i386/pc/multiboot2.c \
> loader/multiboot2.c \
> loader/multiboot_loader.c
> multiboot_mod_CFLAGS = $(COMMON_CFLAGS)
> multiboot_mod_LDFLAGS = $(COMMON_LDFLAGS)
> +multiboot_mod_ASFLAGS = $(COMMON_ASFLAGS)
>
> # For aout.mod.
> aout_mod_SOURCES = loader/aout.c
> diff --git a/conf/i386-ieee1275.rmk b/conf/i386-ieee1275.rmk
> index dbcbb4a..a84b5aa 100644
> --- a/conf/i386-ieee1275.rmk
> +++ b/conf/i386-ieee1275.rmk
> @@ -127,10 +127,12 @@ normal_mod_LDFLAGS = $(COMMON_LDFLAGS)
>
> # For multiboot.mod.
> multiboot_mod_SOURCES = loader/ieee1275/multiboot2.c \
> + loader/i386/multiboot_helper.S \
> loader/multiboot2.c \
> loader/multiboot_loader.c
> multiboot_mod_CFLAGS = $(COMMON_CFLAGS)
> multiboot_mod_LDFLAGS = $(COMMON_LDFLAGS)
> +multiboot_mod_ASFLAGS = $(COMMON_ASFLAGS)
>
> # For aout.mod.
> aout_mod_SOURCES = loader/aout.c
> diff --git a/conf/i386-pc.rmk b/conf/i386-pc.rmk
> index cc845ed..60d5182 100644
> --- a/conf/i386-pc.rmk
> +++ b/conf/i386-pc.rmk
> @@ -228,11 +228,13 @@ serial_mod_LDFLAGS = $(COMMON_LDFLAGS)
>
> # For multiboot.mod.
> multiboot_mod_SOURCES = loader/i386/multiboot.c \
> + loader/i386/multiboot_helper.S \
> loader/i386/pc/multiboot2.c \
> loader/multiboot2.c \
> loader/multiboot_loader.c
> multiboot_mod_CFLAGS = $(COMMON_CFLAGS)
> multiboot_mod_LDFLAGS = $(COMMON_LDFLAGS)
> +multiboot_mod_ASFLAGS = $(COMMON_ASFLAGS)
>
> # For vbe.mod.
> vbe_mod_SOURCES = video/i386/pc/vbe.c video/i386/pc/vbeblit.c \
> diff --git a/include/grub/i386/loader.h b/include/grub/i386/loader.h
> index df8b4e3..3052030 100644
> --- a/include/grub/i386/loader.h
> +++ b/include/grub/i386/loader.h
> @@ -1,6 +1,6 @@
> /*
> * GRUB -- GRand Unified Bootloader
> - * Copyright (C) 2002,2003,2004,2007,2008 Free Software Foundation, Inc.
> + * 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
> @@ -22,7 +22,6 @@
> #include <grub/types.h>
> #include <grub/err.h>
> #include <grub/symbol.h>
> -#include <grub/multiboot.h>
>
> extern grub_uint32_t EXPORT_VAR(grub_linux_prot_size);
> extern char *EXPORT_VAR(grub_linux_tmp_addr);
> @@ -33,26 +32,7 @@ extern grub_size_t EXPORT_VAR(grub_os_area_size);
>
> grub_err_t EXPORT_FUNC(grub_linux_boot) (void);
>
> -/* The asm part of the multiboot loader. */
> -void EXPORT_FUNC(grub_multiboot_real_boot) (grub_addr_t entry,
> - struct grub_multiboot_info *mbi)
> - __attribute__ ((noreturn));
> -void EXPORT_FUNC(grub_multiboot2_real_boot) (grub_addr_t entry,
> - struct grub_multiboot_info *mbi)
> - __attribute__ ((noreturn));
> void EXPORT_FUNC(grub_unix_real_boot) (grub_addr_t entry, ...)
> __attribute__ ((cdecl,noreturn));
>
> -extern grub_addr_t EXPORT_VAR(grub_multiboot_payload_orig);
> -extern grub_addr_t EXPORT_VAR(grub_multiboot_payload_dest);
> -extern grub_size_t EXPORT_VAR(grub_multiboot_payload_size);
> -extern grub_uint32_t EXPORT_VAR(grub_multiboot_payload_entry_offset);
> -
> -extern grub_uint8_t EXPORT_VAR(grub_multiboot_forward_relocator);
> -extern grub_uint8_t EXPORT_VAR(grub_multiboot_forward_relocator_end);
> -extern grub_uint8_t EXPORT_VAR(grub_multiboot_backward_relocator);
> -extern grub_uint8_t EXPORT_VAR(grub_multiboot_backward_relocator_end);
> -
> -#define RELOCATOR_SIZEOF(x) (&grub_multiboot_##x##_relocator_end - &grub_multiboot_##x##_relocator)
> -
> #endif /* ! GRUB_LOADER_CPU_HEADER */
> diff --git a/include/grub/i386/multiboot.h b/include/grub/i386/multiboot.h
> new file mode 100644
> index 0000000..ea68640
> --- /dev/null
> +++ b/include/grub/i386/multiboot.h
> @@ -0,0 +1,42 @@
> +/*
> + * GRUB -- GRand Unified Bootloader
> + * Copyright (C) 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 <http://www.gnu.org/licenses/>.
> + */
> +
> +#ifndef GRUB_MULTIBOOT_CPU_HEADER
> +#define GRUB_MULTIBOOT_CPU_HEADER 1
> +
> +/* The asm part of the multiboot loader. */
> +void grub_multiboot_real_boot (grub_addr_t entry,
> + struct grub_multiboot_info *mbi)
> + __attribute__ ((noreturn));
> +void grub_multiboot2_real_boot (grub_addr_t entry,
> + struct grub_multiboot_info *mbi)
> + __attribute__ ((noreturn));
> +
> +extern grub_addr_t grub_multiboot_payload_orig;
> +extern grub_addr_t grub_multiboot_payload_dest;
> +extern grub_size_t grub_multiboot_payload_size;
> +extern grub_uint32_t grub_multiboot_payload_entry_offset;
> +
> +extern grub_uint8_t grub_multiboot_forward_relocator;
> +extern grub_uint8_t grub_multiboot_forward_relocator_end;
> +extern grub_uint8_t grub_multiboot_backward_relocator;
> +extern grub_uint8_t grub_multiboot_backward_relocator_end;
> +
> +#define RELOCATOR_SIZEOF(x) (&grub_multiboot_##x##_relocator_end - &grub_multiboot_##x##_relocator)
> +
> +#endif /* ! GRUB_MULTIBOOT_CPU_HEADER */
> diff --git a/kern/i386/coreboot/init.c b/kern/i386/coreboot/init.c
> index 9978d4a..1348488 100644
> --- a/kern/i386/coreboot/init.c
> +++ b/kern/i386/coreboot/init.c
> @@ -146,6 +146,7 @@ grub_machine_fini (void)
> {
> grub_at_keyboard_fini ();
> grub_vga_text_fini ();
> + grub_stop_floppy ();
> }
>
> /* Return the end of the core image. */
> diff --git a/kern/i386/loader.S b/kern/i386/loader.S
> index cacbbea..0e8ded6 100644
> --- a/kern/i386/loader.S
> +++ b/kern/i386/loader.S
> @@ -118,106 +118,6 @@ linux_setup_seg:
> .word 0
> .code32
>
> -
> -/*
> - * This starts the multiboot kernel.
> - */
> -
> -VARIABLE(grub_multiboot_payload_size)
> - .long 0
> -VARIABLE(grub_multiboot_payload_orig)
> - .long 0
> -VARIABLE(grub_multiboot_payload_dest)
> - .long 0
> -VARIABLE(grub_multiboot_payload_entry_offset)
> - .long 0
> -
> -/*
> - * The relocators below understand the following parameters:
> - * ecx: Size of the block to be copied.
> - * esi: Where to copy from (always lowest address, even if we're relocating
> - * backwards).
> - * edi: Where to copy to (likewise).
> - * edx: Offset of the entry point (relative to the beginning of the block).
> - */
> -VARIABLE(grub_multiboot_forward_relocator)
> - /* Add entry offset. */
> - addl %edi, %edx
> -
> - /* Forward copy. */
> - cld
> - rep
> - movsb
> -
> - jmp *%edx
> -VARIABLE(grub_multiboot_forward_relocator_end)
> -
> -VARIABLE(grub_multiboot_backward_relocator)
> - /* Add entry offset (before %edi is mangled). */
> - addl %edi, %edx
> -
> - /* Backward movsb is implicitly off-by-one. compensate that. */
> - decl %esi
> - decl %edi
> -
> - /* Backward copy. */
> - std
> - addl %ecx, %esi
> - addl %ecx, %edi
> - rep
> - movsb
> -
> - jmp *%edx
> -VARIABLE(grub_multiboot_backward_relocator_end)
> -
> -FUNCTION(grub_multiboot_real_boot)
> - /* Push the entry address on the stack. */
> - pushl %eax
> - /* Move the address of the multiboot information structure to ebx. */
> - movl %edx,%ebx
> -
> - /* Unload all modules and stop the floppy driver. */
> - call EXT_C(grub_dl_unload_all)
> - call EXT_C(grub_stop_floppy)
> -
> - /* Interrupts should be disabled. */
> - cli
> -
> - /* Where do we copy what from. */
> - movl EXT_C(grub_multiboot_payload_size), %ecx
> - movl EXT_C(grub_multiboot_payload_orig), %esi
> - movl EXT_C(grub_multiboot_payload_dest), %edi
> - movl EXT_C(grub_multiboot_payload_entry_offset), %edx
> -
> - /* Move the magic value into eax. */
> - movl $MULTIBOOT_MAGIC2, %eax
> -
> - /* Jump to the relocator. */
> - popl %ebp
> - jmp *%ebp
> -
> -/*
> - * This starts the multiboot 2 kernel.
> - */
> -
> -FUNCTION(grub_multiboot2_real_boot)
> - /* Push the entry address on the stack. */
> - pushl %eax
> - /* Move the address of the multiboot information structure to ebx. */
> - movl %edx,%ebx
> -
> - /* Unload all modules and stop the floppy driver. */
> - call EXT_C(grub_dl_unload_all)
> - call EXT_C(grub_stop_floppy)
> -
> - /* Interrupts should be disabled. */
> - cli
> -
> - /* Move the magic value into eax and jump to the kernel. */
> - movl $MULTIBOOT2_BOOTLOADER_MAGIC,%eax
> - popl %ecx
> - jmp *%ecx
> -
> /*
> * Use cdecl calling convention for *BSD kernels.
> */
> @@ -225,7 +125,6 @@ FUNCTION(grub_multiboot2_real_boot)
> FUNCTION(grub_unix_real_boot)
>
> call EXT_C(grub_dl_unload_all)
> - call EXT_C(grub_stop_floppy)
>
> /* Interrupts should be disabled. */
> cli
> diff --git a/kern/i386/pc/init.c b/kern/i386/pc/init.c
> index 1d6d22f..6191412 100644
> --- a/kern/i386/pc/init.c
> +++ b/kern/i386/pc/init.c
> @@ -223,6 +223,7 @@ void
> grub_machine_fini (void)
> {
> grub_console_fini ();
> + grub_stop_floppy ();
> }
>
> /* Return the end of the core image. */
> diff --git a/loader/i386/multiboot.c b/loader/i386/multiboot.c
> index 4c01d87..27042a5 100644
> --- a/loader/i386/multiboot.c
> +++ b/loader/i386/multiboot.c
> @@ -32,6 +32,7 @@
> #include <grub/multiboot.h>
> #include <grub/machine/init.h>
> #include <grub/machine/memory.h>
> +#include <grub/cpu/multiboot.h>
> #include <grub/elf.h>
> #include <grub/aout.h>
> #include <grub/file.h>
> diff --git a/loader/i386/multiboot_helper.S b/loader/i386/multiboot_helper.S
> new file mode 100644
> index 0000000..1e71120
> --- /dev/null
> +++ b/loader/i386/multiboot_helper.S
> @@ -0,0 +1,115 @@
> +/*
> + * GRUB -- GRand Unified Bootloader
> + * Copyright (C) 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 <http://www.gnu.org/licenses/>.
> + */
> +
> +#include <grub/symbol.h>
> +#include <multiboot.h>
> +#include <multiboot2.h>
> +
> + .p2align 2 /* force 4-byte alignment */
> +
> +/*
> + * This starts the multiboot kernel.
> + */
> +
> +VARIABLE(grub_multiboot_payload_size)
> + .long 0
> +VARIABLE(grub_multiboot_payload_orig)
> + .long 0
> +VARIABLE(grub_multiboot_payload_dest)
> + .long 0
> +VARIABLE(grub_multiboot_payload_entry_offset)
> + .long 0
> +
> +/*
> + * The relocators below understand the following parameters:
> + * ecx: Size of the block to be copied.
> + * esi: Where to copy from (always lowest address, even if we're relocating
> + * backwards).
> + * edi: Where to copy to (likewise).
> + * edx: Offset of the entry point (relative to the beginning of the block).
> + */
> +
> +VARIABLE(grub_multiboot_forward_relocator)
> + /* Add entry offset. */
> + addl %edi, %edx
> +
> + /* Forward copy. */
> + cld
> + rep
> + movsb
> +
> + jmp *%edx
> +VARIABLE(grub_multiboot_forward_relocator_end)
> +
> +VARIABLE(grub_multiboot_backward_relocator)
> + /* Add entry offset (before %edi is mangled). */
> + addl %edi, %edx
> +
> + /* Backward movsb is implicitly off-by-one. compensate that. */
> + decl %esi
> + decl %edi
> +
> + /* Backward copy. */
> + std
> + addl %ecx, %esi
> + addl %ecx, %edi
> + rep
> + movsb
> +
> + jmp *%edx
> +VARIABLE(grub_multiboot_backward_relocator_end)
> +
> +FUNCTION(grub_multiboot_real_boot)
> + /* Push the entry address on the stack. */
> + pushl %eax
> + /* Move the address of the multiboot information structure to ebx. */
> + movl %edx,%ebx
> +
> + /* Interrupts should be disabled. */
> + cli
> +
> + /* Where do we copy what from. */
> + movl EXT_C(grub_multiboot_payload_size), %ecx
> + movl EXT_C(grub_multiboot_payload_orig), %esi
> + movl EXT_C(grub_multiboot_payload_dest), %edi
> + movl EXT_C(grub_multiboot_payload_entry_offset), %edx
> +
> + /* Move the magic value into eax. */
> + movl $MULTIBOOT_MAGIC2, %eax
> +
> + /* Jump to the relocator. */
> + popl %ebp
> + jmp *%ebp
> +
> +/*
> + * This starts the multiboot 2 kernel.
> + */
> +
> +FUNCTION(grub_multiboot2_real_boot)
> + /* Push the entry address on the stack. */
> + pushl %eax
> + /* Move the address of the multiboot information structure to ebx. */
> + movl %edx,%ebx
> +
> + /* Interrupts should be disabled. */
> + cli
> +
> + /* Move the magic value into eax and jump to the kernel. */
> + movl $MULTIBOOT2_BOOTLOADER_MAGIC,%eax
> + popl %ecx
> + jmp *%ecx
> _______________________________________________
> Grub-devel mailing list
> Grub-devel@gnu.org
> http://lists.gnu.org/mailman/listinfo/grub-devel
--
Robert Millan
The DRM opt-in fallacy: "Your data belongs to us. We will decide when (and
how) you may access your data; but nobody's threatening your freedom: we
still allow you to remove your data and not access it at all."
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2009-03-22 12:29 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-02-11 10:42 [Patch] Move multiboot helpers out of the kernel phcoder
2009-03-13 23:35 ` phcoder
2009-03-14 14:48 ` Robert Millan
2009-03-14 17:52 ` phcoder
2009-03-15 15:34 ` Robert Millan
2009-03-21 22:51 ` phcoder
2009-03-21 23:08 ` Robert Millan
2009-03-22 0:15 ` phcoder
2009-03-22 12:29 ` Robert Millan
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.