From 164c8d65056c27fc8675b5df2fb9246bb92b1a00 Mon Sep 17 00:00:00 2001 From: longpanda Date: Mon, 15 Nov 2021 16:00:30 +0800 Subject: [PATCH] Optimization for FreeBSD distro. --- .../grub-2.04/grub-core/ventoy/ventoy_cmd.c | 1 + .../grub-2.04/grub-core/ventoy/ventoy_def.h | 23 +++ .../grub-2.04/grub-core/ventoy/ventoy_unix.c | 182 +++++++++++++++++- INSTALL/grub/grub.cfg | 7 + INSTALL/ventoy/ventoy_unix.cpio | Bin 89088 -> 103936 bytes .../geom_ventoy_ko/13.x/32/geom_ventoy.ko.xz | Bin 6820 -> 7676 bytes .../geom_ventoy_ko/13.x/64/geom_ventoy.ko.xz | Bin 6608 -> 7432 bytes .../13.x/sys/geom/ventoy/g_ventoy.c | 80 ++++++-- .../13.x/sys/geom/ventoy/g_ventoy.h | 27 +++ 9 files changed, 301 insertions(+), 19 deletions(-) diff --git a/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_cmd.c b/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_cmd.c index ea53303c..296c0fea 100644 --- a/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_cmd.c +++ b/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_cmd.c @@ -5253,6 +5253,7 @@ static cmd_para ventoy_cmds[] = { "vt_unix_reset", ventoy_cmd_unix_reset, 0, NULL, "", "", NULL }, { "vt_unix_replace_conf", ventoy_cmd_unix_replace_conf, 0, NULL, "", "", NULL }, { "vt_unix_replace_ko", ventoy_cmd_unix_replace_ko, 0, NULL, "", "", NULL }, + { "vt_unix_ko_fillmap", ventoy_cmd_unix_ko_fillmap, 0, NULL, "", "", NULL }, { "vt_unix_fill_image_desc", ventoy_cmd_unix_fill_image_desc, 0, NULL, "", "", NULL }, { "vt_unix_gzip_new_ko", ventoy_cmd_unix_gzip_newko, 0, NULL, "", "", NULL }, { "vt_unix_chain_data", ventoy_cmd_unix_chain_data, 0, NULL, "", "", NULL }, diff --git a/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_def.h b/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_def.h index 82428770..28817ba1 100644 --- a/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_def.h +++ b/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_def.h @@ -1088,6 +1088,7 @@ int ventoy_get_disk_guid(const char *filename, grub_uint8_t *guid, grub_uint8_t grub_err_t ventoy_cmd_unix_reset(grub_extcmd_context_t ctxt, int argc, char **args); grub_err_t ventoy_cmd_unix_replace_conf(grub_extcmd_context_t ctxt, int argc, char **args); grub_err_t ventoy_cmd_unix_replace_ko(grub_extcmd_context_t ctxt, int argc, char **args); +grub_err_t ventoy_cmd_unix_ko_fillmap(grub_extcmd_context_t ctxt, int argc, char **args); grub_err_t ventoy_cmd_unix_fill_image_desc(grub_extcmd_context_t ctxt, int argc, char **args); grub_err_t ventoy_cmd_unix_gzip_newko(grub_extcmd_context_t ctxt, int argc, char **args); grub_err_t ventoy_cmd_unix_freebsd_ver(grub_extcmd_context_t ctxt, int argc, char **args); @@ -1128,5 +1129,27 @@ int ventoy_chain_file_read(const char *path, int offset, int len, void *buf); extern ventoy_grub_param *g_grub_param; +#pragma pack(1) +#define VENTOY_UNIX_SEG_MAGIC0 0x11223344 +#define VENTOY_UNIX_SEG_MAGIC1 0x55667788 +#define VENTOY_UNIX_SEG_MAGIC2 0x99aabbcc +#define VENTOY_UNIX_SEG_MAGIC3 0xddeeff00 +#define VENTOY_UNIX_MAX_SEGNUM 40960 +struct g_ventoy_seg { + grub_uint64_t seg_start_bytes; + grub_uint64_t seg_end_bytes; +}; + +struct g_ventoy_map{ + grub_uint32_t magic1[4]; + grub_uint32_t magic2[4]; + grub_uint64_t segnum; + grub_uint64_t disksize; + grub_uint8_t diskuuid[16]; + struct g_ventoy_seg seglist[VENTOY_UNIX_MAX_SEGNUM]; + grub_uint32_t magic3[4]; +}; +#pragma pack() + #endif /* __VENTOY_DEF_H__ */ diff --git a/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_unix.c b/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_unix.c index 179739b2..0eac9e41 100644 --- a/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_unix.c +++ b/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_unix.c @@ -47,6 +47,11 @@ char *g_conf_new_data = NULL; int g_mod_new_len = 0; char *g_mod_new_data = NULL; +int g_mod_search_magic = 0; + +int g_ko_fillmap_len = 0; +char *g_ko_fillmap_data = NULL; + grub_uint64_t g_mod_override_offset = 0; grub_uint64_t g_conf_override_offset = 0; @@ -82,6 +87,15 @@ static grub_uint32_t ventoy_unix_get_override_chunk_count(void) { count++; } + + if (g_ko_fillmap_len > 0) + { + count += (g_ko_fillmap_len / 512); + if ((g_ko_fillmap_len % 512) > 0) + { + count++; + } + } return count; } @@ -121,15 +135,49 @@ static grub_uint32_t ventoy_unix_get_virt_chunk_size(void) return size; } -static void ventoy_unix_fill_override_data( grub_uint64_t isosize, void *override) +static void ventoy_unix_fill_map_data(ventoy_chain_head *chain, struct g_ventoy_map *map) { + grub_uint32_t i; + ventoy_img_chunk *chunk = NULL; + + debug("Fill unix map data: <%llu> <%u>\n", (unsigned long long)chain->os_param.vtoy_disk_size, g_img_chunk_list.cur_chunk); + + map->magic1[0] = map->magic2[0] = map->magic3[0] = VENTOY_UNIX_SEG_MAGIC0; + map->magic1[1] = map->magic2[1] = map->magic3[1] = VENTOY_UNIX_SEG_MAGIC1; + map->magic1[2] = map->magic2[2] = map->magic3[2] = VENTOY_UNIX_SEG_MAGIC2; + map->magic1[3] = map->magic2[3] = map->magic3[3] = VENTOY_UNIX_SEG_MAGIC3; + + map->disksize = chain->os_param.vtoy_disk_size; + grub_memcpy(map->diskuuid, chain->os_param.vtoy_disk_guid, 16); + + map->segnum = g_img_chunk_list.cur_chunk; + if (g_img_chunk_list.cur_chunk > VENTOY_UNIX_MAX_SEGNUM) + { + debug("####[FAIL] Too many segments for the ISO file %u\n", g_img_chunk_list.cur_chunk); + map->segnum = VENTOY_UNIX_MAX_SEGNUM; + } + + for (i = 0; i < (grub_uint32_t)(map->segnum); i++) + { + chunk = g_img_chunk_list.chunk + i; + map->seglist[i].seg_start_bytes = chunk->disk_start_sector * 512ULL; + map->seglist[i].seg_end_bytes = (chunk->disk_end_sector + 1) * 512ULL; + } +} + +static void ventoy_unix_fill_override_data( grub_uint64_t isosize, ventoy_chain_head *chain) +{ + int i; + int left; + char *data = NULL; + grub_uint64_t offset; grub_uint64_t sector; ventoy_override_chunk *cur; ventoy_iso9660_override *dirent; sector = (isosize + 2047) / 2048; - cur = (ventoy_override_chunk *)override; + cur = (ventoy_override_chunk *)((char *)chain + chain->override_chunk_offset); if (g_conf_new_len > 0) { @@ -158,6 +206,35 @@ static void ventoy_unix_fill_override_data( grub_uint64_t isosize, void *over sector += (dirent->size + 2047) / 2048; } + if (g_ko_fillmap_len > 0) + { + data = g_ko_fillmap_data; + offset = g_mod_override_offset; + + ventoy_unix_fill_map_data(chain, (struct g_ventoy_map *)data); + + for (i = 0; i < g_ko_fillmap_len / 512; i++) + { + cur++; + cur->img_offset = offset; + cur->override_size = 512; + grub_memcpy(cur->override_data, data, 512); + + offset += 512; + data += 512; + } + + left = (g_ko_fillmap_len % 512); + if (left > 0) + { + cur++; + cur->img_offset = offset; + cur->override_size = left; + grub_memcpy(cur->override_data, data, left); + offset += left; + } + } + return; } @@ -182,6 +259,11 @@ static void ventoy_unix_fill_virt_data( grub_uint64_t isosize, ventoy_chain_h if (g_mod_new_len > 0) { + if (g_mod_search_magic > 0) + { + ventoy_unix_fill_map_data(chain, (struct g_ventoy_map *)(g_mod_new_data + g_mod_search_magic)); + } + ventoy_unix_fill_virt(g_mod_new_data, g_mod_new_len); } @@ -210,6 +292,12 @@ static int ventoy_freebsd_append_conf(char *buf, const char *isopath) vtoy_ssprintf(buf, pos, "ventoy_load=\"%s\"\n", "YES"); vtoy_ssprintf(buf, pos, "ventoy_name=\"%s\"\n", g_ko_mod_path); + if (g_mod_search_magic) + { + debug("hint.ventoy NO need\n"); + goto out; + } + disk = isofile->device->disk; ventoy_get_disk_guid(isofile->name, disk_guid, disk_sig); @@ -232,8 +320,8 @@ static int ventoy_freebsd_append_conf(char *buf, const char *isopath) (ulonglong)((chunk->disk_end_sector + 1) * 512)); } +out: grub_file_close(isofile); - return pos; } @@ -258,13 +346,16 @@ grub_err_t ventoy_cmd_unix_reset(grub_extcmd_context_t ctxt, int argc, char **ar (void)argc; (void)args; + g_mod_search_magic = 0; g_conf_new_len = 0; g_mod_new_len = 0; g_mod_override_offset = 0; g_conf_override_offset = 0; + g_ko_fillmap_len = 0; check_free(g_mod_new_data, grub_free); check_free(g_conf_new_data, grub_free); + check_free(g_ko_fillmap_data, grub_free); VENTOY_CMD_RETURN(GRUB_ERR_NONE); } @@ -624,6 +715,27 @@ grub_err_t ventoy_cmd_unix_replace_conf(grub_extcmd_context_t ctxt, int argc, ch VENTOY_CMD_RETURN(GRUB_ERR_NONE); } +static int ventoy_unix_search_magic(char *data, int len) +{ + int i; + grub_uint32_t *magic = NULL; + + for (i = 0; i < len; i += 65536) + { + magic = (grub_uint32_t *)(data + i); + if (magic[0] == VENTOY_UNIX_SEG_MAGIC0 && magic[1] == VENTOY_UNIX_SEG_MAGIC1 && + magic[2] == VENTOY_UNIX_SEG_MAGIC2 && magic[3] == VENTOY_UNIX_SEG_MAGIC3) + { + debug("unix find search magic at 0x%x loop:%d\n", i, (i >> 16)); + g_mod_search_magic = i; + return 0; + } + } + + debug("unix can not find search magic\n"); + return 1; +} + grub_err_t ventoy_cmd_unix_replace_ko(grub_extcmd_context_t ctxt, int argc, char **args) { char *data; @@ -673,10 +785,72 @@ grub_err_t ventoy_cmd_unix_replace_ko(grub_extcmd_context_t ctxt, int argc, char g_mod_new_data = data; g_mod_new_len = (int)file->size; + + ventoy_unix_search_magic(g_mod_new_data, g_mod_new_len); VENTOY_CMD_RETURN(GRUB_ERR_NONE); } +grub_err_t ventoy_cmd_unix_ko_fillmap(grub_extcmd_context_t ctxt, int argc, char **args) +{ + int i; + grub_file_t file; + grub_uint32_t magic[4]; + grub_uint32_t len; + + (void)ctxt; + + if (argc != 1) + { + debug("Fillmap ko invalid argc %d\n", argc); + return 1; + } + + debug("Fillmap ko %s\n", args[0]); + + file = ventoy_grub_file_open(VENTOY_FILE_TYPE, "(loop)%s", args[0]); + if (file) + { + g_mod_override_offset = grub_iso9660_get_last_read_pos(file); + } + else + { + debug("Can't find replace ko file from %s\n", args[0]); + return 1; + } + + for (i = 0; i < (int)(file->size); i += 65536) + { + magic[0] = 0; + grub_file_seek(file, i); + grub_file_read(file, magic, sizeof(magic)); + + if (magic[0] == VENTOY_UNIX_SEG_MAGIC0 && magic[1] == VENTOY_UNIX_SEG_MAGIC1 && + magic[2] == VENTOY_UNIX_SEG_MAGIC2 && magic[3] == VENTOY_UNIX_SEG_MAGIC3) + { + debug("unix find search magic at 0x%x loop:%d\n", i, (i >> 16)); + g_mod_override_offset += i; + break; + } + } + + len = (grub_uint32_t)OFFSET_OF(struct g_ventoy_map, seglist) + + (sizeof(struct g_ventoy_seg) * g_img_chunk_list.cur_chunk); + + g_ko_fillmap_len = (int)len; + g_ko_fillmap_data = grub_malloc(len); + if (!g_ko_fillmap_data) + { + g_ko_fillmap_len = 0; + debug("Failed to malloc fillmap data\n"); + } + + debug("Fillmap ko segnum:%u, override len:%d", g_img_chunk_list.cur_chunk, g_ko_fillmap_len); + + grub_file_close(file); + VENTOY_CMD_RETURN(GRUB_ERR_NONE); +} + grub_err_t ventoy_cmd_unix_fill_image_desc(grub_extcmd_context_t ctxt, int argc, char **args) { int i; @@ -908,7 +1082,7 @@ grub_err_t ventoy_cmd_unix_chain_data(grub_extcmd_context_t ctxt, int argc, char /* part 4: override chunk */ chain->override_chunk_offset = chain->img_chunk_offset + img_chunk_size; chain->override_chunk_num = override_count; - ventoy_unix_fill_override_data(isosize, (char *)chain + chain->override_chunk_offset); + ventoy_unix_fill_override_data(isosize, chain); /* part 5: virt chunk */ chain->virt_chunk_offset = chain->override_chunk_offset + override_size; diff --git a/INSTALL/grub/grub.cfg b/INSTALL/grub/grub.cfg index 92497b45..f68f2c3f 100644 --- a/INSTALL/grub/grub.cfg +++ b/INSTALL/grub/grub.cfg @@ -129,6 +129,9 @@ function get_os_type { elif [ -e (loop)/bin/freebsd-version ]; then set vtoy_os=Unix set vt_unix_type=FreeBSD + elif [ -e (loop)/boot/kernel/geom_ventoy.ko ]; then + set vtoy_os=Unix + set vt_unix_type=FreeBSD elif vt_str_begin "$vt_system_id" "DragonFly"; then set vtoy_os=Unix set vt_unix_type=DragonFly @@ -469,6 +472,10 @@ function ventoy_freebsd_proc { set vt_freebsd_ver=9.x fi + if [ -e (loop)/boot/kernel/geom_ventoy.ko ]; then + vt_unix_ko_fillmap /boot/kernel/geom_ventoy.ko + return + fi if [ -e (loop)/usr/freebsd-dist/cloninst.sh ]; then set vtFreeBsdDistro=ClonOS diff --git a/INSTALL/ventoy/ventoy_unix.cpio b/INSTALL/ventoy/ventoy_unix.cpio index f888ffb60547833c9183d930043fcfb9bfa38088..83fdf00b464af4ddfdd1c0cdda7532b00dc94cb3 100644 GIT binary patch delta 28114 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 diff --git a/Unix/ventoy_unix/FreeBSD/geom_ventoy_ko/13.x/32/geom_ventoy.ko.xz b/Unix/ventoy_unix/FreeBSD/geom_ventoy_ko/13.x/32/geom_ventoy.ko.xz index 280d1487db5c66863f499ca4531e48319ee97383..2de914580e3188ab8ea566e538481d20044d39f8 100644 GIT binary patch literal 7676 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 Bm`eZv literal 6608 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 KCXggcWE21>{^sWZ diff --git a/Unix/ventoy_unix_src/FreeBSD/geom_ventoy_src/13.x/sys/geom/ventoy/g_ventoy.c b/Unix/ventoy_unix_src/FreeBSD/geom_ventoy_src/13.x/sys/geom/ventoy/g_ventoy.c index 585c0537..5477c5ea 100644 --- a/Unix/ventoy_unix_src/FreeBSD/geom_ventoy_src/13.x/sys/geom/ventoy/g_ventoy.c +++ b/Unix/ventoy_unix_src/FreeBSD/geom_ventoy_src/13.x/sys/geom/ventoy/g_ventoy.c @@ -65,12 +65,22 @@ static g_taste_t g_ventoy_taste; static g_ctl_req_t g_ventoy_config; static g_dumpconf_t g_ventoy_dumpconf; -static const char *g_ventoy_disk_uuid = NULL; +static char g_ventoy_disk_uuid[64]; static bool g_ventoy_tasted = false; static off_t g_ventoy_disk_size = 0; static off_t g_disk_map_start = 0; static off_t g_disk_map_end = 0; +struct g_ventoy_map g_ventoy_map_data __attribute__((aligned (65536))) = +{ + { VENTOY_UNIX_SEG_MAGIC0, VENTOY_UNIX_SEG_MAGIC1, VENTOY_UNIX_SEG_MAGIC2, VENTOY_UNIX_SEG_MAGIC3 }, + { 0, 0, 0, 0 }, + 0, 0, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { { 0, 0 } }, + { VENTOY_UNIX_SEG_MAGIC0, VENTOY_UNIX_SEG_MAGIC1, VENTOY_UNIX_SEG_MAGIC2, VENTOY_UNIX_SEG_MAGIC3 } +}; + struct g_class g_ventoy_class = { .name = G_VENTOY_CLASS_NAME, .version = G_VERSION, @@ -719,16 +729,36 @@ static bool g_vtoy_check_disk(struct g_class *mp, struct g_provider *pp) if (g_ventoy_disk_size == 0) { - if (resource_string_value("ventoy", 0, "disksize", &value) == 0) + if (VENTOY_MAP_VALID(g_ventoy_map_data.magic2)) { - G_DEBUG("ventoy.disksize: %s\n", value); - g_ventoy_disk_size = strtouq(value, NULL, 0); - } + G_DEBUG("ventoy map data is valid. [OK]\n"); - if (resource_string_value("ventoy", 0, "diskuuid", &g_ventoy_disk_uuid) == 0) - { + for (i = 0; i < 16; i++) + { + sprintf(uuid + i * 2, "%02x", g_ventoy_map_data.diskuuid[i]); + } + snprintf(g_ventoy_disk_uuid, sizeof(g_ventoy_disk_uuid), "%s", uuid); + g_ventoy_disk_size = g_ventoy_map_data.disksize; + + G_DEBUG("ventoy.disksize: %llu\n", (unsigned long long)g_ventoy_disk_size); G_DEBUG("ventoy.diskuuid: <%s>\n", g_ventoy_disk_uuid); } + else + { + G_DEBUG("ventoy map data is invalid, get from resource\n"); + + if (resource_string_value("ventoy", 0, "disksize", &value) == 0) + { + G_DEBUG("ventoy.disksize: %s\n", value); + g_ventoy_disk_size = strtouq(value, NULL, 0); + } + + if (resource_string_value("ventoy", 0, "diskuuid", &value) == 0) + { + snprintf(g_ventoy_disk_uuid, sizeof(g_ventoy_disk_uuid), "%s", value); + G_DEBUG("ventoy.diskuuid: <%s>\n", value); + } + } } if (g_ventoy_disk_size != pp->mediasize) @@ -812,7 +842,16 @@ g_ventoy_taste(struct g_class *mp, struct g_provider *pp, int flags __unused) G_DEBUG("######### ventoy disk <%s> #############\n", pp->name); - resource_int_value("ventoy", 0, "segnum", &disknum); + if (VENTOY_MAP_VALID(g_ventoy_map_data.magic2)) + { + disknum = (int)g_ventoy_map_data.segnum; + G_DEBUG("segnum from map data is:<%d>\n", disknum); + } + else + { + resource_int_value("ventoy", 0, "segnum", &disknum); + G_DEBUG("segnum from resource is:<%d>\n", disknum); + } strlcpy(md.md_magic, G_VENTOY_MAGIC, sizeof(md.md_magic)); md.md_version = G_VENTOY_VERSION; @@ -834,18 +873,29 @@ g_ventoy_taste(struct g_class *mp, struct g_provider *pp, int flags __unused) for (i = 0; i < disknum; i ++) { - if (resource_string_value("ventoy", i, "seg", &value) == 0) + if (VENTOY_MAP_VALID(g_ventoy_map_data.magic2)) { - g_disk_map_start = strtouq(value, &endpos, 0); - g_disk_map_end = strtouq(endpos + 1, NULL, 0); + G_DEBUG("[map] ventoy segment%d: 0x%llx@0x%llx\n", i, + (long long)g_ventoy_map_data.seglist[i].seg_start_bytes, + (long long)g_ventoy_map_data.seglist[i].seg_end_bytes); + + g_disk_map_start = (off_t)g_ventoy_map_data.seglist[i].seg_start_bytes; + g_disk_map_end = (off_t)g_ventoy_map_data.seglist[i].seg_end_bytes; } else { - printf("Failed to parse ventoy seg %d\n", i); - continue; + if (resource_string_value("ventoy", i, "seg", &value) == 0) + { + g_disk_map_start = strtouq(value, &endpos, 0); + g_disk_map_end = strtouq(endpos + 1, NULL, 0); + } + else + { + printf("Failed to parse ventoy seg %d\n", i); + continue; + } + G_DEBUG("[resource] ventoy segment%d: %s\n", i, value); } - - G_DEBUG("ventoy segment%d: %s\n", i, value); G_VENTOY_DEBUG(1, "Adding disk %s to %s.", pp->name, gp->name); error = g_ventoy_add_disk(sc, pp, i); diff --git a/Unix/ventoy_unix_src/FreeBSD/geom_ventoy_src/13.x/sys/geom/ventoy/g_ventoy.h b/Unix/ventoy_unix_src/FreeBSD/geom_ventoy_src/13.x/sys/geom/ventoy/g_ventoy.h index e442b246..abe565bd 100644 --- a/Unix/ventoy_unix_src/FreeBSD/geom_ventoy_src/13.x/sys/geom/ventoy/g_ventoy.h +++ b/Unix/ventoy_unix_src/FreeBSD/geom_ventoy_src/13.x/sys/geom/ventoy/g_ventoy.h @@ -76,6 +76,33 @@ struct g_ventoy_softc { struct mtx sc_lock; }; #define sc_name sc_geom->name + + +#pragma pack(1) +#define VENTOY_UNIX_SEG_MAGIC0 0x11223344 +#define VENTOY_UNIX_SEG_MAGIC1 0x55667788 +#define VENTOY_UNIX_SEG_MAGIC2 0x99aabbcc +#define VENTOY_UNIX_SEG_MAGIC3 0xddeeff00 +#define VENTOY_UNIX_MAX_SEGNUM 40960 +struct g_ventoy_seg { + uint64_t seg_start_bytes; + uint64_t seg_end_bytes; +}; + +struct g_ventoy_map{ + uint32_t magic1[4]; + uint32_t magic2[4]; + uint64_t segnum; + uint64_t disksize; + uint8_t diskuuid[16]; + struct g_ventoy_seg seglist[VENTOY_UNIX_MAX_SEGNUM]; + uint32_t magic3[4]; +}; +#pragma pack() + +#define VENTOY_MAP_VALID(magic2) \ + (magic2[0] == VENTOY_UNIX_SEG_MAGIC0 && magic2[1] == VENTOY_UNIX_SEG_MAGIC1 && magic2[2] == VENTOY_UNIX_SEG_MAGIC2 && magic2[3] == VENTOY_UNIX_SEG_MAGIC3) + #endif /* _KERNEL */ struct g_ventoy_metadata {