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