grub-devel
[Top][All Lists]
Advanced

[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."




reply via email to

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