Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
dadigang
Ventoy
Commits
d02f184a
Commit
d02f184a
authored
Sep 26, 2020
by
longpanda
Browse files
add support for linux vdisk(vhd/vdi/raw)
parent
3c649b28
Changes
26
Hide whitespace changes
Inline
Side-by-side
Showing
20 changed files
with
1008 additions
and
123 deletions
+1008
-123
EDK2/edk2_mod/edk2-edk2-stable201911/MdeModulePkg/Application/Ventoy/Ventoy.c
...dk2-stable201911/MdeModulePkg/Application/Ventoy/Ventoy.c
+21
-7
EDK2/edk2_mod/edk2-edk2-stable201911/MdeModulePkg/Application/Ventoy/VentoyProtocol.c
...le201911/MdeModulePkg/Application/Ventoy/VentoyProtocol.c
+160
-5
GRUB2/MOD_SRC/grub-2.04/grub-core/normal/menu_text.c
GRUB2/MOD_SRC/grub-2.04/grub-core/normal/menu_text.c
+9
-2
GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy.c
GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy.c
+185
-24
GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_def.h
GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_def.h
+44
-6
GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_unix.c
GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_unix.c
+4
-2
GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_vhd.c
GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_vhd.c
+193
-0
GRUB2/MOD_SRC/grub-2.04/include/grub/ventoy.h
GRUB2/MOD_SRC/grub-2.04/include/grub/ventoy.h
+4
-2
IMG/cpio/ventoy/hook/manjaro/ventoy-disk.sh
IMG/cpio/ventoy/hook/manjaro/ventoy-disk.sh
+66
-0
IMG/cpio/ventoy/hook/manjaro/ventoy-hook.sh
IMG/cpio/ventoy/hook/manjaro/ventoy-hook.sh
+16
-2
IMG/cpio/ventoy/hook/ventoy-hook-lib.sh
IMG/cpio/ventoy/hook/ventoy-hook-lib.sh
+28
-7
INSTALL/EFI/BOOT/grubx64_real.efi
INSTALL/EFI/BOOT/grubx64_real.efi
+0
-0
INSTALL/grub/grub.cfg
INSTALL/grub/grub.cfg
+87
-20
INSTALL/grub/i386-pc/core.img
INSTALL/grub/i386-pc/core.img
+0
-0
INSTALL/grub/i386-pc/moddep.lst
INSTALL/grub/i386-pc/moddep.lst
+1
-1
INSTALL/grub/x86_64-efi/moddep.lst
INSTALL/grub/x86_64-efi/moddep.lst
+1
-1
INSTALL/grub/x86_64-efi/normal.mod
INSTALL/grub/x86_64-efi/normal.mod
+0
-0
IPXE/ipxe_mod_code/ipxe-3fe683e/src/arch/x86/core/ventoy_vdisk.c
...xe_mod_code/ipxe-3fe683e/src/arch/x86/core/ventoy_vdisk.c
+150
-7
IPXE/ipxe_mod_code/ipxe-3fe683e/src/arch/x86/interface/pcbios/ventoy_int13.c
...ipxe-3fe683e/src/arch/x86/interface/pcbios/ventoy_int13.c
+32
-35
IPXE/ipxe_mod_code/ipxe-3fe683e/src/include/ventoy.h
IPXE/ipxe_mod_code/ipxe-3fe683e/src/include/ventoy.h
+7
-2
No files found.
EDK2/edk2_mod/edk2-edk2-stable201911/MdeModulePkg/Application/Ventoy/Ventoy.c
View file @
d02f184a
...
@@ -273,19 +273,33 @@ static int ventoy_update_image_location(ventoy_os_param *param)
...
@@ -273,19 +273,33 @@ static int ventoy_update_image_location(ventoy_os_param *param)
}
}
CopyMem
(
&
location
->
guid
,
&
param
->
guid
,
sizeof
(
ventoy_guid
));
CopyMem
(
&
location
->
guid
,
&
param
->
guid
,
sizeof
(
ventoy_guid
));
location
->
image_sector_size
=
2048
;
location
->
image_sector_size
=
gSector512Mode
?
512
:
2048
;
location
->
disk_sector_size
=
g_chain
->
disk_sector_size
;
location
->
disk_sector_size
=
g_chain
->
disk_sector_size
;
location
->
region_count
=
g_img_chunk_num
;
location
->
region_count
=
g_img_chunk_num
;
region
=
location
->
regions
;
region
=
location
->
regions
;
for
(
i
=
0
;
i
<
g_img_chunk_num
;
i
++
)
if
(
gSector512Mode
)
{
{
region
->
image_sector_count
=
chunk
->
img_end_sector
-
chunk
->
img_start_sector
+
1
;
for
(
i
=
0
;
i
<
g_img_chunk_num
;
i
++
)
region
->
image_start_sector
=
chunk
->
img_start_sector
;
{
region
->
disk_start_sector
=
chunk
->
disk_start_sector
;
region
->
image_sector_count
=
chunk
->
disk_end_sector
-
chunk
->
disk_start_sector
+
1
;
region
++
;
region
->
image_start_sector
=
chunk
->
img_start_sector
*
4
;
chunk
++
;
region
->
disk_start_sector
=
chunk
->
disk_start_sector
;
region
++
;
chunk
++
;
}
}
else
{
for
(
i
=
0
;
i
<
g_img_chunk_num
;
i
++
)
{
region
->
image_sector_count
=
chunk
->
img_end_sector
-
chunk
->
img_start_sector
+
1
;
region
->
image_start_sector
=
chunk
->
img_start_sector
;
region
->
disk_start_sector
=
chunk
->
disk_start_sector
;
region
++
;
chunk
++
;
}
}
}
return
0
;
return
0
;
...
...
EDK2/edk2_mod/edk2-edk2-stable201911/MdeModulePkg/Application/Ventoy/VentoyProtocol.c
View file @
d02f184a
...
@@ -71,6 +71,7 @@ STATIC EFI_LOCATE_HANDLE g_org_locate_handle = NULL;
...
@@ -71,6 +71,7 @@ STATIC EFI_LOCATE_HANDLE g_org_locate_handle = NULL;
STATIC
UINT8
g_sector_buf
[
2048
];
STATIC
UINT8
g_sector_buf
[
2048
];
STATIC
EFI_BLOCK_READ
g_sector_2048_read
=
NULL
;
STATIC
EFI_BLOCK_READ
g_sector_2048_read
=
NULL
;
STATIC
EFI_BLOCK_WRITE
g_sector_2048_write
=
NULL
;
BOOLEAN
ventoy_is_cdrom_dp_exist
(
VOID
)
BOOLEAN
ventoy_is_cdrom_dp_exist
(
VOID
)
{
{
...
@@ -245,6 +246,87 @@ STATIC EFI_STATUS EFIAPI ventoy_read_iso_sector
...
@@ -245,6 +246,87 @@ STATIC EFI_STATUS EFIAPI ventoy_read_iso_sector
return
EFI_SUCCESS
;
return
EFI_SUCCESS
;
}
}
STATIC
EFI_STATUS
EFIAPI
ventoy_write_iso_sector
(
IN
UINT64
Sector
,
IN
UINTN
Count
,
IN
VOID
*
Buffer
)
{
EFI_STATUS
Status
=
EFI_SUCCESS
;
EFI_LBA
MapLba
=
0
;
UINT32
i
=
0
;
UINTN
secLeft
=
0
;
UINTN
secRead
=
0
;
UINT64
ReadStart
=
0
;
UINT64
ReadEnd
=
0
;
UINT8
*
pCurBuf
=
(
UINT8
*
)
Buffer
;
ventoy_img_chunk
*
pchunk
=
g_chunk
;
EFI_BLOCK_IO_PROTOCOL
*
pRawBlockIo
=
gBlockData
.
pRawBlockIo
;
debug
(
"write iso sector %lu count %u"
,
Sector
,
Count
);
ReadStart
=
Sector
*
2048
;
ReadEnd
=
(
Sector
+
Count
)
*
2048
;
for
(
i
=
0
;
Count
>
0
&&
i
<
g_img_chunk_num
;
i
++
,
pchunk
++
)
{
if
(
Sector
>=
pchunk
->
img_start_sector
&&
Sector
<=
pchunk
->
img_end_sector
)
{
if
(
g_chain
->
disk_sector_size
==
512
)
{
MapLba
=
(
Sector
-
pchunk
->
img_start_sector
)
*
4
+
pchunk
->
disk_start_sector
;
}
else
{
MapLba
=
(
Sector
-
pchunk
->
img_start_sector
)
*
2048
/
g_chain
->
disk_sector_size
+
pchunk
->
disk_start_sector
;
}
secLeft
=
pchunk
->
img_end_sector
+
1
-
Sector
;
secRead
=
(
Count
<
secLeft
)
?
Count
:
secLeft
;
Status
=
pRawBlockIo
->
WriteBlocks
(
pRawBlockIo
,
pRawBlockIo
->
Media
->
MediaId
,
MapLba
,
secRead
*
2048
,
pCurBuf
);
if
(
EFI_ERROR
(
Status
))
{
debug
(
"Raw disk write block failed %r LBA:%lu Count:%u"
,
Status
,
MapLba
,
secRead
);
return
Status
;
}
Count
-=
secRead
;
Sector
+=
secRead
;
pCurBuf
+=
secRead
*
2048
;
}
}
return
EFI_SUCCESS
;
}
EFI_STATUS
EFIAPI
ventoy_block_io_ramdisk_write
(
IN
EFI_BLOCK_IO_PROTOCOL
*
This
,
IN
UINT32
MediaId
,
IN
EFI_LBA
Lba
,
IN
UINTN
BufferSize
,
IN
VOID
*
Buffer
)
{
(
VOID
)
This
;
(
VOID
)
MediaId
;
(
VOID
)
Lba
;
(
VOID
)
BufferSize
;
(
VOID
)
Buffer
;
if
(
!
gSector512Mode
)
{
return
EFI_WRITE_PROTECTED
;
}
CopyMem
(
g_iso_data_buf
+
(
Lba
*
2048
),
Buffer
,
BufferSize
);
return
EFI_SUCCESS
;
}
EFI_STATUS
EFIAPI
ventoy_block_io_ramdisk_read
EFI_STATUS
EFIAPI
ventoy_block_io_ramdisk_read
(
(
IN
EFI_BLOCK_IO_PROTOCOL
*
This
,
IN
EFI_BLOCK_IO_PROTOCOL
*
This
,
...
@@ -438,12 +520,21 @@ EFI_STATUS EFIAPI ventoy_block_io_write
...
@@ -438,12 +520,21 @@ EFI_STATUS EFIAPI ventoy_block_io_write
IN
VOID
*
Buffer
IN
VOID
*
Buffer
)
)
{
{
UINT32
secNum
=
0
;
UINT64
offset
=
0
;
(
VOID
)
This
;
(
VOID
)
This
;
(
VOID
)
MediaId
;
(
VOID
)
MediaId
;
(
VOID
)
Lba
;
(
VOID
)
BufferSize
;
if
(
!
gSector512Mode
)
(
VOID
)
Buffer
;
{
return
EFI_WRITE_PROTECTED
;
return
EFI_WRITE_PROTECTED
;
}
secNum
=
BufferSize
/
2048
;
offset
=
Lba
*
2048
;
return
ventoy_write_iso_sector
(
Lba
,
secNum
,
Buffer
);
}
}
EFI_STATUS
EFIAPI
ventoy_block_io_flush
(
IN
EFI_BLOCK_IO_PROTOCOL
*
This
)
EFI_STATUS
EFIAPI
ventoy_block_io_flush
(
IN
EFI_BLOCK_IO_PROTOCOL
*
This
)
...
@@ -633,6 +724,68 @@ EFI_STATUS EFIAPI ventoy_block_io_read_512
...
@@ -633,6 +724,68 @@ EFI_STATUS EFIAPI ventoy_block_io_read_512
return
Status
;
return
Status
;
}
}
EFI_STATUS
EFIAPI
ventoy_block_io_write_512
(
IN
EFI_BLOCK_IO_PROTOCOL
*
This
,
IN
UINT32
MediaId
,
IN
EFI_LBA
Lba
,
IN
UINTN
BufferSize
,
IN
VOID
*
Buffer
)
{
EFI_LBA
Mod
;
UINTN
ReadSize
;
UINT8
*
CurBuf
=
NULL
;
EFI_STATUS
Status
=
EFI_SUCCESS
;
debug
(
"ventoy_block_io_write_512 %lu %lu
\n
"
,
Lba
,
BufferSize
/
512
);
CurBuf
=
(
UINT8
*
)
Buffer
;
Mod
=
Lba
%
4
;
if
(
Mod
>
0
)
{
Status
|=
g_sector_2048_read
(
This
,
MediaId
,
Lba
/
4
,
2048
,
g_sector_buf
);
if
(
BufferSize
<=
(
4
-
Mod
)
*
512
)
{
CopyMem
(
g_sector_buf
+
Mod
*
512
,
CurBuf
,
BufferSize
);
return
g_sector_2048_write
(
This
,
MediaId
,
Lba
/
4
,
2048
,
g_sector_buf
);
}
else
{
ReadSize
=
(
4
-
Mod
)
*
512
;
CopyMem
(
g_sector_buf
+
Mod
*
512
,
CurBuf
,
ReadSize
);
g_sector_2048_write
(
This
,
MediaId
,
Lba
/
4
,
2048
,
g_sector_buf
);
CurBuf
+=
ReadSize
;
Lba
+=
(
4
-
Mod
);
BufferSize
-=
ReadSize
;
}
}
if
(
BufferSize
>=
2048
)
{
ReadSize
=
BufferSize
/
2048
*
2048
;
Status
|=
g_sector_2048_write
(
This
,
MediaId
,
Lba
/
4
,
ReadSize
,
CurBuf
);
CurBuf
+=
ReadSize
;
Lba
+=
ReadSize
/
512
;
BufferSize
-=
ReadSize
;
}
if
(
BufferSize
>
0
)
{
Status
|=
g_sector_2048_read
(
This
,
MediaId
,
Lba
/
4
,
2048
,
g_sector_buf
);
CopyMem
(
g_sector_buf
,
CurBuf
,
BufferSize
);
g_sector_2048_write
(
This
,
MediaId
,
Lba
/
4
,
2048
,
g_sector_buf
);
}
return
Status
;
}
EFI_STATUS
EFIAPI
ventoy_install_blockio
(
IN
EFI_HANDLE
ImageHandle
,
IN
UINT64
ImgSize
)
EFI_STATUS
EFIAPI
ventoy_install_blockio
(
IN
EFI_HANDLE
ImageHandle
,
IN
UINT64
ImgSize
)
{
{
EFI_STATUS
Status
=
EFI_SUCCESS
;
EFI_STATUS
Status
=
EFI_SUCCESS
;
...
@@ -665,14 +818,16 @@ EFI_STATUS EFIAPI ventoy_install_blockio(IN EFI_HANDLE ImageHandle, IN UINT64 Im
...
@@ -665,14 +818,16 @@ EFI_STATUS EFIAPI ventoy_install_blockio(IN EFI_HANDLE ImageHandle, IN UINT64 Im
if
(
gSector512Mode
)
if
(
gSector512Mode
)
{
{
g_sector_2048_read
=
gMemdiskMode
?
ventoy_block_io_ramdisk_read
:
ventoy_block_io_read
;
g_sector_2048_read
=
gMemdiskMode
?
ventoy_block_io_ramdisk_read
:
ventoy_block_io_read
;
g_sector_2048_write
=
gMemdiskMode
?
ventoy_block_io_ramdisk_write
:
ventoy_block_io_write
;
pBlockIo
->
ReadBlocks
=
ventoy_block_io_read_512
;
pBlockIo
->
ReadBlocks
=
ventoy_block_io_read_512
;
pBlockIo
->
WriteBlocks
=
ventoy_block_io_write_512
;
}
}
else
else
{
{
pBlockIo
->
ReadBlocks
=
gMemdiskMode
?
ventoy_block_io_ramdisk_read
:
ventoy_block_io_read
;
pBlockIo
->
ReadBlocks
=
gMemdiskMode
?
ventoy_block_io_ramdisk_read
:
ventoy_block_io_read
;
pBlockIo
->
WriteBlocks
=
ventoy_block_io_write
;
}
}
pBlockIo
->
WriteBlocks
=
ventoy_block_io_write
;
pBlockIo
->
FlushBlocks
=
ventoy_block_io_flush
;
pBlockIo
->
FlushBlocks
=
ventoy_block_io_flush
;
Status
=
gBS
->
InstallMultipleProtocolInterfaces
(
&
gBlockData
.
Handle
,
Status
=
gBS
->
InstallMultipleProtocolInterfaces
(
&
gBlockData
.
Handle
,
...
...
GRUB2/MOD_SRC/grub-2.04/grub-core/normal/menu_text.c
View file @
d02f184a
...
@@ -190,10 +190,17 @@ command-line or ESC to discard edits and return to the GRUB menu."),
...
@@ -190,10 +190,17 @@ command-line or ESC to discard edits and return to the GRUB menu."),
}
}
else
else
{
{
char
szLine
[
128
];
const
char
*
checkret
=
grub_env_get
(
"VTOY_CHKDEV_RESULT_STRING"
);
if
(
checkret
==
NULL
||
checkret
[
0
]
!=
'0'
)
{
grub_snprintf
(
szLine
,
sizeof
(
szLine
),
"%s [Unofficial Ventoy]"
,
grub_env_get
(
"VTOY_TEXT_MENU_VER"
));
}
else
{
grub_snprintf
(
szLine
,
sizeof
(
szLine
),
"%s"
,
grub_env_get
(
"VTOY_TEXT_MENU_VER"
));
}
ret
+=
grub_print_message_indented_real
(
"
\n
"
,
STANDARD_MARGIN
,
STANDARD_MARGIN
,
term
,
dry_run
);
ret
+=
grub_print_message_indented_real
(
"
\n
"
,
STANDARD_MARGIN
,
STANDARD_MARGIN
,
term
,
dry_run
);
ret
+=
grub_print_message_indented_real
(
grub_env_get
(
"VTOY_TEXT_MENU_VER"
),
ret
+=
grub_print_message_indented_real
(
szLine
,
STANDARD_MARGIN
,
STANDARD_MARGIN
,
term
,
dry_run
);
STANDARD_MARGIN
,
STANDARD_MARGIN
,
term
,
dry_run
);
ret
+=
grub_print_message_indented_real
(
"
\n
"
,
STANDARD_MARGIN
,
STANDARD_MARGIN
,
term
,
dry_run
);
ret
+=
grub_print_message_indented_real
(
"
\n
"
,
STANDARD_MARGIN
,
STANDARD_MARGIN
,
term
,
dry_run
);
ret
+=
grub_print_message_indented_real
(
grub_env_get
(
"VTOY_HOTKEY_TIP"
),
ret
+=
grub_print_message_indented_real
(
grub_env_get
(
"VTOY_HOTKEY_TIP"
),
...
...
GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy.c
View file @
d02f184a
...
@@ -40,6 +40,7 @@
...
@@ -40,6 +40,7 @@
#endif
#endif
#include <grub/time.h>
#include <grub/time.h>
#include <grub/video.h>
#include <grub/video.h>
#include <grub/acpi.h>
#include <grub/relocator.h>
#include <grub/relocator.h>
#include <grub/charset.h>
#include <grub/charset.h>
#include <grub/ventoy.h>
#include <grub/ventoy.h>
...
@@ -108,12 +109,12 @@ static ventoy_video_mode *g_video_mode_list = NULL;
...
@@ -108,12 +109,12 @@ static ventoy_video_mode *g_video_mode_list = NULL;
static
const
char
*
g_menu_class
[]
=
static
const
char
*
g_menu_class
[]
=
{
{
"vtoyiso"
,
"vtoywim"
,
"vtoyefi"
,
"vtoyimg"
,
"vtoyvhd"
"vtoyiso"
,
"vtoywim"
,
"vtoyefi"
,
"vtoyimg"
,
"vtoyvhd"
,
"vtoyvtoy"
};
};
static
const
char
*
g_menu_prefix
[]
=
static
const
char
*
g_menu_prefix
[]
=
{
{
"iso"
,
"wim"
,
"efi"
,
"img"
,
"vhd"
"iso"
,
"wim"
,
"efi"
,
"img"
,
"vhd"
,
"vtoy"
};
};
void
ventoy_debug
(
const
char
*
fmt
,
...)
void
ventoy_debug
(
const
char
*
fmt
,
...)
...
@@ -1195,6 +1196,10 @@ static int ventoy_colect_img_files(const char *filename, const struct grub_dirho
...
@@ -1195,6 +1196,10 @@ static int ventoy_colect_img_files(const char *filename, const struct grub_dirho
}
}
type
=
img_type_img
;
type
=
img_type_img
;
}
}
else
if
(
len
>=
5
&&
0
==
grub_strcasecmp
(
filename
+
len
-
5
,
".vtoy"
))
{
type
=
img_type_vtoy
;
}
else
else
{
{
return
0
;
return
0
;
...
@@ -1495,19 +1500,21 @@ int ventoy_check_device_result(int ret)
...
@@ -1495,19 +1500,21 @@ int ventoy_check_device_result(int ret)
{
{
char
buf
[
32
];
char
buf
[
32
];
grub_snprintf
(
buf
,
sizeof
(
buf
),
"%d"
,
ret
);
grub_snprintf
(
buf
,
sizeof
(
buf
),
"%d"
,
(
ret
&
0x7FFF
));
ventoy_set_env
(
"VTOY_CHKDEV_RESULT_STRING"
,
buf
);
grub_env_set
(
"VTOY_CHKDEV_RESULT_STRING"
,
buf
);
grub_env_export
(
"VTOY_CHKDEV_RESULT_STRING"
);
if
(
ret
)
if
(
ret
&
0x1000
)
{
{
grub_printf
(
VTOY_WARNING
"
\n
"
);
grub_printf
(
VTOY_WARNING
"
\n
"
);
grub_printf
(
VTOY_WARNING
"
\n
"
);
grub_printf
(
VTOY_WARNING
"
\n
"
);
grub_printf
(
VTOY_WARNING
"
\n\n\n
"
);
grub_printf
(
VTOY_WARNING
"
\n\n\n
"
);
grub_printf
(
"Unsatisfied conditions detected for Ventoy.
\n\n
"
);
grub_printf
(
"This is NOT a standard Ventoy device and is NOT officially supported.
\n\n
"
);
grub_printf
(
"This is NOT a standard Ventoy device and is NOT officially supported.
\n\n
"
);
grub_printf
(
"Recommend to follow the instructions in https://www.ventoy.net to use Ventoy.
\n
"
);
grub_printf
(
"Recommend to follow the instructions in https://www.ventoy.net to use Ventoy.
\n
"
);
grub_printf
(
"
\n\n
Will
continue to boo
t after 10 seconds ...... "
);
grub_printf
(
"
\n\n
Will
exi
t after 10 seconds ...... "
);
grub_refresh
();
grub_refresh
();
grub_sleep
(
10
);
grub_sleep
(
10
);
}
}
...
@@ -1527,29 +1534,41 @@ int ventoy_check_device(grub_device_t dev)
...
@@ -1527,29 +1534,41 @@ int ventoy_check_device(grub_device_t dev)
if
(
dev
->
disk
==
NULL
||
dev
->
disk
->
partition
==
NULL
)
if
(
dev
->
disk
==
NULL
||
dev
->
disk
->
partition
==
NULL
)
{
{
return
ventoy_check_device_result
(
1
);
return
ventoy_check_device_result
(
1
|
0x1000
);
}
}
partition
=
dev
->
disk
->
partition
;
if
(
0
==
ventoy_check_file_exist
(
"(%s,2)/ventoy/ventoy.cpio"
,
dev
->
disk
->
name
)
||
if
(
partition
->
number
!=
0
||
partition
->
start
!=
2048
)
0
==
ventoy_check_file_exist
(
"(%s,2)/grub/localboot.cfg"
,
dev
->
disk
->
name
)
||
0
==
ventoy_check_file_exist
(
"(%s,2)/tool/mount.exfat-fuse_64"
,
dev
->
disk
->
name
))
{
{
return
ventoy_check_device_result
(
2
);
return
ventoy_check_device_result
(
2
|
0x1000
);
}
}
offset
=
partition
->
start
+
partition
->
len
;
/* We must have partition 2 */
/* We must have partition 2 */
file
=
ventoy_grub_file_open
(
VENTOY_FILE_TYPE
,
"(%s,2)/ventoy/ventoy.cpio"
,
dev
->
disk
->
name
);
file
=
ventoy_grub_file_open
(
VENTOY_FILE_TYPE
,
"(%s,2)/ventoy/ventoy.cpio"
,
dev
->
disk
->
name
);
if
(
!
file
)
if
(
!
file
)
{
{
return
ventoy_check_device_result
(
3
);
return
ventoy_check_device_result
(
3
|
0x1000
);
}
if
(
NULL
==
grub_strstr
(
file
->
fs
->
name
,
"fat"
))
{
grub_file_close
(
file
);
return
ventoy_check_device_result
(
4
|
0x1000
);
}
partition
=
dev
->
disk
->
partition
;
if
(
partition
->
number
!=
0
||
partition
->
start
!=
2048
)
{
return
ventoy_check_device_result
(
5
);
}
}
offset
=
partition
->
start
+
partition
->
len
;
partition
=
file
->
device
->
disk
->
partition
;
partition
=
file
->
device
->
disk
->
partition
;
if
((
partition
->
number
!=
1
)
||
(
partition
->
len
!=
65536
)
||
(
offset
!=
partition
->
start
))
if
((
partition
->
number
!=
1
)
||
(
partition
->
len
!=
65536
)
||
(
offset
!=
partition
->
start
))
{
{
grub_file_close
(
file
);
grub_file_close
(
file
);
return
ventoy_check_device_result
(
4
);
return
ventoy_check_device_result
(
6
);
}
}
grub_file_close
(
file
);
grub_file_close
(
file
);
...
@@ -1557,21 +1576,21 @@ int ventoy_check_device(grub_device_t dev)
...
@@ -1557,21 +1576,21 @@ int ventoy_check_device(grub_device_t dev)
dev2
=
grub_device_open
(
devname
);
dev2
=
grub_device_open
(
devname
);
if
(
!
dev2
)
if
(
!
dev2
)
{
{
return
ventoy_check_device_result
(
5
);
return
ventoy_check_device_result
(
7
);
}
}
fs
=
grub_fs_probe
(
dev2
);
fs
=
grub_fs_probe
(
dev2
);
if
(
!
fs
)
if
(
!
fs
)
{
{
grub_device_close
(
dev2
);
grub_device_close
(
dev2
);
return
ventoy_check_device_result
(
6
);
return
ventoy_check_device_result
(
8
);
}
}
fs
->
fs_label
(
dev2
,
&
label
);
fs
->
fs_label
(
dev2
,
&
label
);
if
((
!
label
)
||
grub_strncmp
(
"VTOYEFI"
,
label
,
7
))
if
((
!
label
)
||
grub_strncmp
(
"VTOYEFI"
,
label
,
7
))
{
{
grub_device_close
(
dev2
);
grub_device_close
(
dev2
);
return
ventoy_check_device_result
(
7
);
return
ventoy_check_device_result
(
9
);
}
}
grub_device_close
(
dev2
);
grub_device_close
(
dev2
);
...
@@ -1624,9 +1643,6 @@ static grub_err_t ventoy_cmd_list_img(grub_extcmd_context_t ctxt, int argc, char
...
@@ -1624,9 +1643,6 @@ static grub_err_t ventoy_cmd_list_img(grub_extcmd_context_t ctxt, int argc, char
goto
fail
;
goto
fail
;
}
}
/* make sure that we are running in a correct Ventoy device */
ventoy_check_device
(
dev
);
g_enum_fs
=
fs
=
grub_fs_probe
(
dev
);
g_enum_fs
=
fs
=
grub_fs_probe
(
dev
);
if
(
!
fs
)
if
(
!
fs
)
{
{
...
@@ -1869,7 +1885,7 @@ static grub_err_t ventoy_cmd_chosen_img_path(grub_extcmd_context_t ctxt, int arg
...
@@ -1869,7 +1885,7 @@ static grub_err_t ventoy_cmd_chosen_img_path(grub_extcmd_context_t ctxt, int arg
VENTOY_CMD_RETURN
(
GRUB_ERR_NONE
);
VENTOY_CMD_RETURN
(
GRUB_ERR_NONE
);
}
}
int
ventoy_get_disk_guid
(
const
char
*
filename
,
grub_uint8_t
*
guid
)
int
ventoy_get_disk_guid
(
const
char
*
filename
,
grub_uint8_t
*
guid
,
grub_uint8_t
*
signature
)
{
{
grub_disk_t
disk
;
grub_disk_t
disk
;
char
*
device_name
;
char
*
device_name
;
...
@@ -1903,6 +1919,7 @@ int ventoy_get_disk_guid(const char *filename, grub_uint8_t *guid)
...
@@ -1903,6 +1919,7 @@ int ventoy_get_disk_guid(const char *filename, grub_uint8_t *guid)
if
(
disk
)
if
(
disk
)
{
{
grub_disk_read
(
disk
,
0
,
0x180
,
16
,
guid
);
grub_disk_read
(
disk
,
0
,
0x180
,
16
,
guid
);
grub_disk_read
(
disk
,
0
,
0x1b8
,
4
,
signature
);
grub_disk_close
(
disk
);
grub_disk_close
(
disk
);
}
}
else
else
...
@@ -1999,7 +2016,7 @@ void ventoy_fill_os_param(grub_file_t file, ventoy_os_param *param)
...
@@ -1999,7 +2016,7 @@ void ventoy_fill_os_param(grub_file_t file, ventoy_os_param *param)
grub_snprintf
(
param
->
vtoy_img_path
,
sizeof
(
param
->
vtoy_img_path
),
"%s"
,
pos
);
grub_snprintf
(
param
->
vtoy_img_path
,
sizeof
(
param
->
vtoy_img_path
),
"%s"
,
pos
);
ventoy_get_disk_guid
(
file
->
name
,
param
->
vtoy_disk_guid
);
ventoy_get_disk_guid
(
file
->
name
,
param
->
vtoy_disk_guid
,
param
->
vtoy_disk_signature
);
param
->
vtoy_img_size
=
file
->
size
;
param
->
vtoy_img_size
=
file
->
size
;
...
@@ -2112,7 +2129,10 @@ int ventoy_get_block_list(grub_file_t file, ventoy_img_chunk_list *chunklist, gr
...
@@ -2112,7 +2129,10 @@ int ventoy_get_block_list(grub_file_t file, ventoy_img_chunk_list *chunklist, gr
}
}
len
=
(
int
)
grub_strlen
(
file
->
name
);
len
=
(
int
)
grub_strlen
(
file
->
name
);
if
(
grub_strncasecmp
(
file
->
name
+
len
-
4
,
".img"
,
4
)
==
0
)
if
((
len
>
4
&&
grub_strncasecmp
(
file
->
name
+
len
-
4
,
".img"
,
4
)
==
0
)
||
(
len
>
4
&&
grub_strncasecmp
(
file
->
name
+
len
-
4
,
".vhd"
,
4
)
==
0
)
||
(
len
>
5
&&
grub_strncasecmp
(
file
->
name
+
len
-
5
,
".vhdx"
,
5
)
==
0
)
||
(
len
>
5
&&
grub_strncasecmp
(
file
->
name
+
len
-
5
,
".vtoy"
,
5
)
==
0
))
{
{
for
(
i
=
0
;
i
<
chunklist
->
cur_chunk
;
i
++
)
for
(
i
=
0
;
i
<
chunklist
->
cur_chunk
;
i
++
)
{
{
...
@@ -2155,6 +2175,12 @@ static grub_err_t ventoy_cmd_img_sector(grub_extcmd_context_t ctxt, int argc, ch
...
@@ -2155,6 +2175,12 @@ static grub_err_t ventoy_cmd_img_sector(grub_extcmd_context_t ctxt, int argc, ch
grub_free
(
g_img_chunk_list
.
chunk
);
grub_free
(
g_img_chunk_list
.
chunk
);
}
}
if
(
ventoy_get_fs_type
(
file
->
fs
->
name
)
>=
ventoy_fs_max
)
{
grub_file_close
(
file
);
return
grub_error
(
GRUB_ERR_BAD_ARGUMENT
,
"Unsupported filesystem %s
\n
"
,
file
->
fs
->
name
);
}
/* get image chunk data */
/* get image chunk data */
grub_memset
(
&
g_img_chunk_list
,
0
,
sizeof
(
g_img_chunk_list
));
grub_memset
(
&
g_img_chunk_list
,
0
,
sizeof
(
g_img_chunk_list
));
g_img_chunk_list
.
chunk
=
grub_malloc
(
sizeof
(
ventoy_img_chunk
)
*
DEFAULT_CHUNK_NUM
);
g_img_chunk_list
.
chunk
=
grub_malloc
(
sizeof
(
ventoy_img_chunk
)
*
DEFAULT_CHUNK_NUM
);
...
@@ -2977,6 +3003,119 @@ static grub_err_t ventoy_cmd_img_unhook_root(grub_extcmd_context_t ctxt, int arg
...
@@ -2977,6 +3003,119 @@ static grub_err_t ventoy_cmd_img_unhook_root(grub_extcmd_context_t ctxt, int arg
return
0
;
return
0
;
}
}
static
grub_err_t
ventoy_cmd_acpi_param
(
grub_extcmd_context_t
ctxt
,
int
argc
,
char
**
args
)
{
int
i
;
int
buflen
;
int
datalen
;
int
loclen
;
int
img_chunk_num
;
int
image_sector_size
;
char
cmd
[
64
];
ventoy_chain_head
*
chain
;
ventoy_img_chunk
*
chunk
;
ventoy_os_param
*
osparam
;
ventoy_image_location
*
location
;
ventoy_image_disk_region
*
region
;
struct
grub_acpi_table_header
*
acpi
;
(
void
)
ctxt
;
if
(
argc
!=
2
)
{
return
1
;
}
debug
(
"ventoy_cmd_acpi_param %s %s
\n
"
,
args
[
0
],
args
[
1
]);
chain
=
(
ventoy_chain_head
*
)(
ulong
)
grub_strtoul
(
args
[
0
],
NULL
,
16
);
if
(
!
chain
)
{
return
1
;
}
image_sector_size
=
(
int
)
grub_strtol
(
args
[
1
],
NULL
,
10
);
if
(
grub_memcmp
(
&
g_ventoy_guid
,
&
(
chain
->
os_param
.
guid
),
16
))
{
debug
(
"Invalid ventoy guid 0x%x
\n
"
,
chain
->
os_param
.
guid
.
data1
);
return
1
;
}
img_chunk_num
=
chain
->
img_chunk_num
;
loclen
=
sizeof
(
ventoy_image_location
)
+
(
img_chunk_num
-
1
)
*
sizeof
(
ventoy_image_disk_region
);
datalen
=
sizeof
(
ventoy_os_param
)
+
loclen
;
buflen
=
sizeof
(
struct
grub_acpi_table_header
)
+
datalen
;
acpi
=
grub_zalloc
(
buflen
);
if
(
!
acpi
)
{
return
1
;
}
/* Step1: Fill acpi table header */
grub_memcpy
(
acpi
->
signature
,
"VTOY"
,
4
);
acpi
->
length
=
buflen
;
acpi
->
revision
=
1
;
grub_memcpy
(
acpi
->
oemid
,
"VENTOY"
,
6
);
grub_memcpy
(
acpi
->
oemtable
,
"OSPARAMS"
,
8
);
acpi
->
oemrev
=
1
;
acpi
->
creator_id
[
0
]
=
1
;
acpi
->
creator_rev
=
1
;
/* Step2: Fill data */
osparam
=
(
ventoy_os_param
*
)(
acpi
+
1
);
grub_memcpy
(
osparam
,
&
chain
->
os_param
,
sizeof
(
ventoy_os_param
));
osparam
->
vtoy_img_location_addr
=
0
;
osparam
->
vtoy_img_location_len
=
loclen
;
osparam
->
chksum
=
0
;
osparam
->
chksum
=
0x100
-
grub_byte_checksum
(
osparam
,
sizeof
(
ventoy_os_param
));
location
=
(
ventoy_image_location
*
)(
osparam
+
1
);
grub_memcpy
(
&
location
->
guid
,
&
osparam
->
guid
,
sizeof
(
ventoy_guid
));
location
->
image_sector_size
=
image_sector_size
;
location
->
disk_sector_size
=
chain
->
disk_sector_size
;
location
->
region_count
=
img_chunk_num
;
region
=
location
->
regions
;
chunk
=
(
ventoy_img_chunk
*
)((
char
*
)
chain
+
chain
->
img_chunk_offset
);
if
(
512
==
image_sector_size
)
{
for
(
i
=
0
;
i
<
img_chunk_num
;
i
++
)
{
region
->
image_sector_count
=
chunk
->
disk_end_sector
-
chunk
->
disk_start_sector
+
1
;
region
->
image_start_sector
=
chunk
->
img_start_sector
*
4
;
region
->
disk_start_sector
=
chunk
->
disk_start_sector
;
region
++
;
chunk
++
;
}
}
else
{
for
(
i
=
0
;
i
<
img_chunk_num
;
i
++
)
{
region
->
image_sector_count
=
chunk
->
img_end_sector
-
chunk
->
img_start_sector
+
1
;
region
->
image_start_sector
=
chunk
->
img_start_sector
;
region
->
disk_start_sector
=
chunk
->
disk_start_sector
;
region
++
;
chunk
++
;
}
}
/* Step3: Fill acpi checksum */
acpi
->
checksum
=
0
;
acpi
->
checksum
=
0x100
-
grub_byte_checksum
(
acpi
,
acpi
->
length
);
/* load acpi table */
grub_snprintf
(
cmd
,
sizeof
(
cmd
),
"acpi mem:0x%lx:size:%d"
,
(
ulong
)
acpi
,
acpi
->
length
);
grub_script_execute_sourcecode
(
cmd
);
grub_free
(
acpi
);
VENTOY_CMD_RETURN
(
0
);
}
static
grub_err_t
ventoy_cmd_push_last_entry
(
grub_extcmd_context_t
ctxt
,
int
argc
,
char
**
args
)
static
grub_err_t
ventoy_cmd_push_last_entry
(
grub_extcmd_context_t
ctxt
,
int
argc
,
char
**
args
)
{
{
(
void
)
ctxt
;
(
void
)
ctxt
;
...
@@ -3081,7 +3220,10 @@ end:
...
@@ -3081,7 +3220,10 @@ end:
static
grub_err_t
ventoy_cmd_load_part_table
(
grub_extcmd_context_t
ctxt
,
int
argc
,
char
**
args
)
static
grub_err_t
ventoy_cmd_load_part_table
(
grub_extcmd_context_t
ctxt
,
int
argc
,
char
**
args
)
{
{
char
name
[
64
];
int
ret
;
grub_disk_t
disk
;
grub_disk_t
disk
;
grub_device_t
dev
;
(
void
)
argc
;
(
void
)
argc
;
(
void
)
ctxt
;
(
void
)
ctxt
;
...
@@ -3101,7 +3243,21 @@ static grub_err_t ventoy_cmd_load_part_table(grub_extcmd_context_t ctxt, int arg
...
@@ -3101,7 +3243,21 @@ static grub_err_t ventoy_cmd_load_part_table(grub_extcmd_context_t ctxt, int arg
grub_disk_read
(
disk
,
0
,
0
,
sizeof
(
ventoy_gpt_info
),
g_ventoy_part_info
);
grub_disk_read
(
disk
,
0
,
0
,
sizeof
(
ventoy_gpt_info
),
g_ventoy_part_info
);
grub_disk_close
(
disk
);
grub_disk_close
(
disk
);
grub_snprintf
(
name
,
sizeof
(
name
),
"%s,1"
,
args
[
0
]);
dev
=
grub_device_open
(
name
);
if
(
dev
)
{
/* make sure that we are running in a correct Ventoy device */
ret
=
ventoy_check_device
(
dev
);
grub_device_close
(
dev
);
if
(
ret
&
0x1000
)
{
grub_exit
();
}
}
return
0
;
return
0
;
}
}
...
@@ -3492,6 +3648,8 @@ static int ventoy_env_init(void)
...
@@ -3492,6 +3648,8 @@ static int ventoy_env_init(void)
g_grub_param
->
grub_env_printf
=
(
grub_env_printf_pf
)
grub_printf
;
g_grub_param
->
grub_env_printf
=
(
grub_env_printf_pf
)
grub_printf
;
grub_snprintf
(
buf
,
sizeof
(
buf
),
"%p"
,
g_grub_param
);
grub_snprintf
(
buf
,
sizeof
(
buf
),
"%p"
,
g_grub_param
);
grub_env_set
(
"env_param"
,
buf
);
grub_env_set
(
"env_param"
,
buf
);
grub_env_set
(
"ventoy_env_param"
,
buf
);
grub_env_export
(
"ventoy_env_param"
);
}
}
return
0
;
return
0
;
...
@@ -3517,6 +3675,8 @@ static cmd_para ventoy_cmds[] =
...
@@ -3517,6 +3675,8 @@ static cmd_para ventoy_cmds[] =
{
"vt_load_wimboot"
,
ventoy_cmd_load_wimboot
,
0
,
NULL
,
""
,
""
,
NULL
},
{
"vt_load_wimboot"
,
ventoy_cmd_load_wimboot
,
0
,
NULL
,
""
,
""
,
NULL
},
{
"vt_load_vhdboot"
,
ventoy_cmd_load_vhdboot
,
0
,
NULL
,
""
,
""
,
NULL
},
{
"vt_load_vhdboot"
,
ventoy_cmd_load_vhdboot
,
0
,
NULL
,
""
,
""
,
NULL
},
{
"vt_patch_vhdboot"
,
ventoy_cmd_patch_vhdboot
,
0
,
NULL
,
""
,
""
,
NULL
},
{
"vt_patch_vhdboot"
,
ventoy_cmd_patch_vhdboot
,
0
,
NULL
,
""
,
""
,
NULL
},
{
"vt_raw_chain_data"
,
ventoy_cmd_raw_chain_data
,
0
,
NULL
,
""
,
""
,
NULL
},
{
"vt_get_vtoy_type"
,
ventoy_cmd_get_vtoy_type
,
0
,
NULL
,
""
,
""
,
NULL
},
{
"vt_cpio_busybox64"
,
ventoy_cmd_cpio_busybox_64
,
0
,
NULL
,
""
,
""
,
NULL
},
{
"vt_cpio_busybox64"
,
ventoy_cmd_cpio_busybox_64
,
0
,
NULL
,
""
,
""
,
NULL
},
{
"vt_load_cpio"
,
ventoy_cmd_load_cpio
,
0
,
NULL
,
""
,
""
,
NULL
},
{
"vt_load_cpio"
,
ventoy_cmd_load_cpio
,
0
,
NULL
,
""
,
""
,
NULL
},
...
@@ -3597,6 +3757,7 @@ static cmd_para ventoy_cmds[] =
...
@@ -3597,6 +3757,7 @@ static cmd_para ventoy_cmds[] =
{
"vt_img_hook_root"
,
ventoy_cmd_img_hook_root
,
0
,
NULL
,
""
,
""
,
NULL
},
{
"vt_img_hook_root"
,
ventoy_cmd_img_hook_root
,
0
,
NULL
,
""
,
""
,
NULL
},
{
"vt_img_unhook_root"
,
ventoy_cmd_img_unhook_root
,
0
,
NULL
,
""
,
""
,
NULL
},
{
"vt_img_unhook_root"
,
ventoy_cmd_img_unhook_root
,
0
,
NULL
,
""
,
""
,
NULL
},
{
"vt_acpi_param"
,
ventoy_cmd_acpi_param
,
0
,
NULL
,
""
,
""
,
NULL
},
};
};
...
...
GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_def.h
View file @
d02f184a
...
@@ -152,11 +152,12 @@ typedef struct ventoy_iso9660_vd
...
@@ -152,11 +152,12 @@ typedef struct ventoy_iso9660_vd
#pragma pack()
#pragma pack()
#define img_type_iso 0
#define img_type_iso 0
#define img_type_wim 1
#define img_type_wim 1
#define img_type_efi 2
#define img_type_efi 2
#define img_type_img 3
#define img_type_img 3
#define img_type_vhd 4
#define img_type_vhd 4
#define img_type_vtoy 5
typedef
struct
img_info
typedef
struct
img_info
{
{
...
@@ -656,6 +657,41 @@ typedef struct ventoy_gpt_info
...
@@ -656,6 +657,41 @@ typedef struct ventoy_gpt_info
ventoy_gpt_head
Head
;
ventoy_gpt_head
Head
;
ventoy_gpt_part_tbl
PartTbl
[
128
];
ventoy_gpt_part_tbl
PartTbl
[
128
];
}
ventoy_gpt_info
;
}
ventoy_gpt_info
;
typedef
struct
vhd_footer_t
{
char
cookie
[
8
];
// Cookie
grub_uint32_t
features
;
// Features
grub_uint32_t
ffversion
;
// File format version
grub_uint32_t
dataoffset
;
// Data offset
grub_uint32_t
timestamp
;
// Timestamp
grub_uint32_t
creatorapp
;
// Creator application
grub_uint32_t
creatorver
;
// Creator version
grub_uint32_t
creatorhos
;
// Creator host OS
grub_uint32_t
origsize
;
// Original size
grub_uint32_t
currsize
;
// Current size
grub_uint32_t
diskgeom
;
// Disk geometry
grub_uint32_t
disktype
;
// Disk type
grub_uint32_t
checksum
;
// Checksum
grub_uint8_t
uniqueid
[
16
];
// Unique ID
grub_uint8_t
savedst
;
// Saved state
}
vhd_footer_t
;
#define VDI_IMAGE_FILE_INFO "<<< Oracle VM VirtualBox Disk Image >>>\n"
/** Image signature. */
#define VDI_IMAGE_SIGNATURE (0xbeda107f)
typedef
struct
VDIPREHEADER
{
/** Just text info about image type, for eyes only. */
char
szFileInfo
[
64
];
/** The image signature (VDI_IMAGE_SIGNATURE). */
grub_uint32_t
u32Signature
;
/** The image version (VDI_IMAGE_VERSION). */
grub_uint32_t
u32Version
;
}
VDIPREHEADER
,
*
PVDIPREHEADER
;
#pragma pack()
#pragma pack()
typedef
struct
ventoy_video_mode
typedef
struct
ventoy_video_mode
...
@@ -792,7 +828,7 @@ grub_err_t ventoy_cmd_collect_wim_patch(grub_extcmd_context_t ctxt, int argc, ch
...
@@ -792,7 +828,7 @@ grub_err_t ventoy_cmd_collect_wim_patch(grub_extcmd_context_t ctxt, int argc, ch
grub_err_t
ventoy_cmd_wim_patch_count
(
grub_extcmd_context_t
ctxt
,
int
argc
,
char
**
args
);
grub_err_t
ventoy_cmd_wim_patch_count
(
grub_extcmd_context_t
ctxt
,
int
argc
,
char
**
args
);
grub_err_t
ventoy_cmd_locate_wim_patch
(
grub_extcmd_context_t
ctxt
,
int
argc
,
char
**
args
);
grub_err_t
ventoy_cmd_locate_wim_patch
(
grub_extcmd_context_t
ctxt
,
int
argc
,
char
**
args
);
grub_err_t
ventoy_cmd_unix_chain_data
(
grub_extcmd_context_t
ctxt
,
int
argc
,
char
**
args
);
grub_err_t
ventoy_cmd_unix_chain_data
(
grub_extcmd_context_t
ctxt
,
int
argc
,
char
**
args
);
int
ventoy_get_disk_guid
(
const
char
*
filename
,
grub_uint8_t
*
guid
);
int
ventoy_get_disk_guid
(
const
char
*
filename
,
grub_uint8_t
*
guid
,
grub_uint8_t
*
signature
);
grub_err_t
ventoy_cmd_unix_reset
(
grub_extcmd_context_t
ctxt
,
int
argc
,
char
**
args
);
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_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_replace_ko
(
grub_extcmd_context_t
ctxt
,
int
argc
,
char
**
args
);
...
@@ -803,6 +839,8 @@ int ventoy_check_device(grub_device_t dev);
...
@@ -803,6 +839,8 @@ int ventoy_check_device(grub_device_t dev);
void
ventoy_debug_dump_guid
(
const
char
*
prefix
,
grub_uint8_t
*
guid
);
void
ventoy_debug_dump_guid
(
const
char
*
prefix
,
grub_uint8_t
*
guid
);
grub_err_t
ventoy_cmd_load_vhdboot
(
grub_extcmd_context_t
ctxt
,
int
argc
,
char
**
args
);
grub_err_t
ventoy_cmd_load_vhdboot
(
grub_extcmd_context_t
ctxt
,
int
argc
,
char
**
args
);
grub_err_t
ventoy_cmd_patch_vhdboot
(
grub_extcmd_context_t
ctxt
,
int
argc
,
char
**
args
);
grub_err_t
ventoy_cmd_patch_vhdboot
(
grub_extcmd_context_t
ctxt
,
int
argc
,
char
**
args
);
grub_err_t
ventoy_cmd_raw_chain_data
(
grub_extcmd_context_t
ctxt
,
int
argc
,
char
**
args
);
grub_err_t
ventoy_cmd_get_vtoy_type
(
grub_extcmd_context_t
ctxt
,
int
argc
,
char
**
args
);
#endif
/* __VENTOY_DEF_H__ */
#endif
/* __VENTOY_DEF_H__ */
GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_unix.c
View file @
d02f184a
...
@@ -194,6 +194,7 @@ static int ventoy_freebsd_append_conf(char *buf, const char *isopath)
...
@@ -194,6 +194,7 @@ static int ventoy_freebsd_append_conf(char *buf, const char *isopath)
grub_file_t
isofile
;
grub_file_t
isofile
;
char
uuid
[
64
]
=
{
0
};
char
uuid
[
64
]
=
{
0
};
ventoy_img_chunk
*
chunk
;
ventoy_img_chunk
*
chunk
;
grub_uint8_t
disk_sig
[
4
];
grub_uint8_t
disk_guid
[
16
];
grub_uint8_t
disk_guid
[
16
];
debug
(
"ventoy_freebsd_append_conf %s
\n
"
,
isopath
);
debug
(
"ventoy_freebsd_append_conf %s
\n
"
,
isopath
);
...
@@ -209,7 +210,7 @@ static int ventoy_freebsd_append_conf(char *buf, const char *isopath)
...
@@ -209,7 +210,7 @@ static int ventoy_freebsd_append_conf(char *buf, const char *isopath)
disk
=
isofile
->
device
->
disk
;
disk
=
isofile
->
device
->
disk
;
ventoy_get_disk_guid
(
isofile
->
name
,
disk_guid
);
ventoy_get_disk_guid
(
isofile
->
name
,
disk_guid
,
disk_sig
);
for
(
i
=
0
;
i
<
16
;
i
++
)
for
(
i
=
0
;
i
<
16
;
i
++
)
{
{
...
@@ -217,7 +218,8 @@ static int ventoy_freebsd_append_conf(char *buf, const char *isopath)
...
@@ -217,7 +218,8 @@ static int ventoy_freebsd_append_conf(char *buf, const char *isopath)
}
}
vtoy_ssprintf
(
buf
,
pos
,
"hint.ventoy.0.disksize=%llu
\n
"
,
(
ulonglong
)(
disk
->
total_sectors
*
(
1
<<
disk
->
log_sector_size
)));
vtoy_ssprintf
(
buf
,
pos
,
"hint.ventoy.0.disksize=%llu
\n
"
,
(
ulonglong
)(
disk
->
total_sectors
*
(
1
<<
disk
->
log_sector_size
)));
vtoy_ssprintf
(
buf
,
pos
,
"hint.ventoy.0.diskuuid=
\"
%s
\"\n
"
,
uuid
);
vtoy_ssprintf
(
buf
,
pos
,
"hint.ventoy.0.diskuuid=
\"
%s
\"\n
"
,
uuid
);
vtoy_ssprintf
(
buf
,
pos
,
"hint.ventoy.0.disksignature=%02x%02x%02x%02x
\n
"
,
disk_sig
[
0
],
disk_sig
[
1
],
disk_sig
[
2
],
disk_sig
[
3
]);
vtoy_ssprintf
(
buf
,
pos
,
"hint.ventoy.0.segnum=%u
\n
"
,
g_img_chunk_list
.
cur_chunk
);
vtoy_ssprintf
(
buf
,
pos
,
"hint.ventoy.0.segnum=%u
\n
"
,
g_img_chunk_list
.
cur_chunk
);
for
(
i
=
0
;
i
<
g_img_chunk_list
.
cur_chunk
;
i
++
)
for
(
i
=
0
;
i
<
g_img_chunk_list
.
cur_chunk
;
i
++
)
...
...
GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_vhd.c
View file @
d02f184a
...
@@ -273,3 +273,196 @@ grub_err_t ventoy_cmd_load_vhdboot(grub_extcmd_context_t ctxt, int argc, char **
...
@@ -273,3 +273,196 @@ grub_err_t ventoy_cmd_load_vhdboot(grub_extcmd_context_t ctxt, int argc, char **
return
0
;
return
0
;
}
}
grub_err_t
ventoy_cmd_get_vtoy_type
(
grub_extcmd_context_t
ctxt
,
int
argc
,
char
**
args
)
{
int
i
;
int
offset
=
-
1
;
grub_file_t
file
;
vhd_footer_t
vhdfoot
;
VDIPREHEADER
vdihdr
;
char
type
[
16
]
=
{
0
};
ventoy_mbr_head
mbr
;
ventoy_gpt_info
*
gpt
;
(
void
)
ctxt
;
if
(
argc
!=
4
)
{
return
0
;
}
file
=
grub_file_open
(
args
[
0
],
VENTOY_FILE_TYPE
);
if
(
!
file
)
{
debug
(
"Failed to open file %s
\n
"
,
args
[
0
]);
return
0
;
}
grub_snprintf
(
type
,
sizeof
(
type
),
"unknown"
);
grub_file_seek
(
file
,
file
->
size
-
512
);
grub_file_read
(
file
,
&
vhdfoot
,
sizeof
(
vhdfoot
));
if
(
grub_strncmp
(
vhdfoot
.
cookie
,
"conectix"
,
8
)
==
0
)
{
offset
=
0
;
grub_snprintf
(
type
,
sizeof
(
type
),
"vhd%u"
,
grub_swap_bytes32
(
vhdfoot
.
disktype
));
}
else
{
grub_file_seek
(
file
,
0
);
grub_file_read
(
file
,
&
vdihdr
,
sizeof
(
vdihdr
));
if
(
vdihdr
.
u32Signature
==
VDI_IMAGE_SIGNATURE
&&
grub_strncmp
(
vdihdr
.
szFileInfo
,
VDI_IMAGE_FILE_INFO
,
grub_strlen
(
VDI_IMAGE_FILE_INFO
))
==
0
)
{
offset
=
2
*
1048576
;
grub_snprintf
(
type
,
sizeof
(
type
),
"vdi"
);
}
else
{
offset
=
0
;
grub_snprintf
(
type
,
sizeof
(
type
),
"raw"
);
}
}
grub_env_set
(
args
[
1
],
type
);
debug
(
"<%s> vtoy type: <%s> "
,
args
[
0
],
type
);
if
(
offset
>=
0
)
{
grub_file_seek
(
file
,
offset
);
grub_file_read
(
file
,
&
mbr
,
sizeof
(
mbr
));
if
(
mbr
.
Byte55
!=
0x55
||
mbr
.
ByteAA
!=
0xAA
)
{
grub_env_set
(
args
[
1
],
"unknown"
);
debug
(
"invalid mbr signature: 0x%x 0x%x
\n
"
,
mbr
.
Byte55
,
mbr
.
ByteAA
);
goto
end
;
}
if
(
mbr
.
PartTbl
[
0
].
FsFlag
==
0xEE
)
{
grub_env_set
(
args
[
2
],
"gpt"
);
debug
(
"part type: %s
\n
"
,
"GPT"
);
gpt
=
grub_zalloc
(
sizeof
(
ventoy_gpt_info
));
if
(
gpt
)
{
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
)
{
debug
(
"part %d is grub_bios part
\n
"
,
i
);
grub_env_set
(
args
[
3
],
"1"
);
break
;
}
else
if
(
gpt
->
PartTbl
[
i
].
LastLBA
==
0
)
{
break
;
}
}
grub_free
(
gpt
);
}
}
else
{
grub_env_set
(
args
[
2
],
"mbr"
);
debug
(
"part type: %s
\n
"
,
"MBR"
);
}
}
else
{
debug
(
"part type: %s
\n
"
,
"xxx"
);
}
end:
grub_file_close
(
file
);
VENTOY_CMD_RETURN
(
GRUB_ERR_NONE
);
}
grub_err_t
ventoy_cmd_raw_chain_data
(
grub_extcmd_context_t
ctxt
,
int
argc
,
char
**
args
)
{
grub_uint32_t
size
=
0
;
grub_uint32_t
img_chunk_size
=
0
;
grub_file_t
file
;
grub_disk_t
disk
;
const
char
*
pLastChain
=
NULL
;
ventoy_chain_head
*
chain
;
char
envbuf
[
64
];
(
void
)
ctxt
;
(
void
)
argc
;
if
(
NULL
==
g_img_chunk_list
.
chunk
)
{
grub_printf
(
"ventoy not ready
\n
"
);
return
1
;
}
file
=
ventoy_grub_file_open
(
VENTOY_FILE_TYPE
,
"%s"
,
args
[
0
]);
if
(
!
file
)
{
return
1
;
}
img_chunk_size
=
g_img_chunk_list
.
cur_chunk
*
sizeof
(
ventoy_img_chunk
);
size
=
sizeof
(
ventoy_chain_head
)
+
img_chunk_size
;
pLastChain
=
grub_env_get
(
"vtoy_chain_mem_addr"
);
if
(
pLastChain
)
{
chain
=
(
ventoy_chain_head
*
)
grub_strtoul
(
pLastChain
,
NULL
,
16
);
if
(
chain
)
{
debug
(
"free last chain memory %p
\n
"
,
chain
);
grub_free
(
chain
);
}
}
chain
=
grub_malloc
(
size
);
if
(
!
chain
)
{
grub_printf
(
"Failed to alloc chain memory size %u
\n
"
,
size
);
grub_file_close
(
file
);
return
1
;
}
grub_snprintf
(
envbuf
,
sizeof
(
envbuf
),
"0x%lx"
,
(
unsigned
long
)
chain
);
grub_env_set
(
"vtoy_chain_mem_addr"
,
envbuf
);
grub_snprintf
(
envbuf
,
sizeof
(
envbuf
),
"%u"
,
size
);
grub_env_set
(
"vtoy_chain_mem_size"
,
envbuf
);
grub_env_export
(
"vtoy_chain_mem_addr"
);
grub_env_export
(
"vtoy_chain_mem_size"
);
grub_memset
(
chain
,
0
,
sizeof
(
ventoy_chain_head
));
/* part 1: os parameter */
g_ventoy_chain_type
=
ventoy_chain_linux
;
ventoy_fill_os_param
(
file
,
&
(
chain
->
os_param
));
/* part 2: chain head */
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
;
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_read
(
file
,
chain
->
boot_catalog_sector
,
512
);
grub_file_close
(
file
);
VENTOY_CMD_RETURN
(
GRUB_ERR_NONE
);
}
GRUB2/MOD_SRC/grub-2.04/include/grub/ventoy.h
View file @
d02f184a
...
@@ -71,7 +71,7 @@ typedef struct ventoy_image_location
...
@@ -71,7 +71,7 @@ typedef struct ventoy_image_location
{
{
ventoy_guid
guid
;
ventoy_guid
guid
;
/* image sector size,
currently this value is always
2048 */
/* image sector size, 2048
/512
*/
grub_uint32_t
image_sector_size
;
grub_uint32_t
image_sector_size
;
/* disk sector size, normally the value is 512 */
/* disk sector size, normally the value is 512 */
...
@@ -125,7 +125,9 @@ typedef struct ventoy_os_param
...
@@ -125,7 +125,9 @@ typedef struct ventoy_os_param
*/
*/
grub_uint8_t
vtoy_reserved
[
32
];
// Internal use by ventoy
grub_uint8_t
vtoy_reserved
[
32
];
// Internal use by ventoy
grub_uint8_t
reserved
[
31
];
grub_uint8_t
vtoy_disk_signature
[
4
];
grub_uint8_t
reserved
[
27
];
}
ventoy_os_param
;
}
ventoy_os_param
;
...
...
IMG/cpio/ventoy/hook/manjaro/ventoy-disk.sh
0 → 100644
View file @
d02f184a
#!/ventoy/busybox/sh
#************************************************************************************
# Copyright (c) 2020, longpanda <admin@ventoy.net>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation; either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, see <http://www.gnu.org/licenses/>.
#
#************************************************************************************
.
/ventoy/hook/ventoy-hook-lib.sh
vtlog
"#########
$0
$*
############"
if
is_ventoy_hook_finished
;
then
exit
0
fi
wait_for_usb_disk_ready
vtdiskname
=
$(
get_ventoy_disk_name
)
if
[
"
$vtdiskname
"
=
"unknown"
]
;
then
vtlog
"ventoy disk not found"
exit
0
fi
ventoy_udev_disk_common_hook
"
${
vtdiskname
#/dev/
}
2"
"noreplace"
blkdev_num
=
$(
$VTOY_PATH
/tool/dmsetup
ls
|
grep
ventoy |
sed
's/.*(\([0-9][0-9]*\),.*\([0-9][0-9]*\).*/\1:\2/'
)
vtDM
=
$(
ventoy_find_dm_id
${
blkdev_num
}
)
vtlog
"blkdev_num=
$blkdev_num
vtDM=
$vtDM
..."
while
[
-n
"Y"
]
;
do
if
[
-b
/dev/
$vtDM
]
;
then
break
else
sleep
0.3
fi
done
if
[
-n
"
$1
"
]
;
then
vtlog
"ln -s /dev/
$vtDM
$1
"
ln
-s
/dev/
$vtDM
"
$1
"
else
vtLABEL
=
$(
$BUSYBOX_PATH
/blkid /dev/
$vtDM
|
$SED
's/.*LABEL="\([^"]*\)".*/\1/'
)
vtlog
"vtLABEL is
$vtLABEL
"
if
[
-z
"
$vtLABEL
"
]
;
then
vtLABEL
=
$(
$SED
"s/.*label=
\(
[^ ]*
\)
/
\1
/"
/proc/cmdline
)
vtlog
"vtLABEL is
$vtLABEL
from cmdline"
fi
ln
-s
/dev/
$vtDM
"/dev/disk/by-label/
$vtLABEL
"
fi
# OK finish
set_ventoy_hook_finish
IMG/cpio/ventoy/hook/manjaro/ventoy-hook.sh
View file @
d02f184a
...
@@ -28,8 +28,22 @@ else
...
@@ -28,8 +28,22 @@ else
$CAT
$VTOY_PATH
/hook/default/13-dm-disk.rules
>
"
$DISTRO_UDEV_DIR
/13-dm-disk.rules"
$CAT
$VTOY_PATH
/hook/default/13-dm-disk.rules
>
"
$DISTRO_UDEV_DIR
/13-dm-disk.rules"
fi
fi
if
$GREP
-q
'^"$mount_handler"'
/init
;
then
if
$GREP
-q
'^mount_setup$'
init
;
then
echo
'use mount_handler ...'
>>
$VTLOG
vthookfile
=
/hooks/archiso
if
[
-e
/hooks/miso
]
;
then
vthookfile
=
/hooks/miso
$SED
"/^
\"\$
mount_handler
\"
/i
\
$BUSYBOX_PATH
/sh
$VTOY_PATH
/hook/manjaro/ventoy-disk.sh
\"\$
misodevice
\"
"
-i
/init
else
$SED
"/^
\"\$
mount_handler
\"
/i
\
$BUSYBOX_PATH
/sh
$VTOY_PATH
/hook/manjaro/ventoy-disk.sh
\"\$
archisodevice
\"
"
-i
/init
fi
if
[
-f
$vthookfile
]
;
then
$SED
'/while ! poll_device "${dev}"/a\ if /ventoy/busybox/sh /ventoy/hook/manjaro/ventoy-timeout.sh ${dev}; then break; fi'
-i
$vthookfile
fi
elif
$GREP
-q
'^mount_setup$'
init
;
then
echo
"Here use notify ..."
>>
$VTLOG
echo
"Here use notify ..."
>>
$VTLOG
ventoy_set_inotify_script manjaro/ventoy-inotifyd-hook.sh
ventoy_set_inotify_script manjaro/ventoy-inotifyd-hook.sh
...
...
IMG/cpio/ventoy/hook/ventoy-hook-lib.sh
View file @
d02f184a
...
@@ -87,7 +87,13 @@ wait_for_usb_disk_ready() {
...
@@ -87,7 +87,13 @@ wait_for_usb_disk_ready() {
usb_disk
=
$(
get_ventoy_disk_name
)
usb_disk
=
$(
get_ventoy_disk_name
)
vtlog
"wait_for_usb_disk_ready
$usb_disk
..."
vtlog
"wait_for_usb_disk_ready
$usb_disk
..."
if
[
-e
"
${
usb_disk
}
2"
]
;
then
if
echo
$usb_disk
|
$EGREP
-q
"nvme|mmc"
;
then
vtpart2
=
${
usb_disk
}
p2
else
vtpart2
=
${
usb_disk
}
2
fi
if
[
-e
"
${
vtpart2
}
"
]
;
then
vtlog
"wait_for_usb_disk_ready
$usb_disk
finish"
vtlog
"wait_for_usb_disk_ready
$usb_disk
finish"
break
break
else
else
...
@@ -105,7 +111,13 @@ is_ventoy_disk() {
...
@@ -105,7 +111,13 @@ is_ventoy_disk() {
}
}
not_ventoy_disk
()
{
not_ventoy_disk
()
{
if
$VTOY_PATH
/tool/vtoydump
-f
$VTOY_PATH
/ventoy_os_param
-c
"
$1
"
;
then
if
echo
$1
|
$EGREP
-q
"nvme.*p
$|
mmc.*p$"
;
then
vtDiskName
=
${
1
:0:-1
}
else
vtDiskName
=
$1
fi
if
$VTOY_PATH
/tool/vtoydump
-f
$VTOY_PATH
/ventoy_os_param
-c
"
$vtDiskName
"
;
then
$BUSYBOX_PATH
/false
$BUSYBOX_PATH
/false
else
else
$BUSYBOX_PATH
/true
$BUSYBOX_PATH
/true
...
@@ -463,9 +475,12 @@ ventoy_create_persistent_link() {
...
@@ -463,9 +475,12 @@ ventoy_create_persistent_link() {
fi
fi
}
}
ventoy_udev_disk_common_hook
()
{
ventoy_udev_disk_common_hook
()
{
if
echo
$1
|
$EGREP
-q
"nvme.*p[0-9]
$|
mmc.*p[0-9]$"
;
then
VTDISK
=
"
${
1
:0:-1
}
"
VTDISK
=
"
${
1
:0:-2
}
"
else
VTDISK
=
"
${
1
:0:-1
}
"
fi
if
[
-e
/vtoy/vtoy
]
;
then
if
[
-e
/vtoy/vtoy
]
;
then
VTRWMOD
=
""
VTRWMOD
=
""
...
@@ -533,8 +548,14 @@ is_inotify_ventoy_part() {
...
@@ -533,8 +548,14 @@ is_inotify_ventoy_part() {
if
echo
$1
|
$GREP
-q
"2$"
;
then
if
echo
$1
|
$GREP
-q
"2$"
;
then
if
!
[
-e
/sys/block/
$1
]
;
then
if
!
[
-e
/sys/block/
$1
]
;
then
if
[
-e
/sys/class/block/
$1
]
;
then
if
[
-e
/sys/class/block/
$1
]
;
then
if
[
-e
/dev/
${
1
:0:-1
}
]
;
then
if
echo
$1
|
$EGREP
-q
"nvme|mmc"
;
then
$VTOY_PATH
/tool/vtoydump
-f
$VTOY_PATH
/ventoy_os_param
-c
${
1
:0:-1
}
vtShortName
=
${
1
:0:-2
}
else
vtShortName
=
${
1
:0:-1
}
fi
if
[
-e
/dev/
$vtShortName
]
;
then
$VTOY_PATH
/tool/vtoydump
-f
$VTOY_PATH
/ventoy_os_param
-c
$vtShortName
return
return
fi
fi
fi
fi
...
...
INSTALL/EFI/BOOT/grubx64_real.efi
View file @
d02f184a
No preview for this file type
INSTALL/grub/grub.cfg
View file @
d02f184a
...
@@ -252,7 +252,11 @@ function distro_specify_initrd_file_phase2 {
...
@@ -252,7 +252,11 @@ function distro_specify_initrd_file_phase2 {
if [ "$grub_platform" != "pc" ]; then
if [ "$grub_platform" != "pc" ]; then
vt_add_replace_file 0 "minimal\\x86_64\\rootfs.xz"
vt_add_replace_file 0 "minimal\\x86_64\\rootfs.xz"
fi
fi
elif [ -f (loop)/arch/boot/x86_64/archiso.img ]; then
vt_linux_specify_initrd_file /arch/boot/x86_64/archiso.img
if [ "$grub_platform" != "pc" ]; then
vt_add_replace_file 0 "EFI\\archiso\\archiso.img"
fi
fi
fi
}
}
...
@@ -440,6 +444,7 @@ function uefi_windows_menu_func {
...
@@ -440,6 +444,7 @@ function uefi_windows_menu_func {
}
}
function uefi_linux_menu_func {
function uefi_linux_menu_func {
if [ "$ventoy_compatible" = "NO" ]; then
if [ "$ventoy_compatible" = "NO" ]; then
if [ "$ventoy_fs_probe" = "udf" ]; then
if [ "$ventoy_fs_probe" = "udf" ]; then
...
@@ -493,6 +498,12 @@ function uefi_linux_menu_func {
...
@@ -493,6 +498,12 @@ function uefi_linux_menu_func {
elif [ -f (loop)/boot/initramfs_x86_64.img ]; then
elif [ -f (loop)/boot/initramfs_x86_64.img ]; then
vt_add_replace_file $vtindex "boot\\initramfs_x86_64.img"
vt_add_replace_file $vtindex "boot\\initramfs_x86_64.img"
fi
fi
elif [ -d (loop)/parabola ]; then
if [ -f (loop)/parabola/boot/x86_64/parabola.img ]; then
vt_add_replace_file $vtindex "EFI\\parabola\\parabola.img"
elif [ -f (loop)/boot/initramfs_x86_64.img ]; then
vt_add_replace_file $vtindex "boot\\initramfs_x86_64.img"
fi
elif [ -f (loop)/EFI/BOOT/initrd.gz ]; then
elif [ -f (loop)/EFI/BOOT/initrd.gz ]; then
vt_add_replace_file $vtindex "EFI\\BOOT\\initrd.gz"
vt_add_replace_file $vtindex "EFI\\BOOT\\initrd.gz"
elif [ -f (loop)/loader/entries/thinstation.conf ]; then
elif [ -f (loop)/loader/entries/thinstation.conf ]; then
...
@@ -508,7 +519,7 @@ function uefi_linux_menu_func {
...
@@ -508,7 +519,7 @@ function uefi_linux_menu_func {
fi
fi
elif [ -d (loop)/EFI/BOOT/entries ]; then
elif [ -d (loop)/EFI/BOOT/entries ]; then
if [ -f (loop)/parabola/boot/x86_64/parabolaiso.img ]; then
if [ -f (loop)/parabola/boot/x86_64/parabolaiso.img ]; then
vt_add_replace_file 0 "EFI\\parabolaiso\\parabolaiso.img"
vt_add_replace_file 0 "EFI\\parabolaiso\\parabolaiso.img"
fi
fi
elif [ -e (loop)/syslinux/alt0/full.cz ]; then
elif [ -e (loop)/syslinux/alt0/full.cz ]; then
vt_add_replace_file 0 "EFI\\BOOT\\full.cz"
vt_add_replace_file 0 "EFI\\BOOT\\full.cz"
...
@@ -646,9 +657,7 @@ function legacy_windows_menu_func {
...
@@ -646,9 +657,7 @@ function legacy_windows_menu_func {
ventoy_debug_pause
ventoy_debug_pause
if [ -n "$vtoy_chain_mem_addr" ]; then
if [ -n "$vtoy_chain_mem_addr" ]; then
linux16 $vtoy_path/ipxe.krn ${vtdebug_flag} ibft mem:${vtoy_chain_mem_addr}:size:${vtoy_chain_mem_size}
linux16 $vtoy_path/ipxe.krn ${vtdebug_flag} ibft mem:${vtoy_chain_mem_addr}:size:${vtoy_chain_mem_size}
set gfxmode=1920x1080,1366x768,1024x768,800x600,auto
terminal_output gfxterm
boot
boot
else
else
echo "chain empty failed"
echo "chain empty failed"
...
@@ -900,9 +909,7 @@ function wim_common_menuentry {
...
@@ -900,9 +909,7 @@ function wim_common_menuentry {
if [ -n "$vtoy_chain_mem_addr" ]; then
if [ -n "$vtoy_chain_mem_addr" ]; then
if [ "$grub_platform" = "pc" ]; then
if [ "$grub_platform" = "pc" ]; then
linux16 $vtoy_path/ipxe.krn ${vtdebug_flag} mem:${vtoy_chain_mem_addr}:size:${vtoy_chain_mem_size}
linux16 $vtoy_path/ipxe.krn ${vtdebug_flag} mem:${vtoy_chain_mem_addr}:size:${vtoy_chain_mem_size}
set gfxmode=1920x1080,1366x768,1024x768,800x600,auto
terminal_output gfxterm
else
else
ventoy_cli_console
ventoy_cli_console
chainloader ${vtoy_path}/ventoy_x64.efi env_param=${env_param} isoefi=${LoadIsoEfiDriver} ${vtdebug_flag} mem:${vtoy_chain_mem_addr}:size:${vtoy_chain_mem_size}
chainloader ${vtoy_path}/ventoy_x64.efi env_param=${env_param} isoefi=${LoadIsoEfiDriver} ${vtdebug_flag} mem:${vtoy_chain_mem_addr}:size:${vtoy_chain_mem_size}
...
@@ -945,7 +952,6 @@ function efi_unsupport_menuentry {
...
@@ -945,7 +952,6 @@ function efi_unsupport_menuentry {
common_unsupport_menuentry
common_unsupport_menuentry
}
}
function vhd_common_menuentry {
function vhd_common_menuentry {
if [ "$VTOY_VHD_NO_WARNING" != "1" ]; then
if [ "$VTOY_VHD_NO_WARNING" != "1" ]; then
...
@@ -959,17 +965,14 @@ function vhd_common_menuentry {
...
@@ -959,17 +965,14 @@ function vhd_common_menuentry {
fi
fi
vt_chosen_img_path vt_chosen_path vt_chosen_size
vt_chosen_img_path vt_chosen_path vt_chosen_size
vt_patch_vhdboot $
{
vt_chosen_path
}
vt_patch_vhdboot $vt_chosen_path
ventoy_debug_pause
ventoy_debug_pause
if [ -n "$vtoy_vhd_buf_addr" ]; then
if [ -n "$vtoy_vhd_buf_addr" ]; then
if [ "$grub_platform" = "pc" ]; then
if [ "$grub_platform" = "pc" ]; then
linux16 $vtoy_path/memdisk iso raw
linux16 $vtoy_path/memdisk iso raw
initrd16 mem:${vtoy_vhd_buf_addr}:size:${vtoy_vhd_buf_size}
initrd16 mem:${vtoy_vhd_buf_addr}:size:${vtoy_vhd_buf_size}
set gfxmode=1920x1080,1366x768,1024x768,800x600,auto
terminal_output gfxterm
boot
boot
else
else
ventoy_cli_console
ventoy_cli_console
...
@@ -978,7 +981,7 @@ function vhd_common_menuentry {
...
@@ -978,7 +981,7 @@ function vhd_common_menuentry {
ventoy_gui_console
ventoy_gui_console
fi
fi
else
else
echo "
Failed to boot vhd file
"
echo "
Please put the right ventoy_vhdboot.img file to the 1st partition
"
ventoy_pause
ventoy_pause
fi
fi
}
}
...
@@ -987,6 +990,68 @@ function vhd_unsupport_menuentry {
...
@@ -987,6 +990,68 @@ function vhd_unsupport_menuentry {
common_unsupport_menuentry
common_unsupport_menuentry
}
}
function vtoyboot_common_func {
set efigrubpart=0
set vtoysupport=0
vt_get_vtoy_type ${1} vtoytype parttype efigrubpart
if vt_str_begin $vtoytype vhd; then
set vtoysupport=1
elif [ "$vtoytype" = "raw" ]; then
set vtoysupport=1
fi
if [ $vtoysupport -eq 1 ]; then
if [ "$grub_platform" = "pc" ]; then
if [ "$parttype" = "gpt" -a $efigrubpart -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
echo "The OS in the vdisk was created in Legacy BIOS mode, but current is UEFI mode."
echo "虚拟磁盘内的系统是在Legacy BIOS模式下创建的,而当前系统是UEFI模式,可能无法正常启动。"
ventoy_pause
fi
fi
vt_img_sector ${1}
vt_raw_chain_data ${1}
ventoy_debug_pause
if [ -n "$vtoy_chain_mem_addr" ]; then
if [ "$grub_platform" = "pc" ]; then
vt_acpi_param ${vtoy_chain_mem_addr} 512
linux16 $vtoy_path/ipxe.krn ${vtdebug_flag} sector512 mem:${vtoy_chain_mem_addr}:size:${vtoy_chain_mem_size}
boot
else
ventoy_cli_console
chainloader ${vtoy_path}/ventoy_x64.efi sector512 env_param=${ventoy_env_param} ${vtdebug_flag} mem:${vtoy_chain_mem_addr}:size:${vtoy_chain_mem_size}
boot
ventoy_gui_console
fi
else
echo "chain empty failed!"
ventoy_pause
fi
else
echo "Unsupported vtoy type $vtoytype"
ventoy_pause
fi
}
function vtoy_common_menuentry {
vt_chosen_img_path vt_chosen_path vt_chosen_size
vtoyboot_common_func ${vtoy_iso_part}${vt_chosen_path}
}
function vtoy_unsupport_menuentry {
common_unsupport_menuentry
}
#
#
#============================================================#
#============================================================#
# IMG file boot process #
# IMG file boot process #
...
@@ -1228,10 +1293,11 @@ function img_common_menuentry {
...
@@ -1228,10 +1293,11 @@ function img_common_menuentry {
ventoy_img_memtest86
ventoy_img_memtest86
fi
fi
else
else
vt_linux_chain_data ${vtoy_iso_part}${vt_chosen_path}
if [ "$grub_platform" = "pc" ]; then
if [ "$grub_platform" = "pc" ]; then
img_unsupport_tip
linux16 $vtoy_path/ipxe.krn ${vtdebug_flag} sector512 mem:${vtoy_chain_mem_addr}:size:${vtoy_chain_mem_size}
else
boot
vt_linux_chain_data ${vtoy_iso_part}${vt_chosen_path}
else
chainloader ${vtoy_path}/ventoy_x64.efi sector512 env_param=${env_param} isoefi=${LoadIsoEfiDriver} FirstTry=${FirstTryBootFile} ${vtdebug_flag} mem:${vtoy_chain_mem_addr}:size:${vtoy_chain_mem_size}
chainloader ${vtoy_path}/ventoy_x64.efi sector512 env_param=${env_param} isoefi=${LoadIsoEfiDriver} FirstTry=${FirstTryBootFile} ${vtdebug_flag} mem:${vtoy_chain_mem_addr}:size:${vtoy_chain_mem_size}
boot
boot
fi
fi
...
@@ -1355,6 +1421,7 @@ else
...
@@ -1355,6 +1421,7 @@ else
set gfxpayload=keep
set gfxpayload=keep
fi
fi
if [ "$vtoy_display_mode" = "CLI" ]; then
if [ "$vtoy_display_mode" = "CLI" ]; then
terminal_output console
terminal_output console
elif [ "$vtoy_display_mode" = "serial" ]; then
elif [ "$vtoy_display_mode" = "serial" ]; then
...
@@ -1382,14 +1449,14 @@ fi
...
@@ -1382,14 +1449,14 @@ fi
export theme
export theme
export gfxmode
export gfxmode
export vtoydev
export vtoydev
export vtoy_path
export vtdebug_flag
export vtoy_iso_part
export vtoy_iso_part
export vtoy_efi_part
export vtoy_efi_part
export VENTOY_VERSION
export VENTOY_VERSION
export VTOY_CUR_VIDEO_MODE
export VTOY_CUR_VIDEO_MODE
#colect all image files (iso files)
#colect all image files (iso files)
set ventoy_img_count=0
set ventoy_img_count=0
vt_list_img $vtoy_iso_part ventoy_img_count
vt_list_img $vtoy_iso_part ventoy_img_count
...
...
INSTALL/grub/i386-pc/core.img
View file @
d02f184a
No preview for this file type
INSTALL/grub/i386-pc/moddep.lst
View file @
d02f184a
...
@@ -122,7 +122,7 @@ crypto:
...
@@ -122,7 +122,7 @@ crypto:
part_bsd: part_msdos
part_bsd: part_msdos
cs5536: pci
cs5536: pci
biosdisk:
biosdisk:
ventoy: ext2 fshelp font crypto exfat udf extcmd normal video gcry_sha1 relocator iso9660
ventoy: ext2 fshelp font crypto exfat udf extcmd normal video gcry_sha1 relocator iso9660
acpi
lsapm:
lsapm:
gcry_sha512: crypto
gcry_sha512: crypto
password: crypto normal
password: crypto normal
...
...
INSTALL/grub/x86_64-efi/moddep.lst
View file @
d02f184a
...
@@ -119,7 +119,7 @@ ehci: cs5536 usb boot
...
@@ -119,7 +119,7 @@ ehci: cs5536 usb boot
crypto:
crypto:
part_bsd: part_msdos
part_bsd: part_msdos
cs5536:
cs5536:
ventoy: ext2 fshelp crypto
font
exfat udf extcmd normal video gcry_sha1 iso9660
ventoy: ext2 fshelp
font
crypto exfat udf extcmd normal video gcry_sha1 iso9660
gcry_sha512: crypto
gcry_sha512: crypto
password: crypto normal
password: crypto normal
fshelp:
fshelp:
...
...
INSTALL/grub/x86_64-efi/normal.mod
View file @
d02f184a
No preview for this file type
IPXE/ipxe_mod_code/ipxe-3fe683e/src/arch/x86/core/ventoy_vdisk.c
View file @
d02f184a
...
@@ -25,6 +25,7 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
...
@@ -25,6 +25,7 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
#include <ventoy.h>
#include <ventoy.h>
int
g_debug
=
0
;
int
g_debug
=
0
;
int
g_hddmode
=
0
;
char
*
g_cmdline_copy
;
char
*
g_cmdline_copy
;
void
*
g_initrd_addr
;
void
*
g_initrd_addr
;
size_t
g_initrd_len
;
size_t
g_initrd_len
;
...
@@ -55,6 +56,40 @@ uint64 g_fixup_iso9660_secover_tot_secs = 0;
...
@@ -55,6 +56,40 @@ uint64 g_fixup_iso9660_secover_tot_secs = 0;
static
struct
int13_disk_address
__bss16
(
ventoy_address
);
static
struct
int13_disk_address
__bss16
(
ventoy_address
);
#define ventoy_address __use_data16 ( ventoy_address )
#define ventoy_address __use_data16 ( ventoy_address )
static
uint64_t
ventoy_remap_lba_hdd
(
uint64_t
lba
,
uint32_t
*
count
)
{
uint32_t
i
;
uint32_t
max_sectors
;
ventoy_img_chunk
*
cur
;
if
((
NULL
==
g_cur_chunk
)
||
(
lba
<
g_cur_chunk
->
img_start_sector
)
||
(
lba
>
g_cur_chunk
->
img_end_sector
))
{
g_cur_chunk
=
NULL
;
for
(
i
=
0
;
i
<
g_img_chunk_num
;
i
++
)
{
cur
=
g_chunk
+
i
;
if
(
lba
>=
cur
->
img_start_sector
&&
lba
<=
cur
->
img_end_sector
)
{
g_cur_chunk
=
cur
;
break
;
}
}
}
if
(
g_cur_chunk
)
{
max_sectors
=
g_cur_chunk
->
img_end_sector
-
lba
+
1
;
if
(
*
count
>
max_sectors
)
{
*
count
=
max_sectors
;
}
return
g_cur_chunk
->
disk_start_sector
+
(
lba
-
g_cur_chunk
->
img_start_sector
);
}
return
lba
;
}
static
uint64_t
ventoy_remap_lba
(
uint64_t
lba
,
uint32_t
*
count
)
static
uint64_t
ventoy_remap_lba
(
uint64_t
lba
,
uint32_t
*
count
)
{
{
uint32_t
i
;
uint32_t
i
;
...
@@ -92,6 +127,72 @@ static uint64_t ventoy_remap_lba(uint64_t lba, uint32_t *count)
...
@@ -92,6 +127,72 @@ static uint64_t ventoy_remap_lba(uint64_t lba, uint32_t *count)
return
lba
;
return
lba
;
}
}
static
int
ventoy_vdisk_read_real_hdd
(
uint64_t
lba
,
unsigned
int
count
,
unsigned
long
buffer
)
{
uint32_t
left
=
0
;
uint32_t
readcount
=
0
;
uint32_t
tmpcount
=
0
;
uint16_t
status
=
0
;
uint64_t
curlba
=
0
;
uint64_t
maplba
=
0
;
unsigned
long
phyaddr
;
curlba
=
lba
;
left
=
count
;
#if VTOY_DEBUG
printf
(
"ventoy_vdisk_read_real_hdd: %llu %u
\n
"
,
lba
,
count
);
#endif
while
(
left
>
0
)
{
readcount
=
left
;
maplba
=
ventoy_remap_lba_hdd
(
curlba
,
&
readcount
);
tmpcount
=
readcount
;
phyaddr
=
user_to_phys
(
buffer
,
0
);
while
(
tmpcount
>
0
)
{
/* Use INT 13, 42 to read the data from real disk */
ventoy_address
.
lba
=
maplba
;
ventoy_address
.
buffer
.
segment
=
(
uint16_t
)(
phyaddr
>>
4
);
ventoy_address
.
buffer
.
offset
=
(
uint16_t
)(
phyaddr
&
0x0F
);
if
(
tmpcount
>=
64
)
/* max sectors per transmit */
{
ventoy_address
.
count
=
64
;
tmpcount
-=
64
;
maplba
+=
64
;
phyaddr
+=
32768
;
}
else
{
ventoy_address
.
count
=
tmpcount
;
tmpcount
=
0
;
}
__asm__
__volatile__
(
REAL_CODE
(
"stc
\n\t
"
"sti
\n\t
"
"int $0x13
\n\t
"
"sti
\n\t
"
/* BIOS bugs */
"jc 1f
\n\t
"
"xorw %%ax, %%ax
\n\t
"
"
\n
1:
\n\t
"
)
:
"=a"
(
status
)
:
"a"
(
0x4200
),
"d"
(
VENTOY_BIOS_FAKE_DRIVE
),
"S"
(
__from_data16
(
&
ventoy_address
)
)
);
}
curlba
+=
readcount
;
left
-=
readcount
;
buffer
+=
(
readcount
*
512
);
}
return
0
;
}
static
int
ventoy_vdisk_read_real
(
uint64_t
lba
,
unsigned
int
count
,
unsigned
long
buffer
)
static
int
ventoy_vdisk_read_real
(
uint64_t
lba
,
unsigned
int
count
,
unsigned
long
buffer
)
{
{
uint32_t
i
=
0
;
uint32_t
i
=
0
;
...
@@ -297,6 +398,13 @@ int ventoy_vdisk_read(struct san_device *sandev, uint64_t lba, unsigned int coun
...
@@ -297,6 +398,13 @@ int ventoy_vdisk_read(struct san_device *sandev, uint64_t lba, unsigned int coun
ix86
=
(
struct
i386_all_regs
*
)
sandev
->
x86_regptr
;
ix86
=
(
struct
i386_all_regs
*
)
sandev
->
x86_regptr
;
if
(
g_hddmode
)
{
ventoy_vdisk_read_real_hdd
(
lba
,
count
,
buffer
);
ix86
->
regs
.
dl
=
sandev
->
drive
;
return
0
;
}
/* Workaround for SSTR PE loader error */
/* Workaround for SSTR PE loader error */
if
(
g_fixup_iso9660_secover_start
)
if
(
g_fixup_iso9660_secover_start
)
{
{
...
@@ -441,9 +549,12 @@ static void ventoy_dump_chain(ventoy_chain_head *chain)
...
@@ -441,9 +549,12 @@ static void ventoy_dump_chain(ventoy_chain_head *chain)
uint32_t
i
=
0
;
uint32_t
i
=
0
;
uint8_t
chksum
=
0
;
uint8_t
chksum
=
0
;
uint8_t
*
guid
;
uint8_t
*
guid
;
uint8_t
*
sig
;
uint8_t
*
vtoy_reserve
;
uint8_t
*
vtoy_reserve
;
guid
=
chain
->
os_param
.
vtoy_disk_guid
;
guid
=
chain
->
os_param
.
vtoy_disk_guid
;
sig
=
chain
->
os_param
.
vtoy_disk_signature
;
for
(
i
=
0
;
i
<
sizeof
(
ventoy_os_param
);
i
++
)
for
(
i
=
0
;
i
<
sizeof
(
ventoy_os_param
);
i
++
)
{
{
chksum
+=
*
((
uint8_t
*
)(
&
(
chain
->
os_param
))
+
i
);
chksum
+=
*
((
uint8_t
*
)(
&
(
chain
->
os_param
))
+
i
);
...
@@ -457,6 +568,7 @@ static void ventoy_dump_chain(ventoy_chain_head *chain)
...
@@ -457,6 +568,7 @@ static void ventoy_dump_chain(ventoy_chain_head *chain)
printf
(
"os_param->chksum=0x%x (%s)
\n
"
,
chain
->
os_param
.
chksum
,
chksum
?
"FAILED"
:
"SUCCESS"
);
printf
(
"os_param->chksum=0x%x (%s)
\n
"
,
chain
->
os_param
.
chksum
,
chksum
?
"FAILED"
:
"SUCCESS"
);
printf
(
"os_param->vtoy_disk_guid=%02x%02x%02x%02x
\n
"
,
guid
[
0
],
guid
[
1
],
guid
[
2
],
guid
[
3
]);
printf
(
"os_param->vtoy_disk_guid=%02x%02x%02x%02x
\n
"
,
guid
[
0
],
guid
[
1
],
guid
[
2
],
guid
[
3
]);
printf
(
"os_param->vtoy_disk_signature=%02x%02x%02x%02x
\n
"
,
sig
[
0
],
sig
[
1
],
sig
[
2
],
sig
[
3
]);
printf
(
"os_param->vtoy_disk_size=%llu
\n
"
,
chain
->
os_param
.
vtoy_disk_size
);
printf
(
"os_param->vtoy_disk_size=%llu
\n
"
,
chain
->
os_param
.
vtoy_disk_size
);
printf
(
"os_param->vtoy_disk_part_id=%u
\n
"
,
chain
->
os_param
.
vtoy_disk_part_id
);
printf
(
"os_param->vtoy_disk_part_id=%u
\n
"
,
chain
->
os_param
.
vtoy_disk_part_id
);
printf
(
"os_param->vtoy_disk_part_type=%u
\n
"
,
chain
->
os_param
.
vtoy_disk_part_type
);
printf
(
"os_param->vtoy_disk_part_type=%u
\n
"
,
chain
->
os_param
.
vtoy_disk_part_type
);
...
@@ -530,19 +642,33 @@ static int ventoy_update_image_location(ventoy_os_param *param)
...
@@ -530,19 +642,33 @@ static int ventoy_update_image_location(ventoy_os_param *param)
}
}
memcpy
(
&
location
->
guid
,
&
param
->
guid
,
sizeof
(
ventoy_guid
));
memcpy
(
&
location
->
guid
,
&
param
->
guid
,
sizeof
(
ventoy_guid
));
location
->
image_sector_size
=
2048
;
location
->
image_sector_size
=
g_hddmode
?
512
:
2048
;
location
->
disk_sector_size
=
g_chain
->
disk_sector_size
;
location
->
disk_sector_size
=
g_chain
->
disk_sector_size
;
location
->
region_count
=
g_img_chunk_num
;
location
->
region_count
=
g_img_chunk_num
;
region
=
location
->
regions
;
region
=
location
->
regions
;
for
(
i
=
0
;
i
<
g_img_chunk_num
;
i
++
)
if
(
g_hddmode
)
{
for
(
i
=
0
;
i
<
g_img_chunk_num
;
i
++
)
{
region
->
image_sector_count
=
chunk
->
disk_end_sector
-
chunk
->
disk_start_sector
+
1
;
region
->
image_start_sector
=
chunk
->
img_start_sector
*
4
;
region
->
disk_start_sector
=
chunk
->
disk_start_sector
;
region
++
;
chunk
++
;
}
}
else
{
{
region
->
image_sector_count
=
chunk
->
img_end_sector
-
chunk
->
img_start_sector
+
1
;
for
(
i
=
0
;
i
<
g_img_chunk_num
;
i
++
)
region
->
image_start_sector
=
chunk
->
img_start_sector
;
{
region
->
disk_start_sector
=
chunk
->
disk_start_sector
;
region
->
image_sector_count
=
chunk
->
img_end_sector
-
chunk
->
img_start_sector
+
1
;
region
++
;
region
->
image_start_sector
=
chunk
->
img_start_sector
;
chunk
++
;
region
->
disk_start_sector
=
chunk
->
disk_start_sector
;
region
++
;
chunk
++
;
}
}
}
return
0
;
return
0
;
...
@@ -553,6 +679,7 @@ int ventoy_boot_vdisk(void *data)
...
@@ -553,6 +679,7 @@ int ventoy_boot_vdisk(void *data)
uint8_t
chksum
=
0
;
uint8_t
chksum
=
0
;
unsigned
int
i
;
unsigned
int
i
;
unsigned
int
drive
;
unsigned
int
drive
;
ventoy_img_chunk
*
cur
;
(
void
)
data
;
(
void
)
data
;
...
@@ -562,8 +689,14 @@ int ventoy_boot_vdisk(void *data)
...
@@ -562,8 +689,14 @@ int ventoy_boot_vdisk(void *data)
{
{
g_debug
=
1
;
g_debug
=
1
;
printf
(
"### ventoy chain boot begin... ###
\n
"
);
printf
(
"### ventoy chain boot begin... ###
\n
"
);
printf
(
"cmdline: <%s>
\n
"
,
g_cmdline_copy
);
ventoy_debug_pause
();
ventoy_debug_pause
();
}
}
if
(
strstr
(
g_cmdline_copy
,
"sector512"
))
{
g_hddmode
=
1
;
}
g_chain
=
(
ventoy_chain_head
*
)
g_initrd_addr
;
g_chain
=
(
ventoy_chain_head
*
)
g_initrd_addr
;
g_chunk
=
(
ventoy_img_chunk
*
)((
char
*
)
g_chain
+
g_chain
->
img_chunk_offset
);
g_chunk
=
(
ventoy_img_chunk
*
)((
char
*
)
g_chain
+
g_chain
->
img_chunk_offset
);
...
@@ -601,6 +734,16 @@ int ventoy_boot_vdisk(void *data)
...
@@ -601,6 +734,16 @@ int ventoy_boot_vdisk(void *data)
ventoy_dump_chain
(
g_chain
);
ventoy_dump_chain
(
g_chain
);
}
}
if
(
g_hddmode
)
{
for
(
i
=
0
;
i
<
g_img_chunk_num
;
i
++
)
{
cur
=
g_chunk
+
i
;
cur
->
img_start_sector
*=
4
;
cur
->
img_end_sector
=
cur
->
img_end_sector
*
4
+
3
;
}
}
drive
=
ventoy_int13_hook
(
g_chain
);
drive
=
ventoy_int13_hook
(
g_chain
);
if
(
g_debug
)
if
(
g_debug
)
...
...
IPXE/ipxe_mod_code/ipxe-3fe683e/src/arch/x86/interface/pcbios/ventoy_int13.c
View file @
d02f184a
...
@@ -1051,6 +1051,10 @@ static __asmcall void int13 ( struct i386_all_regs *ix86 ) {
...
@@ -1051,6 +1051,10 @@ static __asmcall void int13 ( struct i386_all_regs *ix86 ) {
/* We simulate a cdrom, so no need to sync hd drive number */
/* We simulate a cdrom, so no need to sync hd drive number */
//int13_check_num_drives();
//int13_check_num_drives();
#if VTOY_DEBUG
printf
(
"int13 0x%x 0x%x
\n
"
,
bios_drive
,
command
);
sleep
(
1
);
#endif
if
(
bios_drive
==
VENTOY_BIOS_FAKE_DRIVE
)
if
(
bios_drive
==
VENTOY_BIOS_FAKE_DRIVE
)
{
{
ix86
->
regs
.
dl
=
g_sandev
->
exdrive
;
ix86
->
regs
.
dl
=
g_sandev
->
exdrive
;
...
@@ -1255,39 +1259,15 @@ static void int13_hook_vector ( void ) {
...
@@ -1255,39 +1259,15 @@ static void int13_hook_vector ( void ) {
* @ret rc Return status code
* @ret rc Return status code
*/
*/
static
int
int13_load_mbr
(
unsigned
int
drive
,
struct
segoff
*
address
)
{
static
int
int13_load_mbr
(
unsigned
int
drive
,
struct
segoff
*
address
)
{
uint16_t
status
;
int
discard_b
,
discard_c
,
discard_d
;
uint16_t
magic
;
uint16_t
magic
;
/* Use INT 13, 02 to read the MBR */
address
->
segment
=
0
;
address
->
segment
=
0
;
address
->
offset
=
0x7c00
;
address
->
offset
=
0x7c00
;
copy_to_real
(
address
->
segment
,
address
->
offset
,
g_sandev
->
boot_catalog_sector
,
512
);
__asm__
__volatile__
(
REAL_CODE
(
"pushw %%es
\n\t
"
"pushl %%ebx
\n\t
"
"popw %%bx
\n\t
"
"popw %%es
\n\t
"
"stc
\n\t
"
"sti
\n\t
"
"int $0x13
\n\t
"
"sti
\n\t
"
/* BIOS bugs */
"jc 1f
\n\t
"
"xorw %%ax, %%ax
\n\t
"
"
\n
1:
\n\t
"
"popw %%es
\n\t
"
)
:
"=a"
(
status
),
"=b"
(
discard_b
),
"=c"
(
discard_c
),
"=d"
(
discard_d
)
:
"a"
(
0x0201
),
"b"
(
*
address
),
"c"
(
1
),
"d"
(
drive
)
);
if
(
status
)
{
DBG
(
"INT13 drive %02x could not read MBR (status %04x)
\n
"
,
drive
,
status
);
return
-
EIO
;
}
/* Check magic signature */
/* Check magic signature */
get_real
(
magic
,
address
->
segment
,
get_real
(
magic
,
address
->
segment
,
(
address
->
offset
+
offsetof
(
struct
master_boot_record
,
magic
)
)
);
(
address
->
offset
+
offsetof
(
struct
master_boot_record
,
magic
)
)
);
if
(
magic
!=
INT13_MBR_MAGIC
)
{
if
(
magic
!=
INT13_MBR_MAGIC
)
{
DBG
(
"INT13 drive %02x does not contain a valid MBR
\n
"
,
DBG
(
"INT13 drive %02x does not contain a valid MBR
\n
"
,
drive
);
drive
);
...
@@ -1443,8 +1423,14 @@ unsigned int ventoy_int13_hook (ventoy_chain_head *chain)
...
@@ -1443,8 +1423,14 @@ unsigned int ventoy_int13_hook (ventoy_chain_head *chain)
/* hook will copy num_drives to dl when int13 08 was called, so must initialize it's value */
/* hook will copy num_drives to dl when int13 08 was called, so must initialize it's value */
get_real
(
num_drives
,
BDA_SEG
,
BDA_NUM_DRIVES
);
get_real
(
num_drives
,
BDA_SEG
,
BDA_NUM_DRIVES
);
//natural_drive = num_drives | 0x80;
if
(
g_hddmode
)
natural_drive
=
0xE0
;
/* just set a cdrom drive number 224 */
{
natural_drive
=
num_drives
|
0x80
;
}
else
{
natural_drive
=
0xE0
;
/* just set a cdrom drive number 224 */
}
if
(
chain
->
disk_drive
>=
0x80
&&
chain
->
drive_map
>=
0x80
)
if
(
chain
->
disk_drive
>=
0x80
&&
chain
->
drive_map
>=
0x80
)
{
{
...
@@ -1456,8 +1442,8 @@ unsigned int ventoy_int13_hook (ventoy_chain_head *chain)
...
@@ -1456,8 +1442,8 @@ unsigned int ventoy_int13_hook (ventoy_chain_head *chain)
g_sandev
=
zalloc
(
sizeof
(
struct
san_device
)
+
sizeof
(
struct
int13_data
));
g_sandev
=
zalloc
(
sizeof
(
struct
san_device
)
+
sizeof
(
struct
int13_data
));
g_sandev
->
priv
=
int13
=
(
struct
int13_data
*
)(
g_sandev
+
1
);
g_sandev
->
priv
=
int13
=
(
struct
int13_data
*
)(
g_sandev
+
1
);
g_sandev
->
drive
=
int13
->
natural_drive
=
natural_drive
;
g_sandev
->
drive
=
int13
->
natural_drive
=
natural_drive
;
g_sandev
->
is_cdrom
=
1
;
g_sandev
->
is_cdrom
=
g_hddmode
?
0
:
1
;
g_sandev
->
blksize_shift
=
2
;
g_sandev
->
blksize_shift
=
g_hddmode
?
0
:
2
;
g_sandev
->
capacity
.
blksize
=
512
;
g_sandev
->
capacity
.
blksize
=
512
;
g_sandev
->
capacity
.
blocks
=
chain
->
virt_img_size_in_bytes
/
512
;
g_sandev
->
capacity
.
blocks
=
chain
->
virt_img_size_in_bytes
/
512
;
g_sandev
->
exdrive
=
chain
->
disk_drive
;
g_sandev
->
exdrive
=
chain
->
disk_drive
;
...
@@ -1521,9 +1507,20 @@ int ventoy_int13_boot ( unsigned int drive, void *imginfo, const char *cmdline)
...
@@ -1521,9 +1507,20 @@ int ventoy_int13_boot ( unsigned int drive, void *imginfo, const char *cmdline)
struct
ibft_table
*
ibft
=
NULL
;
struct
ibft_table
*
ibft
=
NULL
;
/* Look for a usable boot sector */
/* Look for a usable boot sector */
if
(
(
(
rc
=
int13_load_eltorito
(
drive
,
&
address
)
)
!=
0
)
&&
if
(
g_hddmode
)
(
(
rc
=
int13_load_mbr
(
drive
,
&
address
)
)
!=
0
))
{
if
((
rc
=
int13_load_mbr
(
drive
,
&
address
))
!=
0
)
{
printf
(
"int13_load_mbr %d
\n
"
,
rc
);
return
rc
;
}
}
else
{
if
(
(
(
rc
=
int13_load_eltorito
(
drive
,
&
address
)
)
!=
0
)
&&
(
(
rc
=
int13_load_mbr
(
drive
,
&
address
)
)
!=
0
))
return
rc
;
return
rc
;
}
if
(
imginfo
)
if
(
imginfo
)
{
{
...
...
IPXE/ipxe_mod_code/ipxe-3fe683e/src/include/ventoy.h
View file @
d02f184a
...
@@ -4,6 +4,8 @@
...
@@ -4,6 +4,8 @@
FILE_LICENCE
(
GPL2_OR_LATER_OR_UBDL
);
FILE_LICENCE
(
GPL2_OR_LATER_OR_UBDL
);
//#define VTOY_DEBUG 1
#define grub_uint64_t uint64_t
#define grub_uint64_t uint64_t
#define grub_uint32_t uint32_t
#define grub_uint32_t uint32_t
#define grub_uint16_t uint16_t
#define grub_uint16_t uint16_t
...
@@ -43,7 +45,7 @@ typedef struct ventoy_image_location
...
@@ -43,7 +45,7 @@ typedef struct ventoy_image_location
{
{
ventoy_guid
guid
;
ventoy_guid
guid
;
/* image sector size,
currently this value is always
2048 */
/* image sector size, 2048
/512
*/
grub_uint32_t
image_sector_size
;
grub_uint32_t
image_sector_size
;
/* disk sector size, normally the value is 512 */
/* disk sector size, normally the value is 512 */
...
@@ -86,7 +88,9 @@ typedef struct ventoy_os_param
...
@@ -86,7 +88,9 @@ typedef struct ventoy_os_param
grub_uint64_t
vtoy_reserved
[
4
];
// Internal use by ventoy
grub_uint64_t
vtoy_reserved
[
4
];
// Internal use by ventoy
grub_uint8_t
reserved
[
31
];
grub_uint8_t
vtoy_disk_signature
[
4
];
grub_uint8_t
reserved
[
27
];
}
ventoy_os_param
;
}
ventoy_os_param
;
typedef
struct
ventoy_iso9660_override
typedef
struct
ventoy_iso9660_override
...
@@ -182,6 +186,7 @@ typedef struct ventoy_sector_flag
...
@@ -182,6 +186,7 @@ typedef struct ventoy_sector_flag
#define VENTOY_BOOT_FIXBIN_DRIVE 0xFD
#define VENTOY_BOOT_FIXBIN_DRIVE 0xFD
extern
int
g_debug
;
extern
int
g_debug
;
extern
int
g_hddmode
;
extern
char
*
g_cmdline_copy
;
extern
char
*
g_cmdline_copy
;
extern
void
*
g_initrd_addr
;
extern
void
*
g_initrd_addr
;
extern
size_t
g_initrd_len
;
extern
size_t
g_initrd_len
;
...
...
Prev
1
2
Next
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment