xen: make xen loader callable multiple times

The loader for xen paravirtualized environment isn't callable multiple
times as it won't free any memory in case of failure.

Call grub_relocator_unload() as other modules do it before allocating
a new relocator or when unloading the module.

Signed-off-by: Juergen Gross <jgross@suse.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
This commit is contained in:
Juergen Gross 2016-03-03 10:38:06 +01:00 committed by Daniel Kiper
parent a620876e3b
commit 4231927e44
1 changed files with 19 additions and 8 deletions

View File

@ -316,11 +316,23 @@ grub_xen_boot (void)
xen_inf.virt_base);
}
static void
grub_xen_reset (void)
{
grub_memset (&next_start, 0, sizeof (next_start));
xen_module_info_page = NULL;
n_modules = 0;
grub_relocator_unload (relocator);
relocator = NULL;
loaded = 0;
}
static grub_err_t
grub_xen_unload (void)
{
grub_xen_reset ();
grub_dl_unref (my_mod);
loaded = 0;
return GRUB_ERR_NONE;
}
@ -403,10 +415,7 @@ grub_cmd_xen (grub_command_t cmd __attribute__ ((unused)),
grub_loader_unset ();
grub_memset (&next_start, 0, sizeof (next_start));
xen_module_info_page = NULL;
n_modules = 0;
grub_xen_reset ();
grub_create_loader_cmdline (argc - 1, argv + 1,
(char *) next_start.cmd_line,
@ -503,16 +512,18 @@ grub_cmd_xen (grub_command_t cmd __attribute__ ((unused)),
goto fail;
fail:
/* grub_errno might be clobbered by further calls, save the error reason. */
err = grub_errno;
if (elf)
grub_elf_close (elf);
else if (file)
grub_file_close (file);
if (grub_errno != GRUB_ERR_NONE)
loaded = 0;
if (err != GRUB_ERR_NONE)
grub_xen_reset ();
return grub_errno;
return err;
}
static grub_err_t