diff options
author | наб <nabijaczleweli@gmail.com> | 2020-05-30 18:45:35 +0200 |
---|---|---|
committer | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2020-06-01 23:07:32 +0200 |
commit | 204a382c7b6ccc6443a81688066319d73ef65cab (patch) | |
tree | ea3079e78a93c1d0607999d7696121cd0b58591b /linux/dev/include | |
parent | f802b371c8f5e0ca89bbea8f197b5bec5763f78f (diff) | |
download | gnumach-204a382c7b6ccc6443a81688066319d73ef65cab.tar.gz gnumach-204a382c7b6ccc6443a81688066319d73ef65cab.tar.bz2 gnumach-204a382c7b6ccc6443a81688066319d73ef65cab.zip |
Support GPT disklabels and build them by default
Based on UEFI 2.8A spec
Diffstat (limited to 'linux/dev/include')
-rw-r--r-- | linux/dev/include/linux/genhd.h | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/linux/dev/include/linux/genhd.h b/linux/dev/include/linux/genhd.h index 20a6c978..f19015d4 100644 --- a/linux/dev/include/linux/genhd.h +++ b/linux/dev/include/linux/genhd.h @@ -128,6 +128,73 @@ struct bsd_disklabel { #endif /* CONFIG_BSD_DISKLABEL */ +#ifdef CONFIG_GPT_DISKLABEL +/* + * GPT disklabel support by наб <nabijaczleweli@gmail.com> + * + * Based on UEFI specification 2.8A (current as of May 2020): + * https://uefi.org/specifications + * https://uefi.org/sites/default/files/resources/UEFI_Spec_2_8_A_Feb14.pdf + * + * CRC32 behaviour (final ^ ~0) courtesy of util-linux documentation: + * https://git.kernel.org/pub/scm/utils/util-linux/util-linux.git/tree/libblkid/src/partitions/gpt.c?id=042f62dfc514da177c148c257e4dcb32e5f8379d#n104 + */ + +#define GPT_PARTITION 0xee /* Partition ID in MBR */ + +#define GPT_GUID_SIZE 16 +struct gpt_guid { + __u32 g_time_low; /* Low field of timestamp */ + __u16 g_time_mid; /* Medium field of timestamp */ + __u16 g_time_high_version; /* High field of timestamp and version */ + __u8 g_clock_sec_high; /* High field of clock sequence and variant */ + __u8 g_clock_sec_low; /* Low field of clock sequence */ + __u8 g_node_id[6]; /* Spatially unique node identifier (MAC address or urandom) */ +} __attribute((packed)); +typedef char __gpt_guid_right_size[(sizeof(struct gpt_guid) == GPT_GUID_SIZE) ? 1 : -1]; + +static const struct gpt_guid GPT_GUID_TYPE_UNUSED = {0,0,0,0,0,{0,0,0,0,0,0}}; + +#define GPT_SIGNATURE "EFI PART" /* The header signauture */ +#define GPT_REVISION (0x00010000UL) /* Little-endian on disk */ +#define GPT_HEADER_SIZE 92 +#define GPT_MAXPARTITIONS 128 +struct gpt_disklabel_header { + char h_signature[8]; /* Must match GPT_SIGNATURE */ + __u32 h_revision; /* Disklabel revision, must match GPT_REVISION */ + __u32 h_header_size; /* Must match GPT_HEADER_SIZE */ + __u32 h_header_crc; /* CRC32 of header, zero for calculation */ + __u32 h_reserved; /* Must be zero */ + __u64 h_lba_current; /* LBA of this copy of the header */ + __u64 h_lba_backup; /* LBA of the second (backup) copy of the header */ + __u64 h_lba_usable_first; /* First usable LBA for partitions (last LBA of primary table + 1) */ + __u64 h_lba_usable_last; /* Last usable LBA for partitions (first LBA of secondary table - 1) */ + struct gpt_guid h_guid; /* ID of the disk */ + __u64 h_part_table_lba; /* First LBA of the partition table (usually 2 in primary header) */ + __u32 h_part_table_len; /* Amount of entries in the partition table */ + __u32 h_part_table_entry_size; /* Size of each partition entry (usually 128) */ + __u32 h_part_table_crc; /* CRC32 of entire partition table, starts at h_part_table_lba, is h_part_table_len*h_part_table_entry_size long */ + /* Rest of block must be zero */ +} __attribute((packed)); +typedef char __gpt_header_right_size[(sizeof(struct gpt_disklabel_header) == GPT_HEADER_SIZE) ? 1 : -1]; + +/* 3-47: reserved; 48-63: defined for individual partition types. */ +#define GPT_PARTITION_ATTR_PLATFORM_REQUIRED (1ULL << 0) /* Required by the platform to function */ +#define GPT_PARTITION_ATTR_EFI_IGNORE (1ULL << 1) /* To be ignored by the EFI firmware */ +#define GPT_PARTITION_ATTR_BIOS_BOOTABLE (1ULL << 2) /* Equivalent to MBR active flag */ + +#define GPT_PARTITION_ENTRY_SIZE 128 /* Minimum size, implementations must respect bigger vendor-specific entries */ +struct gpt_disklabel_part { + struct gpt_guid p_type; /* Partition type GUID */ + struct gpt_guid p_guid; /* ID of the partition */ + __u64 p_lba_first; /* First LBA of the partition */ + __u64 p_lba_last; /* Last LBA of the partition */ + __u64 p_attrs; /* Partition attribute bitfield, see above */ + __u16 p_name[36]; /* Display name of partition, UTF-16 */ +} __attribute((packed)); +typedef char __gpt_part_entry_right_size[(sizeof(struct gpt_disklabel_part) == GPT_PARTITION_ENTRY_SIZE) ? 1 : -1]; +#endif /* CONFIG_GPT_DISKLABEL */ + extern struct gendisk *gendisk_head; /* linked list of disks */ /* |