^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++, §);
^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) }