commit-grub
[Top][All Lists]
Advanced

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

[1752] 2008-07-30 Robert Millan <address@hidden>


From: Robert Millan
Subject: [1752] 2008-07-30 Robert Millan <address@hidden>
Date: Wed, 30 Jul 2008 10:42:12 +0000

Revision: 1752
          http://svn.sv.gnu.org/viewvc/?view=rev&root=grub&revision=1752
Author:   robertmh
Date:     2008-07-30 10:42:11 +0000 (Wed, 30 Jul 2008)

Log Message:
-----------
2008-07-30  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.

Modified Paths:
--------------
    trunk/grub2/ChangeLog
    trunk/grub2/include/grub/i386/coreboot/kernel.h
    trunk/grub2/include/grub/i386/ieee1275/kernel.h
    trunk/grub2/include/grub/powerpc/ieee1275/kernel.h
    trunk/grub2/kern/i386/ieee1275/startup.S
    trunk/grub2/kern/i386/linuxbios/init.c
    trunk/grub2/kern/i386/linuxbios/startup.S
    trunk/grub2/kern/ieee1275/init.c
    trunk/grub2/util/elf/grub-mkimage.c

Modified: trunk/grub2/ChangeLog
===================================================================
--- trunk/grub2/ChangeLog       2008-07-30 00:21:35 UTC (rev 1751)
+++ trunk/grub2/ChangeLog       2008-07-30 10:42:11 UTC (rev 1752)
@@ -1,5 +1,32 @@
 2008-07-30  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.
+
+2008-07-30  Robert Millan  <address@hidden>
+
        * util/grub.d/10_hurd.in: Source ${libdir}/grub/update-grub_lib.
 
 2008-07-30  Robert Millan  <address@hidden>

Modified: trunk/grub2/include/grub/i386/coreboot/kernel.h
===================================================================
--- trunk/grub2/include/grub/i386/coreboot/kernel.h     2008-07-30 00:21:35 UTC 
(rev 1751)
+++ trunk/grub2/include/grub/i386/coreboot/kernel.h     2008-07-30 10:42:11 UTC 
(rev 1752)
@@ -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 */

Modified: trunk/grub2/include/grub/i386/ieee1275/kernel.h
===================================================================
--- trunk/grub2/include/grub/i386/ieee1275/kernel.h     2008-07-30 00:21:35 UTC 
(rev 1751)
+++ trunk/grub2/include/grub/i386/ieee1275/kernel.h     2008-07-30 10:42:11 UTC 
(rev 1752)
@@ -1 +1,4 @@
 #include <grub/powerpc/ieee1275/kernel.h>
+
+#define GRUB_KERNEL_MACHINE_PREFIX     0x2
+#define GRUB_KERNEL_MACHINE_DATA_END   0x42

Modified: trunk/grub2/include/grub/powerpc/ieee1275/kernel.h
===================================================================
--- trunk/grub2/include/grub/powerpc/ieee1275/kernel.h  2008-07-30 00:21:35 UTC 
(rev 1751)
+++ trunk/grub2/include/grub/powerpc/ieee1275/kernel.h  2008-07-30 10:42:11 UTC 
(rev 1752)
@@ -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 */

Modified: trunk/grub2/kern/i386/ieee1275/startup.S
===================================================================
--- trunk/grub2/kern/i386/ieee1275/startup.S    2008-07-30 00:21:35 UTC (rev 
1751)
+++ trunk/grub2/kern/i386/ieee1275/startup.S    2008-07-30 10:42:11 UTC (rev 
1752)
@@ -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)
 

Modified: trunk/grub2/kern/i386/linuxbios/init.c
===================================================================
--- trunk/grub2/kern/i386/linuxbios/init.c      2008-07-30 00:21:35 UTC (rev 
1751)
+++ trunk/grub2/kern/i386/linuxbios/init.c      2008-07-30 10:42:11 UTC (rev 
1752)
@@ -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

Modified: trunk/grub2/kern/i386/linuxbios/startup.S
===================================================================
--- trunk/grub2/kern/i386/linuxbios/startup.S   2008-07-30 00:21:35 UTC (rev 
1751)
+++ trunk/grub2/kern/i386/linuxbios/startup.S   2008-07-30 10:42:11 UTC (rev 
1752)
@@ -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
 

Modified: trunk/grub2/kern/ieee1275/init.c
===================================================================
--- trunk/grub2/kern/ieee1275/init.c    2008-07-30 00:21:35 UTC (rev 1751)
+++ trunk/grub2/kern/ieee1275/init.c    2008-07-30 10:42:11 UTC (rev 1752)
@@ -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 the core image.  */
+      return;
+    }
+
   if (grub_ieee1275_get_property (grub_ieee1275_chosen, "bootpath", &bootpath,
                                  sizeof (bootpath), 0))
     {

Modified: trunk/grub2/util/elf/grub-mkimage.c
===================================================================
--- trunk/grub2/util/elf/grub-mkimage.c 2008-07-30 00:21:35 UTC (rev 1751)
+++ trunk/grub2/util/elf/grub-mkimage.c 2008-07-30 10:42:11 UTC (rev 1752)
@@ -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);
 






reply via email to

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