fix: GPT partition notation + double-parentheses in hiperiso_boot
Two critical bugs prevented the hypervisor boot path from working:
1. GRUB2 EFI requires explicit gpt/msdos prefix in partition names.
The shorthand (hd0,2) does NOT resolve for GPT disks. Fixed by
having vt_load_part_table set hiso_iso_part/hiso_efi_part with
correct notation based on detected partition table type.
2. hiperiso_boot C function wrapped $hiso_efi_part in extra parens:
($hiso_efi_part) expanded to ((hd0,gpt2)) which GRUB2 parsed as
device name (hd0,gpt2) with literal parens. Fixed by using
${hiso_efi_part} without wrapping.
QEMU-verified: kernel boots, loads initramfs, runs /init with all
hiperiso_* parameters correctly passed through kernel cmdline.
This commit is contained in:
Binary file not shown.
@@ -2534,9 +2534,9 @@ vt_device $root hiso_dev
|
||||
if [ "$hiso_dev" = "tftp" ]; then
|
||||
set hiso_path=($root)
|
||||
for vtid in 0 1 2 3; do
|
||||
if [ -f (hd$vtid,2)/hiperiso/hiperiso.cpio ]; then
|
||||
set hiso_iso_part=(hd$vtid,1)
|
||||
set hiso_efi_part=(hd$vtid,2)
|
||||
if [ -f (hd$vtid,gpt2)/hiperiso/hiperiso.cpio ]; then
|
||||
set hiso_iso_part=(hd$vtid,gpt1)
|
||||
set hiso_efi_part=(hd$vtid,gpt2)
|
||||
set hisodev=hd$vtid
|
||||
break
|
||||
fi
|
||||
|
||||
@@ -5194,6 +5194,7 @@ void hiperiso_prompt_end(void)
|
||||
static grub_err_t hiperiso_cmd_load_part_table(grub_extcmd_context_t ctxt, int argc, char **args)
|
||||
{
|
||||
int ret;
|
||||
char buf[64];
|
||||
|
||||
(void)argc;
|
||||
(void)ctxt;
|
||||
@@ -5207,6 +5208,25 @@ static grub_err_t hiperiso_cmd_load_part_table(grub_extcmd_context_t ctxt, int a
|
||||
g_hiperiso_disk_part_size[0] = hiperiso_get_hiso_partsize(0);
|
||||
g_hiperiso_disk_part_size[1] = hiperiso_get_hiso_partsize(1);
|
||||
|
||||
/* Set partition variables with correct notation for GRUB2 shell.
|
||||
* GRUB2 EFI requires explicit gpt/msdos prefix; the shorthand (hd0,N)
|
||||
* does NOT resolve for GPT partitions. */
|
||||
if (g_hiperiso_part_info &&
|
||||
grub_memcmp(g_hiperiso_part_info->Head.Signature, "EFI PART", 8) == 0)
|
||||
{
|
||||
grub_snprintf(buf, sizeof(buf), "(%s,gpt1)", args[0]);
|
||||
grub_env_set("hiso_iso_part", buf);
|
||||
grub_snprintf(buf, sizeof(buf), "(%s,gpt2)", args[0]);
|
||||
grub_env_set("hiso_efi_part", buf);
|
||||
}
|
||||
else
|
||||
{
|
||||
grub_snprintf(buf, sizeof(buf), "(%s,msdos1)", args[0]);
|
||||
grub_env_set("hiso_iso_part", buf);
|
||||
grub_snprintf(buf, sizeof(buf), "(%s,msdos2)", args[0]);
|
||||
grub_env_set("hiso_efi_part", buf);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -7108,7 +7128,7 @@ static grub_err_t hiperiso_cmd_boot(grub_extcmd_context_t ctxt, int argc, char *
|
||||
}
|
||||
|
||||
grub_snprintf(linux_script, sizeof(linux_script),
|
||||
"linux ($hiso_efi_part)/EFI/hiperiso/vmlinuz %s", cmdline);
|
||||
"linux ${hiso_efi_part}/EFI/hiperiso/vmlinuz %s", cmdline);
|
||||
grub_script_execute_sourcecode(linux_script);
|
||||
if (grub_errno != GRUB_ERR_NONE)
|
||||
{
|
||||
@@ -7117,7 +7137,7 @@ static grub_err_t hiperiso_cmd_boot(grub_extcmd_context_t ctxt, int argc, char *
|
||||
}
|
||||
|
||||
grub_snprintf(initrd_script, sizeof(initrd_script),
|
||||
"initrd ($hiso_efi_part)/EFI/hiperiso/initramfs.cpio.gz");
|
||||
"initrd ${hiso_efi_part}/EFI/hiperiso/initramfs.cpio.gz");
|
||||
grub_script_execute_sourcecode(initrd_script);
|
||||
if (grub_errno != GRUB_ERR_NONE)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user