[PATCH 2/2] part: efi: Treat unused partition type GUID as a valid case

Heinrich Schuchardt xypron.glpk at gmx.de
Fri Mar 29 02:02:07 CET 2024


On 3/28/24 23:29, Sam Protsenko wrote:
> Some platforms use the "unused" (all-zero) GUID as a partition type GUID
> to make some partitions hidden from the OS. For example, Samsung phones
> and other devices often have GPT partition tables like that, created by
> their "gpt_builder" tool [1]. All partitions with FILESYS=0 value
> (second column in [2] file) will be created in a way that:
>    1. Partition type GUID will be all-zero ("unused")
>    2. Attributes[48:49] bits will be set to 0 (whereas non-zero values
>       mean the partition is visible to the OS: 1=raw, 2=ext4, 3=f2fs)

The UEFI specification is defining what a GPT partition table has to
look like.

According the specification partition type GUID
00000000-0000-0000-0000-000000000000 marks an "unused entry" in the
partition table.

An unused partition table entry cannot define a partition. It is one of
the entries, that you skip over when enumerating via your patch 1/2.

With this patch 128 partition table entries are printed for an image
having a single partition.

=> part list host 0

Partition Map for HOST device 0  --   Partition Type: EFI

Part    Start LBA       End LBA         Name
         Attributes
         Type GUID
         Partition GUID
   1     0x00000800      0x0001f7ff      "EFI system partition"
         attrs:  0x0000000000000005
         type:   c12a7328-f81f-11d2-ba4b-00a0c93ec93b
                 (system)
         guid:   ee474198-4601-4d5c-81f0-54acf904dd40
   2     0x00000000      0x00000000      ""
         attrs:  0x0000000000000000
         type:   00000000-0000-0000-0000-000000000000
                 (00000000-0000-0000-0000-000000000000)
         guid:   00000000-0000-0000-0000-000000000000
...

128     0x00000000      0x00000000      ""
         attrs:  0x0000000000000000
         type:   00000000-0000-0000-0000-000000000000
                 (00000000-0000-0000-0000-000000000000)
         guid:   00000000-0000-0000-0000-000000000000

This is definitively wrong.

>
> Although it's true that Linux kernel verifies the partition type GUID to
> be non-zero (in block/partitions/efi.c, is_pte_valid() function), where
> its U-Boot counterpart code was borrowed from originally, in case of
> U-Boot we want to handle partitions with "unused" GUIDs the same way as
> any other valid partitions, to allow the user to interact with those
> (e.g. list partitions using "part list", be able to flash those via
> fastboot, etc).

You cannot interact with a non-existing partition.

You may create a new partition in any empty slot that Samsung's tool has
left in the partition table and then write to it. No patch is needed for
this.

Best regards

Heinrich

>
> [1] https://gitlab.com/Linaro/96boards/e850-96/tools/gpt/
> [2] https://gitlab.com/Linaro/96boards/e850-96/tools/gpt/-/blob/master/gpt_layout
>
> Fixes: 07f3d789b9be ("Add support for CONFIG_EFI_PARTITION (GUID Partition Table)")
> Signed-off-by: Sam Protsenko <semen.protsenko at linaro.org>
> ---
>   disk/part_efi.c | 21 +++++----------------
>   1 file changed, 5 insertions(+), 16 deletions(-)
>
> diff --git a/disk/part_efi.c b/disk/part_efi.c
> index 4ce9243ef25c..6b138abae0a6 100644
> --- a/disk/part_efi.c
> +++ b/disk/part_efi.c
> @@ -1166,28 +1166,17 @@ static gpt_entry *alloc_read_gpt_entries(struct blk_desc *desc,
>    */
>   static int is_pte_valid(gpt_entry * pte)
>   {
> -	efi_guid_t unused_guid;
> +	/*
> +	 * NOTE: Do not check unused (zero) GUIDs here, it's considered a valid
> +	 * case in U-Boot.
> +	 */
>
>   	if (!pte) {
>   		log_debug("Invalid Argument(s)\n");
>   		return 0;
>   	}
>
> -	/* Only one validation for now:
> -	 * The GUID Partition Type != Unused Entry (ALL-ZERO)
> -	 */
> -	memset(unused_guid.b, 0, sizeof(unused_guid.b));
> -
> -	if (memcmp(pte->partition_type_guid.b, unused_guid.b,
> -		sizeof(unused_guid.b)) == 0) {
> -
> -		log_debug("Found an unused PTE GUID at 0x%08X\n",
> -			  (unsigned int)(uintptr_t)pte);
> -
> -		return 0;
> -	} else {
> -		return 1;
> -	}
> +	return 1;
>   }
>
>   /*



More information about the U-Boot mailing list