Fix the boot issue for latest GhostBSD (#3664)

This commit is contained in:
longpanda
2026-07-24 16:56:59 +08:00
parent 9be9c7adb8
commit 5ebef5af77
2 changed files with 217 additions and 198 deletions

View File

@@ -525,42 +525,18 @@ grub_err_t ventoy_cmd_unix_freebsd_ver(grub_extcmd_context_t ctxt, int argc, cha
VENTOY_CMD_RETURN(GRUB_ERR_NONE); VENTOY_CMD_RETURN(GRUB_ERR_NONE);
} }
grub_err_t ventoy_cmd_unix_freebsd_ver_elf(grub_extcmd_context_t ctxt, int argc, char **args) static int ventoy_freebsd_ver_elf(int bit64, grub_elf_t elf, const char *section, const char *env, char *data)
{ {
int j; int j = 0;
int k; int k = 0;
grub_elf_t elf = NULL; int ret = 1;
char *str = NULL;
void *hdr = NULL;
grub_off_t offset = 0; grub_off_t offset = 0;
grub_uint32_t len = 0; grub_uint32_t len = 0;
char *str = NULL;
char *data = NULL;
void *hdr = NULL;
char ver[64] = {0}; char ver[64] = {0};
(void)ctxt; if (bit64)
(void)argc;
(void)args;
if (argc != 3)
{
debug("Invalid argc %d\n", argc);
return 1;
}
data = grub_zalloc(8192);
if (!data)
{
goto out;
}
elf = grub_elf_open(args[0], GRUB_FILE_TYPE_LINUX_INITRD);
if (!elf)
{
debug("Failed to open file %s\n", args[0]);
goto out;
}
if (args[1][0] == '6')
{ {
Elf64_Ehdr *e = &(elf->ehdr.ehdr64); Elf64_Ehdr *e = &(elf->ehdr.ehdr64);
Elf64_Shdr *h; Elf64_Shdr *h;
@@ -592,11 +568,11 @@ grub_err_t ventoy_cmd_unix_freebsd_ver_elf(grub_extcmd_context_t ctxt, int argc,
for (t = h, i = 0; i < e->e_shnum; i++) for (t = h, i = 0; i < e->e_shnum; i++)
{ {
if (grub_strcmp(str + t->sh_name, ".data") == 0) if (grub_strcmp(str + t->sh_name, section) == 0)
{ {
offset = t->sh_offset; offset = t->sh_offset;
len = t->sh_size; len = t->sh_size;
debug("find .data section at %u %u\n", (grub_uint32_t)offset, len); debug("find %s section at %u %u\n", section, (grub_uint32_t)offset, len);
break; break;
} }
t = (Elf64_Shdr *)((char *)t + e->e_shentsize); t = (Elf64_Shdr *)((char *)t + e->e_shentsize);
@@ -634,11 +610,11 @@ grub_err_t ventoy_cmd_unix_freebsd_ver_elf(grub_extcmd_context_t ctxt, int argc,
for (t = h, i = 0; i < e->e_shnum; i++) for (t = h, i = 0; i < e->e_shnum; i++)
{ {
if (grub_strcmp(str + t->sh_name, ".data") == 0) if (grub_strcmp(str + t->sh_name, section) == 0)
{ {
offset = t->sh_offset; offset = t->sh_offset;
len = t->sh_size; len = t->sh_size;
debug("find .data section at %u %u\n", (grub_uint32_t)offset, len); debug("find %s section at %u %u\n", section, (grub_uint32_t)offset, len);
break; break;
} }
t = (Elf32_Shdr *)((char *)t + e->e_shentsize); t = (Elf32_Shdr *)((char *)t + e->e_shentsize);
@@ -647,7 +623,7 @@ grub_err_t ventoy_cmd_unix_freebsd_ver_elf(grub_extcmd_context_t ctxt, int argc,
if (offset == 0 || len == 0) if (offset == 0 || len == 0)
{ {
debug(".data section not found %s\n", args[0]); debug("%s section not found\n", section);
goto out; goto out;
} }
@@ -672,21 +648,64 @@ grub_err_t ventoy_cmd_unix_freebsd_ver_elf(grub_extcmd_context_t ctxt, int argc,
} }
} }
if (ver[0]) if (ver[0])
{ {
k = (int)grub_strtoul(ver, NULL, 10); k = (int)grub_strtoul(ver, NULL, 10);
debug("freebsd version:<%s> <%d.x>\n", ver, k); debug("%s freebsd version:<%s> <%d.x>\n", section, ver, k);
grub_snprintf(ver, sizeof(ver), "%d.x", k); grub_snprintf(ver, sizeof(ver), "%d.x", k);
ventoy_set_env(args[2], ver); ventoy_set_env(env, ver);
ret = 0;
} }
else else
{ {
debug("freebsd version:<%s>\n", "NOT FOUND"); debug("%s freebsd version:<%s>\n", section, "NOT FOUND");
ret = 1;
} }
out: out:
grub_check_free(str); grub_check_free(str);
grub_check_free(hdr); grub_check_free(hdr);
return ret;
}
grub_err_t ventoy_cmd_unix_freebsd_ver_elf(grub_extcmd_context_t ctxt, int argc, char **args)
{
int ret = 0;
int bit64 = 0;
char *data = NULL;
grub_elf_t elf = NULL;
(void)ctxt;
if (argc != 3)
{
debug("Invalid argc %d\n", argc);
return 1;
}
data = grub_zalloc(8192);
if (!data)
{
goto out;
}
elf = grub_elf_open(args[0], GRUB_FILE_TYPE_LINUX_INITRD);
if (!elf)
{
debug("Failed to open file %s\n", args[0]);
goto out;
}
bit64 = (args[1][0] == '6') ? 1 : 0;
ret = ventoy_freebsd_ver_elf(bit64, elf, ".data", args[2], data);
if (ret != 0)
{
ret = ventoy_freebsd_ver_elf(bit64, elf, ".rodata", args[2], data);
}
out:
grub_check_free(data); grub_check_free(data);
check_free(elf, grub_elf_close); check_free(elf, grub_elf_close);

View File

@@ -489,19 +489,19 @@ function ventoy_freebsd_proc {
ventoy_get_truenas_ver "$1" "${chosen_path}" ventoy_get_truenas_ver "$1" "${chosen_path}"
elif vt_strstr "$vt_volume_id" "FURYBSD"; then elif vt_strstr "$vt_volume_id" "FURYBSD"; then
ventoy_get_furybsd_ver "$1" "${chosen_path}" ventoy_get_furybsd_ver "$1" "${chosen_path}"
elif regexp --set 1:vtBsdVerNum "^(15|14|13|12|11|10|9)_[0-9]" "$vt_volume_id"; then elif regexp --set 1:vtBsdVerNum "^(1[0-9]|9)_[0-9]" "$vt_volume_id"; then
set vt_freebsd_ver=${vtBsdVerNum}.x set vt_freebsd_ver=${vtBsdVerNum}.x
elif [ -d (loop)/usr/midnightbsd-dist ]; then elif [ -d (loop)/usr/midnightbsd-dist ]; then
ventoy_get_midnightbsd_ver "$1" "${chosen_path}" ventoy_get_midnightbsd_ver "$1" "${chosen_path}"
set vtFreeBsdDistro=MidnightBSD set vtFreeBsdDistro=MidnightBSD
elif [ -e (loop)/bin/freebsd-version ]; then elif [ -e (loop)/bin/freebsd-version ]; then
vt_unix_parse_freebsd_ver (loop)/bin/freebsd-version vt_userland_ver vt_unix_parse_freebsd_ver (loop)/bin/freebsd-version vt_userland_ver
if regexp --set 1:vtBsdVerNum "\"(15|14|13|12|11|10|9)\.[0-9]-" "$vt_userland_ver"; then if regexp --set 1:vtBsdVerNum "\"(1[0-9]|9)\.[0-9]-" "$vt_userland_ver"; then
set vt_freebsd_ver=${vtBsdVerNum}.x set vt_freebsd_ver=${vtBsdVerNum}.x
fi fi
elif [ -e (loop)/README.TXT ]; then elif [ -e (loop)/README.TXT ]; then
vt_1st_line (loop)/README.TXT vt_freebsd_line1 vt_1st_line (loop)/README.TXT vt_freebsd_line1
if regexp --set 1:vtBsdVerNum "FreeBSD (15|14|13|12|11|10|9)\.[0-9]-" "$vt_freebsd_line1"; then if regexp --set 1:vtBsdVerNum "FreeBSD (1[0-9]|9)\.[0-9]-" "$vt_freebsd_line1"; then
set vt_freebsd_ver=${vtBsdVerNum}.x set vt_freebsd_ver=${vtBsdVerNum}.x
fi fi
elif vt_strstr "${chosen_path}" "MidnightBSD"; then elif vt_strstr "${chosen_path}" "MidnightBSD"; then
@@ -531,7 +531,7 @@ function ventoy_freebsd_proc {
fi fi
if [ "$vt_freebsd_ver" = "xx" ]; then if [ "$vt_freebsd_ver" = "xx" ]; then
set vt_freebsd_ver=14.x set vt_freebsd_ver=15.x
fi fi
fi fi