summaryrefslogtreecommitdiff
path: root/sys/stand
diff options
context:
space:
mode:
authorjmcneill <jmcneill@NetBSD.org>2020-11-28 15:24:05 +0000
committerjmcneill <jmcneill@NetBSD.org>2020-11-28 15:24:05 +0000
commitbb91bcced2b2983bc08a675bcf0e7bab328de139 (patch)
treec7eaba3eb4db31d5b93ec666b430f71134ef792f /sys/stand
parentaa56c0c16fbeefb1140941abba8723cc672dc8e7 (diff)
Deal with devices that report either 512 or 2048 as logical block size
for CD9660 file-systems.
Diffstat (limited to 'sys/stand')
-rw-r--r--sys/stand/efiboot/efiblock.c37
1 files changed, 27 insertions, 10 deletions
diff --git a/sys/stand/efiboot/efiblock.c b/sys/stand/efiboot/efiblock.c
index b674189e983..edfeeb44c9d 100644
--- a/sys/stand/efiboot/efiblock.c
+++ b/sys/stand/efiboot/efiblock.c
@@ -1,4 +1,4 @@
-/* $NetBSD: efiblock.c,v 1.9 2020/10/18 18:05:48 tnn Exp $ */
+/* $NetBSD: efiblock.c,v 1.10 2020/11/28 15:24:05 jmcneill Exp $ */
/*-
* Copyright (c) 2016 Kimihiro Nonaka <nonaka@netbsd.org>
@@ -127,28 +127,43 @@ efi_block_find_partitions_cd9660(struct efi_block_dev *bdev)
EFI_LBA lba;
UINT32 sz;
+ if (bdev->bio->Media->BlockSize != DEV_BSIZE &&
+ bdev->bio->Media->BlockSize != ISO_DEFAULT_BLOCK_SIZE) {
+ return ENXIO;
+ }
+
sz = __MAX(sizeof(*vd), bdev->bio->Media->BlockSize);
sz = roundup(sz, bdev->bio->Media->BlockSize);
- if ((buf = efi_block_allocate_device_buffer(bdev, sz, &buf_start)) == NULL)
+ if ((buf = efi_block_allocate_device_buffer(bdev, sz, &buf_start)) == NULL) {
return ENOMEM;
+ }
for (lba = 16;; lba++) {
- status = uefi_call_wrapper(bdev->bio->ReadBlocks, 5, bdev->bio, bdev->media_id,
- lba, sz, buf_start);
- if (EFI_ERROR(status))
+ status = uefi_call_wrapper(bdev->bio->ReadBlocks, 5,
+ bdev->bio,
+ bdev->media_id,
+ lba * ISO_DEFAULT_BLOCK_SIZE / bdev->bio->Media->BlockSize,
+ sz,
+ buf_start);
+ if (EFI_ERROR(status)) {
goto io_error;
+ }
vd = (struct iso_primary_descriptor *)buf_start;
- if (memcmp(vd->id, ISO_STANDARD_ID, sizeof vd->id) != 0)
+ if (memcmp(vd->id, ISO_STANDARD_ID, sizeof vd->id) != 0) {
goto io_error;
- if (isonum_711(vd->type) == ISO_VD_END)
+ }
+ if (isonum_711(vd->type) == ISO_VD_END) {
goto io_error;
- if (isonum_711(vd->type) == ISO_VD_PRIMARY)
+ }
+ if (isonum_711(vd->type) == ISO_VD_PRIMARY) {
break;
+ }
}
- if (isonum_723(vd->logical_block_size) != ISO_DEFAULT_BLOCK_SIZE)
+ if (isonum_723(vd->logical_block_size) != ISO_DEFAULT_BLOCK_SIZE) {
goto io_error;
+ }
bpart = alloc(sizeof(*bpart));
bpart->index = 0;
@@ -593,6 +608,7 @@ efi_block_strategy(void *devdata, int rw, daddr_t dblk, size_t size, void *buf,
dblk += le64toh(bpart->gpt.ent.ent_lba_start);
break;
case EFI_BLOCK_PART_CD9660:
+ dblk *= ISO_DEFAULT_BLOCK_SIZE / bpart->bdev->bio->Media->BlockSize;
break;
default:
return EINVAL;
@@ -603,8 +619,9 @@ efi_block_strategy(void *devdata, int rw, daddr_t dblk, size_t size, void *buf,
allocated_buf = NULL;
aligned_buf = buf;
} else if ((allocated_buf = efi_block_allocate_device_buffer(bpart->bdev,
- size, &aligned_buf)) == NULL)
+ size, &aligned_buf)) == NULL) {
return ENOMEM;
+ }
status = uefi_call_wrapper(bpart->bdev->bio->ReadBlocks, 5,
bpart->bdev->bio, bpart->bdev->media_id, dblk, size, aligned_buf);