vboot/ui: Disallow Ctrl-S when GBB forces dev mode

When GBB forces developer mode (VB2_GBB_FLAG_FORCE_DEV_SWITCH_ON),
disallow Ctrl-S shortcut in developer screens. Beep and show an error
message when Ctrl-S is pressed.

BRANCH=zork
BUG=b:146399181, b:164975737
TEST=export CC=x86_64-pc-linux-gnu-clang; make runtests
TEST=emerge-nami depthcharge

Cq-Depend: chromium:2397556
Change-Id: I62d18575290498b7ae829c2b3a2ff8dda6679636
Signed-off-by: Yu-Ping Wu <yupingso@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/vboot_reference/+/2390593
Reviewed-by: Hsuan Ting Chen <roccochen@chromium.org>
diff --git a/firmware/2lib/2ui_screens.c b/firmware/2lib/2ui_screens.c
index e1b02d0..6cdae95 100644
--- a/firmware/2lib/2ui_screens.c
+++ b/firmware/2lib/2ui_screens.c
@@ -810,6 +810,21 @@
 /******************************************************************************/
 /* VB2_SCREEN_DEVELOPER_TO_NORM */
 
+#define DEVELOPER_TO_NORM_ITEM_CONFIRM 1
+
+static vb2_error_t developer_to_norm_init(struct vb2_ui_context *ui)
+{
+	/* Don't allow to-norm if GBB forces dev mode */
+	if (vb2_get_gbb(ui->ctx)->flags & VB2_GBB_FLAG_FORCE_DEV_SWITCH_ON) {
+		VB2_DEBUG("ERROR: to-norm not allowed\n");
+		ui->error_beep = 1;
+		ui->error_code = VB2_UI_ERROR_TO_NORM_NOT_ALLOWED;
+		return vb2_ui_screen_back(ui);
+	}
+	ui->state->selected_item = DEVELOPER_TO_NORM_ITEM_CONFIRM;
+	return VB2_REQUEST_UI_CONTINUE;
+}
+
 vb2_error_t developer_to_norm_action(struct vb2_ui_context *ui)
 {
 	if (vb2_get_gbb(ui->ctx)->flags & VB2_GBB_FLAG_FORCE_DEV_SWITCH_ON) {
@@ -838,6 +853,7 @@
 static const struct vb2_screen_info developer_to_norm_screen = {
 	.id = VB2_SCREEN_DEVELOPER_TO_NORM,
 	.name = "Transition to normal mode",
+	.init = developer_to_norm_init,
 	.menu = MENU_ITEMS(developer_to_norm_items),
 };
 
diff --git a/firmware/2lib/include/2api.h b/firmware/2lib/include/2api.h
index 56c0b80..dc66167 100644
--- a/firmware/2lib/include/2api.h
+++ b/firmware/2lib/include/2api.h
@@ -1332,6 +1332,8 @@
 	VB2_UI_ERROR_NONE = 0,
 	/* Dev mode already enabled */
 	VB2_UI_ERROR_DEV_MODE_ALREADY_ENABLED,
+	/* To-norm not allowed */
+	VB2_UI_ERROR_TO_NORM_NOT_ALLOWED,
 	/* Debug info screen initialization failed */
 	VB2_UI_ERROR_DEBUG_LOG,
 	/* Firmware log screen initialization failed */