vboot: implement vb2api_get_recovery_reason

This API function should be used rather than directly
accessing vb2_shared_data.recovery_reason.

BUG=b:124141368, chromium:1038260, chromium:957880
TEST=make clean && make runtests
BRANCH=none

Change-Id: I92c8f9a654400be69885a691b39c4b9e4e2031c1
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/vboot_reference/+/2055662
Reviewed-by: Julius Werner <jwerner@chromium.org>
Commit-Queue: Joel Kitching <kitching@chromium.org>
Tested-by: Joel Kitching <kitching@chromium.org>
diff --git a/firmware/2lib/2misc.c b/firmware/2lib/2misc.c
index b289f31..76062f8 100644
--- a/firmware/2lib/2misc.c
+++ b/firmware/2lib/2misc.c
@@ -443,3 +443,8 @@
 	}
 	return 0;
 }
+
+uint32_t vb2api_get_recovery_reason(struct vb2_context *ctx)
+{
+	return vb2_get_sd(ctx)->recovery_reason;
+}
diff --git a/firmware/2lib/include/2api.h b/firmware/2lib/include/2api.h
index 2a87ab1..0ad10bd 100644
--- a/firmware/2lib/include/2api.h
+++ b/firmware/2lib/include/2api.h
@@ -765,6 +765,16 @@
  */
 int vb2api_need_reboot_for_display(struct vb2_context *ctx);
 
+/**
+ * Get the current recovery reason.
+ *
+ * See enum vb2_nv_recovery in 2recovery_reasons.h.
+ *
+ * @param ctx		Vboot context
+ * @return Current recovery reason.
+ */
+uint32_t vb2api_get_recovery_reason(struct vb2_context *ctx);
+
 /*****************************************************************************/
 /* APIs provided by the caller to verified boot */
 
diff --git a/tests/vb2_misc_tests.c b/tests/vb2_misc_tests.c
index ac7671e..5e2cb89 100644
--- a/tests/vb2_misc_tests.c
+++ b/tests/vb2_misc_tests.c
@@ -785,6 +785,13 @@
 		4, "  subcode shifted");
 }
 
+static void get_recovery_reason_tests(void)
+{
+	reset_common_data();
+	sd->recovery_reason = 4;
+	TEST_EQ(vb2api_get_recovery_reason(ctx), 4, "correct recovery reason");
+}
+
 int main(int argc, char* argv[])
 {
 	init_workbuf_tests();
@@ -797,6 +804,7 @@
 	select_slot_tests();
 	need_reboot_for_display_tests();
 	clear_recovery_tests();
+	get_recovery_reason_tests();
 
 	return gTestSuccess ? 0 : 255;
 }