+#ifdef GRUB_MACHINE_EFI
+static grub_err_t ventoy_cmd_relocator_chaindata(grub_extcmd_context_t ctxt, int argc, char **args)
+{
+ (void)ctxt;
+ (void)argc;
+ (void)args;
+ return 0;
+}
+#else
+static grub_err_t ventoy_cmd_relocator_chaindata(grub_extcmd_context_t ctxt, int argc, char **args)
+{
+ int rc = 0;
+ ulong chain_len = 0;
+ char *chain_data = NULL;
+ char *relocator_addr = NULL;
+ grub_relocator_chunk_t ch;
+ struct grub_relocator *relocator = NULL;
+ char envbuf[64] = { 0 };
+
+ (void)ctxt;
+ (void)argc;
+ (void)args;
+
+ if (argc != 2)
+ {
+ return 1;
+ }
+
+ chain_data = (char *)grub_strtoul(args[0], NULL, 16);
+ chain_len = grub_strtoul(args[1], NULL, 10);
+
+ relocator = grub_relocator_new ();
+ if (!relocator)
+ {
+ debug("grub_relocator_new failed %p %lu\n", chain_data, chain_len);
+ return 1;
+ }
+
+ rc = grub_relocator_alloc_chunk_addr (relocator, &ch,
+ 0x100000, // GRUB_LINUX_BZIMAGE_ADDR,
+ chain_len);
+ if (rc)
+ {
+ debug("grub_relocator_alloc_chunk_addr failed %d %p %lu\n", rc, chain_data, chain_len);
+ grub_relocator_unload (relocator);
+ return 1;
+ }
+
+ relocator_addr = get_virtual_current_address(ch);
+
+ grub_memcpy(relocator_addr, chain_data, chain_len);
+
+ grub_relocator_unload (relocator);
+
+ grub_snprintf(envbuf, sizeof(envbuf), "0x%lx", (unsigned long)relocator_addr);
+ grub_env_set("vtoy_chain_relocator_addr", envbuf);
+
+ VENTOY_CMD_RETURN(GRUB_ERR_NONE);
+}
+#endif
+
+static grub_err_t ventoy_cmd_test_block_list(grub_extcmd_context_t ctxt, int argc, char **args)
+{
+ grub_uint32_t i;
+ grub_file_t file;
+ ventoy_img_chunk_list chunklist;
+
+ (void)ctxt;
+ (void)argc;
+
+ file = ventoy_grub_file_open(VENTOY_FILE_TYPE, "%s", args[0]);
+ if (!file)
+ {
+ return grub_error(GRUB_ERR_BAD_ARGUMENT, "Can't open file %s\n", args[0]);
+ }
+
+ /* get image chunk data */
+ grub_memset(&chunklist, 0, sizeof(chunklist));
+ chunklist.chunk = grub_malloc(sizeof(ventoy_img_chunk) * DEFAULT_CHUNK_NUM);
+ if (NULL == chunklist.chunk)
+ {
+ return grub_error(GRUB_ERR_OUT_OF_MEMORY, "Can't allocate image chunk memoty\n");
+ }
+
+ chunklist.max_chunk = DEFAULT_CHUNK_NUM;
+ chunklist.cur_chunk = 0;
+
+ ventoy_get_block_list(file, &chunklist, 0);
+
+ grub_file_close(file);
+
+ grub_printf("filesystem: <%s> entry number:<%u>\n", file->fs->name, chunklist.cur_chunk);
+
+ for (i = 0; i < chunklist.cur_chunk; i++)
+ {
+ grub_printf("%llu+%llu,", (ulonglong)chunklist.chunk[i].disk_start_sector,
+ (ulonglong)(chunklist.chunk[i].disk_end_sector + 1 - chunklist.chunk[i].disk_start_sector));
+ }
+
+ grub_printf("\n==================================\n");
+ for (i = 0; i < chunklist.cur_chunk; i++)
+ {
+ grub_printf("%2u: [%llu %llu] - [%llu %llu]\n", i,
+ (ulonglong)chunklist.chunk[i].img_start_sector,
+ (ulonglong)chunklist.chunk[i].img_end_sector,
+ (ulonglong)chunklist.chunk[i].disk_start_sector,
+ (ulonglong)chunklist.chunk[i].disk_end_sector
+ );
+ }
+
+ grub_free(chunklist.chunk);
+
+ VENTOY_CMD_RETURN(GRUB_ERR_NONE);
+}
+