[Feature][API-794]when a/b slot broken, rollback and repair it.-1.boot partition rollback
Change-Id: Id59abfdfb79c740363c47da7c0f8bf603e958ddb
diff --git a/src/bsp/lk/app/blxboot/avb.c b/src/bsp/lk/app/blxboot/avb.c
index 0ff1873..09b3a9e 100644
--- a/src/bsp/lk/app/blxboot/avb.c
+++ b/src/bsp/lk/app/blxboot/avb.c
@@ -26,6 +26,11 @@
#include <libavb/libavb.h>
#include <libavb_ab/libavb_ab.h>
+
+//xf.li@2023410 add for ab rooback start
+#include <lib/bootctrl.h>
+#include <platform.h>
+//xf.li@2023410 add for ab rooback end
#include <platform/mmc_rpmb.h>
#include <sys/types.h>
#include <string.h>
@@ -408,9 +413,19 @@
AvbSlotVerifyResult verify_result;
const char *requested_partitions[] = { part_name, NULL };
const char *ab_suffix = get_suffix() ? : "";
+ int current_slot = -1;
verify_result = avb_slot_verify(&avbops,requested_partitions,ab_suffix,is_device_unlocked(),AVB_HASHTREE_ERROR_MODE_RESTART,verifyData);
dprintf(CRITICAL, "avb boot verification result is %s\n",avb_slot_verify_result_to_string(verify_result));
+//xf.li@20230313 modify for ab_rollback start
+ if(verify_result == AVB_SLOT_VERIFY_RESULT_ERROR_VERIFICATION && avb_strcmp(part_name,"boot") == 0)
+ {
+ dprintf(ALWAYS, "BOOTCTRL: hash verification is error\n");
+ current_slot = get_current_slot();
+ dprintf(ALWAYS, "BOOTCTRL: current_slot: %d. reboot\n" ,current_slot);
+ mark_slot_unsuccessful(current_slot);
+ }
+//xf.li@20230313 modify for ab_rollback end
if (verify_result == AVB_SLOT_VERIFY_RESULT_OK) {
verify_result = avb_update_rollback_indexes(&avbops,*verifyData);
dprintf(CRITICAL, "avb boot rollback indexes result is %s\n",avb_slot_verify_result_to_string(verify_result));
diff --git a/src/bsp/lk/lib/bootctrl/bootctrl_api.c b/src/bsp/lk/lib/bootctrl/bootctrl_api.c
index 92f8bc3..598b368 100644
--- a/src/bsp/lk/lib/bootctrl/bootctrl_api.c
+++ b/src/bsp/lk/lib/bootctrl/bootctrl_api.c
@@ -254,6 +254,7 @@
}
slotp = &metadata.slots[slot];
+ dprintf(ALWAYS, "BOOTCTRL: tries_remaining = %u\n", slotp->tries_remaining);
return slotp->tries_remaining;
}
@@ -300,7 +301,7 @@
ab_metadata_init(0);
return 0;
}
-
+ dprintf(ALWAYS, "BOOTCTRL: metadata.slots[0].priority = %u, metadata.slots[1].priority = %u.\n",metadata.slots[0].priority, metadata.slots[1].priority);
if ((metadata.slots[0].priority > 0) || (metadata.slots[1].priority > 0))
return 0;
@@ -425,7 +426,33 @@
return slotp->bl_ver;
}
+//xf.li@20230313 modify for ab_rollback start
+int mark_slot_unsuccessful(int slot)
+{
+ int ret = -1;
+ AvbABSlotData *slotp;
+ AvbABData metadata;
+ if (slot < 0 || slot >= SLOT_COUNT) {
+ return -1;
+ }
+
+ ret = read_write_partition_info(&metadata, READ_PARTITION);
+ if (ret < 0) {
+ return -1;
+ }
+
+ slotp = &metadata.slots[slot];
+ slotp->successful_boot = 0;
+
+ ret = read_write_partition_info(&metadata, WRITE_PARTITION);
+ if (ret < 0) {
+ return -1;
+ }
+
+ return 0;
+}
+//xf.li@20230313 modify for ab_rollback end
int check_ab_boot(void)
{
int ret, slot,next_slot;
@@ -434,12 +461,12 @@
ab_metadata_init(0);
plat_ab_set_active_bootdev(0);
}
-
slot = get_current_slot();
if (get_bootup_status(slot) == 1) {
+ dprintf(ALWAYS, "BOOTCTRL: this slot is successful\n");
return 0;
}
-
+ dprintf(ALWAYS, "BOOTCTRL: this slot is unsuccessful\n");
if (get_retry_count(slot) > 0) {
reduce_retry_count(slot);
return 0;
@@ -448,10 +475,13 @@
mark_slot_invalid(slot);
if (check_valid_slot() == -1)
+ {
return -EIO;
+ }
+
next_slot = (slot == 0) ? 1 : 0;
ret = plat_ab_set_active_bootdev(next_slot);
-
+ dprintf(ALWAYS, "BOOTCTRL: rollback slot\n");
/* report the bad slot error code when set new active bootdev ok */
if (ret == 0)
return -EBADSLT;
diff --git a/src/bsp/lk/lib/bootctrl/include/lib/bootctrl.h b/src/bsp/lk/lib/bootctrl/include/lib/bootctrl.h
index ff82784..ad91bfb 100644
--- a/src/bsp/lk/lib/bootctrl/include/lib/bootctrl.h
+++ b/src/bsp/lk/lib/bootctrl/include/lib/bootctrl.h
@@ -135,6 +135,14 @@
*/
int get_bl_ver_data(int slot);
+//xf.li@20230313 modify for ab_rollback start
+/**
+* mark_slot_unsuccessful() mark the slot unsuccessful.
+* Returns mark success or fail.
+*/
+int mark_slot_unsuccessful(int slot);
+//xf.li@20230313 modify for ab_rollback start
+
/**
* check_ab_boot() - check ab boot status
*