[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH] UUID boot on ieee1275 (Re: [PATCH] use UUIDs for cross-disk
From: |
Robert Millan |
Subject: |
Re: [PATCH] UUID boot on ieee1275 (Re: [PATCH] use UUIDs for cross-disk installs (Re: Issue with boot != root and chainloading)) |
Date: |
Wed, 30 Jul 2008 12:41:36 +0200 |
User-agent: |
Mutt/1.5.13 (2006-08-11) |
Committed.
On Sun, Jul 27, 2008 at 10:36:35PM +0200, Robert Millan wrote:
> On Sun, Jul 27, 2008 at 10:13:19PM +0200, Robert Millan wrote:
> >
> > So I'm submitting a patch that implements --prefix, without having
> > grub-install
> > use it. This is useful already (for manual installs), and I'd like to use
> > that
> > --prefix option for Coreboot later too.
>
> Here's a combined patch which also implements --prefix for Coreboot (and on
> Coreboot it's the only option for automated boot we provide so far).
>
> --
> Robert Millan
>
> <GPLv2> I know my rights; I want my phone call!
> <DRM> What good is a phone call… if you are unable to speak?
> (as seen on /.)
> 2008-07-27 Robert Millan <address@hidden>
>
> * kern/ieee1275/init.c (grub_machine_set_prefix): If `grub_prefix'
> is non-empty, use it to set the `prefix' environment variable instead
> of the usual approach.
> * kern/i386/linuxbios/init.c (make_install_device): Remove function.
> (grub_machine_set_prefix): Use `grub_prefix' to set the `prefix'
> environment variable instead of dummy make_install_device().
>
> * kern/i386/ieee1275/startup.S: Include `<grub/machine/kernel.h>'.
> (start): Insert a data section, with `grub_prefix' variable.
> * kern/i386/linuxbios/startup.S: Likewise.
>
> * include/grub/powerpc/ieee1275/kernel.h [!ASM_FILE] (grub_prefix):
> New variable reference.
> * include/grub/i386/ieee1275/kernel.h (GRUB_KERNEL_MACHINE_PREFIX):
> New macro. Defines offset of `grub_prefix' within startup.S (relative
> to `start').
> (GRUB_KERNEL_MACHINE_DATA_END): New macro. Defines the end of data
> section within startup.S (relative to `start').
> * include/grub/i386/coreboot/kernel.h: Likewise.
>
> * util/elf/grub-mkimage.c (add_segments): Receive `prefix' parameter.
> Overwrite grub_prefix with its contents, at the beginning of the
> first segment.
> (main): Understand -p|--prefix.
>
> Index: kern/ieee1275/init.c
> ===================================================================
> --- kern/ieee1275/init.c (revision 1734)
> +++ kern/ieee1275/init.c (working copy)
> @@ -84,6 +84,13 @@
> /* We already set prefix in grub_machine_init(). */
> return;
>
> + if (grub_prefix[0])
> + {
> + grub_env_set ("prefix", grub_prefix);
> + /* Prefix is hardcoded in kernel.elf. */
> + return;
> + }
> +
> if (grub_ieee1275_get_property (grub_ieee1275_chosen, "bootpath",
> &bootpath,
> sizeof (bootpath), 0))
> {
> Index: kern/i386/ieee1275/startup.S
> ===================================================================
> --- kern/i386/ieee1275/startup.S (revision 1734)
> +++ kern/i386/ieee1275/startup.S (working copy)
> @@ -19,6 +19,7 @@
> #define ASM_FILE 1
>
> #include <grub/symbol.h>
> +#include <grub/machine/kernel.h>
> #include <grub/machine/memory.h>
> #include <grub/cpu/linux.h>
> #include <multiboot.h>
> @@ -38,6 +39,24 @@
>
> start:
> _start:
> + jmp codestart
> +
> + /*
> + * This is a special data area at a fixed offset from the beginning.
> + */
> +
> + . = EXT_C(start) + GRUB_KERNEL_MACHINE_PREFIX
> +
> +VARIABLE(grub_prefix)
> + /* to be filled by grub-mkimage */
> +
> + /*
> + * Leave some breathing room for the prefix.
> + */
> +
> + . = EXT_C(start) + GRUB_KERNEL_MACHINE_DATA_END
> +
> +codestart:
> movl %eax, EXT_C(grub_ieee1275_entry_fn)
> jmp EXT_C(grub_main)
>
> Index: kern/i386/linuxbios/startup.S
> ===================================================================
> --- kern/i386/linuxbios/startup.S (revision 1734)
> +++ kern/i386/linuxbios/startup.S (working copy)
> @@ -19,6 +19,7 @@
> #define ASM_FILE 1
>
> #include <grub/symbol.h>
> +#include <grub/machine/kernel.h>
> #include <grub/machine/memory.h>
> #include <grub/cpu/linux.h>
> #include <multiboot.h>
> @@ -35,7 +36,25 @@
> .file "startup.S"
> .text
> .globl start, _start
> +start:
> +_start:
> + jmp codestart
>
> + /*
> + * This is a special data area at a fixed offset from the beginning.
> + */
> +
> + . = EXT_C(start) + GRUB_KERNEL_MACHINE_PREFIX
> +
> +VARIABLE(grub_prefix)
> + /* to be filled by grub-mkimage */
> +
> + /*
> + * Leave some breathing room for the prefix.
> + */
> +
> + . = EXT_C(start) + GRUB_KERNEL_MACHINE_DATA_END
> +
> #if 0
> /*
> * Support for booting GRUB from a Multiboot boot loader (e.g. GRUB itself).
> @@ -49,8 +68,7 @@
> .long -0x1BADB002
> #endif
>
> -start:
> -_start:
> +codestart:
> /* initialize the stack */
> movl $GRUB_MEMORY_MACHINE_PROT_STACK, %esp
>
> Index: kern/i386/linuxbios/init.c
> ===================================================================
> --- kern/i386/linuxbios/init.c (revision 1734)
> +++ kern/i386/linuxbios/init.c (working copy)
> @@ -78,12 +78,6 @@
> {
> }
>
> -static char *
> -make_install_device (void)
> -{
> - return NULL;
> -}
> -
> void
> grub_machine_init (void)
> {
> @@ -155,7 +149,7 @@
> grub_machine_set_prefix (void)
> {
> /* Initialize the prefix. */
> - grub_env_set ("prefix", make_install_device ());
> + grub_env_set ("prefix", grub_prefix);
> }
>
> void
> Index: include/grub/powerpc/ieee1275/kernel.h
> ===================================================================
> --- include/grub/powerpc/ieee1275/kernel.h (revision 1734)
> +++ include/grub/powerpc/ieee1275/kernel.h (working copy)
> @@ -28,7 +28,15 @@
> rewrite grub-mkimage to generate valid ELF files. */
> #define GRUB_MOD_GAP 0x8000
>
> +#ifndef ASM_FILE
> +
> void EXPORT_FUNC (grub_reboot) (void);
> void EXPORT_FUNC (grub_halt) (void);
>
> +/* The prefix which points to the directory where GRUB modules and its
> + configuration file are located. */
> +extern char grub_prefix[];
> +
> +#endif
> +
> #endif /* ! GRUB_KERNEL_MACHINE_HEADER */
> Index: include/grub/i386/ieee1275/kernel.h
> ===================================================================
> --- include/grub/i386/ieee1275/kernel.h (revision 1734)
> +++ include/grub/i386/ieee1275/kernel.h (working copy)
> @@ -1 +1,4 @@
> #include <grub/powerpc/ieee1275/kernel.h>
> +
> +#define GRUB_KERNEL_MACHINE_PREFIX 0x2
> +#define GRUB_KERNEL_MACHINE_DATA_END 0x42
> Index: include/grub/i386/coreboot/kernel.h
> ===================================================================
> --- include/grub/i386/coreboot/kernel.h (revision 1734)
> +++ include/grub/i386/coreboot/kernel.h (working copy)
> @@ -26,4 +26,11 @@
> /* Non-zero value is only needed for some IEEE-1275 platforms. */
> #define GRUB_MOD_GAP 0
>
> +#ifndef ASM_FILE
> +extern char grub_prefix[];
> +#endif
> +
> +#define GRUB_KERNEL_MACHINE_PREFIX 0x2
> +#define GRUB_KERNEL_MACHINE_DATA_END 0x42
> +
> #endif /* ! GRUB_KERNEL_MACHINE_HEADER */
> Index: util/elf/grub-mkimage.c
> ===================================================================
> --- util/elf/grub-mkimage.c (revision 1734)
> +++ util/elf/grub-mkimage.c (working copy)
> @@ -158,7 +158,7 @@
> }
>
> void
> -add_segments (char *dir, FILE *out, int chrp, char *mods[])
> +add_segments (char *dir, char *prefix, FILE *out, int chrp, char *mods[])
> {
> Elf32_Ehdr ehdr;
> Elf32_Phdr *phdrs = NULL;
> @@ -166,7 +166,7 @@
> FILE *in;
> char *kernel_path;
> grub_addr_t grub_end = 0;
> - off_t offset;
> + off_t offset, first_segment;
> int i, phdr_size;
>
> /* Read ELF header. */
> @@ -192,6 +192,8 @@
> phdrs = xmalloc (phdr_size);
> offset += ALIGN_UP (phdr_size, GRUB_TARGET_SIZEOF_LONG);
>
> + first_segment = offset;
> +
> /* Copy all existing segments. */
> for (i = 0; i < grub_target_to_host16 (ehdr.e_phnum); i++)
> {
> @@ -272,6 +274,13 @@
> /* Write ELF header. */
> grub_util_write_image_at (&ehdr, sizeof (ehdr), 0, out);
>
> + if (prefix)
> + {
> + if (GRUB_KERNEL_MACHINE_PREFIX + strlen (prefix) + 1 >
> GRUB_KERNEL_MACHINE_DATA_END)
> + grub_util_error ("prefix too long");
> + grub_util_write_image_at (prefix, strlen (prefix) + 1, first_segment +
> GRUB_KERNEL_MACHINE_PREFIX, out);
> + }
> +
> free (phdrs);
> free (kernel_path);
> }
> @@ -279,6 +288,7 @@
> static struct option options[] =
> {
> {"directory", required_argument, 0, 'd'},
> + {"prefix", required_argument, 0, 'p'},
> {"output", required_argument, 0, 'o'},
> {"help", no_argument, 0, 'h'},
> {"note", no_argument, 0, 'n'},
> @@ -299,6 +309,7 @@
> Make a bootable image of GRUB.\n\
> \n\
> -d, --directory=DIR use images and modules under DIR [default=%s]\n\
> +-p, --prefix=DIR set grub_prefix directory\n\
> -o, --output=FILE output a generated image to FILE\n\
> -h, --help display this message and exit\n\
> -n, --note add NOTE segment for CHRP Open Firmware\n\
> @@ -317,13 +328,14 @@
> FILE *fp;
> char *output = NULL;
> char *dir = NULL;
> + char *prefix = NULL;
> int chrp = 0;
>
> progname = "grub-mkimage";
>
> while (1)
> {
> - int c = getopt_long (argc, argv, "d:o:hVvn", options, 0);
> + int c = getopt_long (argc, argv, "d:p:o:hVvn", options, 0);
> if (c == -1)
> break;
>
> @@ -334,6 +346,11 @@
> free (dir);
> dir = xstrdup (optarg);
> break;
> + case 'p':
> + if (prefix)
> + free (prefix);
> + prefix = xstrdup (optarg);
> + break;
> case 'h':
> usage (0);
> break;
> @@ -364,7 +381,7 @@
> if (! fp)
> grub_util_error ("cannot open %s", output);
>
> - add_segments (dir ? : GRUB_LIBDIR, fp, chrp, argv + optind);
> + add_segments (dir ? : GRUB_LIBDIR, prefix, fp, chrp, argv + optind);
>
> fclose (fp);
>
> _______________________________________________
> 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."
- Re: Issue with boot != root and chainloading, (continued)
- Re: Issue with boot != root and chainloading, Robert Millan, 2008/07/25
- Re: Issue with boot != root and chainloading, Pavel Roskin, 2008/07/25
- [PATCH] use UUIDs for cross-disk installs (Re: Issue with boot != root and chainloading), Robert Millan, 2008/07/25
- Re: [PATCH] use UUIDs for cross-disk installs (Re: Issue with boot != root and chainloading), Pavel Roskin, 2008/07/25
- Re: [PATCH] use UUIDs for cross-disk installs (Re: Issue with boot != root and chainloading), Robert Millan, 2008/07/27
- Re: [PATCH] use UUIDs for cross-disk installs (Re: Issue with boot != root and chainloading), Pavel Roskin, 2008/07/27
- Re: [PATCH] use UUIDs for cross-disk installs (Re: Issue with boot != root and chainloading), Robert Millan, 2008/07/27
- UUID boot on ieee1275 (Re: [PATCH] use UUIDs for cross-disk installs (Re: Issue with boot != root and chainloading)), Robert Millan, 2008/07/27
- Re: [PATCH] UUID boot on ieee1275 (Re: [PATCH] use UUIDs for cross-disk installs (Re: Issue with boot != root and chainloading)), Robert Millan, 2008/07/27
- Re: [PATCH] UUID boot on ieee1275 (Re: [PATCH] use UUIDs for cross-disk installs (Re: Issue with boot != root and chainloading)), Robert Millan, 2008/07/27
- Re: [PATCH] UUID boot on ieee1275 (Re: [PATCH] use UUIDs for cross-disk installs (Re: Issue with boot != root and chainloading)),
Robert Millan <=
- Re: [PATCH] use UUIDs for cross-disk installs (Re: Issue with boot != root and chainloading), Robert Millan, 2008/07/27
- Re: [PATCH] use UUIDs for cross-disk installs (Re: Issue with boot != root and chainloading), Robert Millan, 2008/07/30
Re: Issue with boot != root and chainloading, Andy Kittner, 2008/07/22