Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   1) // SPDX-License-Identifier: GPL-2.0-or-later
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   2) /************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   3)  * EFI GUID Partition Table handling
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   4)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   5)  * http://www.uefi.org/specs/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   6)  * http://www.intel.com/technology/efi/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   7)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   8)  * efi.[ch] by Matt Domsch <Matt_Domsch@dell.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   9)  *   Copyright 2000,2001,2002,2004 Dell Inc.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  10)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  11)  * TODO:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  12)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  13)  * Changelog:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  14)  * Mon August 5th, 2013 Davidlohr Bueso <davidlohr@hp.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  15)  * - detect hybrid MBRs, tighter pMBR checking & cleanups.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  16)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  17)  * Mon Nov 09 2004 Matt Domsch <Matt_Domsch@dell.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  18)  * - test for valid PMBR and valid PGPT before ever reading
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  19)  *   AGPT, allow override with 'gpt' kernel command line option.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  20)  * - check for first/last_usable_lba outside of size of disk
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  21)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  22)  * Tue  Mar 26 2002 Matt Domsch <Matt_Domsch@dell.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  23)  * - Ported to 2.5.7-pre1 and 2.5.7-dj2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  24)  * - Applied patch to avoid fault in alternate header handling
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  25)  * - cleaned up find_valid_gpt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  26)  * - On-disk structure and copy in memory is *always* LE now - 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  27)  *   swab fields as needed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  28)  * - remove print_gpt_header()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  29)  * - only use first max_p partition entries, to keep the kernel minor number
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  30)  *   and partition numbers tied.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  31)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  32)  * Mon  Feb 04 2002 Matt Domsch <Matt_Domsch@dell.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  33)  * - Removed __PRIPTR_PREFIX - not being used
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  34)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  35)  * Mon  Jan 14 2002 Matt Domsch <Matt_Domsch@dell.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  36)  * - Ported to 2.5.2-pre11 + library crc32 patch Linus applied
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  37)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  38)  * Thu Dec 6 2001 Matt Domsch <Matt_Domsch@dell.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  39)  * - Added compare_gpts().
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  40)  * - moved le_efi_guid_to_cpus() back into this file.  GPT is the only
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  41)  *   thing that keeps EFI GUIDs on disk.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  42)  * - Changed gpt structure names and members to be simpler and more Linux-like.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  43)  * 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  44)  * Wed Oct 17 2001 Matt Domsch <Matt_Domsch@dell.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  45)  * - Removed CONFIG_DEVFS_VOLUMES_UUID code entirely per Martin Wilck
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  46)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  47)  * Wed Oct 10 2001 Matt Domsch <Matt_Domsch@dell.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  48)  * - Changed function comments to DocBook style per Andreas Dilger suggestion.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  49)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  50)  * Mon Oct 08 2001 Matt Domsch <Matt_Domsch@dell.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  51)  * - Change read_lba() to use the page cache per Al Viro's work.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  52)  * - print u64s properly on all architectures
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  53)  * - fixed debug_printk(), now Dprintk()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  54)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  55)  * Mon Oct 01 2001 Matt Domsch <Matt_Domsch@dell.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  56)  * - Style cleanups
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  57)  * - made most functions static
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  58)  * - Endianness addition
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  59)  * - remove test for second alternate header, as it's not per spec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  60)  *   and is unnecessary.  There's now a method to read/write the last
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  61)  *   sector of an odd-sized disk from user space.  No tools have ever
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  62)  *   been released which used this code, so it's effectively dead.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  63)  * - Per Asit Mallick of Intel, added a test for a valid PMBR.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  64)  * - Added kernel command line option 'gpt' to override valid PMBR test.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  65)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  66)  * Wed Jun  6 2001 Martin Wilck <Martin.Wilck@Fujitsu-Siemens.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  67)  * - added devfs volume UUID support (/dev/volumes/uuids) for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  68)  *   mounting file systems by the partition GUID. 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  69)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  70)  * Tue Dec  5 2000 Matt Domsch <Matt_Domsch@dell.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  71)  * - Moved crc32() to linux/lib, added efi_crc32().
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  72)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  73)  * Thu Nov 30 2000 Matt Domsch <Matt_Domsch@dell.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  74)  * - Replaced Intel's CRC32 function with an equivalent
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  75)  *   non-license-restricted version.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  76)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  77)  * Wed Oct 25 2000 Matt Domsch <Matt_Domsch@dell.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  78)  * - Fixed the last_lba() call to return the proper last block
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  79)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  80)  * Thu Oct 12 2000 Matt Domsch <Matt_Domsch@dell.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  81)  * - Thanks to Andries Brouwer for his debugging assistance.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  82)  * - Code works, detects all the partitions.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  83)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  84)  ************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  85) #include <linux/kernel.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  86) #include <linux/crc32.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  87) #include <linux/ctype.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  88) #include <linux/math64.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  89) #include <linux/slab.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  90) #include "check.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  91) #include "efi.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  92) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  93) /* This allows a kernel command line option 'gpt' to override
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  94)  * the test for invalid PMBR.  Not __initdata because reloading
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  95)  * the partition tables happens after init too.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  96)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  97) static int force_gpt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  98) static int __init
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  99) force_gpt_fn(char *str)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) 	force_gpt = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) 	return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) __setup("gpt", force_gpt_fn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108)  * efi_crc32() - EFI version of crc32 function
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109)  * @buf: buffer to calculate crc32 of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110)  * @len: length of buf
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112)  * Description: Returns EFI-style CRC32 value for @buf
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113)  * 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114)  * This function uses the little endian Ethernet polynomial
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115)  * but seeds the function with ~0, and xor's with ~0 at the end.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116)  * Note, the EFI Specification, v1.02, has a reference to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117)  * Dr. Dobbs Journal, May 1994 (actually it's in May 1992).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) static inline u32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) efi_crc32(const void *buf, unsigned long len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) 	return (crc32(~0L, buf, len) ^ ~0L);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126)  * last_lba(): return number of last logical block of device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127)  * @bdev: block device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128)  * 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129)  * Description: Returns last LBA value on success, 0 on error.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130)  * This is stored (by sd and ide-geometry) in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131)  *  the part[0] entry for this disk, and is the number of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132)  *  physical sectors available on the disk.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) static u64 last_lba(struct block_device *bdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) 	if (!bdev || !bdev->bd_inode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) 	return div_u64(bdev->bd_inode->i_size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) 		       bdev_logical_block_size(bdev)) - 1ULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) static inline int pmbr_part_valid(gpt_mbr_record *part)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) 	if (part->os_type != EFI_PMBR_OSTYPE_EFI_GPT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) 		goto invalid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) 	/* set to 0x00000001 (i.e., the LBA of the GPT Partition Header) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) 	if (le32_to_cpu(part->starting_lba) != GPT_PRIMARY_PARTITION_TABLE_LBA)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) 		goto invalid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) 	return GPT_MBR_PROTECTIVE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) invalid:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157)  * is_pmbr_valid(): test Protective MBR for validity
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158)  * @mbr: pointer to a legacy mbr structure
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159)  * @total_sectors: amount of sectors in the device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161)  * Description: Checks for a valid protective or hybrid
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162)  * master boot record (MBR). The validity of a pMBR depends
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163)  * on all of the following properties:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164)  *  1) MSDOS signature is in the last two bytes of the MBR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165)  *  2) One partition of type 0xEE is found
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167)  * In addition, a hybrid MBR will have up to three additional
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168)  * primary partitions, which point to the same space that's
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169)  * marked out by up to three GPT partitions.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171)  * Returns 0 upon invalid MBR, or GPT_MBR_PROTECTIVE or
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172)  * GPT_MBR_HYBRID depending on the device layout.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) static int is_pmbr_valid(legacy_mbr *mbr, sector_t total_sectors)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) 	uint32_t sz = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) 	int i, part = 0, ret = 0; /* invalid by default */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) 	if (!mbr || le16_to_cpu(mbr->signature) != MSDOS_MBR_SIGNATURE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) 		goto done;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) 	for (i = 0; i < 4; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) 		ret = pmbr_part_valid(&mbr->partition_record[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) 		if (ret == GPT_MBR_PROTECTIVE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) 			part = i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) 			/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) 			 * Ok, we at least know that there's a protective MBR,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) 			 * now check if there are other partition types for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) 			 * hybrid MBR.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) 			 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) 			goto check_hybrid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) 	if (ret != GPT_MBR_PROTECTIVE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) 		goto done;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) check_hybrid:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) 	for (i = 0; i < 4; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) 		if ((mbr->partition_record[i].os_type !=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) 			EFI_PMBR_OSTYPE_EFI_GPT) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) 		    (mbr->partition_record[i].os_type != 0x00))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) 			ret = GPT_MBR_HYBRID;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) 	 * Protective MBRs take up the lesser of the whole disk
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) 	 * or 2 TiB (32bit LBA), ignoring the rest of the disk.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) 	 * Some partitioning programs, nonetheless, choose to set
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) 	 * the size to the maximum 32-bit limitation, disregarding
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) 	 * the disk size.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) 	 *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) 	 * Hybrid MBRs do not necessarily comply with this.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) 	 *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) 	 * Consider a bad value here to be a warning to support dd'ing
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) 	 * an image from a smaller disk to a larger disk.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) 	if (ret == GPT_MBR_PROTECTIVE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) 		sz = le32_to_cpu(mbr->partition_record[part].size_in_lba);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) 		if (sz != (uint32_t) total_sectors - 1 && sz != 0xFFFFFFFF)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) 			pr_debug("GPT: mbr size in lba (%u) different than whole disk (%u).\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) 				 sz, min_t(uint32_t,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) 					   total_sectors - 1, 0xFFFFFFFF));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) done:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228)  * read_lba(): Read bytes from disk, starting at given LBA
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229)  * @state: disk parsed partitions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230)  * @lba: the Logical Block Address of the partition table
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231)  * @buffer: destination buffer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232)  * @count: bytes to read
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234)  * Description: Reads @count bytes from @state->bdev into @buffer.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235)  * Returns number of bytes read on success, 0 on error.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) static size_t read_lba(struct parsed_partitions *state,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) 		       u64 lba, u8 *buffer, size_t count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) 	size_t totalreadcount = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) 	struct block_device *bdev = state->bdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) 	sector_t n = lba * (bdev_logical_block_size(bdev) / 512);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) 	if (!buffer || lba > last_lba(bdev))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245)                 return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) 	while (count) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) 		int copied = 512;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) 		Sector sect;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) 		unsigned char *data = read_part_sector(state, n++, &sect);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) 		if (!data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) 		if (copied > count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) 			copied = count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) 		memcpy(buffer, data, copied);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) 		put_dev_sector(sect);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) 		buffer += copied;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) 		totalreadcount +=copied;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) 		count -= copied;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) 	return totalreadcount;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265)  * alloc_read_gpt_entries(): reads partition entries from disk
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266)  * @state: disk parsed partitions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267)  * @gpt: GPT header
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268)  * 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269)  * Description: Returns ptes on success,  NULL on error.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270)  * Allocates space for PTEs based on information found in @gpt.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271)  * Notes: remember to free pte when you're done!
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) static gpt_entry *alloc_read_gpt_entries(struct parsed_partitions *state,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) 					 gpt_header *gpt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) 	size_t count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) 	gpt_entry *pte;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) 	if (!gpt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) 		return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) 	count = (size_t)le32_to_cpu(gpt->num_partition_entries) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283)                 le32_to_cpu(gpt->sizeof_partition_entry);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) 	if (!count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) 		return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) 	pte = kmalloc(count, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) 	if (!pte)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) 		return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) 	if (read_lba(state, le64_to_cpu(gpt->partition_entry_lba),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) 			(u8 *) pte, count) < count) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) 		kfree(pte);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293)                 pte=NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) 		return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) 	return pte;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300)  * alloc_read_gpt_header(): Allocates GPT header, reads into it from disk
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301)  * @state: disk parsed partitions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302)  * @lba: the Logical Block Address of the partition table
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303)  * 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304)  * Description: returns GPT header on success, NULL on error.   Allocates
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305)  * and fills a GPT header starting at @ from @state->bdev.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306)  * Note: remember to free gpt when finished with it.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) static gpt_header *alloc_read_gpt_header(struct parsed_partitions *state,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) 					 u64 lba)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) 	gpt_header *gpt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) 	unsigned ssz = bdev_logical_block_size(state->bdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) 	gpt = kmalloc(ssz, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) 	if (!gpt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) 		return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) 	if (read_lba(state, lba, (u8 *) gpt, ssz) < ssz) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) 		kfree(gpt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320)                 gpt=NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) 		return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) 	return gpt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328)  * is_gpt_valid() - tests one GPT header and PTEs for validity
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329)  * @state: disk parsed partitions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330)  * @lba: logical block address of the GPT header to test
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331)  * @gpt: GPT header ptr, filled on return.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332)  * @ptes: PTEs ptr, filled on return.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334)  * Description: returns 1 if valid,  0 on error.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335)  * If valid, returns pointers to newly allocated GPT header and PTEs.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) static int is_gpt_valid(struct parsed_partitions *state, u64 lba,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) 			gpt_header **gpt, gpt_entry **ptes)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) 	u32 crc, origcrc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) 	u64 lastlba, pt_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) 	if (!ptes)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) 	if (!(*gpt = alloc_read_gpt_header(state, lba)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) 	/* Check the GUID Partition Table signature */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) 	if (le64_to_cpu((*gpt)->signature) != GPT_HEADER_SIGNATURE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) 		pr_debug("GUID Partition Table Header signature is wrong:"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) 			 "%lld != %lld\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) 			 (unsigned long long)le64_to_cpu((*gpt)->signature),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) 			 (unsigned long long)GPT_HEADER_SIGNATURE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) 		goto fail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) 	/* Check the GUID Partition Table header size is too big */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) 	if (le32_to_cpu((*gpt)->header_size) >
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) 			bdev_logical_block_size(state->bdev)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) 		pr_debug("GUID Partition Table Header size is too large: %u > %u\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) 			le32_to_cpu((*gpt)->header_size),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) 			bdev_logical_block_size(state->bdev));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) 		goto fail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) 	/* Check the GUID Partition Table header size is too small */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) 	if (le32_to_cpu((*gpt)->header_size) < sizeof(gpt_header)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) 		pr_debug("GUID Partition Table Header size is too small: %u < %zu\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) 			le32_to_cpu((*gpt)->header_size),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) 			sizeof(gpt_header));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) 		goto fail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) 	/* Check the GUID Partition Table CRC */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) 	origcrc = le32_to_cpu((*gpt)->header_crc32);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) 	(*gpt)->header_crc32 = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) 	crc = efi_crc32((const unsigned char *) (*gpt), le32_to_cpu((*gpt)->header_size));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) 	if (crc != origcrc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) 		pr_debug("GUID Partition Table Header CRC is wrong: %x != %x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) 			 crc, origcrc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) 		goto fail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) 	(*gpt)->header_crc32 = cpu_to_le32(origcrc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) 	/* Check that the my_lba entry points to the LBA that contains
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) 	 * the GUID Partition Table */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) 	if (le64_to_cpu((*gpt)->my_lba) != lba) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) 		pr_debug("GPT my_lba incorrect: %lld != %lld\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) 			 (unsigned long long)le64_to_cpu((*gpt)->my_lba),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) 			 (unsigned long long)lba);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) 		goto fail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) 	/* Check the first_usable_lba and last_usable_lba are
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) 	 * within the disk.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) 	lastlba = last_lba(state->bdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) 	if (le64_to_cpu((*gpt)->first_usable_lba) > lastlba) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) 		pr_debug("GPT: first_usable_lba incorrect: %lld > %lld\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) 			 (unsigned long long)le64_to_cpu((*gpt)->first_usable_lba),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) 			 (unsigned long long)lastlba);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) 		goto fail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) 	if (le64_to_cpu((*gpt)->last_usable_lba) > lastlba) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) 		pr_debug("GPT: last_usable_lba incorrect: %lld > %lld\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) 			 (unsigned long long)le64_to_cpu((*gpt)->last_usable_lba),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) 			 (unsigned long long)lastlba);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) 		goto fail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) 	if (le64_to_cpu((*gpt)->last_usable_lba) < le64_to_cpu((*gpt)->first_usable_lba)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) 		pr_debug("GPT: last_usable_lba incorrect: %lld > %lld\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) 			 (unsigned long long)le64_to_cpu((*gpt)->last_usable_lba),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) 			 (unsigned long long)le64_to_cpu((*gpt)->first_usable_lba));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) 		goto fail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) 	/* Check that sizeof_partition_entry has the correct value */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) 	if (le32_to_cpu((*gpt)->sizeof_partition_entry) != sizeof(gpt_entry)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) 		pr_debug("GUID Partition Entry Size check failed.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) 		goto fail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) 	/* Sanity check partition table size */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) 	pt_size = (u64)le32_to_cpu((*gpt)->num_partition_entries) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) 		le32_to_cpu((*gpt)->sizeof_partition_entry);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) 	if (pt_size > KMALLOC_MAX_SIZE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) 		pr_debug("GUID Partition Table is too large: %llu > %lu bytes\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) 			 (unsigned long long)pt_size, KMALLOC_MAX_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) 		goto fail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) 	if (!(*ptes = alloc_read_gpt_entries(state, *gpt)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) 		goto fail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) 	/* Check the GUID Partition Entry Array CRC */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) 	crc = efi_crc32((const unsigned char *) (*ptes), pt_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) 	if (crc != le32_to_cpu((*gpt)->partition_entry_array_crc32)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) 		pr_debug("GUID Partition Entry Array CRC check failed.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) 		goto fail_ptes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) 	/* We're done, all's well */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) 	return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446)  fail_ptes:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) 	kfree(*ptes);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) 	*ptes = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449)  fail:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) 	kfree(*gpt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) 	*gpt = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456)  * is_pte_valid() - tests one PTE for validity
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457)  * @pte:pte to check
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458)  * @lastlba: last lba of the disk
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460)  * Description: returns 1 if valid,  0 on error.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) static inline int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) is_pte_valid(const gpt_entry *pte, const u64 lastlba)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) 	if ((!efi_guidcmp(pte->partition_type_guid, NULL_GUID)) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) 	    le64_to_cpu(pte->starting_lba) > lastlba         ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) 	    le64_to_cpu(pte->ending_lba)   > lastlba)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) 	return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473)  * compare_gpts() - Search disk for valid GPT headers and PTEs
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474)  * @pgpt: primary GPT header
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475)  * @agpt: alternate GPT header
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476)  * @lastlba: last LBA number
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478)  * Description: Returns nothing.  Sanity checks pgpt and agpt fields
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479)  * and prints warnings on discrepancies.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480)  * 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) compare_gpts(gpt_header *pgpt, gpt_header *agpt, u64 lastlba)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) 	int error_found = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) 	if (!pgpt || !agpt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) 	if (le64_to_cpu(pgpt->my_lba) != le64_to_cpu(agpt->alternate_lba)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) 		pr_warn("GPT:Primary header LBA != Alt. header alternate_lba\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) 		pr_warn("GPT:%lld != %lld\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) 		       (unsigned long long)le64_to_cpu(pgpt->my_lba),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492)                        (unsigned long long)le64_to_cpu(agpt->alternate_lba));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) 		error_found++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) 	if (le64_to_cpu(pgpt->alternate_lba) != le64_to_cpu(agpt->my_lba)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) 		pr_warn("GPT:Primary header alternate_lba != Alt. header my_lba\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) 		pr_warn("GPT:%lld != %lld\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) 		       (unsigned long long)le64_to_cpu(pgpt->alternate_lba),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499)                        (unsigned long long)le64_to_cpu(agpt->my_lba));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) 		error_found++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) 	if (le64_to_cpu(pgpt->first_usable_lba) !=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503)             le64_to_cpu(agpt->first_usable_lba)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) 		pr_warn("GPT:first_usable_lbas don't match.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) 		pr_warn("GPT:%lld != %lld\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) 		       (unsigned long long)le64_to_cpu(pgpt->first_usable_lba),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507)                        (unsigned long long)le64_to_cpu(agpt->first_usable_lba));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) 		error_found++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) 	if (le64_to_cpu(pgpt->last_usable_lba) !=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511)             le64_to_cpu(agpt->last_usable_lba)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) 		pr_warn("GPT:last_usable_lbas don't match.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) 		pr_warn("GPT:%lld != %lld\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) 		       (unsigned long long)le64_to_cpu(pgpt->last_usable_lba),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515)                        (unsigned long long)le64_to_cpu(agpt->last_usable_lba));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) 		error_found++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) 	if (efi_guidcmp(pgpt->disk_guid, agpt->disk_guid)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) 		pr_warn("GPT:disk_guids don't match.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) 		error_found++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) 	if (le32_to_cpu(pgpt->num_partition_entries) !=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523)             le32_to_cpu(agpt->num_partition_entries)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) 		pr_warn("GPT:num_partition_entries don't match: "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) 		       "0x%x != 0x%x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) 		       le32_to_cpu(pgpt->num_partition_entries),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) 		       le32_to_cpu(agpt->num_partition_entries));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) 		error_found++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) 	if (le32_to_cpu(pgpt->sizeof_partition_entry) !=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531)             le32_to_cpu(agpt->sizeof_partition_entry)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) 		pr_warn("GPT:sizeof_partition_entry values don't match: "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) 		       "0x%x != 0x%x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534)                        le32_to_cpu(pgpt->sizeof_partition_entry),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) 		       le32_to_cpu(agpt->sizeof_partition_entry));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) 		error_found++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) 	if (le32_to_cpu(pgpt->partition_entry_array_crc32) !=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539)             le32_to_cpu(agpt->partition_entry_array_crc32)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) 		pr_warn("GPT:partition_entry_array_crc32 values don't match: "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) 		       "0x%x != 0x%x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542)                        le32_to_cpu(pgpt->partition_entry_array_crc32),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) 		       le32_to_cpu(agpt->partition_entry_array_crc32));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) 		error_found++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) 	if (le64_to_cpu(pgpt->alternate_lba) != lastlba) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) 		pr_warn("GPT:Primary header thinks Alt. header is not at the end of the disk.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) 		pr_warn("GPT:%lld != %lld\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) 			(unsigned long long)le64_to_cpu(pgpt->alternate_lba),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) 			(unsigned long long)lastlba);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) 		error_found++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) 	if (le64_to_cpu(agpt->my_lba) != lastlba) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) 		pr_warn("GPT:Alternate GPT header not at the end of the disk.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) 		pr_warn("GPT:%lld != %lld\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) 			(unsigned long long)le64_to_cpu(agpt->my_lba),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) 			(unsigned long long)lastlba);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) 		error_found++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) 	if (error_found)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) 		pr_warn("GPT: Use GNU Parted to correct GPT errors.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) 	return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568)  * find_valid_gpt() - Search disk for valid GPT headers and PTEs
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569)  * @state: disk parsed partitions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570)  * @gpt: GPT header ptr, filled on return.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571)  * @ptes: PTEs ptr, filled on return.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573)  * Description: Returns 1 if valid, 0 on error.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574)  * If valid, returns pointers to newly allocated GPT header and PTEs.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575)  * Validity depends on PMBR being valid (or being overridden by the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576)  * 'gpt' kernel command line option) and finding either the Primary
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577)  * GPT header and PTEs valid, or the Alternate GPT header and PTEs
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578)  * valid.  If the Primary GPT header is not valid, the Alternate GPT header
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579)  * is not checked unless the 'gpt' kernel command line option is passed.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580)  * This protects against devices which misreport their size, and forces
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581)  * the user to decide to use the Alternate GPT.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) static int find_valid_gpt(struct parsed_partitions *state, gpt_header **gpt,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) 			  gpt_entry **ptes)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) 	int good_pgpt = 0, good_agpt = 0, good_pmbr = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) 	gpt_header *pgpt = NULL, *agpt = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) 	gpt_entry *pptes = NULL, *aptes = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) 	legacy_mbr *legacymbr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) 	sector_t total_sectors = i_size_read(state->bdev->bd_inode) >> 9;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) 	u64 lastlba;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) 	if (!ptes)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) 	lastlba = last_lba(state->bdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597)         if (!force_gpt) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) 		/* This will be added to the EFI Spec. per Intel after v1.02. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) 		legacymbr = kzalloc(sizeof(*legacymbr), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) 		if (!legacymbr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) 			goto fail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) 		read_lba(state, 0, (u8 *)legacymbr, sizeof(*legacymbr));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604) 		good_pmbr = is_pmbr_valid(legacymbr, total_sectors);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) 		kfree(legacymbr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) 		if (!good_pmbr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) 			goto fail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) 		pr_debug("Device has a %s MBR\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) 			 good_pmbr == GPT_MBR_PROTECTIVE ?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) 						"protective" : "hybrid");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) 	good_pgpt = is_gpt_valid(state, GPT_PRIMARY_PARTITION_TABLE_LBA,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) 				 &pgpt, &pptes);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617)         if (good_pgpt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) 		good_agpt = is_gpt_valid(state,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) 					 le64_to_cpu(pgpt->alternate_lba),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) 					 &agpt, &aptes);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621)         if (!good_agpt && force_gpt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622)                 good_agpt = is_gpt_valid(state, lastlba, &agpt, &aptes);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624)         /* The obviously unsuccessful case */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625)         if (!good_pgpt && !good_agpt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626)                 goto fail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628)         compare_gpts(pgpt, agpt, lastlba);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630)         /* The good cases */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631)         if (good_pgpt) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632)                 *gpt  = pgpt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633)                 *ptes = pptes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634)                 kfree(agpt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635)                 kfree(aptes);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636) 		if (!good_agpt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637)                         pr_warn("Alternate GPT is invalid, using primary GPT.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638)                 return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640)         else if (good_agpt) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641)                 *gpt  = agpt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642)                 *ptes = aptes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643)                 kfree(pgpt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644)                 kfree(pptes);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) 		pr_warn("Primary GPT is invalid, using alternate GPT.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646)                 return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649)  fail:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650)         kfree(pgpt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651)         kfree(agpt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652)         kfree(pptes);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653)         kfree(aptes);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654)         *gpt = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655)         *ptes = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656)         return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660)  * utf16_le_to_7bit(): Naively converts a UTF-16LE string to 7-bit ASCII characters
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661)  * @in: input UTF-16LE string
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662)  * @size: size of the input string
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663)  * @out: output string ptr, should be capable to store @size+1 characters
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665)  * Description: Converts @size UTF16-LE symbols from @in string to 7-bit
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666)  * ASCII characters and stores them to @out. Adds trailing zero to @out array.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) static void utf16_le_to_7bit(const __le16 *in, unsigned int size, u8 *out)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670) 	unsigned int i = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) 	out[size] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) 	while (i < size) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675) 		u8 c = le16_to_cpu(in[i]) & 0xff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) 		if (c && !isprint(c))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678) 			c = '!';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679) 		out[i] = c;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) 		i++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685)  * efi_partition(struct parsed_partitions *state)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686)  * @state: disk parsed partitions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688)  * Description: called from check.c, if the disk contains GPT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689)  * partitions, sets up partition entries in the kernel.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691)  * If the first block on the disk is a legacy MBR,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692)  * it will get handled by msdos_partition().
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693)  * If it's a Protective MBR, we'll handle it here.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695)  * We do not create a Linux partition for GPT, but
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696)  * only for the actual data partitions.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697)  * Returns:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698)  * -1 if unable to read the partition table
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699)  *  0 if this isn't our partition table
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700)  *  1 if successful
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703) int efi_partition(struct parsed_partitions *state)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705) 	gpt_header *gpt = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706) 	gpt_entry *ptes = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707) 	u32 i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708) 	unsigned ssz = bdev_logical_block_size(state->bdev) / 512;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710) 	if (!find_valid_gpt(state, &gpt, &ptes) || !gpt || !ptes) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711) 		kfree(gpt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712) 		kfree(ptes);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716) 	pr_debug("GUID Partition Table is valid!  Yea!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718) 	for (i = 0; i < le32_to_cpu(gpt->num_partition_entries) && i < state->limit-1; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719) 		struct partition_meta_info *info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720) 		unsigned label_max;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721) 		u64 start = le64_to_cpu(ptes[i].starting_lba);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722) 		u64 size = le64_to_cpu(ptes[i].ending_lba) -
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723) 			   le64_to_cpu(ptes[i].starting_lba) + 1ULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) 		if (!is_pte_valid(&ptes[i], last_lba(state->bdev)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726) 			continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) 		put_partition(state, i+1, start * ssz, size * ssz);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730) 		/* If this is a RAID volume, tell md */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731) 		if (!efi_guidcmp(ptes[i].partition_type_guid, PARTITION_LINUX_RAID_GUID))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732) 			state->parts[i + 1].flags = ADDPART_FLAG_RAID;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734) 		info = &state->parts[i + 1].info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735) 		efi_guid_to_str(&ptes[i].unique_partition_guid, info->uuid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737) 		/* Naively convert UTF16-LE to 7 bits. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738) 		label_max = min(ARRAY_SIZE(info->volname) - 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739) 				ARRAY_SIZE(ptes[i].partition_name));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740) 		utf16_le_to_7bit(ptes[i].partition_name, label_max, info->volname);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741) 		state->parts[i + 1].has_info = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743) 	kfree(ptes);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744) 	kfree(gpt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745) 	strlcat(state->pp_buf, "\n", PAGE_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746) 	return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747) }