From eb0d1d83994a1e54d6720a6fc8eb1fd3ce2e56a9 Mon Sep 17 00:00:00 2001
From: Heinrich Schuchardt <xypron.glpk@gmx.de>
Date: Wed, 30 Sep 2020 21:52:09 +0200
Subject: [PATCH] efi_selftest: avoid unnecessary reset

When we do not execute a test requiring ExitBootServices do not reset the
system after testing.

Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
---
 lib/efi_selftest/efi_selftest.c | 31 +++++++++++++++++++++++++++++++
 1 file changed, 31 insertions(+)

diff --git a/lib/efi_selftest/efi_selftest.c b/lib/efi_selftest/efi_selftest.c
index 165fa265f2..85e819bdfa 100644
--- a/lib/efi_selftest/efi_selftest.c
+++ b/lib/efi_selftest/efi_selftest.c
@@ -142,6 +142,27 @@ static int teardown(struct efi_unit_test *test, unsigned int *failures)
 	return ret;
 }
 
+/*
+ * Check that a test requiring reset exists.
+ *
+ * @testname:	name of the test
+ * @return:	test, or NULL if not found
+ */
+static bool need_reset(const u16 *testname)
+{
+	struct efi_unit_test *test;
+
+	for (test = ll_entry_start(struct efi_unit_test, efi_unit_test);
+	     test < ll_entry_end(struct efi_unit_test, efi_unit_test); ++test) {
+		if (testname && efi_st_strcmp_16_8(testname, test->name))
+			continue;
+		if (test->phase == EFI_SETUP_BEFORE_BOOTTIME_EXIT ||
+		    test->phase == EFI_SETUP_AFTER_BOOTTIME_EXIT)
+			return true;
+	}
+	return false;
+}
+
 /*
  * Check that a test exists.
  *
@@ -290,6 +311,16 @@ efi_status_t EFIAPI efi_selftest(efi_handle_t image_handle,
 			EFI_ST_SETUP | EFI_ST_EXECUTE | EFI_ST_TEARDOWN,
 			&failures);
 
+	if (!need_reset(testname)) {
+		if (failures)
+			ret = EFI_PROTOCOL_ERROR;
+
+		/* Give feedback */
+		efi_st_printc(EFI_WHITE, "\nSummary: %u failures\n\n",
+			      failures);
+		return ret;
+	}
+
 	/* Execute mixed tests */
 	efi_st_do_tests(testname, EFI_SETUP_BEFORE_BOOTTIME_EXIT,
 			EFI_ST_SETUP, &failures);
-- 
2.39.5