initial envp support

This commit is contained in:
phcoder 2009-10-19 18:07:58 +02:00
parent 0b0b59d8d8
commit 7c8f6c181c

View file

@ -38,7 +38,8 @@ static grub_size_t initrd_size;
static grub_size_t linux_size; static grub_size_t linux_size;
static grub_uint8_t *playground; static grub_uint8_t *playground;
static grub_addr_t target_addr, entry_addr, initrd_addr, argc_addr, argv_addr; static grub_addr_t target_addr, entry_addr, initrd_addr, argc_addr;
static grub_addr_t argv_addr, envp_addr;
static grub_err_t static grub_err_t
grub_linux_boot (void) grub_linux_boot (void)
@ -49,6 +50,7 @@ grub_linux_boot (void)
state.gpr[1] = entry_addr; state.gpr[1] = entry_addr;
state.gpr[4] = argc_addr; state.gpr[4] = argc_addr;
state.gpr[5] = argv_addr; state.gpr[5] = argv_addr;
state.gpr[6] = envp_addr;
state.jumpreg = 1; state.jumpreg = 1;
grub_relocator32_boot (playground, target_addr, state); grub_relocator32_boot (playground, target_addr, state);
@ -171,7 +173,7 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)),
int i; int i;
int size; int size;
void *extra; void *extra;
grub_uint32_t *linux_argv; grub_uint32_t *linux_argv, *linux_envp;
char *linux_args; char *linux_args;
grub_err_t err; grub_err_t err;
@ -194,7 +196,7 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)),
loaded = 0; loaded = 0;
size = sizeof (grub_uint32_t) * argc + ALIGN_UP (sizeof ("g"), 4) size = sizeof (grub_uint32_t) * argc + ALIGN_UP (sizeof ("g"), 4)
+ sizeof (grub_uint32_t); + sizeof (grub_uint32_t) + (0 + 1) * sizeof (grub_uint32_t);
for (i = 1; i < argc; i++) for (i = 1; i < argc; i++)
size += ALIGN_UP (grub_strlen (argv[i]) + 1, 4); size += ALIGN_UP (grub_strlen (argv[i]) + 1, 4);
@ -221,19 +223,27 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)),
extra = linux_argv + argc; extra = linux_argv + argc;
linux_args = extra; linux_args = extra;
*linux_argv = (grub_uint32_t) linux_args; *linux_argv = (grub_uint8_t *) linux_args - (grub_uint8_t *) playground
+ target_addr;
grub_memcpy (linux_args, "g", sizeof ("g")); grub_memcpy (linux_args, "g", sizeof ("g"));
linux_args += ALIGN_UP (sizeof ("g"), 4); linux_args += ALIGN_UP (sizeof ("g"), 4);
linux_argv++; linux_argv++;
for (i = 1; i < argc; i++) for (i = 1; i < argc; i++)
{ {
*linux_argv = (grub_uint32_t) linux_args; *linux_argv = (grub_uint8_t *) linux_args - (grub_uint8_t *) playground
+ target_addr;
grub_memcpy (linux_args, argv[i], grub_strlen (argv[i]) + 1); grub_memcpy (linux_args, argv[i], grub_strlen (argv[i]) + 1);
linux_args += ALIGN_UP (grub_strlen (argv[i]) + 1, 4); linux_args += ALIGN_UP (grub_strlen (argv[i]) + 1, 4);
linux_argv++; linux_argv++;
} }
extra = linux_args;
linux_envp = extra;
envp_addr = (grub_uint8_t *) linux_envp - (grub_uint8_t *) playground
+ target_addr;
linux_envp[0] = 0;
grub_loader_set (grub_linux_boot, grub_linux_unload, 1); grub_loader_set (grub_linux_boot, grub_linux_unload, 1);
initrd_addr = 0; initrd_addr = 0;
loaded = 1; loaded = 1;