efi.h
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 /************************************************************
3  * EFI GUID Partition Table
4  * Per Intel EFI Specification v1.02
5  * http://developer.intel.com/technology/efi/efi.htm
6  *
7  * By Matt Domsch <Matt_Domsch@dell.com> Fri Sep 22 22:15:56 CDT 2000
8  * Copyright 2000,2001 Dell Inc.
9  ************************************************************/
10 
11 #ifndef FS_PART_EFI_H_INCLUDED
12 #define FS_PART_EFI_H_INCLUDED
13 
14 #define MSDOS_MBR_SIGNATURE 0xaa55
15 #define EFI_PMBR_OSTYPE_EFI 0xEF
16 #define EFI_PMBR_OSTYPE_EFI_GPT 0xEE
17 
18 #define GPT_MBR_PROTECTIVE 1
19 #define GPT_MBR_HYBRID 2
20 
21 #define GPT_HEADER_SIGNATURE 0x5452415020494645ULL
22 #define GPT_HEADER_REVISION_V1 0x00010000
23 #define GPT_PRIMARY_PARTITION_TABLE_LBA 1
24 
25 using efi_guid_t = Uuid;
26 
27 struct gpt_header_t {
28  uint64_t signature;
29  uint32_t revision;
30  uint32_t header_size;
31  uint32_t header_crc32;
32  uint32_t reserved1;
33  uint64_t my_lba;
34  uint64_t alternate_lba;
35  uint64_t first_usable_lba;
36  uint64_t last_usable_lba;
42 
43  /* The rest of the logical block is reserved by UEFI and must be zero.
44  * EFI standard handles this by:
45  *
46  * uint8_t reserved2[ BlockSize - 92 ];
47  */
48 };
49 
50 static_assert(sizeof(gpt_header_t) == 92 || sizeof(gpt_header_t) == 96);
51 
52 #define GPT_HEADER_SIZE 92
53 
55  uint64_t required_to_function : 1;
56  uint64_t reserved : 47;
57  uint64_t type_guid_specific : 16;
58 };
59 
60 struct gpt_entry_t {
63  uint64_t starting_lba;
64  uint64_t ending_lba;
66  uint16_t partition_name[72 / sizeof(uint16_t)];
67 };
68 
69 static_assert(sizeof(gpt_entry_t) == 128);
70 
71 struct __attribute__((packed)) gpt_mbr_record_t {
72  uint8_t boot_indicator; /* unused by EFI, set to 0x80 for bootable */
73  uint8_t start_head; /* unused by EFI, pt start in CHS */
74  uint8_t start_sector; /* unused by EFI, pt start in CHS */
75  uint8_t start_track;
76  uint8_t os_type; /* EFI and legacy non-EFI OS types */
77  uint8_t end_head; /* unused by EFI, pt end in CHS */
78  uint8_t end_sector; /* unused by EFI, pt end in CHS */
79  uint8_t end_track; /* unused by EFI, pt end in CHS */
80  uint32_t starting_lba; /* used by EFI - start addr of the on disk pt */
81  uint32_t size_in_lba; /* used by EFI - size of pt in LBA */
82 };
83 
84 struct __attribute__((packed)) legacy_mbr_t {
85  uint8_t boot_code[440];
87  uint16_t unknown;
88  gpt_mbr_record_t partition_record[4];
89  uint16_t signature;
90 };
91 
92 #endif
Class for manipulating UUID (aka GUID) entities.
Definition: Uuid.h:26
Definition: efi.h:54
uint64_t reserved
Definition: efi.h:56
uint64_t required_to_function
Definition: efi.h:55
uint64_t type_guid_specific
Definition: efi.h:57
Definition: efi.h:60
efi_guid_t unique_partition_guid
Definition: efi.h:62
uint64_t ending_lba
Definition: efi.h:64
gpt_entry_attributes_t attributes
Definition: efi.h:65
efi_guid_t partition_type_guid
Definition: efi.h:61
uint16_t partition_name[72/sizeof(uint16_t)]
Definition: efi.h:66
uint64_t starting_lba
Definition: efi.h:63
Definition: efi.h:27
uint64_t alternate_lba
Definition: efi.h:34
uint32_t revision
Definition: efi.h:29
uint64_t my_lba
Definition: efi.h:33
uint64_t last_usable_lba
Definition: efi.h:36
uint32_t header_crc32
Definition: efi.h:31
uint32_t sizeof_partition_entry
Definition: efi.h:40
uint32_t partition_entry_array_crc32
Definition: efi.h:41
uint64_t partition_entry_lba
Definition: efi.h:38
uint64_t first_usable_lba
Definition: efi.h:35
uint32_t header_size
Definition: efi.h:30
uint32_t num_partition_entries
Definition: efi.h:39
uint32_t reserved1
Definition: efi.h:32
uint64_t signature
Definition: efi.h:28
efi_guid_t disk_guid
Definition: efi.h:37
Definition: efi.h:71
uint8_t end_head
Definition: efi.h:77
uint32_t size_in_lba
Definition: efi.h:81
uint8_t boot_indicator
Definition: efi.h:72
uint8_t start_sector
Definition: efi.h:74
uint32_t starting_lba
Definition: efi.h:80
uint8_t os_type
Definition: efi.h:76
uint8_t start_track
Definition: efi.h:75
uint8_t start_head
Definition: efi.h:73
uint8_t end_track
Definition: efi.h:79
uint8_t end_sector
Definition: efi.h:78
Definition: efi.h:84
uint16_t unknown
Definition: efi.h:87
uint32_t unique_mbr_signature
Definition: efi.h:86
uint16_t signature
Definition: efi.h:89