Bugfixes & MTD create command
Fix some bugs in the cgpt implementation of the flash I/O functions & load
logic, it was validating too much at load time.
Implement the create command for MTD
BUG=chromium:221745
TEST=MTD version of run_cgpt_tests.sh passes
BRANCH=none
Original-Change-Id: I2f52637d82962f4d805aa827c5c37685f10e76ea
Reviewed-on: https://gerrit.chromium.org/gerrit/47172
Tested-by: Albert Chaulk <achaulk@chromium.org>
Reviewed-by: Bill Richardson <wfrichar@chromium.org>
Reviewed-by: Randall Spangler <rspangler@chromium.org>
Commit-Queue: Albert Chaulk <achaulk@chromium.org>
(cherry picked from commit 931544744ba410dad267064b87d504b0b4c24772)
Change-Id: If9364155fb2c030645adc6ee6f3fbe5373bcc153
Reviewed-on: https://gerrit.chromium.org/gerrit/49793
Commit-Queue: Albert Chaulk <achaulk@chromium.org>
Reviewed-by: Albert Chaulk <achaulk@chromium.org>
Tested-by: Albert Chaulk <achaulk@chromium.org>
diff --git a/cgpt/cgpt_create.c b/cgpt/cgpt_create.c
index b0256c5..0b116b2 100644
--- a/cgpt/cgpt_create.c
+++ b/cgpt/cgpt_create.c
@@ -9,6 +9,65 @@
#include "cgptlib_internal.h"
#include "vboot_host.h"
+int GptCreate(struct drive *drive, CgptCreateParams *params) {
+ // Erase the data
+ memset(drive->gpt.primary_header, 0,
+ drive->gpt.sector_bytes * GPT_HEADER_SECTOR);
+ memset(drive->gpt.secondary_header, 0,
+ drive->gpt.sector_bytes * GPT_HEADER_SECTOR);
+ memset(drive->gpt.primary_entries, 0,
+ drive->gpt.sector_bytes * GPT_ENTRIES_SECTORS);
+ memset(drive->gpt.secondary_entries, 0,
+ drive->gpt.sector_bytes * GPT_ENTRIES_SECTORS);
+
+ drive->gpt.modified |= (GPT_MODIFIED_HEADER1 | GPT_MODIFIED_ENTRIES1 |
+ GPT_MODIFIED_HEADER2 | GPT_MODIFIED_ENTRIES2);
+
+ // Initialize a blank set
+ if (!params->zap) {
+ GptHeader *h = (GptHeader *)drive->gpt.primary_header;
+ memcpy(h->signature, GPT_HEADER_SIGNATURE, GPT_HEADER_SIGNATURE_SIZE);
+ h->revision = GPT_HEADER_REVISION;
+ h->size = sizeof(GptHeader);
+ h->my_lba = 1;
+ h->alternate_lba = drive->gpt.drive_sectors - 1;
+ h->first_usable_lba = 1 + 1 + GPT_ENTRIES_SECTORS;
+ h->last_usable_lba = drive->gpt.drive_sectors - 1 - GPT_ENTRIES_SECTORS - 1;
+ if (!uuid_generator) {
+ Error("Unable to generate new GUID. uuid_generator not set.\n");
+ return -1;
+ }
+ (*uuid_generator)((uint8_t *)&h->disk_uuid);
+ h->entries_lba = 2;
+ h->number_of_entries = 128;
+ h->size_of_entry = sizeof(GptEntry);
+
+ // Copy to secondary
+ RepairHeader(&drive->gpt, MASK_PRIMARY);
+
+ UpdateCrc(&drive->gpt);
+ }
+
+ return 0;
+}
+
+int MtdCreate(struct drive *drive, CgptCreateParams *params) {
+ MtdDiskLayout *h = &drive->mtd.primary;
+ memset(h, 0, sizeof(*h));
+ drive->mtd.modified = 1;
+
+ if (!params->zap) {
+ // Prep basic parameters
+ memcpy(h->signature, MTD_DRIVE_SIGNATURE, sizeof(h->signature));
+ h->size = sizeof(*h);
+ h->first_lba = 0;
+ h->last_lba = drive->mtd.drive_sectors - 1;
+ h->crc32 = MtdHeaderCrc(h);
+ }
+
+ return 0;
+}
+
int CgptCreate(CgptCreateParams *params) {
struct drive drive;
@@ -18,43 +77,12 @@
if (CGPT_OK != DriveOpen(params->drive_name, &drive, O_RDWR))
return CGPT_FAILED;
- // Erase the data
- memset(drive.gpt.primary_header, 0,
- drive.gpt.sector_bytes * GPT_HEADER_SECTOR);
- memset(drive.gpt.secondary_header, 0,
- drive.gpt.sector_bytes * GPT_HEADER_SECTOR);
- memset(drive.gpt.primary_entries, 0,
- drive.gpt.sector_bytes * GPT_ENTRIES_SECTORS);
- memset(drive.gpt.secondary_entries, 0,
- drive.gpt.sector_bytes * GPT_ENTRIES_SECTORS);
-
- drive.gpt.modified |= (GPT_MODIFIED_HEADER1 | GPT_MODIFIED_ENTRIES1 |
- GPT_MODIFIED_HEADER2 | GPT_MODIFIED_ENTRIES2);
-
- // Initialize a blank set
- if (!params->zap)
- {
- GptHeader *h = (GptHeader *)drive.gpt.primary_header;
- memcpy(h->signature, GPT_HEADER_SIGNATURE, GPT_HEADER_SIGNATURE_SIZE);
- h->revision = GPT_HEADER_REVISION;
- h->size = sizeof(GptHeader);
- h->my_lba = 1;
- h->alternate_lba = drive.gpt.drive_sectors - 1;
- h->first_usable_lba = 1 + 1 + GPT_ENTRIES_SECTORS;
- h->last_usable_lba = drive.gpt.drive_sectors - 1 - GPT_ENTRIES_SECTORS - 1;
- if (!uuid_generator) {
- Error("Unable to generate new GUID. uuid_generator not set.\n");
+ if (drive.is_mtd) {
+ if (MtdCreate(&drive, params))
goto bad;
- }
- (*uuid_generator)((uint8_t *)&h->disk_uuid);
- h->entries_lba = 2;
- h->number_of_entries = 128;
- h->size_of_entry = sizeof(GptEntry);
-
- // Copy to secondary
- RepairHeader(&drive.gpt, MASK_PRIMARY);
-
- UpdateCrc(&drive.gpt);
+ } else {
+ if (GptCreate(&drive, params))
+ goto bad;
}
// Write it all out