Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 23 additions & 6 deletions lib/uefi/blockio_protocols.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -103,21 +103,38 @@ __WEAK EfiStatus open_block_device(EfiHandle handle, const void** intf) {
return EFI_STATUS_SUCCESS;
}

EfiStatus list_block_devices(size_t *num_handles, EfiHandle **buf) {
EfiStatus list_block_devices(size_t *num_handles, EfiHandle *buf) {
if (num_handles == nullptr) {
Comment thread
zhangxp1998 marked this conversation as resolved.
return EFI_STATUS_INVALID_PARAMETER;
}

size_t device_count = 0;
bio_iter_devices([&device_count](bdev_t *dev) {
device_count++;
return true;
});
auto devices =
reinterpret_cast<EfiHandle *>(uefi_malloc(sizeof(EfiHandle) * device_count));

if (device_count == 0) {
*num_handles = 0;
return EFI_STATUS_NOT_FOUND;
}

if (*num_handles < device_count) {
*num_handles = device_count;
return EFI_STATUS_BUFFER_TOO_SMALL;
}
Comment thread
zhangxp1998 marked this conversation as resolved.

// Allow null buffers for size queries, but require storage before writing.
if (buf == nullptr) {
return EFI_STATUS_INVALID_PARAMETER;
}

size_t i = 0;
bio_iter_devices([&i, devices, device_count](bdev_t *dev) {
devices[i] = dev->name;
bio_iter_devices([&i, buf, device_count](bdev_t *dev) {
buf[i] = dev->name;
i++;
return i < device_count;
});
*num_handles = i;
*buf = devices;
return EFI_STATUS_SUCCESS;
}
2 changes: 1 addition & 1 deletion lib/uefi/blockio_protocols.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,6 @@

EfiStatus open_block_device(EfiHandle handle, const void **intf);

EfiStatus list_block_devices(size_t *num_handles, EfiHandle **buf);
EfiStatus list_block_devices(size_t *num_handles, EfiHandle *buf);

#endif
Loading