grub-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Patch] Move multiboot helpers out of the kernel


From: Robert Millan
Subject: Re: [Patch] Move multiboot helpers out of the kernel
Date: Sun, 22 Mar 2009 13:29:47 +0100
User-agent: Mutt/1.5.18 (2008-05-17)

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  <address@hidden>
>
>      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  <address@hidden>
>>>
>>>      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
> address@hidden
> 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."




reply via email to

[Prev in Thread] Current Thread [Next in Thread]