From 8e760b3fcde1649517552ca529c13196c0b61021 Mon Sep 17 00:00:00 2001 From: Jan Janssen Date: Sat, 7 Jan 2023 11:21:56 +0100 Subject: [PATCH] boot: Move disk_get_part_uuid into part-discovery.c Thematically, they are similar and disk.c is awfully small to warrant the separation. --- src/boot/efi/boot.c | 5 ++- src/boot/efi/disk.c | 58 ----------------------------------- src/boot/efi/disk.h | 6 ---- src/boot/efi/meson.build | 2 -- src/boot/efi/part-discovery.c | 51 ++++++++++++++++++++++++++++++ src/boot/efi/part-discovery.h | 1 + src/boot/efi/stub.c | 9 +++--- 7 files changed, 58 insertions(+), 74 deletions(-) delete mode 100644 src/boot/efi/disk.c delete mode 100644 src/boot/efi/disk.h diff --git a/src/boot/efi/boot.c b/src/boot/efi/boot.c index ea19dd82d2..3bd3469f82 100644 --- a/src/boot/efi/boot.c +++ b/src/boot/efi/boot.c @@ -4,7 +4,6 @@ #include "bootspec-fundamental.h" #include "console.h" #include "devicetree.h" -#include "disk.h" #include "drivers.h" #include "efivars-fundamental.h" #include "graphics.h" @@ -2542,7 +2541,6 @@ static void export_variables( 0; _cleanup_free_ char16_t *infostr = NULL, *typestr = NULL; - char16_t uuid[37]; assert(loaded_image); @@ -2561,7 +2559,8 @@ static void export_variables( efivar_set(MAKE_GUID_PTR(LOADER), u"LoaderImageIdentifier", loaded_image_path, 0); /* export the device path this image is started from */ - if (disk_get_part_uuid(loaded_image->DeviceHandle, uuid) == EFI_SUCCESS) + _cleanup_free_ char16_t *uuid = disk_get_part_uuid(loaded_image->DeviceHandle); + if (uuid) efivar_set(MAKE_GUID_PTR(LOADER), u"LoaderDevicePartUUID", uuid, 0); } diff --git a/src/boot/efi/disk.c b/src/boot/efi/disk.c deleted file mode 100644 index 44be3232ee..0000000000 --- a/src/boot/efi/disk.c +++ /dev/null @@ -1,58 +0,0 @@ -/* SPDX-License-Identifier: LGPL-2.1-or-later */ - -#include "disk.h" -#include "proto/device-path.h" -#include "util.h" - -EFI_STATUS disk_get_part_uuid(EFI_HANDLE *handle, char16_t uuid[static 37]) { - EFI_STATUS err; - EFI_DEVICE_PATH *dp; - - /* export the device path this image is started from */ - - if (!handle) - return EFI_NOT_FOUND; - - err = BS->HandleProtocol(handle, MAKE_GUID_PTR(EFI_DEVICE_PATH_PROTOCOL), (void **) &dp); - if (err != EFI_SUCCESS) - return err; - - for (; !IsDevicePathEnd(dp); dp = NextDevicePathNode(dp)) { - if (DevicePathType(dp) != MEDIA_DEVICE_PATH) - continue; - if (DevicePathSubType(dp) != MEDIA_HARDDRIVE_DP) - continue; - - /* The HD device path may be misaligned. */ - HARDDRIVE_DEVICE_PATH hd; - memcpy(&hd, dp, MIN(sizeof(hd), (size_t) DevicePathNodeLength(dp))); - - if (hd.SignatureType != SIGNATURE_TYPE_GUID) - continue; - - _cleanup_free_ char16_t *tmp = xasprintf( - "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x", - hd.Signature[3], - hd.Signature[2], - hd.Signature[1], - hd.Signature[0], - - hd.Signature[5], - hd.Signature[4], - hd.Signature[7], - hd.Signature[6], - - hd.Signature[8], - hd.Signature[9], - hd.Signature[10], - hd.Signature[11], - hd.Signature[12], - hd.Signature[13], - hd.Signature[14], - hd.Signature[15]); - strcpy16(uuid, tmp); - return EFI_SUCCESS; - } - - return EFI_NOT_FOUND; -} diff --git a/src/boot/efi/disk.h b/src/boot/efi/disk.h deleted file mode 100644 index 2da5bca133..0000000000 --- a/src/boot/efi/disk.h +++ /dev/null @@ -1,6 +0,0 @@ -/* SPDX-License-Identifier: LGPL-2.1-or-later */ -#pragma once - -#include "efi.h" - -EFI_STATUS disk_get_part_uuid(EFI_HANDLE *handle, char16_t uuid[static 37]); diff --git a/src/boot/efi/meson.build b/src/boot/efi/meson.build index 8d85dac844..e6166075be 100644 --- a/src/boot/efi/meson.build +++ b/src/boot/efi/meson.build @@ -333,7 +333,6 @@ efi_headers = files( 'console.h', 'cpio.h', 'devicetree.h', - 'disk.h', 'drivers.h', 'efi-string.h', 'efi.h', @@ -369,7 +368,6 @@ common_sources = files( 'console.c', 'devicetree.c', 'drivers.c', - 'disk.c', 'efi-string.c', 'graphics.c', 'initrd.c', diff --git a/src/boot/efi/part-discovery.c b/src/boot/efi/part-discovery.c index e25905ff48..5d39995509 100644 --- a/src/boot/efi/part-discovery.c +++ b/src/boot/efi/part-discovery.c @@ -295,3 +295,54 @@ EFI_STATUS partition_open(const EFI_GUID *type, EFI_HANDLE *device, EFI_HANDLE * *ret_root_dir = root_dir; return EFI_SUCCESS; } + +char16_t *disk_get_part_uuid(EFI_HANDLE *handle) { + EFI_STATUS err; + EFI_DEVICE_PATH *dp; + + /* export the device path this image is started from */ + + if (!handle) + return NULL; + + err = BS->HandleProtocol(handle, MAKE_GUID_PTR(EFI_DEVICE_PATH_PROTOCOL), (void **) &dp); + if (err != EFI_SUCCESS) + return NULL; + + for (; !IsDevicePathEnd(dp); dp = NextDevicePathNode(dp)) { + if (DevicePathType(dp) != MEDIA_DEVICE_PATH) + continue; + if (DevicePathSubType(dp) != MEDIA_HARDDRIVE_DP) + continue; + + /* The HD device path may be misaligned. */ + HARDDRIVE_DEVICE_PATH hd; + memcpy(&hd, dp, MIN(sizeof(hd), (size_t) DevicePathNodeLength(dp))); + + if (hd.SignatureType != SIGNATURE_TYPE_GUID) + continue; + + return xasprintf( + "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x", + hd.Signature[3], + hd.Signature[2], + hd.Signature[1], + hd.Signature[0], + + hd.Signature[5], + hd.Signature[4], + hd.Signature[7], + hd.Signature[6], + + hd.Signature[8], + hd.Signature[9], + hd.Signature[10], + hd.Signature[11], + hd.Signature[12], + hd.Signature[13], + hd.Signature[14], + hd.Signature[15]); + } + + return NULL; +} diff --git a/src/boot/efi/part-discovery.h b/src/boot/efi/part-discovery.h index 597ded3b3e..bbc87ffe36 100644 --- a/src/boot/efi/part-discovery.h +++ b/src/boot/efi/part-discovery.h @@ -9,3 +9,4 @@ { 0xc12a7328, 0xf81f, 0x11d2, { 0xba, 0x4b, 0x00, 0xa0, 0xc9, 0x3e, 0xc9, 0x3b } } EFI_STATUS partition_open(const EFI_GUID *type, EFI_HANDLE *device, EFI_HANDLE *ret_device, EFI_FILE **ret_root_dir); +char16_t *disk_get_part_uuid(EFI_HANDLE *handle); diff --git a/src/boot/efi/stub.c b/src/boot/efi/stub.c index d85424ceae..4b8e1e69d9 100644 --- a/src/boot/efi/stub.c +++ b/src/boot/efi/stub.c @@ -2,7 +2,6 @@ #include "cpio.h" #include "devicetree.h" -#include "disk.h" #include "graphics.h" #include "linux.h" #include "measure.h" @@ -87,14 +86,14 @@ static void export_variables(EFI_LOADED_IMAGE_PROTOCOL *loaded_image) { EFI_STUB_FEATURE_RANDOM_SEED | /* We pass a random seed to the kernel */ 0; - char16_t uuid[37]; - assert(loaded_image); /* Export the device path this image is started from, if it's not set yet */ - if (efivar_get_raw(MAKE_GUID_PTR(LOADER), u"LoaderDevicePartUUID", NULL, NULL) != EFI_SUCCESS) - if (disk_get_part_uuid(loaded_image->DeviceHandle, uuid) == EFI_SUCCESS) + if (efivar_get_raw(MAKE_GUID_PTR(LOADER), u"LoaderDevicePartUUID", NULL, NULL) != EFI_SUCCESS) { + _cleanup_free_ char16_t *uuid = disk_get_part_uuid(loaded_image->DeviceHandle); + if (uuid) efivar_set(MAKE_GUID_PTR(LOADER), u"LoaderDevicePartUUID", uuid, 0); + } /* If LoaderImageIdentifier is not set, assume the image with this stub was loaded directly from the * UEFI firmware without any boot loader, and hence set the LoaderImageIdentifier ourselves. Note -- 2.25.1