efi_loader: identify EFI system partition
authorHeinrich Schuchardt <xypron.glpk@gmx.de>
Thu, 19 Mar 2020 14:16:31 +0000 (15:16 +0100)
committerHeinrich Schuchardt <xypron.glpk@gmx.de>
Thu, 30 Apr 2020 08:25:07 +0000 (10:25 +0200)
In subsequent patches UEFI variables shalled be stored on the EFI system
partition. Hence we need to identify the EFI system partition.

Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
include/efi_loader.h
lib/efi_loader/efi_disk.c

index 0ba9a1f702a6224431d64238614c17b89ee1df0a..b7bccf50b30ca66a39170800366fe1c99e2c457a 100644 (file)
@@ -47,6 +47,13 @@ static inline void *guidcpy(void *dst, const void *src)
 /* Root node */
 extern efi_handle_t efi_root;
 
+/* EFI system partition */
+extern struct efi_system_partition {
+       enum if_type if_type;
+       int devnum;
+       u8 part;
+} efi_system_partition;
+
 int __efi_entry_check(void);
 int __efi_exit_check(void);
 const char *__efi_nesting(void);
index fd8fe175670989086f28343b607d2dcee8658683..fd3df80b0b9627649cc47328cfcab91bad36a49d 100644 (file)
@@ -13,6 +13,8 @@
 #include <part.h>
 #include <malloc.h>
 
+struct efi_system_partition efi_system_partition;
+
 const efi_guid_t efi_block_io_guid = EFI_BLOCK_IO_PROTOCOL_GUID;
 
 /**
@@ -418,6 +420,24 @@ static efi_status_t efi_disk_add_dev(
        diskobj->ops.media = &diskobj->media;
        if (disk)
                *disk = diskobj;
+
+       /* Store first EFI system partition */
+       if (part && !efi_system_partition.if_type) {
+               int r;
+               disk_partition_t info;
+
+               r = part_get_info(desc, part, &info);
+               if (r)
+                       return EFI_DEVICE_ERROR;
+               if (info.bootable & PART_EFI_SYSTEM_PARTITION) {
+                       efi_system_partition.if_type = desc->if_type;
+                       efi_system_partition.devnum = desc->devnum;
+                       efi_system_partition.part = part;
+                       EFI_PRINT("EFI system partition: %s %d:%d\n",
+                                 blk_get_if_type_name(desc->if_type),
+                                 desc->devnum, part);
+               }
+       }
        return EFI_SUCCESS;
 }