[PATCH 4/6] firmware-utils/ptgen: change GPT to LBA addressing

Oskari Lemmela oskari at lemmela.net
Tue Mar 2 19:42:09 GMT 2021


Do not align partitions with sectors. Only kb align
for GPT is supported.

Use 254 heads and 63 sectors for PMBR.

Signed-off-by: Oskari Lemmela <oskari at lemmela.net>
---
 tools/firmware-utils/src/ptgen.c | 33 +++++++++++++++++++-------------
 1 file changed, 20 insertions(+), 13 deletions(-)

diff --git a/tools/firmware-utils/src/ptgen.c b/tools/firmware-utils/src/ptgen.c
index a8b89a870a..1eed21393d 100644
--- a/tools/firmware-utils/src/ptgen.c
+++ b/tools/firmware-utils/src/ptgen.c
@@ -94,6 +94,7 @@ typedef struct {
 #define GPT_ENTRY_SIZE          128
 #define GPT_ENTRY_MAX           128
 #define GPT_ENTRY_NAME_SIZE     72
+#define GPT_SIZE		GPT_ENTRY_SIZE * GPT_ENTRY_MAX / DISK_SECTOR_SIZE
 
 #define GPT_ATTR_PLAT_REQUIRED  BIT(0)
 #define GPT_ATTR_EFI_IGNORE     BIT(1)
@@ -120,6 +121,7 @@ struct pte {
 };
 
 struct partinfo {
+	unsigned long actual_start;
 	unsigned long start;
 	unsigned long size;
 	int type;
@@ -383,7 +385,8 @@ static int gen_gptable(uint32_t signature, guid_t guid, unsigned nr)
 		.entry_size = cpu_to_le32(GPT_ENTRY_SIZE),
 	};
 	struct gpte  gpte[GPT_ENTRY_MAX];
-	uint64_t start, end, sect = 0;
+	uint64_t start, end;
+	uint64_t sect = GPT_SIZE + GPT_FIRST_ENTRY_SECTOR;
 	int fd, ret = -1;
 	unsigned i, pmbr = 1;
 
@@ -396,7 +399,7 @@ static int gen_gptable(uint32_t signature, guid_t guid, unsigned nr)
 			fprintf(stderr, "Invalid size in partition %d!\n", i);
 			return ret;
 		}
-		start = sect + sectors;
+		start = sect;
 		if (parts[i].start != 0) {
 			if (parts[i].start * 2 < start) {
 				fprintf(stderr, "Invalid start %ld for partition %d!\n",
@@ -407,11 +410,10 @@ static int gen_gptable(uint32_t signature, guid_t guid, unsigned nr)
 		} else if (kb_align != 0) {
 			start = round_to_kb(start);
 		}
+		parts[i].actual_start = start;
 		gpte[i].start = cpu_to_le64(start);
 
 		sect = start + parts[i].size * 2;
-		if (kb_align == 0)
-			sect = round_to_cyl(sect);
 		gpte[i].end = cpu_to_le64(sect -1);
 		gpte[i].guid = guid;
 		gpte[i].guid.b[sizeof(guid_t) -1] += i + 1;
@@ -445,13 +447,15 @@ static int gen_gptable(uint32_t signature, guid_t guid, unsigned nr)
 		printf("%" PRIu64 "\n", (sect - start) * DISK_SECTOR_SIZE);
 	}
 
-	gpte[GPT_ENTRY_MAX - 1].start = cpu_to_le64(GPT_FIRST_ENTRY_SECTOR + GPT_ENTRY_SIZE * GPT_ENTRY_MAX / DISK_SECTOR_SIZE);
-	gpte[GPT_ENTRY_MAX - 1].end = cpu_to_le64((kb_align ? round_to_kb(sectors) : (unsigned long)sectors) - 1);
-	gpte[GPT_ENTRY_MAX - 1].type = GUID_PARTITION_BIOS_BOOT;
-	gpte[GPT_ENTRY_MAX - 1].guid = guid;
-	gpte[GPT_ENTRY_MAX - 1].guid.b[sizeof(guid_t) -1] += GPT_ENTRY_MAX;
+	if (parts[0].actual_start > GPT_FIRST_ENTRY_SECTOR + GPT_SIZE) {
+		gpte[GPT_ENTRY_MAX - 1].start = cpu_to_le64(GPT_FIRST_ENTRY_SECTOR + GPT_SIZE);
+		gpte[GPT_ENTRY_MAX - 1].end = cpu_to_le64(parts[0].actual_start - 1);
+		gpte[GPT_ENTRY_MAX - 1].type = GUID_PARTITION_BIOS_BOOT;
+		gpte[GPT_ENTRY_MAX - 1].guid = guid;
+		gpte[GPT_ENTRY_MAX - 1].guid.b[sizeof(guid_t) -1] += GPT_ENTRY_MAX;
+	}
 
-	end = sect + sectors - 1;
+	end = sect + GPT_SIZE;
 
 	pte[0].type = 0xEE;
 	pte[0].start = cpu_to_le32(GPT_HEADER_SECTOR);
@@ -459,7 +463,7 @@ static int gen_gptable(uint32_t signature, guid_t guid, unsigned nr)
 	to_chs(GPT_HEADER_SECTOR, pte[0].chs_start);
 	to_chs(end, pte[0].chs_end);
 
-	gpth.last_usable = cpu_to_le64(end - GPT_ENTRY_SIZE * GPT_ENTRY_MAX / DISK_SECTOR_SIZE - 1);
+	gpth.last_usable = cpu_to_le64(end - GPT_SIZE - 1);
 	gpth.alternate = cpu_to_le64(end);
 	gpth.entry_crc32 = cpu_to_le32(gpt_crc32(gpte, GPT_ENTRY_SIZE * GPT_ENTRY_MAX));
 	gpth.crc32 = cpu_to_le32(gpt_crc32((char *)&gpth, GPT_HEADER_SIZE));
@@ -651,11 +655,14 @@ int main (int argc, char **argv)
 		}
 	}
 	argc -= optind;
-	if (argc || (heads <= 0) || (sectors <= 0) || !filename)
+	if (argc || (!use_guid_partition_table && ((heads <= 0) || (sectors <= 0))) || !filename)
 		usage(argv[0]);
 
-	if (use_guid_partition_table)
+	if (use_guid_partition_table) {
+		heads = 254;
+		sectors = 63;
 		return gen_gptable(signature, guid, part) ? EXIT_FAILURE : EXIT_SUCCESS;
+	}
 
 	return gen_ptable(signature, part) ? EXIT_FAILURE : EXIT_SUCCESS;
 }
-- 
2.25.1




More information about the openwrt-devel mailing list