[U-Boot] [PATCH v3 4/7] gpt: The leXX_to_int() calls replaced with ones defined at <compiler.h>
Lukasz Majewski
l.majewski at samsung.com
Thu Sep 13 10:10:02 CEST 2012
From: Chang Hyun Park <chchch.park at samsung.com>
Custom definitions of le_XX_to_int functions have been replaced with
standard ones, defined at <compiler.h>
Replacement of several GPT related structures members with ones
indicating its endianness and proper size.
Signed-off-by: Chang Hyun Park <chchch.park at samsung.com>
Signed-off-by: Lukasz Majewski <l.majewski at samsung.com>
Signed-off-by: Kyungmin Park <kyungmin.park at samsung.com>
---
Changes for v2:
- Combining two commits regarding part_efi.{h|c}
Changes for v3:
- None
---
disk/part_efi.c | 109 +++++++++++++++++++---------------------------------
include/part_efi.h | 85 +++++++++++++++++++++-------------------
2 files changed, 84 insertions(+), 110 deletions(-)
diff --git a/disk/part_efi.c b/disk/part_efi.c
index b2233da..d4c61d2 100644
--- a/disk/part_efi.c
+++ b/disk/part_efi.c
@@ -44,34 +44,6 @@
defined(CONFIG_MMC) || \
defined(CONFIG_SYSTEMACE)
-/* Convert char[2] in little endian format to the host format integer
- */
-static inline unsigned short le16_to_int(unsigned char *le16)
-{
- return ((le16[1] << 8) + le16[0]);
-}
-
-/* Convert char[4] in little endian format to the host format integer
- */
-static inline unsigned long le32_to_int(unsigned char *le32)
-{
- return ((le32[3] << 24) + (le32[2] << 16) + (le32[1] << 8) + le32[0]);
-}
-
-/* Convert char[8] in little endian format to the host format integer
- */
-static inline unsigned long long le64_to_int(unsigned char *le64)
-{
- return (((unsigned long long)le64[7] << 56) +
- ((unsigned long long)le64[6] << 48) +
- ((unsigned long long)le64[5] << 40) +
- ((unsigned long long)le64[4] << 32) +
- ((unsigned long long)le64[3] << 24) +
- ((unsigned long long)le64[2] << 16) +
- ((unsigned long long)le64[1] << 8) +
- (unsigned long long)le64[0]);
-}
-
/**
* efi_crc32() - EFI version of crc32 function
* @buf: buffer to calculate crc32 of
@@ -79,7 +51,7 @@ static inline unsigned long long le64_to_int(unsigned char *le64)
*
* Description: Returns EFI-style CRC32 value for @buf
*/
-static inline unsigned long efi_crc32(const void *buf, unsigned long len)
+static inline u32 efi_crc32(const void *buf, u32 len)
{
return crc32(0, buf, len);
}
@@ -137,13 +109,13 @@ void print_part_efi(block_dev_desc_t * dev_desc)
debug("%s: gpt-entry at %p\n", __func__, gpt_pte);
printf("Part\tName\t\t\tStart LBA\tEnd LBA\n");
- for (i = 0; i < le32_to_int(gpt_head->num_partition_entries); i++) {
+ for (i = 0; i < le32_to_cpu(gpt_head->num_partition_entries); i++) {
if (is_pte_valid(&gpt_pte[i])) {
printf("%3d\t%-18s\t0x%08llX\t0x%08llX\n", (i + 1),
print_efiname(&gpt_pte[i]),
- le64_to_int(gpt_pte[i].starting_lba),
- le64_to_int(gpt_pte[i].ending_lba));
+ (u64) le64_to_cpu(gpt_pte[i].starting_lba),
+ (u64) le64_to_cpu(gpt_pte[i].ending_lba));
} else {
break; /* Stop at the first non valid PTE */
}
@@ -174,9 +146,9 @@ int get_partition_info_efi(block_dev_desc_t * dev_desc, int part,
}
/* The ulong casting limits the maximum disk size to 2 TB */
- info->start = (ulong) le64_to_int(gpt_pte[part - 1].starting_lba);
+ info->start = (u64) le64_to_cpu(gpt_pte[part - 1].starting_lba);
/* The ending LBA is inclusive, to calculate size, add 1 to it */
- info->size = ((ulong)le64_to_int(gpt_pte[part - 1].ending_lba) + 1)
+ info->size = ((u64)le64_to_cpu(gpt_pte[part - 1].ending_lba) + 1)
- info->start;
info->blksz = GPT_BLOCK_SIZE;
@@ -215,7 +187,7 @@ int test_part_efi(block_dev_desc_t * dev_desc)
static int pmbr_part_valid(struct partition *part)
{
if (part->sys_ind == EFI_PMBR_OSTYPE_EFI_GPT &&
- le32_to_int(part->start_sect) == 1UL) {
+ le32_to_cpu(part->start_sect) == 1UL) {
return 1;
}
@@ -234,9 +206,8 @@ static int is_pmbr_valid(legacy_mbr * mbr)
{
int i = 0;
- if (!mbr || le16_to_int(mbr->signature) != MSDOS_MBR_SIGNATURE) {
+ if (!mbr || le16_to_cpu(mbr->signature) != MSDOS_MBR_SIGNATURE)
return 0;
- }
for (i = 0; i < 4; i++) {
if (pmbr_part_valid(&mbr->partition_record[i])) {
@@ -259,8 +230,8 @@ static int is_pmbr_valid(legacy_mbr * mbr)
static int is_gpt_valid(block_dev_desc_t * dev_desc, unsigned long long lba,
gpt_header * pgpt_head, gpt_entry ** pgpt_pte)
{
- unsigned char crc32_backup[4] = { 0 };
- unsigned long calc_crc32;
+ u32 crc32_backup = 0;
+ u32 calc_crc32;
unsigned long long lastlba;
if (!dev_desc || !pgpt_head) {
@@ -275,54 +246,54 @@ static int is_gpt_valid(block_dev_desc_t * dev_desc, unsigned long long lba,
}
/* Check the GPT header signature */
- if (le64_to_int(pgpt_head->signature) != GPT_HEADER_SIGNATURE) {
+ if (le64_to_cpu(pgpt_head->signature) != GPT_HEADER_SIGNATURE) {
printf("GUID Partition Table Header signature is wrong:"
"0x%llX != 0x%llX\n",
- (unsigned long long)le64_to_int(pgpt_head->signature),
- (unsigned long long)GPT_HEADER_SIGNATURE);
+ (u64) le64_to_cpu(pgpt_head->signature),
+ (u64) GPT_HEADER_SIGNATURE);
return 0;
}
/* Check the GUID Partition Table CRC */
- memcpy(crc32_backup, pgpt_head->header_crc32, sizeof(crc32_backup));
- memset(pgpt_head->header_crc32, 0, sizeof(pgpt_head->header_crc32));
+ memcpy(&crc32_backup, &pgpt_head->header_crc32, sizeof(crc32_backup));
+ memset(&pgpt_head->header_crc32, 0, sizeof(pgpt_head->header_crc32));
calc_crc32 = efi_crc32((const unsigned char *)pgpt_head,
- le32_to_int(pgpt_head->header_size));
+ le32_to_cpu(pgpt_head->header_size));
- memcpy(pgpt_head->header_crc32, crc32_backup, sizeof(crc32_backup));
+ memcpy(&pgpt_head->header_crc32, &crc32_backup, sizeof(crc32_backup));
- if (calc_crc32 != le32_to_int(crc32_backup)) {
+ if (calc_crc32 != le32_to_cpu(crc32_backup)) {
printf("GUID Partition Table Header CRC is wrong:"
- "0x%08lX != 0x%08lX\n",
- le32_to_int(crc32_backup), calc_crc32);
+ "0x%x != 0x%x\n",
+ (u32) le32_to_cpu(crc32_backup), calc_crc32);
return 0;
}
/* Check that the my_lba entry points to the LBA that contains the GPT */
- if (le64_to_int(pgpt_head->my_lba) != lba) {
+ if (le64_to_cpu(pgpt_head->my_lba) != lba) {
printf("GPT: my_lba incorrect: %llX != %llX\n",
- (unsigned long long)le64_to_int(pgpt_head->my_lba),
- (unsigned long long)lba);
+ (u64)le64_to_cpu(pgpt_head->my_lba),
+ (u64)lba);
return 0;
}
/* Check the first_usable_lba and last_usable_lba are within the disk. */
lastlba = (unsigned long long)dev_desc->lba;
- if (le64_to_int(pgpt_head->first_usable_lba) > lastlba) {
+ if (le64_to_cpu(pgpt_head->first_usable_lba) > lastlba) {
printf("GPT: first_usable_lba incorrect: %llX > %llX\n",
- le64_to_int(pgpt_head->first_usable_lba), lastlba);
+ (u64) le64_to_cpu(pgpt_head->first_usable_lba), lastlba);
return 0;
}
- if (le64_to_int(pgpt_head->last_usable_lba) > lastlba) {
+ if (le64_to_cpu(pgpt_head->last_usable_lba) > lastlba) {
printf("GPT: last_usable_lba incorrect: %llX > %llX\n",
- le64_to_int(pgpt_head->last_usable_lba), lastlba);
+ (u64) le64_to_cpu(pgpt_head->last_usable_lba), lastlba);
return 0;
}
debug("GPT: first_usable_lba: %llX last_usable_lba %llX last lba %llX\n",
- le64_to_int(pgpt_head->first_usable_lba),
- le64_to_int(pgpt_head->last_usable_lba), lastlba);
+ (u64) le64_to_cpu(pgpt_head->first_usable_lba),
+ (u64) le64_to_cpu(pgpt_head->last_usable_lba), lastlba);
/* Read and allocate Partition Table Entries */
*pgpt_pte = alloc_read_gpt_entries(dev_desc, pgpt_head);
@@ -333,13 +304,13 @@ static int is_gpt_valid(block_dev_desc_t * dev_desc, unsigned long long lba,
/* Check the GUID Partition Table Entry Array CRC */
calc_crc32 = efi_crc32((const unsigned char *)*pgpt_pte,
- le32_to_int(pgpt_head->num_partition_entries) *
- le32_to_int(pgpt_head->sizeof_partition_entry));
+ le32_to_cpu(pgpt_head->num_partition_entries) *
+ le32_to_cpu(pgpt_head->sizeof_partition_entry));
- if (calc_crc32 != le32_to_int(pgpt_head->partition_entry_array_crc32)) {
+ if (calc_crc32 != le32_to_cpu(pgpt_head->partition_entry_array_crc32)) {
printf("GUID Partition Table Entry Array CRC is wrong:"
- "0x%08lX != 0x%08lX\n",
- le32_to_int(pgpt_head->partition_entry_array_crc32),
+ "0x%x != 0x%x\n",
+ (u32)le32_to_cpu(pgpt_head->partition_entry_array_crc32),
calc_crc32);
free(*pgpt_pte);
@@ -370,12 +341,12 @@ static gpt_entry *alloc_read_gpt_entries(block_dev_desc_t * dev_desc,
return NULL;
}
- count = le32_to_int(pgpt_head->num_partition_entries) *
- le32_to_int(pgpt_head->sizeof_partition_entry);
+ count = le32_to_cpu(pgpt_head->num_partition_entries) *
+ le32_to_cpu(pgpt_head->sizeof_partition_entry);
- debug("%s: count = %lu * %lu = %u\n", __func__,
- le32_to_int(pgpt_head->num_partition_entries),
- le32_to_int(pgpt_head->sizeof_partition_entry), count);
+ debug("%s: count = %u * %u = %u\n", __func__,
+ (u32) le32_to_cpu(pgpt_head->num_partition_entries),
+ (u32) le32_to_cpu(pgpt_head->sizeof_partition_entry), count);
/* Allocate memory for PTE, remember to FREE */
if (count != 0) {
@@ -390,7 +361,7 @@ static gpt_entry *alloc_read_gpt_entries(block_dev_desc_t * dev_desc,
/* Read GPT Entries from device */
if (dev_desc->block_read (dev_desc->dev,
- (unsigned long)le64_to_int(pgpt_head->partition_entry_lba),
+ (u64) le64_to_cpu(pgpt_head->partition_entry_lba),
(lbaint_t) (count / GPT_BLOCK_SIZE), pte)
!= (count / GPT_BLOCK_SIZE)) {
diff --git a/include/part_efi.h b/include/part_efi.h
index a9d4399..11d995c 100644
--- a/include/part_efi.h
+++ b/include/part_efi.h
@@ -29,6 +29,8 @@
* http://developer.intel.com/technology/efi/efi.htm
*/
+#include <linux/compiler.h>
+
#ifndef _DISK_PART_EFI_H
#define _DISK_PART_EFI_H
@@ -41,6 +43,8 @@
#define GPT_HEADER_REVISION_V1 0x00010000
#define GPT_PRIMARY_PARTITION_TABLE_LBA 1ULL
#define GPT_ENTRY_NAME "gpt"
+#define GPT_ENTRY_NUMBERS 128
+#define GPT_ENTRY_SIZE 128
#define EFI_GUID(a, b, c, d0, d1, d2, d3, d4, d5, d6, d7) \
((efi_guid_t) \
@@ -73,68 +77,67 @@
0xa2, 0x3c, 0x23, 0x8f, 0x2a, 0x3d, 0xf9, 0x28)
/* linux/include/efi.h */
-typedef unsigned short efi_char16_t;
+typedef u16 efi_char16_t;
typedef struct {
- unsigned char b[16];
+ u8 b[16];
} efi_guid_t;
/* based on linux/include/genhd.h */
struct partition {
- unsigned char boot_ind; /* 0x80 - active */
- unsigned char head; /* starting head */
- unsigned char sector; /* starting sector */
- unsigned char cyl; /* starting cylinder */
- unsigned char sys_ind; /* What partition type */
- unsigned char end_head; /* end head */
- unsigned char end_sector; /* end sector */
- unsigned char end_cyl; /* end cylinder */
- unsigned char start_sect[4]; /* starting sector counting from 0 */
- unsigned char nr_sects[4]; /* nr of sectors in partition */
-} __attribute__ ((packed));
+ u8 boot_ind; /* 0x80 - active */
+ u8 head; /* starting head */
+ u8 sector; /* starting sector */
+ u8 cyl; /* starting cylinder */
+ u8 sys_ind; /* What partition type */
+ u8 end_head; /* end head */
+ u8 end_sector; /* end sector */
+ u8 end_cyl; /* end cylinder */
+ __le32 start_sect; /* starting sector counting from 0 */
+ __le32 nr_sects; /* nr of sectors in partition */
+} __packed;
/* based on linux/fs/partitions/efi.h */
typedef struct _gpt_header {
- unsigned char signature[8];
- unsigned char revision[4];
- unsigned char header_size[4];
- unsigned char header_crc32[4];
- unsigned char reserved1[4];
- unsigned char my_lba[8];
- unsigned char alternate_lba[8];
- unsigned char first_usable_lba[8];
- unsigned char last_usable_lba[8];
+ __le64 signature;
+ __le32 revision;
+ __le32 header_size;
+ __le32 header_crc32;
+ __le32 reserved1;
+ __le64 my_lba;
+ __le64 alternate_lba;
+ __le64 first_usable_lba;
+ __le64 last_usable_lba;
efi_guid_t disk_guid;
- unsigned char partition_entry_lba[8];
- unsigned char num_partition_entries[4];
- unsigned char sizeof_partition_entry[4];
- unsigned char partition_entry_array_crc32[4];
- unsigned char reserved2[GPT_BLOCK_SIZE - 92];
-} __attribute__ ((packed)) gpt_header;
+ __le64 partition_entry_lba;
+ __le32 num_partition_entries;
+ __le32 sizeof_partition_entry;
+ __le32 partition_entry_array_crc32;
+ u8 reserved2[GPT_BLOCK_SIZE - 92];
+} __packed gpt_header;
typedef struct _gpt_entry_attributes {
- unsigned long long required_to_function:1;
- unsigned long long reserved:47;
- unsigned long long type_guid_specific:16;
-} __attribute__ ((packed)) gpt_entry_attributes;
+ u64 required_to_function:1;
+ u64 reserved:47;
+ u64 type_guid_specific:16;
+} __packed gpt_entry_attributes;
#define PARTNAME_SZ (72 / sizeof(efi_char16_t))
typedef struct _gpt_entry {
efi_guid_t partition_type_guid;
efi_guid_t unique_partition_guid;
- unsigned char starting_lba[8];
- unsigned char ending_lba[8];
+ __le64 starting_lba;
+ __le64 ending_lba;
gpt_entry_attributes attributes;
efi_char16_t partition_name[PARTNAME_SZ];
-}
-__attribute__ ((packed)) gpt_entry;
+} __packed gpt_entry;
typedef struct _legacy_mbr {
- unsigned char boot_code[440];
- unsigned char unique_mbr_signature[4];
- unsigned char unknown[2];
+ u8 boot_code[440];
+ __le32 unique_mbr_signature;
+ __le16 unknown;
struct partition partition_record[4];
- unsigned char signature[2];
-} __attribute__ ((packed)) legacy_mbr;
+ __le16 signature;
+} __packed legacy_mbr;
#endif /* _DISK_PART_EFI_H */
--
1.7.2.3
More information about the U-Boot
mailing list