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 <phco...@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 <phco...@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." _______________________________________________ Grub-devel mailing list Grub-devel@gnu.org http://lists.gnu.org/mailman/listinfo/grub-devel