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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�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 HA=&=}gq}{Y delta 13885 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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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 literal 6820 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 G1X)_Du$W5# literal 6608 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 O#Ao{g000001X)@r{^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,15 +729,35 @@ 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"); + + 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); } - - if (resource_string_value("ventoy", 0, "diskuuid", &g_ventoy_disk_uuid) == 0) + else { - G_DEBUG("ventoy.diskuuid: <%s>\n", g_ventoy_disk_uuid); + 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); + } } } @@ -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 {