From 2c21fe6693480e437ccedd03f32cda135cd11c68 Mon Sep 17 00:00:00 2001 From: Randall Spangler Date: Tue, 7 Sep 2010 10:30:50 -0700 Subject: [PATCH] Successful partitions are never marked bad by cgptlib. Change-Id: I70e54f59b540e9115bb6bd77ae51f49a1f4ab671 BUG=chromeos-partner:1029 TEST=make && make runtests Review URL: http://codereview.chromium.org/3315014 --- firmware/lib/cgptlib/cgptlib.c | 10 ++++++---- firmware/version.c | 2 +- tests/cgptlib_test.c | 19 ++++++++++--------- 3 files changed, 17 insertions(+), 14 deletions(-) diff --git a/firmware/lib/cgptlib/cgptlib.c b/firmware/lib/cgptlib/cgptlib.c index a7f8d4e849..20c0b9e862 100644 --- a/firmware/lib/cgptlib/cgptlib.c +++ b/firmware/lib/cgptlib/cgptlib.c @@ -129,10 +129,12 @@ int GptUpdateKernelEntry(GptData* gpt, uint32_t update_type) { } case GPT_UPDATE_ENTRY_BAD: { /* Giving up on this partition entirely. */ - e->attrs.fields.gpt_att = previous_attr & ~( - CGPT_ATTRIBUTE_SUCCESSFUL_MASK | - CGPT_ATTRIBUTE_TRIES_MASK | - CGPT_ATTRIBUTE_PRIORITY_MASK); + if (!GetEntrySuccessful(e)) { + /* Only clear tries and priority if the successful bit is not set. */ + e->attrs.fields.gpt_att = previous_attr & ~( + CGPT_ATTRIBUTE_TRIES_MASK | + CGPT_ATTRIBUTE_PRIORITY_MASK); + } break; } default: diff --git a/firmware/version.c b/firmware/version.c index 5e7eb9d7ff..8c9abb5b98 100644 --- a/firmware/version.c +++ b/firmware/version.c @@ -1 +1 @@ -char* VbootVersion = "VBOOv=c4585ee1"; +char* VbootVersion = "VBOOv=77bb4724"; diff --git a/tests/cgptlib_test.c b/tests/cgptlib_test.c index 891d53b72a..791815e907 100644 --- a/tests/cgptlib_test.c +++ b/tests/cgptlib_test.c @@ -1068,17 +1068,12 @@ static int GptUpdateTest() { EXPECT(4 == GetEntryPriority(e + KERNEL_A)); EXPECT(0 == GetEntryTries(e + KERNEL_A)); EXPECT(0 == gpt->modified); - /* Marking it bad does, though */ + /* Marking it bad also does not update it. */ EXPECT(GPT_SUCCESS == GptUpdateKernelEntry(gpt, GPT_UPDATE_ENTRY_BAD)); - EXPECT(0 == GetEntrySuccessful(e + KERNEL_A)); - EXPECT(0 == GetEntryPriority(e + KERNEL_A)); + EXPECT(1 == GetEntrySuccessful(e + KERNEL_A)); + EXPECT(4 == GetEntryPriority(e + KERNEL_A)); EXPECT(0 == GetEntryTries(e + KERNEL_A)); - /* Which affects both copies of the partition entries */ - EXPECT(0 == GetEntrySuccessful(e2 + KERNEL_A)); - EXPECT(0 == GetEntryPriority(e2 + KERNEL_A)); - EXPECT(0 == GetEntryTries(e2 + KERNEL_A)); - /* And that's caused the GPT to need updating */ - EXPECT(0x0F == gpt->modified); + EXPECT(0 == gpt->modified); /* Kernel with tries */ EXPECT(GPT_SUCCESS == GptNextKernelEntry(gpt, &start, &size)); @@ -1091,6 +1086,12 @@ static int GptUpdateTest() { EXPECT(0 == GetEntrySuccessful(e + KERNEL_B)); EXPECT(0 == GetEntryPriority(e + KERNEL_B)); EXPECT(0 == GetEntryTries(e + KERNEL_B)); + /* Which affects both copies of the partition entries */ + EXPECT(0 == GetEntrySuccessful(e2 + KERNEL_B)); + EXPECT(0 == GetEntryPriority(e2 + KERNEL_B)); + EXPECT(0 == GetEntryTries(e2 + KERNEL_B)); + /* And that's caused the GPT to need updating */ + EXPECT(0x0F == gpt->modified); /* Another kernel with tries */ EXPECT(GPT_SUCCESS == GptNextKernelEntry(gpt, &start, &size));