2008-07-30 Robert Millan <rmh@aybabtu.com>
* 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.
This commit is contained in:
parent
14f41dd1ed
commit
ae88bca301
9 changed files with 142 additions and 13 deletions
27
ChangeLog
27
ChangeLog
|
@ -1,3 +1,30 @@
|
|||
2008-07-30 Robert Millan <rmh@aybabtu.com>
|
||||
|
||||
* 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 <rmh@aybabtu.com>
|
||||
|
||||
* util/grub.d/10_hurd.in: Source ${libdir}/grub/update-grub_lib.
|
||||
|
|
36
include/grub/i386/coreboot/kernel.h
Normal file
36
include/grub/i386/coreboot/kernel.h
Normal file
|
@ -0,0 +1,36 @@
|
|||
/*
|
||||
* GRUB -- GRand Unified Bootloader
|
||||
* Copyright (C) 2005,2006,2007,2008 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_KERNEL_MACHINE_HEADER
|
||||
#define GRUB_KERNEL_MACHINE_HEADER 1
|
||||
|
||||
#include <grub/symbol.h>
|
||||
|
||||
#define GRUB_MOD_ALIGN 0x1000
|
||||
|
||||
/* 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 */
|
|
@ -1 +1,4 @@
|
|||
#include <grub/powerpc/ieee1275/kernel.h>
|
||||
|
||||
#define GRUB_KERNEL_MACHINE_PREFIX 0x2
|
||||
#define GRUB_KERNEL_MACHINE_DATA_END 0x42
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
|
@ -78,12 +78,6 @@ grub_arch_sync_caches (void *address __attribute__ ((unused)),
|
|||
{
|
||||
}
|
||||
|
||||
static char *
|
||||
make_install_device (void)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void
|
||||
grub_machine_init (void)
|
||||
{
|
||||
|
@ -155,7 +149,7 @@ void
|
|||
grub_machine_set_prefix (void)
|
||||
{
|
||||
/* Initialize the prefix. */
|
||||
grub_env_set ("prefix", make_install_device ());
|
||||
grub_env_set ("prefix", grub_prefix);
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
@ -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,6 +36,24 @@
|
|||
.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
|
||||
/*
|
||||
|
@ -49,8 +68,7 @@ multiboot_header:
|
|||
.long -0x1BADB002
|
||||
#endif
|
||||
|
||||
start:
|
||||
_start:
|
||||
codestart:
|
||||
/* initialize the stack */
|
||||
movl $GRUB_MEMORY_MACHINE_PROT_STACK, %esp
|
||||
|
||||
|
|
|
@ -84,6 +84,13 @@ grub_machine_set_prefix (void)
|
|||
/* 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))
|
||||
{
|
||||
|
|
|
@ -158,7 +158,7 @@ load_modules (grub_addr_t modbase, Elf32_Phdr *phdr, const char *dir,
|
|||
}
|
||||
|
||||
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 @@ add_segments (char *dir, FILE *out, int chrp, char *mods[])
|
|||
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 @@ add_segments (char *dir, FILE *out, int chrp, char *mods[])
|
|||
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 @@ add_segments (char *dir, FILE *out, int chrp, char *mods[])
|
|||
/* 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 @@ add_segments (char *dir, FILE *out, int chrp, char *mods[])
|
|||
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 @@ Usage: grub-mkimage -o FILE [OPTION]... [MODULES]\n\
|
|||
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 @@ main (int argc, char *argv[])
|
|||
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 @@ main (int argc, char *argv[])
|
|||
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 @@ main (int argc, char *argv[])
|
|||
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);
|
||||
|
||||
|
|
Loading…
Reference in a new issue