1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * Copyright (C) 2023 Rockchip Electronics Co., Ltd. 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * Licensed under the Apache License, Version 2.0 (the "License"); 5*4882a593Smuzhiyun * you may not use this file except in compliance with the License. 6*4882a593Smuzhiyun * You may obtain a copy of the License at 7*4882a593Smuzhiyun * 8*4882a593Smuzhiyun * http://www.apache.org/licenses/LICENSE-2.0 9*4882a593Smuzhiyun * 10*4882a593Smuzhiyun * Unless required by applicable law or agreed to in writing, software 11*4882a593Smuzhiyun * distributed under the License is distributed on an "AS IS" BASIS, 12*4882a593Smuzhiyun * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*4882a593Smuzhiyun * See the License for the specific language governing permissions and 14*4882a593Smuzhiyun * limitations under the License. 15*4882a593Smuzhiyun */ 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun #ifndef _GPT_H 18*4882a593Smuzhiyun #define _GPT_H 19*4882a593Smuzhiyun 20*4882a593Smuzhiyun #define MSDOS_MBR_SIGNATURE 0xAA55 21*4882a593Smuzhiyun #define EFI_PMBR_OSTYPE_EFI 0xEF 22*4882a593Smuzhiyun #define EFI_PMBR_OSTYPE_EFI_GPT 0xEE 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun #define GPT_HEADER_SIGNATURE 0x5452415020494645ULL 25*4882a593Smuzhiyun #define GPT_HEADER_REVISION_V1 0x00010000 26*4882a593Smuzhiyun #define GPT_PRIMARY_PARTITION_TABLE_LBA 1ULL 27*4882a593Smuzhiyun #define GPT_ENTRY_NAME "gpt" 28*4882a593Smuzhiyun #define GPT_ENTRY_NUMBERS 128 29*4882a593Smuzhiyun #define GPT_ENTRY_SIZE 128 30*4882a593Smuzhiyun #define PART_PROPERTY_BOOTABLE (1 << 2) 31*4882a593Smuzhiyun 32*4882a593Smuzhiyun #define EFI_GUID(a,b,c,d0,d1,d2,d3,d4,d5,d6,d7) \ 33*4882a593Smuzhiyun ((efi_guid_t) \ 34*4882a593Smuzhiyun {{ (a) & 0xff, ((a) >> 8) & 0xff, ((a) >> 16) & 0xff, ((a) >> 24) & 0xff, \ 35*4882a593Smuzhiyun (b) & 0xff, ((b) >> 8) & 0xff, \ 36*4882a593Smuzhiyun (c) & 0xff, ((c) >> 8) & 0xff, \ 37*4882a593Smuzhiyun (d0), (d1), (d2), (d3), (d4), (d5), (d6), (d7) }}) 38*4882a593Smuzhiyun 39*4882a593Smuzhiyun #define PARTITION_IDBLOCK_GUID \ 40*4882a593Smuzhiyun EFI_GUID(0xDA2BB095, 0x390E, 0x48ca, \ 41*4882a593Smuzhiyun 0x90, 0x47, 0x05, 0xE8, 0x18, 0xB2, 0x97, 0xCE) 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun typedef unsigned char u8; 44*4882a593Smuzhiyun typedef unsigned short u16; 45*4882a593Smuzhiyun typedef unsigned int u32; 46*4882a593Smuzhiyun typedef unsigned long long u64; 47*4882a593Smuzhiyun 48*4882a593Smuzhiyun #define uswap_16(x) \ 49*4882a593Smuzhiyun ((((x) & 0xff00) >> 8) | \ 50*4882a593Smuzhiyun (((x) & 0x00ff) << 8)) 51*4882a593Smuzhiyun #define uswap_32(x) \ 52*4882a593Smuzhiyun ((((x) & 0xff000000) >> 24) | \ 53*4882a593Smuzhiyun (((x) & 0x00ff0000) >> 8) | \ 54*4882a593Smuzhiyun (((x) & 0x0000ff00) << 8) | \ 55*4882a593Smuzhiyun (((x) & 0x000000ff) << 24)) 56*4882a593Smuzhiyun #define _uswap_64(x, sfx) \ 57*4882a593Smuzhiyun ((((x) & 0xff00000000000000##sfx) >> 56) | \ 58*4882a593Smuzhiyun (((x) & 0x00ff000000000000##sfx) >> 40) | \ 59*4882a593Smuzhiyun (((x) & 0x0000ff0000000000##sfx) >> 24) | \ 60*4882a593Smuzhiyun (((x) & 0x000000ff00000000##sfx) >> 8) | \ 61*4882a593Smuzhiyun (((x) & 0x00000000ff000000##sfx) << 8) | \ 62*4882a593Smuzhiyun (((x) & 0x0000000000ff0000##sfx) << 24) | \ 63*4882a593Smuzhiyun (((x) & 0x000000000000ff00##sfx) << 40) | \ 64*4882a593Smuzhiyun (((x) & 0x00000000000000ff##sfx) << 56)) 65*4882a593Smuzhiyun #if defined(__GNUC__) 66*4882a593Smuzhiyun # define uswap_64(x) _uswap_64(x, ull) 67*4882a593Smuzhiyun #else 68*4882a593Smuzhiyun # define uswap_64(x) _uswap_64(x, ) 69*4882a593Smuzhiyun #endif 70*4882a593Smuzhiyun #define __LITTLE_ENDIAN__ 1 71*4882a593Smuzhiyun #ifdef __LITTLE_ENDIAN__ 72*4882a593Smuzhiyun # define cpu_to_le16(x) (x) 73*4882a593Smuzhiyun # define cpu_to_le32(x) (x) 74*4882a593Smuzhiyun # define cpu_to_le64(x) (x) 75*4882a593Smuzhiyun # define le16_to_cpu(x) (x) 76*4882a593Smuzhiyun # define le32_to_cpu(x) (x) 77*4882a593Smuzhiyun # define le64_to_cpu(x) (x) 78*4882a593Smuzhiyun # define cpu_to_be16(x) uswap_16(x) 79*4882a593Smuzhiyun # define cpu_to_be32(x) uswap_32(x) 80*4882a593Smuzhiyun # define cpu_to_be64(x) uswap_64(x) 81*4882a593Smuzhiyun # define be16_to_cpu(x) uswap_16(x) 82*4882a593Smuzhiyun # define be32_to_cpu(x) uswap_32(x) 83*4882a593Smuzhiyun # define be64_to_cpu(x) uswap_64(x) 84*4882a593Smuzhiyun #else 85*4882a593Smuzhiyun # define cpu_to_le16(x) uswap_16(x) 86*4882a593Smuzhiyun # define cpu_to_le32(x) uswap_32(x) 87*4882a593Smuzhiyun # define cpu_to_le64(x) uswap_64(x) 88*4882a593Smuzhiyun # define le16_to_cpu(x) uswap_16(x) 89*4882a593Smuzhiyun # define le32_to_cpu(x) uswap_32(x) 90*4882a593Smuzhiyun # define le64_to_cpu(x) uswap_64(x) 91*4882a593Smuzhiyun # define cpu_to_be16(x) (x) 92*4882a593Smuzhiyun # define cpu_to_be32(x) (x) 93*4882a593Smuzhiyun # define cpu_to_be64(x) (x) 94*4882a593Smuzhiyun # define be16_to_cpu(x) (x) 95*4882a593Smuzhiyun # define be32_to_cpu(x) (x) 96*4882a593Smuzhiyun # define be64_to_cpu(x) (x) 97*4882a593Smuzhiyun #endif 98*4882a593Smuzhiyun 99*4882a593Smuzhiyun 100*4882a593Smuzhiyun typedef union { 101*4882a593Smuzhiyun struct { 102*4882a593Smuzhiyun unsigned int time_low; 103*4882a593Smuzhiyun unsigned short time_mid; 104*4882a593Smuzhiyun unsigned short time_hi_and_version; 105*4882a593Smuzhiyun unsigned char clock_seq_hi_and_reserved; 106*4882a593Smuzhiyun unsigned char clock_seq_low; 107*4882a593Smuzhiyun unsigned char node[6]; 108*4882a593Smuzhiyun } uuid; 109*4882a593Smuzhiyun u8 raw[16]; 110*4882a593Smuzhiyun } efi_guid_t; 111*4882a593Smuzhiyun #pragma pack(1) 112*4882a593Smuzhiyun typedef struct { 113*4882a593Smuzhiyun u16 usTag;/*0xEEEE*/ 114*4882a593Smuzhiyun u16 usBackupGpt;/*0:no backup,1:has backup*/ 115*4882a593Smuzhiyun u16 usEntryCount; 116*4882a593Smuzhiyun u64 entryDataSize[32]; 117*4882a593Smuzhiyun } gpt_compact_info; 118*4882a593Smuzhiyun /* based on linux/include/genhd.h */ 119*4882a593Smuzhiyun typedef struct { 120*4882a593Smuzhiyun u8 boot_ind; /* 0x80 - active */ 121*4882a593Smuzhiyun u8 head; /* starting head */ 122*4882a593Smuzhiyun u8 sector; /* starting sector */ 123*4882a593Smuzhiyun u8 cyl; /* starting cylinder */ 124*4882a593Smuzhiyun u8 sys_ind; /* What partition type */ 125*4882a593Smuzhiyun u8 end_head; /* end head */ 126*4882a593Smuzhiyun u8 end_sector; /* end sector */ 127*4882a593Smuzhiyun u8 end_cyl; /* end cylinder */ 128*4882a593Smuzhiyun u32 start_sect; /* starting sector counting from 0 */ 129*4882a593Smuzhiyun u32 nr_sects; /* nr of sectors in partition */ 130*4882a593Smuzhiyun } mbr_partition ; 131*4882a593Smuzhiyun 132*4882a593Smuzhiyun /* based on linux/fs/partitions/efi.h */ 133*4882a593Smuzhiyun typedef struct _gpt_header { 134*4882a593Smuzhiyun u64 signature; //固定字符串“EFI PART” 135*4882a593Smuzhiyun u32 revision; //GPT版本号 136*4882a593Smuzhiyun u32 header_size; //主GPT头大小 137*4882a593Smuzhiyun u32 header_crc32; //主GPT头的CRC32校验数据,注意不是累加和校验 138*4882a593Smuzhiyun u32 reserved1; //保留位 139*4882a593Smuzhiyun u64 my_lba; //主GPT头起始扇区号,LBA1 140*4882a593Smuzhiyun u64 alternate_lba; //主GPT头备份位置扇区号 LBA-1 141*4882a593Smuzhiyun u64 first_usable_lba; //GPT分区起始扇区号,LBA34 142*4882a593Smuzhiyun u64 last_usable_lba; //GPT分区结束扇区号,LBA-34 143*4882a593Smuzhiyun efi_guid_t disk_guid; //磁盘的GUID,唯一标识,这也意味着全硬盘复制是行不通的. 144*4882a593Smuzhiyun u64 partition_entry_lba; //分区表起始扇区号,LBA2 145*4882a593Smuzhiyun u32 num_partition_entries; //分区表项数目,MS强行给128 146*4882a593Smuzhiyun u32 sizeof_partition_entry; //每个分区表占用字节数,128 147*4882a593Smuzhiyun u32 partition_entry_array_crc32; //分区表CRC校验数据 148*4882a593Smuzhiyun } gpt_header; 149*4882a593Smuzhiyun 150*4882a593Smuzhiyun typedef union _gpt_entry_attributes { 151*4882a593Smuzhiyun struct { 152*4882a593Smuzhiyun u64 required_to_function: 1; 153*4882a593Smuzhiyun u64 no_block_io_protocol: 1; 154*4882a593Smuzhiyun u64 legacy_bios_bootable: 1; 155*4882a593Smuzhiyun u64 reserved: 45; 156*4882a593Smuzhiyun u64 type_guid_specific: 16; 157*4882a593Smuzhiyun } fields; 158*4882a593Smuzhiyun unsigned long long raw; 159*4882a593Smuzhiyun } gpt_entry_attributes; 160*4882a593Smuzhiyun 161*4882a593Smuzhiyun #define PARTNAME_SZ 72 162*4882a593Smuzhiyun typedef struct _gpt_entry { 163*4882a593Smuzhiyun efi_guid_t partition_type_guid; 164*4882a593Smuzhiyun efi_guid_t unique_partition_guid; 165*4882a593Smuzhiyun u64 starting_lba; 166*4882a593Smuzhiyun u64 ending_lba; 167*4882a593Smuzhiyun gpt_entry_attributes attributes; 168*4882a593Smuzhiyun u16 partition_name[PARTNAME_SZ / sizeof(u16)]; 169*4882a593Smuzhiyun } gpt_entry; 170*4882a593Smuzhiyun 171*4882a593Smuzhiyun typedef struct _legacy_mbr { 172*4882a593Smuzhiyun u8 boot_code[440]; 173*4882a593Smuzhiyun u32 unique_mbr_signature; 174*4882a593Smuzhiyun u16 unknown; 175*4882a593Smuzhiyun mbr_partition partition_record[4]; 176*4882a593Smuzhiyun u16 signature; 177*4882a593Smuzhiyun } legacy_mbr; 178*4882a593Smuzhiyun #pragma pack() 179*4882a593Smuzhiyun #endif /* _GPT_H */ 180