diff options
author | Furquan Shaikh <furquan@google.com> | 2015-01-12 14:54:04 -0800 |
---|---|---|
committer | ChromeOS Commit Bot <chromeos-commit-bot@chromium.org> | 2015-01-24 01:46:02 +0000 |
commit | f620c0d6560dcb5c6b6b004bd50f4713f191d381 (patch) | |
tree | 24228a96fb5b59baaea7a81acf8829bc1b0f3272 /firmware/lib | |
parent | f1f53b3732f235da15a50080db6e7bbd4666e390 (diff) | |
download | vboot-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>
Diffstat (limited to 'firmware/lib')
-rw-r--r-- | firmware/lib/cgptlib/cgptlib.c | 73 | ||||
-rw-r--r-- | firmware/lib/cgptlib/include/cgptlib.h | 12 | ||||
-rw-r--r-- | firmware/lib/gpt_misc.c | 20 |
3 files changed, 88 insertions, 17 deletions
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; +} |