From 9a820d73511379877b077fde452c31fede89da23 Mon Sep 17 00:00:00 2001 From: Hsuan Ting Chen Date: Wed, 23 Sep 2020 12:37:45 +0800 Subject: minidiag/ui: Prevent calling update action if there were no updates Add a return code `VB2_ERROR_EX_DIAG_TEST_UPDATED` to determine if updating needed. BUG=b:168776970 BRANCH=none TEST=Build locally, boot recovery, select 'run diagnostics', enter memory test (quick) screen, and observe that the delay reduces while pressing keyboard Cq-Depend: chromium:2423699 Signed-off-by: Hsuan Ting Chen Change-Id: I7606911bee7257e8eed4ec35d197efaa57b72e13 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/vboot_reference/+/2424370 Reviewed-by: Yu-Ping Wu --- firmware/2lib/2ui_screens.c | 9 +++++++-- firmware/2lib/include/2api.h | 6 ++++-- firmware/2lib/include/2return_codes.h | 5 ++++- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/firmware/2lib/2ui_screens.c b/firmware/2lib/2ui_screens.c index 878b4ed7..2ec779c7 100644 --- a/firmware/2lib/2ui_screens.c +++ b/firmware/2lib/2ui_screens.c @@ -1129,7 +1129,12 @@ static vb2_error_t diagnostics_memory_update_screen(struct vb2_ui_context *ui, return VB2_REQUEST_UI_CONTINUE; vb2_error_t rv = op(reset, &log_string); - if ((rv && rv != VB2_ERROR_EX_DIAG_TEST_RUNNING) || !log_string) { + + /* The test is still running but the output buffer was unchanged. */ + if (rv == VB2_ERROR_EX_DIAG_TEST_RUNNING) + return VB2_REQUEST_UI_CONTINUE; + + if ((rv && rv != VB2_ERROR_EX_DIAG_TEST_UPDATED) || !log_string) { VB2_DEBUG("ERROR: Failed to retrieve memory test status\n"); ui->error_code = VB2_UI_ERROR_DIAGNOSTICS; return vb2_ui_screen_back(ui); @@ -1152,7 +1157,7 @@ static vb2_error_t diagnostics_memory_update_screen(struct vb2_ui_context *ui, VB2_CLR_BIT(ui->state->hidden_item_mask, DIAGNOSTICS_MEMORY_ITEM_CANCEL); VB2_CLR_BIT(ui->state->hidden_item_mask, DIAGNOSTICS_MEMORY_ITEM_BACK); - if (rv == VB2_ERROR_EX_DIAG_TEST_RUNNING) { + if (rv == VB2_ERROR_EX_DIAG_TEST_UPDATED) { VB2_SET_BIT(ui->state->hidden_item_mask, DIAGNOSTICS_MEMORY_ITEM_BACK); if (ui->state->selected_item == DIAGNOSTICS_MEMORY_ITEM_BACK) diff --git a/firmware/2lib/include/2api.h b/firmware/2lib/include/2api.h index b4dfadf8..4c5e1dc6 100644 --- a/firmware/2lib/include/2api.h +++ b/firmware/2lib/include/2api.h @@ -1513,7 +1513,7 @@ const char *vb2ex_get_diagnostic_storage(void); * control for a short period of time running memory test, and then return the * result of current status. If `reset` is not zero, it will reset the memory * test state. - * * + * * @param reset Discard the current memory test result and re-initialize * a new test. * @param out For returning a read-only pointer of full log string which is @@ -1522,7 +1522,9 @@ const char *vb2ex_get_diagnostic_storage(void); * until next call. * @return The status of memory test. VB2_SUCCESS means the test is finished, * regardless of passing or failing. VB2_ERROR_EX_DIAG_TEST_RUNNING means - * the test is still running. Other non-zero codes for internal errors. + * the test is still running but the output buffer was unchanged. + * VB2_ERROR_EX_DIAG_TEST_UPDATED means the test is still running and the output + * buffer was updated. Other non-zero codes for internal errors. */ vb2_error_t vb2ex_diag_memory_quick_test(int reset, const char **out); vb2_error_t vb2ex_diag_memory_full_test(int reset, const char **out); diff --git a/firmware/2lib/include/2return_codes.h b/firmware/2lib/include/2return_codes.h index 3a50f949..4abe16a7 100644 --- a/firmware/2lib/include/2return_codes.h +++ b/firmware/2lib/include/2return_codes.h @@ -731,9 +731,12 @@ enum vb2_return_code { /* Error setting vendor data (see: VbExSetVendorData). */ VB2_ERROR_EX_SET_VENDOR_DATA, - /* The memory test is running. */ + /* The memory test is running but the output buffer was unchanged. */ VB2_ERROR_EX_DIAG_TEST_RUNNING, + /* The memory test is running and the output buffer was updated. */ + VB2_ERROR_EX_DIAG_TEST_UPDATED, + /* The memory test initialization failed. */ VB2_ERROR_EX_DIAG_TEST_INIT_FAILED, -- cgit v1.2.1