summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFurquan Shaikh <furquan@google.com>2015-01-12 14:54:04 -0800
committerChromeOS Commit Bot <chromeos-commit-bot@chromium.org>2015-01-24 01:46:02 +0000
commitf620c0d6560dcb5c6b6b004bd50f4713f191d381 (patch)
tree24228a96fb5b59baaea7a81acf8829bc1b0f3272
parentf1f53b3732f235da15a50080db6e7bbd4666e390 (diff)
downloadvboot-f620c0d6560dcb5c6b6b004bd50f4713f191d381.tar.gz
cgptlib: Add functions to cgptlib API
Following changes are done to the cgptlib API in order to allow backend component of fastboot to perform erase and write operations on partitions and manipulate GPT entries: GptFindNthEntry - Returns the nth entry in GPT that matches provided GUID. GptGetEntrySizeLba - Returns size of a partition in lba. GptGetEntrySizeBytes - Returns size of a partition in bytes. GptUpdateKernelWithEntry - Given kernel entry is updated using the provided update_type. GptUpdateKernelEntry calls this function with entry for current_kernel. Add flags GPT_UPDATE_ENTRY_RESET and GPT_UPDATE_ENTRY_INVALID for calls to GptUpdateKernelEntry. These operations are used by write image and erase partition respectively. BUG=chrome-os-partner:35861 BRANCH=None TEST=Compiles successfully and all the newly added functions work as expected. Change-Id: I82c87e4c97de2d207e80209dbd4922b4bcd5880a Signed-off-by: Furquan Shaikh <furquan@google.com> Reviewed-on: https://chromium-review.googlesource.com/240268 Trybot-Ready: Furquan Shaikh <furquan@chromium.org> Tested-by: Furquan Shaikh <furquan@chromium.org> Reviewed-by: Randall Spangler <rspangler@chromium.org> Reviewed-by: Aaron Durbin <adurbin@chromium.org> Commit-Queue: Furquan Shaikh <furquan@chromium.org>
-rw-r--r--firmware/include/gpt_misc.h48
-rw-r--r--firmware/lib/cgptlib/cgptlib.c73
-rw-r--r--firmware/lib/cgptlib/include/cgptlib.h12
-rw-r--r--firmware/lib/gpt_misc.c20
4 files changed, 136 insertions, 17 deletions
diff --git a/firmware/include/gpt_misc.h b/firmware/include/gpt_misc.h
index f48133a0..a94224f3 100644
--- a/firmware/include/gpt_misc.h
+++ b/firmware/include/gpt_misc.h
@@ -50,6 +50,16 @@ enum {
* entry as invalid.
*/
GPT_UPDATE_ENTRY_BAD = 2,
+ /*
+ * Used for fastboot mode. When an image is written to kernel partition,
+ * its GPT entry is marked with S1,P1,T15.
+ */
+ GPT_UPDATE_ENTRY_RESET = 3,
+ /*
+ * Used for fastboot mode. When an image is written to kernel partition,
+ * its GPT entry is marked with S0,P0,T0.
+ */
+ GPT_UPDATE_ENTRY_INVALID = 4,
};
/* If this bit is 1, the GPT is stored in another from the streaming data */
@@ -130,6 +140,13 @@ typedef struct {
int GptInit(GptData *gpt);
/**
+ * Return the nth instance of parition entry matching the partition type guid
+ * from the gpt table. Instance value starts from 0. If the entry is not found,
+ * it returns NULL.
+ */
+GptEntry *GptFindNthEntry(GptData *gpt, const Guid *guid, unsigned int n);
+
+/**
* Allocate and read GPT data from the drive. The sector_bytes and
* drive_sectors fields should be filled on input. The primary and secondary
* header and entries are filled on output.
@@ -148,4 +165,35 @@ int WriteAndFreeGptData(VbExDiskHandle_t disk_handle, GptData *gptdata);
*/
int IsUnusedEntry(const GptEntry *e);
+/**
+ * Return size(in lba) of a partition represented by given GPT entry.
+ */
+size_t GptGetEntrySizeLba(const GptEntry *e);
+
+/**
+ * Return size(in bytes) of a partition represented by given GPT entry.
+ */
+size_t GptGetEntrySizeBytes(const GptData *gpt, const GptEntry *e);
+
+/**
+ * Updates the kernel entry with the specified index, using the specified type
+ * of update (GPT_UPDATE_ENTRY_*).
+ *
+ * On return the modified field may be set, if the GPT data has been modified
+ * and should be written to disk.
+ *
+ * Returns GPT_SUCCESS if successful, else
+ * GPT_ERROR_INVALID_UPDATE_TYPE, invalid 'update_type' is given.
+ */
+int GptUpdateKernelWithEntry(GptData *gpt, GptEntry *e, uint32_t update_type);
+
+/**
+ * Updates the kernel entry identified by current_kernel field. If
+ * current_kernel is not set it returns an error.
+ *
+ * Returns GPT_SUCCESS if successful, else
+ * GPT_ERROR_INVALID_UPDATE_TYPE, invalid 'update_type' is given.
+ */
+int GptUpdateKernelEntry(GptData *gpt, uint32_t update_type);
+
#endif /* VBOOT_REFERENCE_CGPT_MISC_H_ */
diff --git a/firmware/lib/cgptlib/cgptlib.c b/firmware/lib/cgptlib/cgptlib.c
index 53b69924..05ee29cb 100644
--- a/firmware/lib/cgptlib/cgptlib.c
+++ b/firmware/lib/cgptlib/cgptlib.c
@@ -112,14 +112,15 @@ int GptNextKernelEntry(GptData *gpt, uint64_t *start_sector, uint64_t *size)
return GPT_SUCCESS;
}
-int GptUpdateKernelEntry(GptData *gpt, uint32_t update_type)
+/*
+ * Func: GptUpdateKernelWithEntry
+ * Desc: This function updates the given kernel entry according to the provided
+ * update_type.
+ */
+int GptUpdateKernelWithEntry(GptData *gpt, GptEntry *e, uint32_t update_type)
{
- GptEntry *entries = (GptEntry *)gpt->primary_entries;
- GptEntry *e = entries + gpt->current_kernel;
int modified = 0;
- if (gpt->current_kernel == CGPT_KERNEL_ENTRY_NOT_FOUND)
- return GPT_ERROR_INVALID_UPDATE_TYPE;
if (!IsKernelEntry(e))
return GPT_ERROR_INVALID_UPDATE_TYPE;
@@ -156,6 +157,28 @@ int GptUpdateKernelEntry(GptData *gpt, uint32_t update_type)
}
break;
}
+ case GPT_UPDATE_ENTRY_RESET: {
+ /*
+ * Used for fastboot mode. If image is written to kernel
+ * partition, its GPT entry is marked with S1,P1,T15
+ */
+ modified = 1;
+ SetEntryTries(e, 15);
+ SetEntryPriority(e, 1);
+ SetEntrySuccessful(e, 1);
+ break;
+ }
+ case GPT_UPDATE_ENTRY_INVALID: {
+ /*
+ * Used for fastboot mode. If kernel partition is erased, its
+ * GPT entry is marked with S0,P0,T0
+ */
+ modified = 1;
+ SetEntryTries(e, 0);
+ SetEntryPriority(e, 0);
+ SetEntrySuccessful(e, 0);
+ break;
+ }
default:
return GPT_ERROR_INVALID_UPDATE_TYPE;
}
@@ -166,3 +189,43 @@ int GptUpdateKernelEntry(GptData *gpt, uint32_t update_type)
return GPT_SUCCESS;
}
+
+/*
+ * Func: GptUpdateKernelEntry
+ * Desc: This function updates current_kernel entry with provided
+ * update_type. If current_kernel is not set, then it returns error.
+ */
+int GptUpdateKernelEntry(GptData *gpt, uint32_t update_type)
+{
+ GptEntry *entries = (GptEntry *)gpt->primary_entries;
+ GptEntry *e = entries + gpt->current_kernel;
+
+ if (gpt->current_kernel == CGPT_KERNEL_ENTRY_NOT_FOUND)
+ return GPT_ERROR_INVALID_UPDATE_TYPE;
+
+ return GptUpdateKernelWithEntry(gpt, e, update_type);
+}
+
+/*
+ * Func: GptFindNthEntry
+ * Desc: This function returns the nth instance of parition entry matching the
+ * partition type guid from the gpt table. Instance value starts from 0. If the
+ * entry is not found it returns NULL.
+ */
+GptEntry *GptFindNthEntry(GptData *gpt, const Guid *guid, unsigned int n)
+{
+ GptHeader *header = (GptHeader *)gpt->primary_header;
+ GptEntry *entries = (GptEntry *)gpt->primary_entries;
+ GptEntry *e;
+ int i;
+
+ for (i = 0, e = entries; i < header->number_of_entries; i++, e++) {
+ if (!Memcmp(&e->type, guid, sizeof(*guid))) {
+ if (n == 0)
+ return e;
+ n--;
+ }
+ }
+
+ return NULL;
+}
diff --git a/firmware/lib/cgptlib/include/cgptlib.h b/firmware/lib/cgptlib/include/cgptlib.h
index 968ec635..df85494e 100644
--- a/firmware/lib/cgptlib/include/cgptlib.h
+++ b/firmware/lib/cgptlib/include/cgptlib.h
@@ -22,16 +22,4 @@
* GPT_ERROR_NO_VALID_KERNEL, no avaliable kernel, enters recovery mode */
int GptNextKernelEntry(GptData *gpt, uint64_t *start_sector, uint64_t *size);
-/**
- * Updates the kernel entry with the specified index, using the specified type
- * of update (GPT_UPDATE_ENTRY_*).
- *
- * On return the modified field may be set, if the GPT data has been modified
- * and should be written to disk.
- *
- * Returns GPT_SUCCESS if successful, else
- * GPT_ERROR_INVALID_UPDATE_TYPE, invalid 'update_type' is given.
- */
-int GptUpdateKernelEntry(GptData *gpt, uint32_t update_type);
-
#endif /* VBOOT_REFERENCE_CGPTLIB_H_ */
diff --git a/firmware/lib/gpt_misc.c b/firmware/lib/gpt_misc.c
index 00c7f9f2..4061bdd9 100644
--- a/firmware/lib/gpt_misc.c
+++ b/firmware/lib/gpt_misc.c
@@ -201,3 +201,23 @@ int IsUnusedEntry(const GptEntry *e)
static Guid zero = {{{0, 0, 0, 0, 0, {0, 0, 0, 0, 0, 0}}}};
return !Memcmp(&zero, (const uint8_t*)(&e->type), sizeof(zero));
}
+
+/*
+ * Func: GptGetEntrySize
+ * Desc: This function returns size(in lba) of a partition represented by
+ * given GPT entry.
+ */
+size_t GptGetEntrySizeLba(const GptEntry *e)
+{
+ return (e->ending_lba - e->starting_lba + 1);
+}
+
+/*
+ * Func: GptGetEntrySize
+ * Desc: This function returns size(in bytes) of a partition represented by
+ * given GPT entry.
+ */
+size_t GptGetEntrySizeBytes(const GptData *gpt, const GptEntry *e)
+{
+ return GptGetEntrySizeLba(e) * gpt->sector_bytes;
+}