1*4882a593Smuzhiyun #ifndef _GPT_H 2*4882a593Smuzhiyun #define _GPT_H 3*4882a593Smuzhiyun 4*4882a593Smuzhiyun #define MSDOS_MBR_SIGNATURE 0xAA55 5*4882a593Smuzhiyun #define EFI_PMBR_OSTYPE_EFI 0xEF 6*4882a593Smuzhiyun #define EFI_PMBR_OSTYPE_EFI_GPT 0xEE 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun #define GPT_HEADER_SIGNATURE 0x5452415020494645ULL 9*4882a593Smuzhiyun #define GPT_HEADER_REVISION_V1 0x00010000 10*4882a593Smuzhiyun #define GPT_PRIMARY_PARTITION_TABLE_LBA 1ULL 11*4882a593Smuzhiyun #define GPT_ENTRY_NAME "gpt" 12*4882a593Smuzhiyun #define GPT_ENTRY_NUMBERS 128 13*4882a593Smuzhiyun #define GPT_ENTRY_SIZE 128 14*4882a593Smuzhiyun #define PART_PROPERTY_BOOTABLE (1 << 2) 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun #define EFI_GUID(a,b,c,d0,d1,d2,d3,d4,d5,d6,d7) \ 17*4882a593Smuzhiyun ((efi_guid_t) \ 18*4882a593Smuzhiyun {{ (a) & 0xff, ((a) >> 8) & 0xff, ((a) >> 16) & 0xff, ((a) >> 24) & 0xff, \ 19*4882a593Smuzhiyun (b) & 0xff, ((b) >> 8) & 0xff, \ 20*4882a593Smuzhiyun (c) & 0xff, ((c) >> 8) & 0xff, \ 21*4882a593Smuzhiyun (d0), (d1), (d2), (d3), (d4), (d5), (d6), (d7) }}) 22*4882a593Smuzhiyun 23*4882a593Smuzhiyun #define PARTITION_IDBLOCK_GUID \ 24*4882a593Smuzhiyun EFI_GUID(0xDA2BB095, 0x390E, 0x48ca, \ 25*4882a593Smuzhiyun 0x90, 0x47, 0x05, 0xE8, 0x18, 0xB2, 0x97, 0xCE) 26*4882a593Smuzhiyun 27*4882a593Smuzhiyun typedef unsigned char u8; 28*4882a593Smuzhiyun typedef unsigned short u16; 29*4882a593Smuzhiyun typedef unsigned int u32; 30*4882a593Smuzhiyun typedef unsigned long long u64; 31*4882a593Smuzhiyun 32*4882a593Smuzhiyun #define uswap_16(x) \ 33*4882a593Smuzhiyun ((((x) & 0xff00) >> 8) | \ 34*4882a593Smuzhiyun (((x) & 0x00ff) << 8)) 35*4882a593Smuzhiyun #define uswap_32(x) \ 36*4882a593Smuzhiyun ((((x) & 0xff000000) >> 24) | \ 37*4882a593Smuzhiyun (((x) & 0x00ff0000) >> 8) | \ 38*4882a593Smuzhiyun (((x) & 0x0000ff00) << 8) | \ 39*4882a593Smuzhiyun (((x) & 0x000000ff) << 24)) 40*4882a593Smuzhiyun #define _uswap_64(x, sfx) \ 41*4882a593Smuzhiyun ((((x) & 0xff00000000000000##sfx) >> 56) | \ 42*4882a593Smuzhiyun (((x) & 0x00ff000000000000##sfx) >> 40) | \ 43*4882a593Smuzhiyun (((x) & 0x0000ff0000000000##sfx) >> 24) | \ 44*4882a593Smuzhiyun (((x) & 0x000000ff00000000##sfx) >> 8) | \ 45*4882a593Smuzhiyun (((x) & 0x00000000ff000000##sfx) << 8) | \ 46*4882a593Smuzhiyun (((x) & 0x0000000000ff0000##sfx) << 24) | \ 47*4882a593Smuzhiyun (((x) & 0x000000000000ff00##sfx) << 40) | \ 48*4882a593Smuzhiyun (((x) & 0x00000000000000ff##sfx) << 56)) 49*4882a593Smuzhiyun #if defined(__GNUC__) 50*4882a593Smuzhiyun #define uswap_64(x) _uswap_64(x, ull) 51*4882a593Smuzhiyun #else 52*4882a593Smuzhiyun #define uswap_64(x) _uswap_64(x, ) 53*4882a593Smuzhiyun #endif 54*4882a593Smuzhiyun #define __LITTLE_ENDIAN__ 1 55*4882a593Smuzhiyun #ifdef __LITTLE_ENDIAN__ 56*4882a593Smuzhiyun #define cpu_to_le16(x) (x) 57*4882a593Smuzhiyun #define cpu_to_le32(x) (x) 58*4882a593Smuzhiyun #define cpu_to_le64(x) (x) 59*4882a593Smuzhiyun #define le16_to_cpu(x) (x) 60*4882a593Smuzhiyun #define le32_to_cpu(x) (x) 61*4882a593Smuzhiyun #define le64_to_cpu(x) (x) 62*4882a593Smuzhiyun #define cpu_to_be16(x) uswap_16(x) 63*4882a593Smuzhiyun #define cpu_to_be32(x) uswap_32(x) 64*4882a593Smuzhiyun #define cpu_to_be64(x) uswap_64(x) 65*4882a593Smuzhiyun #define be16_to_cpu(x) uswap_16(x) 66*4882a593Smuzhiyun #define be32_to_cpu(x) uswap_32(x) 67*4882a593Smuzhiyun #define be64_to_cpu(x) uswap_64(x) 68*4882a593Smuzhiyun #else 69*4882a593Smuzhiyun #define cpu_to_le16(x) uswap_16(x) 70*4882a593Smuzhiyun #define cpu_to_le32(x) uswap_32(x) 71*4882a593Smuzhiyun #define cpu_to_le64(x) uswap_64(x) 72*4882a593Smuzhiyun #define le16_to_cpu(x) uswap_16(x) 73*4882a593Smuzhiyun #define le32_to_cpu(x) uswap_32(x) 74*4882a593Smuzhiyun #define le64_to_cpu(x) uswap_64(x) 75*4882a593Smuzhiyun #define cpu_to_be16(x) (x) 76*4882a593Smuzhiyun #define cpu_to_be32(x) (x) 77*4882a593Smuzhiyun #define cpu_to_be64(x) (x) 78*4882a593Smuzhiyun #define be16_to_cpu(x) (x) 79*4882a593Smuzhiyun #define be32_to_cpu(x) (x) 80*4882a593Smuzhiyun #define be64_to_cpu(x) (x) 81*4882a593Smuzhiyun #endif 82*4882a593Smuzhiyun 83*4882a593Smuzhiyun 84*4882a593Smuzhiyun typedef union 85*4882a593Smuzhiyun { 86*4882a593Smuzhiyun struct 87*4882a593Smuzhiyun { 88*4882a593Smuzhiyun unsigned int time_low; 89*4882a593Smuzhiyun unsigned short time_mid; 90*4882a593Smuzhiyun unsigned short time_hi_and_version; 91*4882a593Smuzhiyun unsigned char clock_seq_hi_and_reserved; 92*4882a593Smuzhiyun unsigned char clock_seq_low; 93*4882a593Smuzhiyun unsigned char node[6]; 94*4882a593Smuzhiyun } uuid; 95*4882a593Smuzhiyun u8 raw[16]; 96*4882a593Smuzhiyun } efi_guid_t; 97*4882a593Smuzhiyun #pragma pack(1) 98*4882a593Smuzhiyun typedef struct 99*4882a593Smuzhiyun { 100*4882a593Smuzhiyun u16 usTag;/*0xEEEE*/ 101*4882a593Smuzhiyun u16 usBackupGpt;/*0:no backup,1:has backup*/ 102*4882a593Smuzhiyun u16 usEntryCount; 103*4882a593Smuzhiyun u64 entryDataSize[32]; 104*4882a593Smuzhiyun } gpt_compact_info; 105*4882a593Smuzhiyun /* based on linux/include/genhd.h */ 106*4882a593Smuzhiyun typedef struct 107*4882a593Smuzhiyun { 108*4882a593Smuzhiyun u8 boot_ind; /* 0x80 - active */ 109*4882a593Smuzhiyun u8 head; /* starting head */ 110*4882a593Smuzhiyun u8 sector; /* starting sector */ 111*4882a593Smuzhiyun u8 cyl; /* starting cylinder */ 112*4882a593Smuzhiyun u8 sys_ind; /* What partition type */ 113*4882a593Smuzhiyun u8 end_head; /* end head */ 114*4882a593Smuzhiyun u8 end_sector; /* end sector */ 115*4882a593Smuzhiyun u8 end_cyl; /* end cylinder */ 116*4882a593Smuzhiyun u32 start_sect; /* starting sector counting from 0 */ 117*4882a593Smuzhiyun u32 nr_sects; /* nr of sectors in partition */ 118*4882a593Smuzhiyun } mbr_partition ; 119*4882a593Smuzhiyun 120*4882a593Smuzhiyun /* based on linux/fs/partitions/efi.h */ 121*4882a593Smuzhiyun typedef struct _gpt_header 122*4882a593Smuzhiyun { 123*4882a593Smuzhiyun u64 signature; 124*4882a593Smuzhiyun u32 revision; 125*4882a593Smuzhiyun u32 header_size; 126*4882a593Smuzhiyun u32 header_crc32; 127*4882a593Smuzhiyun u32 reserved1; 128*4882a593Smuzhiyun u64 my_lba; 129*4882a593Smuzhiyun u64 alternate_lba; 130*4882a593Smuzhiyun u64 first_usable_lba; 131*4882a593Smuzhiyun u64 last_usable_lba; 132*4882a593Smuzhiyun efi_guid_t disk_guid; 133*4882a593Smuzhiyun u64 partition_entry_lba; 134*4882a593Smuzhiyun u32 num_partition_entries; 135*4882a593Smuzhiyun u32 sizeof_partition_entry; 136*4882a593Smuzhiyun u32 partition_entry_array_crc32; 137*4882a593Smuzhiyun } gpt_header; 138*4882a593Smuzhiyun 139*4882a593Smuzhiyun typedef union _gpt_entry_attributes 140*4882a593Smuzhiyun { 141*4882a593Smuzhiyun struct 142*4882a593Smuzhiyun { 143*4882a593Smuzhiyun u64 required_to_function: 1; 144*4882a593Smuzhiyun u64 no_block_io_protocol: 1; 145*4882a593Smuzhiyun u64 legacy_bios_bootable: 1; 146*4882a593Smuzhiyun u64 reserved: 45; 147*4882a593Smuzhiyun u64 type_guid_specific: 16; 148*4882a593Smuzhiyun } fields; 149*4882a593Smuzhiyun unsigned long long raw; 150*4882a593Smuzhiyun } gpt_entry_attributes; 151*4882a593Smuzhiyun 152*4882a593Smuzhiyun #define PARTNAME_SZ 72 153*4882a593Smuzhiyun typedef struct _gpt_entry 154*4882a593Smuzhiyun { 155*4882a593Smuzhiyun efi_guid_t partition_type_guid; 156*4882a593Smuzhiyun efi_guid_t unique_partition_guid; 157*4882a593Smuzhiyun u64 starting_lba; 158*4882a593Smuzhiyun u64 ending_lba; 159*4882a593Smuzhiyun gpt_entry_attributes attributes; 160*4882a593Smuzhiyun u16 partition_name[PARTNAME_SZ / sizeof(u16)]; 161*4882a593Smuzhiyun } gpt_entry; 162*4882a593Smuzhiyun 163*4882a593Smuzhiyun typedef struct _legacy_mbr 164*4882a593Smuzhiyun { 165*4882a593Smuzhiyun u8 boot_code[440]; 166*4882a593Smuzhiyun u32 unique_mbr_signature; 167*4882a593Smuzhiyun u16 unknown; 168*4882a593Smuzhiyun mbr_partition partition_record[4]; 169*4882a593Smuzhiyun u16 signature; 170*4882a593Smuzhiyun } legacy_mbr; 171*4882a593Smuzhiyun #pragma pack() 172*4882a593Smuzhiyun #endif /* _GPT_H */ 173