diff options
author | Jay Srinivasan <jaysri@chromium.org> | 2012-02-16 17:40:45 -0800 |
---|---|---|
committer | Gerrit <chrome-bot@google.com> | 2012-02-16 19:18:08 -0800 |
commit | 250549d3e742cddaf72b4f53d5739e54faf5db96 (patch) | |
tree | 646e9eee48897fc1d912a25443f1736191ac0354 /cgpt/cgpt_boot.c | |
parent | 2ddd5f64515b4be9847a16de793c59b161221e1b (diff) | |
download | vboot-250549d3e742cddaf72b4f53d5739e54faf5db96.tar.gz |
Implementation of CgptManager C++ library and unit tests.
CgptManager exposes the cgpt commands via a C++ library so that
the post-installer for 32- to 64-bit upgrade can link directly
against a library and thus avoid any shell dependency.
The default make target will not build libcgpt-cc.a since it
requires some dependencies that are available only in chroot.
A separate follow-up checkin to the vboot_reference
ebuild will enable emerging the libcgpt-cc.a by default.
BUG=chromium-os:25374
TEST=Tested with the new unit tests for CgptManager,
ran existing cgpt unit tests, as well as running the
cgpt commands manually. Built on both amd64 and x86.
Tested that vboot_reference is also buildable outside of chroot.
Tested that vboot_reference-firmware and vboot_reference-tests
also build fine with these changes.
CQ-DEPEND=I99f6c321e09c2425eaa8171d78685d2d731954c8
Change-Id: I59a896255b8ea2fc8b1b2150ae7c4ff9d0769699
Reviewed-on: https://gerrit.chromium.org/gerrit/15730
Reviewed-by: Bill Richardson <wfrichar@chromium.org>
Reviewed-by: Gaurav Shah <gauravsh@chromium.org>
Commit-Ready: Jay Srinivasan <jaysri@chromium.org>
Tested-by: Jay Srinivasan <jaysri@chromium.org>
Diffstat (limited to 'cgpt/cgpt_boot.c')
-rw-r--r-- | cgpt/cgpt_boot.c | 51 |
1 files changed, 50 insertions, 1 deletions
diff --git a/cgpt/cgpt_boot.c b/cgpt/cgpt_boot.c index 15e98cfa..33c5471c 100644 --- a/cgpt/cgpt_boot.c +++ b/cgpt/cgpt_boot.c @@ -12,6 +12,55 @@ #include "endian.h" #include "cgpt_params.h" + +int cgpt_get_boot_partition_number(CgptBootParams *params) { + struct drive drive; + int gpt_retval= 0; + int retval; + + if (params == NULL) + return CGPT_FAILED; + + if (CGPT_OK != DriveOpen(params->drive_name, &drive)) + return CGPT_FAILED; + + if (GPT_SUCCESS != (gpt_retval = GptSanityCheck(&drive.gpt))) { + Error("GptSanityCheck() returned %d: %s\n", + gpt_retval, GptError(gpt_retval)); + retval = CGPT_FAILED; + goto done; + } + + if (CGPT_OK != ReadPMBR(&drive)) { + Error("Unable to read PMBR\n"); + goto done; + } + + char buf[GUID_STRLEN]; + GuidToStr(&drive.pmbr.boot_guid, buf, sizeof(buf)); + + int numEntries = GetNumberOfEntries(&drive.gpt); + int i; + for(i = 0; i < numEntries; i++) { + GptEntry *entry = GetEntry(&drive.gpt, ANY_VALID, i); + + if (GuidEqual(&entry->unique, &drive.pmbr.boot_guid)) { + params->partition = i + 1; + retval = CGPT_OK; + goto done; + } + } + + Error("Didn't find any boot partition\n"); + params->partition = 0; + retval = CGPT_FAILED; + +done: + (void) DriveClose(&drive, 1); + return retval; +} + + int cgpt_boot(CgptBootParams *params) { struct drive drive; int retval = 1; @@ -20,7 +69,7 @@ int cgpt_boot(CgptBootParams *params) { if (params == NULL) return CGPT_FAILED; - if (CGPT_OK != DriveOpen(params->driveName, &drive)) + if (CGPT_OK != DriveOpen(params->drive_name, &drive)) return CGPT_FAILED; if (CGPT_OK != ReadPMBR(&drive)) { |