[Top][All Lists]
[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."