[SLOF] [PATCH v4] slof/fs/packages/disk-label.fs: improve checking for DOS boot partitions
Kautuk Consul
kconsul at linux.ibm.com
Thu Mar 28 17:00:09 AEDT 2024
While testing with a qcow2 with a DOS boot partition it was found that
when we set the logical_block_size in the guest XML to >512 then the
boot would fail in the following interminable loop:
<SNIP>
Trying to load: from: /pci at 800000020000000/scsi at 3 ...
virtioblk_transfer: Access beyond end of device!
virtioblk_transfer: Access beyond end of device!
virtioblk_transfer: Access beyond end of device!
virtioblk_transfer: Access beyond end of device!
virtioblk_transfer: Access beyond end of device!
virtioblk_transfer: Access beyond end of device!
virtioblk_transfer: Access beyond end of device!
virtioblk_transfer: Access beyond end of device!
virtioblk_transfer: Access beyond end of device!
virtioblk_transfer: Access beyond end of device!
virtioblk_transfer: Access beyond end of device!
virtioblk_transfer: Access beyond end of device!
virtioblk_transfer: Access beyond end of device!
virtioblk_transfer: Access beyond end of device!
virtioblk_transfer: Access beyond end of device!
virtioblk_transfer: Access beyond end of device!
virtioblk_transfer: Access beyond end of device!
</SNIP>
Change the "read-sector" Forth subroutine to throw an exception whenever
it fails to read a full block-size length of sector from the disk.
Also change the "open" method to initiate CATCH exception handling for the calls to
try-partitions/try-files which will also call read-sector which could potentially
now throw this new exception.
After making the above changes, it fails properly with the correct error
message as follows:
<SNIP>
Trying to load: from: /pci at 800000020000000/scsi at 3 ...
virtioblk_transfer: Access beyond end of device!
virtioblk_transfer: Access beyond end of device!
virtioblk_transfer: Access beyond end of device!
virtioblk_transfer: Access beyond end of device!
virtioblk_transfer: Access beyond end of device!
E3404: Not a bootable device!
E3407: Load failed
Type 'boot' and press return to continue booting the system.
Type 'reset-all' and press return to reboot the system.
Ready!
0 >
</SNIP>
Signed-off-by: Kautuk Consul <kconsul at linux.ibm.com>
---
slof/fs/packages/disk-label.fs | 12 +++++++++---
1 file changed, 9 insertions(+), 3 deletions(-)
diff --git a/slof/fs/packages/disk-label.fs b/slof/fs/packages/disk-label.fs
index 661c6b0..a6fb231 100644
--- a/slof/fs/packages/disk-label.fs
+++ b/slof/fs/packages/disk-label.fs
@@ -136,7 +136,8 @@ CONSTANT /gpt-part-entry
: read-sector ( sector-number -- )
\ block-size is 0x200 on disks, 0x800 on cdrom drives
block-size * 0 seek drop \ seek to sector
- block block-size read drop \ read sector
+ block block-size read \ read sector
+ block-size < IF throw THEN \ if we read less than the block-size then throw an exception
;
: (.part-entry) ( part-entry )
@@ -723,10 +724,15 @@ CREATE GPT-LINUX-PARTITION 10 allot
THEN
partition IF
- try-partitions
+ ['] try-partitions
ELSE
- try-files
+ ['] try-files
THEN
+
+ \ Catch any exception that might happen due to read-sector failing to read
+ \ block-size number of bytes from any sector of the disk.
+ CATCH IF false THEN
+
dup 0= IF debug-disk-label? IF ." not found." cr THEN close THEN \ free memory again
;
--
2.31.1
More information about the SLOF
mailing list