Skip to content

Commit

Permalink
linux raw boot
Browse files Browse the repository at this point in the history
  • Loading branch information
ventoy committed Sep 27, 2020
1 parent 4f840ed commit bf4e014
Show file tree
Hide file tree
Showing 12 changed files with 193 additions and 53 deletions.
61 changes: 52 additions & 9 deletions GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy.c
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ int g_initrd_img_count = 0;
int g_valid_initrd_count = 0;
int g_default_menu_mode = 0;
int g_filt_dot_underscore_file = 0;
int g_sort_case_sensitive = 0;
static grub_file_t g_old_file;
static int g_ventoy_last_entry_back;

Expand Down Expand Up @@ -1021,14 +1022,50 @@ int ventoy_cmp_img(img_info *img1, img_info *img2)
c1 = *s1;
c2 = *s2;

if (grub_islower(c1))
if (0 == g_sort_case_sensitive)
{
c1 = c1 - 'a' + 'A';
if (grub_islower(c1))
{
c1 = c1 - 'a' + 'A';
}

if (grub_islower(c2))
{
c2 = c2 - 'a' + 'A';
}
}

if (grub_islower(c2))

if (c1 != c2)
{
break;
}
}

return (c1 - c2);
}

static int ventoy_cmp_subdir(char *name1, char *name2)
{
char *s1, *s2;
int c1 = 0;
int c2 = 0;

for (s1 = name1, s2 = name2; *s1 && *s2; s1++, s2++)
{
c1 = *s1;
c2 = *s2;

if (0 == g_sort_case_sensitive)
{
c2 = c2 - 'a' + 'A';
if (grub_islower(c1))
{
c1 = c1 - 'a' + 'A';
}

if (grub_islower(c2))
{
c2 = c2 - 'a' + 'A';
}
}

if (c1 != c2)
Expand Down Expand Up @@ -1372,10 +1409,10 @@ static img_info * ventoy_get_min_iso(img_iterator_node *node)
{
img_info *minimg = NULL;
img_info *img = (img_info *)(node->firstiso);

while (img && (img_iterator_node *)(img->parent) == node)
{
if (img->select == 0 && (NULL == minimg || grub_strcmp(img->name, minimg->name) < 0))
if (img->select == 0 && (NULL == minimg || ventoy_cmp_img(img, minimg) < 0))
{
minimg = img;
}
Expand All @@ -1397,7 +1434,7 @@ static img_iterator_node * ventoy_get_min_child(img_iterator_node *node)

while (child && child->parent == node)
{
if (child->select == 0 && (NULL == Minchild || grub_strcmp(child->dir, Minchild->dir) < 0))
if (child->select == 0 && (NULL == Minchild || ventoy_cmp_subdir(child->dir, Minchild->dir) < 0))
{
Minchild = child;
}
Expand Down Expand Up @@ -1631,6 +1668,12 @@ static grub_err_t ventoy_cmd_list_img(grub_extcmd_context_t ctxt, int argc, char
g_filt_dot_underscore_file = 1;
}

strdata = ventoy_get_env("VTOY_SORT_CASE_SENSITIVE");
if (strdata && strdata[0] == '1' && strdata[1] == 0)
{
g_sort_case_sensitive = 1;
}

device_name = grub_file_get_device_name(args[0]);
if (!device_name)
{
Expand Down Expand Up @@ -1725,9 +1768,9 @@ static grub_err_t ventoy_cmd_list_img(grub_extcmd_context_t ctxt, int argc, char
"}\n", "<--");
}

default_image = ventoy_get_env("VTOY_DEFAULT_IMAGE");
if (g_default_menu_mode == 0)
{
default_image = ventoy_get_env("VTOY_DEFAULT_IMAGE");
if (default_image)
{
img_len = grub_strlen(default_image);
Expand Down
4 changes: 2 additions & 2 deletions GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_def.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,8 @@
#define VTOY_FILT_MIN_FILE_SIZE 32768

#define VTOY_SIZE_1GB 1073741824
#define VTOY_SIZE_512KB (512 * 1024)
#define VTOY_SIZE_1MB (1024 * 1024)
#define VTOY_SIZE_512KB (512 * 1024)
#define VTOY_SIZE_1KB 1024

#define JSON_SUCCESS 0
Expand Down Expand Up @@ -788,7 +789,6 @@ extern grub_uint8_t g_ventoy_chain_type;
extern int g_vhdboot_enable;
extern ventoy_gpt_info *g_ventoy_part_info;


#define ventoy_unix_fill_virt(new_data, new_len) \
{ \
data_secs = (new_len + 2047) / 2048; \
Expand Down
121 changes: 106 additions & 15 deletions GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_vhd.c
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ static int g_vhdboot_bcd_len = 0;
static int g_vhdboot_isolen = 0;
static char *g_vhdboot_totbuf = NULL;
static char *g_vhdboot_isobuf = NULL;
static grub_uint64_t g_img_trim_head_secnum = 0;

static int ventoy_vhd_find_bcd(int *bcdoffset, int *bcdlen)
{
Expand Down Expand Up @@ -273,6 +274,71 @@ grub_err_t ventoy_cmd_load_vhdboot(grub_extcmd_context_t ctxt, int argc, char **
return 0;
}

static int ventoy_raw_trim_head(grub_uint64_t offset)
{
grub_uint32_t i;
grub_uint32_t memsize;
grub_uint32_t imgstart = 0;
grub_uint32_t imgsecs = 0;
grub_uint64_t sectors = 0;
grub_uint64_t cursecs = 0;
grub_uint64_t delta = 0;

if ((!g_img_chunk_list.chunk) || (!offset))
{
debug("image chunk not ready %p %lu\n", g_img_chunk_list.chunk, (ulong)offset);
return 0;
}

debug("image trim head %lu\n", (ulong)offset);

for (i = 0; i < g_img_chunk_list.cur_chunk; i++)
{
cursecs = g_img_chunk_list.chunk[i].disk_end_sector + 1 - g_img_chunk_list.chunk[i].disk_start_sector;
sectors += cursecs;
if (sectors >= offset)
{
delta = cursecs - (sectors - offset);
break;
}
}

if (sectors < offset || i >= g_img_chunk_list.cur_chunk)
{
debug("Invalid size %lu %lu\n", (ulong)sectors, (ulong)offset);
return 0;
}

if (sectors == offset)
{
memsize = (g_img_chunk_list.cur_chunk - (i + 1)) * sizeof(ventoy_img_chunk);
grub_memmove(g_img_chunk_list.chunk, g_img_chunk_list.chunk + i + 1, memsize);
g_img_chunk_list.cur_chunk -= (i + 1);
}
else
{
g_img_chunk_list.chunk[i].disk_start_sector += delta;
g_img_chunk_list.chunk[i].img_start_sector += (grub_uint32_t)(delta / 4);

if (i > 0)
{
memsize = (g_img_chunk_list.cur_chunk - i) * sizeof(ventoy_img_chunk);
grub_memmove(g_img_chunk_list.chunk, g_img_chunk_list.chunk + i, memsize);
g_img_chunk_list.cur_chunk -= i;
}
}

for (i = 0; i < g_img_chunk_list.cur_chunk; i++)
{
imgsecs = g_img_chunk_list.chunk[i].img_end_sector + 1 - g_img_chunk_list.chunk[i].img_start_sector;
g_img_chunk_list.chunk[i].img_start_sector = imgstart;
g_img_chunk_list.chunk[i].img_end_sector = imgstart + (imgsecs - 1);
imgstart += imgsecs;
}

return 0;
}

grub_err_t ventoy_cmd_get_vtoy_type(grub_extcmd_context_t ctxt, int argc, char **args)
{
int i;
Expand All @@ -281,11 +347,12 @@ grub_err_t ventoy_cmd_get_vtoy_type(grub_extcmd_context_t ctxt, int argc, char *
vhd_footer_t vhdfoot;
VDIPREHEADER vdihdr;
char type[16] = {0};
ventoy_mbr_head mbr;
ventoy_gpt_info *gpt;

(void)ctxt;

g_img_trim_head_secnum = 0;

if (argc != 4)
{
return 0;
Expand Down Expand Up @@ -316,6 +383,7 @@ grub_err_t ventoy_cmd_get_vtoy_type(grub_extcmd_context_t ctxt, int argc, char *
grub_strncmp(vdihdr.szFileInfo, VDI_IMAGE_FILE_INFO, grub_strlen(VDI_IMAGE_FILE_INFO)) == 0)
{
offset = 2 * 1048576;
g_img_trim_head_secnum = offset / 512;
grub_snprintf(type, sizeof(type), "vdi");
}
else
Expand All @@ -330,27 +398,30 @@ grub_err_t ventoy_cmd_get_vtoy_type(grub_extcmd_context_t ctxt, int argc, char *

if (offset >= 0)
{
gpt = grub_zalloc(sizeof(ventoy_gpt_info));
if (!gpt)
{
grub_env_set(args[1], "unknown");
goto end;
}

grub_file_seek(file, offset);
grub_file_read(file, &mbr, sizeof(mbr));
grub_file_read(file, gpt, sizeof(ventoy_gpt_info));

if (mbr.Byte55 != 0x55 || mbr.ByteAA != 0xAA)
if (gpt->MBR.Byte55 != 0x55 || gpt->MBR.ByteAA != 0xAA)
{
grub_env_set(args[1], "unknown");
debug("invalid mbr signature: 0x%x 0x%x\n", mbr.Byte55, mbr.ByteAA);
debug("invalid mbr signature: 0x%x 0x%x\n", gpt->MBR.Byte55, gpt->MBR.ByteAA);
goto end;
}

if (mbr.PartTbl[0].FsFlag == 0xEE)
if (grub_memcmp(gpt->Head.Signature, "EFI PART", 8) == 0)
{
grub_env_set(args[2], "gpt");
debug("part type: %s\n", "GPT");

gpt = grub_zalloc(sizeof(ventoy_gpt_info));
if (gpt)
if (gpt->MBR.PartTbl[0].FsFlag == 0xEE)
{
grub_file_seek(file, offset);
grub_file_read(file, gpt, sizeof(ventoy_gpt_info));

for (i = 0; i < 128; i++)
{
if (grub_memcmp(gpt->PartTbl[i].PartType, "Hah!IdontNeedEFI", 16) == 0)
Expand All @@ -364,14 +435,22 @@ grub_err_t ventoy_cmd_get_vtoy_type(grub_extcmd_context_t ctxt, int argc, char *
break;
}
}

grub_free(gpt);
}
}
}
else
{
grub_env_set(args[2], "mbr");
debug("part type: %s\n", "MBR");

for (i = 0; i < 4; i++)
{
if (gpt->MBR.PartTbl[i].FsFlag == 0xEF)
{
debug("part %d is esp part in MBR mode\n", i);
grub_env_set(args[3], "1");
break;
}
}
}
}
else
Expand All @@ -380,6 +459,7 @@ grub_err_t ventoy_cmd_get_vtoy_type(grub_extcmd_context_t ctxt, int argc, char *
}

end:
grub_check_free(gpt);
grub_file_close(file);
VENTOY_CMD_RETURN(GRUB_ERR_NONE);
}
Expand All @@ -403,6 +483,11 @@ grub_err_t ventoy_cmd_raw_chain_data(grub_extcmd_context_t ctxt, int argc, char
return 1;
}

if (g_img_trim_head_secnum > 0)
{
ventoy_raw_trim_head(g_img_trim_head_secnum);
}

file = ventoy_grub_file_open(VENTOY_FILE_TYPE, "%s", args[0]);
if (!file)
{
Expand Down Expand Up @@ -450,16 +535,22 @@ grub_err_t ventoy_cmd_raw_chain_data(grub_extcmd_context_t ctxt, int argc, char
disk = file->device->disk;
chain->disk_drive = disk->id;
chain->disk_sector_size = (1 << disk->log_sector_size);

chain->real_img_size_in_bytes = file->size;
chain->virt_img_size_in_bytes = (file->size + 2047) / 2048 * 2048;
if (g_img_trim_head_secnum > 0)
{
chain->real_img_size_in_bytes -= g_img_trim_head_secnum * 512;
}

chain->virt_img_size_in_bytes = chain->real_img_size_in_bytes;
chain->boot_catalog = 0;

/* part 3: image chunk */
chain->img_chunk_offset = sizeof(ventoy_chain_head);
chain->img_chunk_num = g_img_chunk_list.cur_chunk;
grub_memcpy((char *)chain + chain->img_chunk_offset, g_img_chunk_list.chunk, img_chunk_size);

grub_file_seek(file, 0);
grub_file_seek(file, g_img_trim_head_secnum * 512);
grub_file_read(file, chain->boot_catalog_sector, 512);

grub_file_close(file);
Expand Down
Binary file modified INSTALL/EFI/BOOT/grubx64_real.efi
Binary file not shown.
13 changes: 8 additions & 5 deletions INSTALL/grub/grub.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -477,6 +477,7 @@ function uefi_linux_menu_func {
distro_specify_initrd_file
vt_linux_initrd_count vtcount
if [ $vtcount -eq 0 ]; then
distro_specify_initrd_file_phase2
Expand Down Expand Up @@ -991,26 +992,28 @@ function vhd_unsupport_menuentry {
}
function vtoyboot_common_func {
set efigrubpart=0
set AltBootPart=0
set vtoysupport=0
vt_get_vtoy_type ${1} vtoytype parttype efigrubpart
vt_get_vtoy_type ${1} vtoytype parttype AltBootPart
if vt_str_begin $vtoytype vhd; then
set vtoysupport=1
elif [ "$vtoytype" = "raw" ]; then
set vtoysupport=1
elif [ "$vtoytype" = "vdi" ]; then
set vtoysupport=1
fi
if [ $vtoysupport -eq 1 ]; then
if [ "$grub_platform" = "pc" ]; then
if [ "$parttype" = "gpt" -a $efigrubpart -eq 0 ]; then
if [ "$parttype" = "gpt" -a $AltBootPart -eq 0 ]; then
echo "The OS in the vdisk was created in UEFI mode, but current is Legacy BIOS mode."
echo "虚拟磁盘内的系统是在UEFI模式下创建的,而当前系统是Legacy BIOS模式,可能无法正常启动。"
ventoy_pause
fi
else
if [ "$parttype" = "mbr" ]; then
if [ "$parttype" = "mbr" -a $AltBootPart -eq 0 ]; then
echo "The OS in the vdisk was created in Legacy BIOS mode, but current is UEFI mode."
echo "虚拟磁盘内的系统是在Legacy BIOS模式下创建的,而当前系统是UEFI模式,可能无法正常启动。"
ventoy_pause
Expand Down Expand Up @@ -1321,7 +1324,7 @@ function img_unsupport_menuentry {
#############################################################
#############################################################
set VENTOY_VERSION="1.0.21"
set VENTOY_VERSION="1.0.22"
# Default menu display mode, you can change it as you want.
# 0: List mode
Expand Down
Binary file modified INSTALL/grub/i386-pc/core.img
Binary file not shown.
Loading

0 comments on commit bf4e014

Please sign in to comment.