summaryrefslogtreecommitdiff
path: root/cgpt/cgpt_boot.c
diff options
context:
space:
mode:
authorJay Srinivasan <jaysri@chromium.org>2012-02-16 17:40:45 -0800
committerGerrit <chrome-bot@google.com>2012-02-16 19:18:08 -0800
commit250549d3e742cddaf72b4f53d5739e54faf5db96 (patch)
tree646e9eee48897fc1d912a25443f1736191ac0354 /cgpt/cgpt_boot.c
parent2ddd5f64515b4be9847a16de793c59b161221e1b (diff)
downloadvboot-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.c51
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)) {