2005-01-31 Marco Gerards <metgerards@student.han.nl>
* include/grub/powerpc/ieee1275/loader.h (grub_load_linux): Removed prototype. (grub_rescue_cmd_linux): New prototype. (grub_rescue_cmd_initrd): Likewise. * powerpc/ieee1275/linux.c (grub_linux_boot): Remove struct `bi_rec'. (grub_linux_release_mem): Release the memory for the initrd. (grub_load_linux): Renamed from this... (grub_rescue_cmd_linux): ...To this. Changed all callers. Changed `entry' not to be static. Loop over memory regions to find another one when the default fails. (grub_rescue_cmd_initrd): New function. (grub_linux_init): Remove function. (grub_linux_fini): Likewise. (GRUB_MOD_INIT): Register `initrd'. (GRUB_MOD_FINI): Unregister `initrd'. * powerpc/ieee1275/linux_normal.c (grub_linux_normal_init): Function removed. (grub_linux_normal_fini): Likewise. (GRUB_MOD_INIT): Register `initrd'. (GRUB_MOD_FINI): Unregister `initrd'.
This commit is contained in:
parent
990cf3aa8a
commit
c9f9c5564d
6 changed files with 372 additions and 52 deletions
|
@ -50,13 +50,6 @@ grub_linux_boot (void)
|
|||
grub_ieee1275_phandle_t chosen;
|
||||
grub_size_t actual;
|
||||
|
||||
struct bi_rec
|
||||
{
|
||||
unsigned long tag;
|
||||
unsigned long size;
|
||||
unsigned long data[0];
|
||||
};
|
||||
|
||||
grub_ieee1275_finddevice ("/chosen", &chosen);
|
||||
|
||||
/* Set the command line arguments. */
|
||||
|
@ -79,7 +72,12 @@ grub_linux_release_mem (void)
|
|||
if (linux_addr && grub_ieee1275_release (linux_addr, linux_size))
|
||||
return grub_error (GRUB_ERR_OUT_OF_MEMORY, "Can not release memory");
|
||||
|
||||
if (initrd_addr && grub_ieee1275_release (initrd_addr, initrd_size))
|
||||
return grub_error (GRUB_ERR_OUT_OF_MEMORY, "Can not release memory");
|
||||
|
||||
linux_addr = 0;
|
||||
initrd_addr = 0;
|
||||
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
|
@ -97,14 +95,15 @@ grub_linux_unload (void)
|
|||
}
|
||||
|
||||
void
|
||||
grub_load_linux (int argc, char *argv[])
|
||||
grub_rescue_cmd_linux (int argc, char *argv[])
|
||||
{
|
||||
grub_file_t file = 0;
|
||||
Elf32_Ehdr ehdr;
|
||||
Elf32_Phdr *phdrs = 0;
|
||||
int i;
|
||||
int offset = 0;
|
||||
static grub_addr_t entry;
|
||||
grub_addr_t entry;
|
||||
int found_addr = 0;
|
||||
int size;
|
||||
|
||||
grub_dl_ref (my_mod);
|
||||
|
@ -188,13 +187,22 @@ grub_load_linux (int argc, char *argv[])
|
|||
/* Reserve memory for the kernel. */
|
||||
linux_size += 0x100000;
|
||||
|
||||
if (grub_claimmap (entry, linux_size) == -1)
|
||||
/* For some vmlinux kernels the address set above won't work. Just
|
||||
try some other addresses just like yaboot does. */
|
||||
for (linux_addr = entry; linux_addr < entry + 200 * 0x100000; linux_addr += 0x100000)
|
||||
{
|
||||
found_addr = grub_claimmap (linux_addr, linux_size);
|
||||
if (found_addr != -1)
|
||||
break;
|
||||
}
|
||||
|
||||
if (found_addr == -1)
|
||||
{
|
||||
grub_error (GRUB_ERR_OUT_OF_MEMORY, "Can not claim memory");
|
||||
goto fail;
|
||||
}
|
||||
linux_addr = entry;
|
||||
|
||||
entry = linux_addr;
|
||||
|
||||
/* Load every loadable segment in memory. */
|
||||
for (i = 0; i < ehdr.e_phnum; i++)
|
||||
{
|
||||
|
@ -257,28 +265,66 @@ grub_load_linux (int argc, char *argv[])
|
|||
return;
|
||||
}
|
||||
|
||||
void
|
||||
grub_rescue_cmd_initrd (int argc, char *argv[])
|
||||
{
|
||||
grub_file_t file = 0;
|
||||
grub_ssize_t size;
|
||||
grub_addr_t addr;
|
||||
|
||||
if (argc == 0)
|
||||
{
|
||||
grub_error (GRUB_ERR_BAD_ARGUMENT, "no initrd specified");
|
||||
goto fail;
|
||||
}
|
||||
|
||||
if (!loaded)
|
||||
{
|
||||
grub_error (GRUB_ERR_BAD_ARGUMENT, "You need to load the kernel first.");
|
||||
goto fail;
|
||||
}
|
||||
|
||||
file = grub_file_open (argv[0]);
|
||||
if (! file)
|
||||
goto fail;
|
||||
|
||||
addr = linux_addr + linux_size;
|
||||
size = grub_file_size (file);
|
||||
|
||||
if (grub_claimmap (addr, size) == -1)
|
||||
{
|
||||
grub_error (GRUB_ERR_OUT_OF_MEMORY, "Can not claim memory");
|
||||
goto fail;
|
||||
}
|
||||
|
||||
if (grub_file_read (file, (void *) addr, size) != size)
|
||||
{
|
||||
grub_ieee1275_release (addr, size);
|
||||
grub_error (GRUB_ERR_FILE_READ_ERROR, "Couldn't read file");
|
||||
goto fail;
|
||||
}
|
||||
|
||||
initrd_addr = addr;
|
||||
initrd_size = size;
|
||||
|
||||
fail:
|
||||
if (file)
|
||||
grub_file_close (file);
|
||||
}
|
||||
|
||||
|
||||
|
||||
GRUB_MOD_INIT
|
||||
{
|
||||
grub_rescue_register_command ("linux", grub_load_linux,
|
||||
grub_rescue_register_command ("linux", grub_rescue_cmd_linux,
|
||||
"load a linux kernel");
|
||||
grub_rescue_register_command ("initrd", grub_rescue_cmd_initrd,
|
||||
"load an initrd");
|
||||
my_mod = mod;
|
||||
}
|
||||
|
||||
GRUB_MOD_FINI
|
||||
{
|
||||
grub_rescue_unregister_command ("linux");
|
||||
}
|
||||
|
||||
void
|
||||
grub_linux_init (void)
|
||||
{
|
||||
grub_rescue_register_command ("linux", grub_load_linux,
|
||||
"load a linux kernel");
|
||||
}
|
||||
|
||||
void
|
||||
grub_linux_fini (void)
|
||||
{
|
||||
grub_rescue_unregister_command ("linux");
|
||||
grub_rescue_unregister_command ("initrd");
|
||||
}
|
||||
|
|
|
@ -31,7 +31,15 @@ static grub_err_t
|
|||
grub_cmd_linux (struct grub_arg_list *state __attribute__ ((unused)),
|
||||
int argc, char **args)
|
||||
{
|
||||
grub_load_linux (argc, args);
|
||||
grub_rescue_cmd_linux (argc, args);
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
grub_cmd_initrd (struct grub_arg_list *state __attribute__ ((unused)),
|
||||
int argc, char **args)
|
||||
{
|
||||
grub_rescue_cmd_initrd (argc, args);
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
|
@ -41,23 +49,13 @@ GRUB_MOD_INIT
|
|||
grub_register_command ("linux", grub_cmd_linux, GRUB_COMMAND_FLAG_BOTH,
|
||||
"linux [KERNELARGS...]",
|
||||
"Loads linux", options);
|
||||
grub_register_command ("initrd", grub_cmd_initrd, GRUB_COMMAND_FLAG_BOTH,
|
||||
"initrd FILE",
|
||||
"Loads initrd", options);
|
||||
}
|
||||
|
||||
GRUB_MOD_FINI
|
||||
{
|
||||
grub_unregister_command ("linux");
|
||||
}
|
||||
|
||||
void
|
||||
grub_linux_normal_init (void)
|
||||
{
|
||||
grub_register_command ("linux", grub_cmd_linux, GRUB_COMMAND_FLAG_BOTH,
|
||||
"linux [KERNELARGS...]",
|
||||
"Loads linux", options);
|
||||
}
|
||||
|
||||
void
|
||||
grub_linux_normal_fini (void)
|
||||
{
|
||||
grub_unregister_command ("linux");
|
||||
grub_unregister_command ("initrd");
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue