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:
2026-07-01 01:23:37 +03:00
parent ddec43370a
commit ce5fa09a95
3 changed files with 25 additions and 5 deletions
Binary file not shown.
+3 -3
View File
@@ -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
+22 -2
View File
@@ -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)
{