summaryrefslogtreecommitdiff
path: root/cgpt/cgpt_create.c
diff options
context:
space:
mode:
authorAlbert Chaulk <achaulk@chromium.org>2013-04-02 13:20:52 -0700
committerChromeBot <chrome-bot@google.com>2013-06-24 15:44:41 -0700
commit92f22e7c2a1ca08034ac3ad21b2af60347c1c4fb (patch)
treec9a0e1fe9c558274a32b205434b2e80dd589139d /cgpt/cgpt_create.c
parent98624d37447d01a9a78d9e0a1f55cbbce2ee99e4 (diff)
downloadvboot-92f22e7c2a1ca08034ac3ad21b2af60347c1c4fb.tar.gz
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>
Diffstat (limited to 'cgpt/cgpt_create.c')
-rw-r--r--cgpt/cgpt_create.c82
1 files changed, 55 insertions, 27 deletions
diff --git a/cgpt/cgpt_create.c b/cgpt/cgpt_create.c
index b0256c51..0b116b2b 100644
--- a/cgpt/cgpt_create.c
+++ b/cgpt/cgpt_create.c
@@ -9,42 +9,33 @@
#include "cgptlib_internal.h"
#include "vboot_host.h"
-int CgptCreate(CgptCreateParams *params) {
- struct drive drive;
-
- if (params == NULL)
- return CGPT_FAILED;
-
- if (CGPT_OK != DriveOpen(params->drive_name, &drive, O_RDWR))
- return CGPT_FAILED;
-
+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 |
+ 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;
+ 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->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;
+ 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");
- goto bad;
+ return -1;
}
(*uuid_generator)((uint8_t *)&h->disk_uuid);
h->entries_lba = 2;
@@ -52,9 +43,46 @@ int CgptCreate(CgptCreateParams *params) {
h->size_of_entry = sizeof(GptEntry);
// Copy to secondary
- RepairHeader(&drive.gpt, MASK_PRIMARY);
+ 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;
- UpdateCrc(&drive.gpt);
+ 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;
+
+ if (params == NULL)
+ return CGPT_FAILED;
+
+ if (CGPT_OK != DriveOpen(params->drive_name, &drive, O_RDWR))
+ return CGPT_FAILED;
+
+ if (drive.is_mtd) {
+ if (MtdCreate(&drive, params))
+ goto bad;
+ } else {
+ if (GptCreate(&drive, params))
+ goto bad;
}
// Write it all out