All of lore.kernel.org
 help / color / mirror / Atom feed
* [U-Boot] [PATCH v3 00/18] efi_loader: implement SetWatchdogTimer
@ 2017-10-17 22:02 Heinrich Schuchardt
  2017-10-17 22:02 ` [U-Boot] [PATCH v3 01/18] efi_loader: move efi_search_obj up in code Heinrich Schuchardt
                   ` (17 more replies)
  0 siblings, 18 replies; 33+ messages in thread
From: Heinrich Schuchardt @ 2017-10-17 22:02 UTC (permalink / raw)
  To: u-boot

The patch series is centered on implementing the SetWatchdogTimer
boottime service. Two tests are supplied. One that checks that
resetting the watchdog timer saves from a reboot. The other
checks that the watchdog timer actually leads to a reset.
Both are covered by Python test cases.

A test for EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.setattribute is supplied.

Additional fixes include missing comments and fixing typos.

v3:
	Split patches as suggested by Alex.
	Add test for EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.setattribute

Heinrich Schuchardt (18):
  efi_loader: move efi_search_obj up in code
  efi_loader: implement SetWatchdogTimer
  efi_selftest: provide test for watchdog timer
  efi_loader: new function utf8_to_utf16
  efi_loader: guard against double inclusion of efi_loader.h
  efi_loader: consistently use efi_status_t in bootefi
  efi_selftest: provide a dummy device path
  efi_selftest: reformat code
  efi_selftest: efi_st_memcmp should return 0
  efi_selftest: deduplicate code
  efi_selftest: allow to select a single test for exexution
  efi_selftest: correctly cleanup after selftest
  efi_loader: use bootargs as load options
  efi_selftest: test reboot by watchdog
  test/py: test reboot by EFI watchdog
  test/py: fix typo in test_efi_loader.py
  efi_selftest: provide test for EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
  efi_loader: set parent handle in efi_load_image

 cmd/bootefi.c                              |  56 ++++++-
 include/charset.h                          |  15 ++
 include/efi_loader.h                       |  11 +-
 include/efi_selftest.h                     |  18 +++
 lib/charset.c                              |  57 ++++++-
 lib/efi_loader/Makefile                    |   2 +-
 lib/efi_loader/efi_boottime.c              |  60 ++++----
 lib/efi_loader/efi_watchdog.c              |  89 +++++++++++
 lib/efi_selftest/Makefile                  |  10 +-
 lib/efi_selftest/efi_selftest.c            | 153 ++++++++++++++-----
 lib/efi_selftest/efi_selftest_console.c    |  10 ++
 lib/efi_selftest/efi_selftest_textoutput.c |  53 +++++++
 lib/efi_selftest/efi_selftest_util.c       |  11 +-
 lib/efi_selftest/efi_selftest_watchdog.c   | 230 +++++++++++++++++++++++++++++
 test/py/tests/test_efi_loader.py           |   2 +-
 test/py/tests/test_efi_selftest.py         |  14 +-
 16 files changed, 711 insertions(+), 80 deletions(-)
 create mode 100644 lib/efi_loader/efi_watchdog.c
 create mode 100644 lib/efi_selftest/efi_selftest_textoutput.c
 create mode 100644 lib/efi_selftest/efi_selftest_watchdog.c

-- 
2.14.2

^ permalink raw reply	[flat|nested] 33+ messages in thread

* [U-Boot] [PATCH v3 01/18] efi_loader: move efi_search_obj up in code
  2017-10-17 22:02 [U-Boot] [PATCH v3 00/18] efi_loader: implement SetWatchdogTimer Heinrich Schuchardt
@ 2017-10-17 22:02 ` Heinrich Schuchardt
  2017-10-17 22:02 ` [U-Boot] [PATCH v3 02/18] efi_loader: implement SetWatchdogTimer Heinrich Schuchardt
                   ` (16 subsequent siblings)
  17 siblings, 0 replies; 33+ messages in thread
From: Heinrich Schuchardt @ 2017-10-17 22:02 UTC (permalink / raw)
  To: u-boot

To avoid a forward declaration move efi_search_obj before
all protocol services functions.

Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
---
v3	
	no change
v2
	no change
---
 lib/efi_loader/efi_boottime.c | 41 +++++++++++++++++++++--------------------
 1 file changed, 21 insertions(+), 20 deletions(-)

diff --git a/lib/efi_loader/efi_boottime.c b/lib/efi_loader/efi_boottime.c
index f627340de4..30577f717e 100644
--- a/lib/efi_loader/efi_boottime.c
+++ b/lib/efi_loader/efi_boottime.c
@@ -690,6 +690,27 @@ static efi_status_t EFIAPI efi_check_event(struct efi_event *event)
 	return EFI_EXIT(EFI_INVALID_PARAMETER);
 }
 
+/*
+ * Find the internal EFI object for a handle.
+ *
+ * @handle	handle to find
+ * @return	EFI object
+ */
+static struct efi_object *efi_search_obj(void *handle)
+{
+	struct list_head *lhandle;
+
+	list_for_each(lhandle, &efi_obj_list) {
+		struct efi_object *efiobj;
+
+		efiobj = list_entry(lhandle, struct efi_object, link);
+		if (efiobj->handle == handle)
+			return efiobj;
+	}
+
+	return NULL;
+}
+
 /*
  * Install protocol interface.
  *
@@ -1355,26 +1376,6 @@ static efi_status_t EFIAPI efi_exit(efi_handle_t image_handle,
 	panic("EFI application exited");
 }
 
-/*
- * Find the internal EFI object for a handle.
- *
- * @handle	handle to find
- * @return	EFI object
- */
-static struct efi_object *efi_search_obj(void *handle)
-{
-	struct list_head *lhandle;
-
-	list_for_each(lhandle, &efi_obj_list) {
-		struct efi_object *efiobj;
-		efiobj = list_entry(lhandle, struct efi_object, link);
-		if (efiobj->handle == handle)
-			return efiobj;
-	}
-
-	return NULL;
-}
-
 /*
  * Unload an EFI image.
  *
-- 
2.14.2

^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [U-Boot] [PATCH v3 02/18] efi_loader: implement SetWatchdogTimer
  2017-10-17 22:02 [U-Boot] [PATCH v3 00/18] efi_loader: implement SetWatchdogTimer Heinrich Schuchardt
  2017-10-17 22:02 ` [U-Boot] [PATCH v3 01/18] efi_loader: move efi_search_obj up in code Heinrich Schuchardt
@ 2017-10-17 22:02 ` Heinrich Schuchardt
  2017-10-17 22:02 ` [U-Boot] [PATCH v3 03/18] efi_selftest: provide test for watchdog timer Heinrich Schuchardt
                   ` (15 subsequent siblings)
  17 siblings, 0 replies; 33+ messages in thread
From: Heinrich Schuchardt @ 2017-10-17 22:02 UTC (permalink / raw)
  To: u-boot

The watchdog is initialized with a 5 minute timeout period.
It can be reset by SetWatchdogTimer.
It is stopped by ExitBoottimeServices.

Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
---
v3
	add a constant for 1s to 100ns conversion
v2
	code comments updated
---
 cmd/bootefi.c                 |  1 +
 include/efi_loader.h          |  4 ++
 lib/efi_loader/Makefile       |  2 +-
 lib/efi_loader/efi_boottime.c | 17 ++-------
 lib/efi_loader/efi_watchdog.c | 89 +++++++++++++++++++++++++++++++++++++++++++
 5 files changed, 98 insertions(+), 15 deletions(-)
 create mode 100644 lib/efi_loader/efi_watchdog.c

diff --git a/cmd/bootefi.c b/cmd/bootefi.c
index 478bc116e2..18176a1266 100644
--- a/cmd/bootefi.c
+++ b/cmd/bootefi.c
@@ -43,6 +43,7 @@ static void efi_init_obj_list(void)
 #ifdef CONFIG_GENERATE_SMBIOS_TABLE
 	efi_smbios_register();
 #endif
+	efi_watchdog_register();
 
 	/* Initialize EFI runtime services */
 	efi_reset_system_init();
diff --git a/include/efi_loader.h b/include/efi_loader.h
index 1b92edbd77..af64b11cee 100644
--- a/include/efi_loader.h
+++ b/include/efi_loader.h
@@ -163,6 +163,8 @@ int efi_disk_register(void);
 int efi_gop_register(void);
 /* Called by bootefi to make the network interface available */
 int efi_net_register(void);
+/* Called by bootefi to make the watchdog available */
+int efi_watchdog_register(void);
 /* Called by bootefi to make SMBIOS tables available */
 void efi_smbios_register(void);
 
@@ -171,6 +173,8 @@ efi_fs_from_path(struct efi_device_path *fp);
 
 /* Called by networking code to memorize the dhcp ack package */
 void efi_net_set_dhcp_ack(void *pkt, int len);
+/* Called by efi_set_watchdog_timer to reset the timer */
+efi_status_t efi_set_watchdog(unsigned long timeout);
 
 /* Called from places to check whether a timer expired */
 void efi_timer_check(void);
diff --git a/lib/efi_loader/Makefile b/lib/efi_loader/Makefile
index ddb978f650..83d879b686 100644
--- a/lib/efi_loader/Makefile
+++ b/lib/efi_loader/Makefile
@@ -17,7 +17,7 @@ endif
 obj-$(CONFIG_CMD_BOOTEFI_HELLO) += helloworld_efi.o
 obj-y += efi_image_loader.o efi_boottime.o efi_runtime.o efi_console.o
 obj-y += efi_memory.o efi_device_path_to_text.o efi_device_path.o
-obj-y += efi_file.o efi_variable.o efi_bootmgr.o
+obj-y += efi_file.o efi_variable.o efi_bootmgr.o efi_watchdog.o
 obj-$(CONFIG_LCD) += efi_gop.o
 obj-$(CONFIG_DM_VIDEO) += efi_gop.o
 obj-$(CONFIG_PARTITIONS) += efi_disk.o
diff --git a/lib/efi_loader/efi_boottime.c b/lib/efi_loader/efi_boottime.c
index 30577f717e..fd8d15655b 100644
--- a/lib/efi_loader/efi_boottime.c
+++ b/lib/efi_loader/efi_boottime.c
@@ -155,18 +155,6 @@ void efi_signal_event(struct efi_event *event)
 	event->is_queued = false;
 }
 
-/*
- * Write a debug message for an EPI API service that is not implemented yet.
- *
- * @funcname	function that is not yet implemented
- * @return	EFI_UNSUPPORTED
- */
-static efi_status_t efi_unsupported(const char *funcname)
-{
-	debug("EFI: App called into unimplemented function %s\n", funcname);
-	return EFI_EXIT(EFI_UNSUPPORTED);
-}
-
 /*
  * Raise the task priority level.
  *
@@ -1454,6 +1442,7 @@ static efi_status_t EFIAPI efi_exit_boot_services(void *image_handle,
 	bootm_disable_interrupts();
 
 	/* Give the payload some time to boot */
+	efi_set_watchdog(0);
 	WATCHDOG_RESET();
 
 	return EFI_EXIT(EFI_SUCCESS);
@@ -1497,7 +1486,7 @@ static efi_status_t EFIAPI efi_stall(unsigned long microseconds)
 /*
  * Reset the watchdog timer.
  *
- * This function implements the WatchdogTimer service.
+ * This function implements the SetWatchdogTimer service.
  * See the Unified Extensible Firmware Interface (UEFI) specification
  * for details.
  *
@@ -1514,7 +1503,7 @@ static efi_status_t EFIAPI efi_set_watchdog_timer(unsigned long timeout,
 {
 	EFI_ENTRY("%ld, 0x%"PRIx64", %ld, %p", timeout, watchdog_code,
 		  data_size, watchdog_data);
-	return efi_unsupported(__func__);
+	return EFI_EXIT(efi_set_watchdog(timeout));
 }
 
 /*
diff --git a/lib/efi_loader/efi_watchdog.c b/lib/efi_loader/efi_watchdog.c
new file mode 100644
index 0000000000..35a45dedf8
--- /dev/null
+++ b/lib/efi_loader/efi_watchdog.c
@@ -0,0 +1,89 @@
+/*
+ *  EFI watchdog
+ *
+ *  Copyright (c) 2017 Heinrich Schuchardt
+ *
+ *  SPDX-License-Identifier:     GPL-2.0+
+ */
+
+#include <common.h>
+#include <efi_loader.h>
+
+/* Conversion factor from seconds to multiples of 100ns */
+#define EFI_SECONDS_TO_100NS 10000000ULL
+
+static struct efi_event *watchdog_timer_event;
+
+/*
+ * Reset the system when the watchdog event is notified.
+ *
+ * @event:	the watchdog event
+ * @context:	not used
+ */
+static void EFIAPI efi_watchdog_timer_notify(struct efi_event *event,
+					     void *context)
+{
+	EFI_ENTRY("%p, %p", event, context);
+
+	printf("\nEFI: Watchdog timeout\n");
+	EFI_CALL_VOID(efi_runtime_services.reset_system(EFI_RESET_COLD,
+							EFI_SUCCESS, 0, NULL));
+
+	EFI_EXIT(EFI_UNSUPPORTED);
+}
+
+/*
+ * Reset the watchdog timer.
+ *
+ * This function is used by the SetWatchdogTimer service.
+ *
+ * @timeout:		seconds before reset by watchdog
+ * @return:		status code
+ */
+efi_status_t efi_set_watchdog(unsigned long timeout)
+{
+	efi_status_t r;
+
+	if (timeout)
+		/* Reset watchdog */
+		r = efi_set_timer(watchdog_timer_event, EFI_TIMER_RELATIVE,
+				  EFI_SECONDS_TO_100NS * timeout);
+	else
+		/* Deactivate watchdog */
+		r = efi_set_timer(watchdog_timer_event, EFI_TIMER_STOP, 0);
+	return r;
+}
+
+/*
+ * Initialize the EFI watchdog.
+ *
+ * This function is called by efi_init_obj_list()
+ */
+int efi_watchdog_register(void)
+{
+	efi_status_t r;
+
+	/*
+	 * Create a timer event.
+	 */
+	r = efi_create_event(EVT_TIMER | EVT_NOTIFY_SIGNAL, TPL_CALLBACK,
+			     efi_watchdog_timer_notify, NULL,
+			     &watchdog_timer_event);
+	if (r != EFI_SUCCESS) {
+		printf("ERROR: Failed to register watchdog event\n");
+		return r;
+	}
+	/*
+	 * The UEFI standard requires that the watchdog timer is set to five
+	 * minutes when invoking an EFI boot option.
+	 *
+	 * Unified Extensible Firmware Interface (UEFI), version 2.7 Errata A
+	 * 7.5. Miscellaneous Boot Services - EFI_BOOT_SERVICES.SetWatchdogTimer
+	 */
+	r = efi_set_watchdog(300);
+	if (r != EFI_SUCCESS) {
+		printf("ERROR: Failed to set watchdog timer\n");
+		return r;
+	}
+	return 0;
+}
-- 
2.14.2

^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [U-Boot] [PATCH v3 03/18] efi_selftest: provide test for watchdog timer
  2017-10-17 22:02 [U-Boot] [PATCH v3 00/18] efi_loader: implement SetWatchdogTimer Heinrich Schuchardt
  2017-10-17 22:02 ` [U-Boot] [PATCH v3 01/18] efi_loader: move efi_search_obj up in code Heinrich Schuchardt
  2017-10-17 22:02 ` [U-Boot] [PATCH v3 02/18] efi_loader: implement SetWatchdogTimer Heinrich Schuchardt
@ 2017-10-17 22:02 ` Heinrich Schuchardt
  2017-10-17 22:02 ` [U-Boot] [PATCH v3 04/18] efi_loader: new function utf8_to_utf16 Heinrich Schuchardt
                   ` (14 subsequent siblings)
  17 siblings, 0 replies; 33+ messages in thread
From: Heinrich Schuchardt @ 2017-10-17 22:02 UTC (permalink / raw)
  To: u-boot

The test verifies that resetting the watchdog timer ensures
that it is not called during the timeout period.

Testing that the watchdog timer actually executes a reset
would require a test outside the efi_selftest framework.

Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
---
v3
	no change
v2
	no change
---
 lib/efi_selftest/Makefile                |   5 +-
 lib/efi_selftest/efi_selftest_watchdog.c | 185 +++++++++++++++++++++++++++++++
 2 files changed, 189 insertions(+), 1 deletion(-)
 create mode 100644 lib/efi_selftest/efi_selftest_watchdog.c

diff --git a/lib/efi_selftest/Makefile b/lib/efi_selftest/Makefile
index e446046e02..3e5c9a6d16 100644
--- a/lib/efi_selftest/Makefile
+++ b/lib/efi_selftest/Makefile
@@ -21,6 +21,8 @@ CFLAGS_efi_selftest_tpl.o := $(CFLAGS_EFI)
 CFLAGS_REMOVE_efi_selftest_tpl.o := $(CFLAGS_NON_EFI)
 CFLAGS_efi_selftest_util.o := $(CFLAGS_EFI)
 CFLAGS_REMOVE_efi_selftest_util.o := $(CFLAGS_NON_EFI)
+CFLAGS_efi_selftest_watchdog.o := $(CFLAGS_EFI)
+CFLAGS_REMOVE_efi_selftest_watchdog.o := $(CFLAGS_NON_EFI)
 
 obj-$(CONFIG_CMD_BOOTEFI_SELFTEST) += \
 efi_selftest.o \
@@ -29,4 +31,5 @@ efi_selftest_events.o \
 efi_selftest_exitbootservices.o \
 efi_selftest_snp.o \
 efi_selftest_tpl.o \
-efi_selftest_util.o
+efi_selftest_util.o \
+efi_selftest_watchdog.o
diff --git a/lib/efi_selftest/efi_selftest_watchdog.c b/lib/efi_selftest/efi_selftest_watchdog.c
new file mode 100644
index 0000000000..f8c5404000
--- /dev/null
+++ b/lib/efi_selftest/efi_selftest_watchdog.c
@@ -0,0 +1,185 @@
+/*
+ * efi_selftest_watchdog
+ *
+ * Copyright (c) 2017 Heinrich Schuchardt <xypron.glpk@gmx.de>
+ *
+ * SPDX-License-Identifier:     GPL-2.0+
+ *
+ * This unit test checks that the watchdog timer will not cause
+ * a system restart during the timeout period after a timer reset.
+ *
+ * Testing that the watchdog timer actually will reset the system
+ * after a timeout is not possible within the used framework.
+ */
+
+#include <efi_selftest.h>
+
+/*
+ * This is the communication structure for the notification function.
+ */
+struct notify_context {
+	/* Status code returned when resetting watchdog */
+	efi_status_t status;
+	/* Number of invocations of the notification function */
+	unsigned int timer_ticks;
+};
+
+static struct efi_event *event_notify;
+static struct efi_event *event_wait;
+static struct efi_boot_services *boottime;
+static struct notify_context notification_context;
+
+/*
+ * Notification function, increments the notfication count if parameter
+ * context is provided.
+ *
+ * @event	notified event
+ * @context	pointer to the timeout
+ */
+static void EFIAPI notify(struct efi_event *event, void *context)
+{
+	struct notify_context *notify_context = context;
+	efi_status_t ret = EFI_SUCCESS;
+
+	if (!notify_context)
+		return;
+
+	/* Reset watchdog timer to one second */
+	ret = boottime->set_watchdog_timer(1, 0, 0, NULL);
+	if (ret != EFI_SUCCESS)
+		notify_context->status = ret;
+	/* Count number of calls */
+	notify_context->timer_ticks++;
+}
+
+/*
+ * Setup unit test.
+ *
+ * Create two timer events.
+ * One with EVT_NOTIFY_SIGNAL, the other with EVT_NOTIFY_WAIT.
+ *
+ * @handle:	handle of the loaded image
+ * @systable:	system table
+ * @return:	EFI_ST_SUCCESS for success
+ */
+static int setup(const efi_handle_t handle,
+		 const struct efi_system_table *systable)
+{
+	efi_status_t ret;
+
+	boottime = systable->boottime;
+
+	notification_context.status = EFI_SUCCESS;
+	notification_context.timer_ticks = 0;
+	ret = boottime->create_event(EVT_TIMER | EVT_NOTIFY_SIGNAL,
+				     TPL_CALLBACK, notify,
+				     (void *)&notification_context,
+				     &event_notify);
+	if (ret != EFI_SUCCESS) {
+		efi_st_error("could not create event\n");
+		return EFI_ST_FAILURE;
+	}
+	ret = boottime->create_event(EVT_TIMER | EVT_NOTIFY_WAIT,
+				     TPL_CALLBACK, notify, NULL, &event_wait);
+	if (ret != EFI_SUCCESS) {
+		efi_st_error("could not create event\n");
+		return EFI_ST_FAILURE;
+	}
+	return EFI_ST_SUCCESS;
+}
+
+/*
+ * Tear down unit test.
+ *
+ * Close the events created in setup.
+ *
+ * @return:	EFI_ST_SUCCESS for success
+ */
+static int teardown(void)
+{
+	efi_status_t ret;
+
+	/* Set the watchdog timer to the five minute default value */
+	ret = boottime->set_watchdog_timer(300, 0, 0, NULL);
+	if (ret != EFI_SUCCESS) {
+		efi_st_error("Setting watchdog timer failed\n");
+		return EFI_ST_FAILURE;
+	}
+	if (event_notify) {
+		ret = boottime->close_event(event_notify);
+		event_notify = NULL;
+		if (ret != EFI_SUCCESS) {
+			efi_st_error("Could not close event\n");
+			return EFI_ST_FAILURE;
+		}
+	}
+	if (event_wait) {
+		ret = boottime->close_event(event_wait);
+		event_wait = NULL;
+		if (ret != EFI_SUCCESS) {
+			efi_st_error("Could not close event\n");
+			return EFI_ST_FAILURE;
+		}
+	}
+	return EFI_ST_SUCCESS;
+}
+
+/*
+ * Execute unit test.
+ *
+ * Run a 600 ms periodic timer that resets the watchdog to one second
+ * on every timer tick.
+ *
+ * Run a 1350 ms single shot timer and check that the 600ms timer has
+ * been called 2 times.
+ *
+ * @return:	EFI_ST_SUCCESS for success
+ */
+static int execute(void)
+{
+	size_t index;
+	efi_status_t ret;
+
+	/* Set the watchdog timeout to one second */
+	ret = boottime->set_watchdog_timer(1, 0, 0, NULL);
+	if (ret != EFI_SUCCESS) {
+		efi_st_error("Setting watchdog timer failed\n");
+		return EFI_ST_FAILURE;
+	}
+	/* Set 600 ms timer */
+	ret = boottime->set_timer(event_notify, EFI_TIMER_PERIODIC, 6000000);
+	if (ret != EFI_SUCCESS) {
+		efi_st_error("Could not set timer\n");
+		return EFI_ST_FAILURE;
+	}
+	/* Set 1350 ms timer */
+	ret = boottime->set_timer(event_wait, EFI_TIMER_RELATIVE, 13500000);
+	if (ret != EFI_SUCCESS) {
+		efi_st_error("Could not set timer\n");
+		return EFI_ST_FAILURE;
+	}
+
+	ret = boottime->wait_for_event(1, &event_wait, &index);
+	if (ret != EFI_SUCCESS) {
+		efi_st_error("Could not wait for event\n");
+		return EFI_ST_FAILURE;
+	}
+	if (notification_context.status != EFI_SUCCESS) {
+		efi_st_error("Setting watchdog timer failed\n");
+		return EFI_ST_FAILURE;
+	}
+	if (notification_context.timer_ticks != 2) {
+		efi_st_error("The timer was called %u times, expected 2.\n",
+			     notification_context.timer_ticks);
+		return EFI_ST_FAILURE;
+	}
+	return EFI_ST_SUCCESS;
+}
+
+EFI_UNIT_TEST(watchdog) = {
+	.name = "watchdog timer",
+	.phase = EFI_EXECUTE_BEFORE_BOOTTIME_EXIT,
+	.setup = setup,
+	.execute = execute,
+	.teardown = teardown,
+};
-- 
2.14.2

^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [U-Boot] [PATCH v3 04/18] efi_loader: new function utf8_to_utf16
  2017-10-17 22:02 [U-Boot] [PATCH v3 00/18] efi_loader: implement SetWatchdogTimer Heinrich Schuchardt
                   ` (2 preceding siblings ...)
  2017-10-17 22:02 ` [U-Boot] [PATCH v3 03/18] efi_selftest: provide test for watchdog timer Heinrich Schuchardt
@ 2017-10-17 22:02 ` Heinrich Schuchardt
  2017-10-22 14:35   ` Simon Glass
  2017-10-17 22:02 ` [U-Boot] [PATCH v3 05/18] efi_loader: guard against double inclusion of efi_loader.h Heinrich Schuchardt
                   ` (13 subsequent siblings)
  17 siblings, 1 reply; 33+ messages in thread
From: Heinrich Schuchardt @ 2017-10-17 22:02 UTC (permalink / raw)
  To: u-boot

Provide a conversion function from utf8 to utf16.

Add missing #include <linux/types.h> in include/charset.h.
Remove superfluous #include <common.h> in lib/charset.c.

Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
---
v3
	no change
v2
	new patch
---
 include/charset.h | 15 +++++++++++++++
 lib/charset.c     | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 2 files changed, 71 insertions(+), 1 deletion(-)

diff --git a/include/charset.h b/include/charset.h
index 37a3278499..2662c2f7c9 100644
--- a/include/charset.h
+++ b/include/charset.h
@@ -9,6 +9,8 @@
 #ifndef __CHARSET_H_
 #define __CHARSET_H_
 
+#include <linux/types.h>
+
 #define MAX_UTF8_PER_UTF16 3
 
 /**
@@ -62,4 +64,17 @@ uint16_t *utf16_strdup(const uint16_t *s);
  */
 uint8_t *utf16_to_utf8(uint8_t *dest, const uint16_t *src, size_t size);
 
+/**
+ * utf8_to_utf16() - Convert an utf8 string to utf16
+ *
+ * Converts up to 'size' characters of the utf16 string 'src' to utf8
+ * written to the 'dest' buffer. Stops at 0x00.
+ *
+ * @dest   the destination buffer to write the utf8 characters
+ * @src    the source utf16 string
+ * @size   maximum number of utf16 characters to convert
+ * @return the pointer to the first unwritten byte in 'dest'
+ */
+uint16_t *utf8_to_utf16(uint16_t *dest, const uint8_t *src, size_t size);
+
 #endif /* __CHARSET_H_ */
diff --git a/lib/charset.c b/lib/charset.c
index ff76e88c77..8cd17ea1cb 100644
--- a/lib/charset.c
+++ b/lib/charset.c
@@ -6,7 +6,6 @@
  *  SPDX-License-Identifier:     GPL-2.0+
  */
 
-#include <common.h>
 #include <charset.h>
 #include <malloc.h>
 
@@ -99,3 +98,59 @@ uint8_t *utf16_to_utf8(uint8_t *dest, const uint16_t *src, size_t size)
 
 	return dest;
 }
+
+uint16_t *utf8_to_utf16(uint16_t *dest, const uint8_t *src, size_t size)
+{
+	while (size--) {
+		int extension_bytes;
+		uint32_t code;
+
+		extension_bytes = 0;
+		if (*src <= 0x7f) {
+			code = *src++;
+			/* Exit on zero byte */
+			if (!code)
+				size = 0;
+		} else if (*src <= 0xbf) {
+			/* Illegal code */
+			code = '?';
+		} else if (*src <= 0xdf) {
+			code = *src++ & 0x1f;
+			extension_bytes = 1;
+		} else if (*src <= 0xef) {
+			code = *src++ & 0x0f;
+			extension_bytes = 2;
+		} else if (*src <= 0xf7) {
+			code = *src++ & 0x07;
+			extension_bytes = 3;
+		} else {
+			/* Illegal code */
+			code = '?';
+		}
+
+		for (; extension_bytes && size; --size, --extension_bytes) {
+			if ((*src & 0xc0) == 0x80) {
+				code <<= 6;
+				code |= *src++ & 0x3f;
+			} else {
+				/* Illegal code */
+				code = '?';
+				++src;
+				--size;
+				break;
+			}
+		}
+
+		if (code < 0x10000) {
+			*dest++ = code;
+		} else {
+			/*
+			 * Simplified expression for
+			 * (((code - 0x10000) >> 10) & 0x3ff) | 0xd800
+			 */
+			*dest++ = (code >> 10) + 0xd7c0;
+			*dest++ = (code & 0x3ff) | 0xdc00;
+		}
+	}
+	return dest;
+}
-- 
2.14.2

^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [U-Boot] [PATCH v3 05/18] efi_loader: guard against double inclusion of efi_loader.h
  2017-10-17 22:02 [U-Boot] [PATCH v3 00/18] efi_loader: implement SetWatchdogTimer Heinrich Schuchardt
                   ` (3 preceding siblings ...)
  2017-10-17 22:02 ` [U-Boot] [PATCH v3 04/18] efi_loader: new function utf8_to_utf16 Heinrich Schuchardt
@ 2017-10-17 22:02 ` Heinrich Schuchardt
  2017-10-22 14:35   ` Simon Glass
  2017-10-17 22:02 ` [U-Boot] [PATCH v3 06/18] efi_loader: consistently use efi_status_t in bootefi Heinrich Schuchardt
                   ` (12 subsequent siblings)
  17 siblings, 1 reply; 33+ messages in thread
From: Heinrich Schuchardt @ 2017-10-17 22:02 UTC (permalink / raw)
  To: u-boot

Use a define to detect double inclusion of efi_loader.h.

Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
---
v3
	no change
v2
	new patch
---
 include/efi_loader.h | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/include/efi_loader.h b/include/efi_loader.h
index af64b11cee..e506eeec61 100644
--- a/include/efi_loader.h
+++ b/include/efi_loader.h
@@ -6,6 +6,9 @@
  *  SPDX-License-Identifier:     GPL-2.0+
  */
 
+#ifndef _EFI_LOADER_H
+#define _EFI_LOADER_H 1
+
 #include <common.h>
 #include <part_efi.h>
 #include <efi_api.h>
@@ -345,4 +348,6 @@ static inline void efi_set_bootdev(const char *dev, const char *devnr,
 				   const char *path) { }
 static inline void efi_net_set_dhcp_ack(void *pkt, int len) { }
 
-#endif
+#endif /* CONFIG_EFI_LOADER && !CONFIG_SPL_BUILD */
+
+#endif /* _EFI_LOADER_H */
-- 
2.14.2

^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [U-Boot] [PATCH v3 06/18] efi_loader: consistently use efi_status_t in bootefi
  2017-10-17 22:02 [U-Boot] [PATCH v3 00/18] efi_loader: implement SetWatchdogTimer Heinrich Schuchardt
                   ` (4 preceding siblings ...)
  2017-10-17 22:02 ` [U-Boot] [PATCH v3 05/18] efi_loader: guard against double inclusion of efi_loader.h Heinrich Schuchardt
@ 2017-10-17 22:02 ` Heinrich Schuchardt
  2017-10-22 14:35   ` Simon Glass
  2017-10-17 22:02 ` [U-Boot] [PATCH v3 07/18] efi_selftest: provide a dummy device path Heinrich Schuchardt
                   ` (11 subsequent siblings)
  17 siblings, 1 reply; 33+ messages in thread
From: Heinrich Schuchardt @ 2017-10-17 22:02 UTC (permalink / raw)
  To: u-boot

Where ulong or unsigned long are used to hold an EFI status
code we should consistenly use efi_status_t.

Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
---
v3
	new patch
---
 cmd/bootefi.c | 18 +++++++++---------
 1 file changed, 9 insertions(+), 9 deletions(-)

diff --git a/cmd/bootefi.c b/cmd/bootefi.c
index 18176a1266..6bdbb89c29 100644
--- a/cmd/bootefi.c
+++ b/cmd/bootefi.c
@@ -93,10 +93,10 @@ static void *copy_fdt(void *fdt)
 	return new_fdt;
 }
 
-static ulong efi_do_enter(void *image_handle,
-			  struct efi_system_table *st,
-			  asmlinkage ulong (*entry)(void *image_handle,
-				struct efi_system_table *st))
+static efi_status_t efi_do_enter(
+			void *image_handle, struct efi_system_table *st,
+			asmlinkage ulong (*entry)(void *image_handle,
+			struct efi_system_table *st))
 {
 	efi_status_t ret = EFI_LOAD_ERROR;
 
@@ -107,7 +107,7 @@ static ulong efi_do_enter(void *image_handle,
 }
 
 #ifdef CONFIG_ARM64
-static unsigned long efi_run_in_el2(asmlinkage ulong (*entry)(
+static efi_status_t efi_run_in_el2(asmlinkage ulong (*entry)(
 			void *image_handle, struct efi_system_table *st),
 			void *image_handle, struct efi_system_table *st)
 {
@@ -122,9 +122,9 @@ static unsigned long efi_run_in_el2(asmlinkage ulong (*entry)(
  * Load an EFI payload into a newly allocated piece of memory, register all
  * EFI objects it would want to access and jump to it.
  */
-static unsigned long do_bootefi_exec(void *efi, void *fdt,
-				     struct efi_device_path *device_path,
-				     struct efi_device_path *image_path)
+static efi_status_t do_bootefi_exec(void *efi, void *fdt,
+				    struct efi_device_path *device_path,
+				    struct efi_device_path *image_path)
 {
 	struct efi_loaded_image loaded_image_info = {};
 	struct efi_object loaded_image_info_obj = {};
@@ -278,7 +278,7 @@ static int do_bootefi(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 {
 	char *saddr, *sfdt;
 	unsigned long addr, fdt_addr = 0;
-	unsigned long r;
+	efi_status_t r;
 
 	if (argc < 2)
 		return CMD_RET_USAGE;
-- 
2.14.2

^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [U-Boot] [PATCH v3 07/18] efi_selftest: provide a dummy device path
  2017-10-17 22:02 [U-Boot] [PATCH v3 00/18] efi_loader: implement SetWatchdogTimer Heinrich Schuchardt
                   ` (5 preceding siblings ...)
  2017-10-17 22:02 ` [U-Boot] [PATCH v3 06/18] efi_loader: consistently use efi_status_t in bootefi Heinrich Schuchardt
@ 2017-10-17 22:02 ` Heinrich Schuchardt
  2017-10-22 14:35   ` Simon Glass
  2017-10-17 22:02 ` [U-Boot] [PATCH v3 08/18] efi_selftest: reformat code Heinrich Schuchardt
                   ` (10 subsequent siblings)
  17 siblings, 1 reply; 33+ messages in thread
From: Heinrich Schuchardt @ 2017-10-17 22:02 UTC (permalink / raw)
  To: u-boot

Currently we pass bootefi_device_path and bootefi_image_path as
device and image path without initializing them. They may carry
values from previous calls to bootefi.

With the patch the variables are initialized valid dummy values.

Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
---
v3
	new patch split off
---
 cmd/bootefi.c | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/cmd/bootefi.c b/cmd/bootefi.c
index 59696f4601..d497381ac3 100644
--- a/cmd/bootefi.c
+++ b/cmd/bootefi.c
@@ -299,6 +299,12 @@ static int do_bootefi(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 		struct efi_loaded_image loaded_image_info = {};
 		struct efi_object loaded_image_info_obj = {};
 
+		/* Construct a dummy device path. */
+		bootefi_device_path = efi_dp_from_mem(EFI_RESERVED_MEMORY_TYPE,
+						      (uintptr_t)&efi_selftest,
+						      (uintptr_t)&efi_selftest);
+		bootefi_image_path = efi_dp_from_file(NULL, 0, "\\selftest");
+
 		efi_setup_loaded_image(&loaded_image_info,
 				       &loaded_image_info_obj,
 				       bootefi_device_path, bootefi_image_path);
-- 
2.14.2

^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [U-Boot] [PATCH v3 08/18] efi_selftest: reformat code
  2017-10-17 22:02 [U-Boot] [PATCH v3 00/18] efi_loader: implement SetWatchdogTimer Heinrich Schuchardt
                   ` (6 preceding siblings ...)
  2017-10-17 22:02 ` [U-Boot] [PATCH v3 07/18] efi_selftest: provide a dummy device path Heinrich Schuchardt
@ 2017-10-17 22:02 ` Heinrich Schuchardt
  2017-10-22 14:35   ` Simon Glass
  2017-10-17 22:02 ` [U-Boot] [PATCH v3 09/18] efi_selftest: efi_st_memcmp should return 0 Heinrich Schuchardt
                   ` (9 subsequent siblings)
  17 siblings, 1 reply; 33+ messages in thread
From: Heinrich Schuchardt @ 2017-10-17 22:02 UTC (permalink / raw)
  To: u-boot

Remove superfluous spaces.

Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
---
v3
	new patch split off
---
 lib/efi_selftest/efi_selftest.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/lib/efi_selftest/efi_selftest.c b/lib/efi_selftest/efi_selftest.c
index 45d8d3d384..c2c339a7be 100644
--- a/lib/efi_selftest/efi_selftest.c
+++ b/lib/efi_selftest/efi_selftest.c
@@ -25,8 +25,8 @@ static u16 reset_message[] = L"Selftest completed";
  */
 void efi_st_exit_boot_services(void)
 {
-	unsigned long  map_size = 0;
-	unsigned long  map_key;
+	unsigned long map_size = 0;
+	unsigned long map_key;
 	unsigned long desc_size;
 	u32 desc_version;
 	efi_status_t ret;
-- 
2.14.2

^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [U-Boot] [PATCH v3 09/18] efi_selftest: efi_st_memcmp should return 0
  2017-10-17 22:02 [U-Boot] [PATCH v3 00/18] efi_loader: implement SetWatchdogTimer Heinrich Schuchardt
                   ` (7 preceding siblings ...)
  2017-10-17 22:02 ` [U-Boot] [PATCH v3 08/18] efi_selftest: reformat code Heinrich Schuchardt
@ 2017-10-17 22:02 ` Heinrich Schuchardt
  2017-10-22 14:35   ` Simon Glass
  2017-10-17 22:02 ` [U-Boot] [PATCH v3 10/18] efi_selftest: deduplicate code Heinrich Schuchardt
                   ` (8 subsequent siblings)
  17 siblings, 1 reply; 33+ messages in thread
From: Heinrich Schuchardt @ 2017-10-17 22:02 UTC (permalink / raw)
  To: u-boot

If the compared memory areas match the return value should be 0.
We should not use the unrelated constant EFI_ST_SUCCESS.

Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
---
v3
	new patch split off
---
 lib/efi_selftest/efi_selftest_util.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lib/efi_selftest/efi_selftest_util.c b/lib/efi_selftest/efi_selftest_util.c
index 5cffe383d8..5f81f251c4 100644
--- a/lib/efi_selftest/efi_selftest_util.c
+++ b/lib/efi_selftest/efi_selftest_util.c
@@ -21,5 +21,5 @@ int efi_st_memcmp(const void *buf1, const void *buf2, size_t length)
 		++pos1;
 		++pos2;
 	}
-	return EFI_ST_SUCCESS;
+	return 0;
 }
-- 
2.14.2

^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [U-Boot] [PATCH v3 10/18] efi_selftest: deduplicate code
  2017-10-17 22:02 [U-Boot] [PATCH v3 00/18] efi_loader: implement SetWatchdogTimer Heinrich Schuchardt
                   ` (8 preceding siblings ...)
  2017-10-17 22:02 ` [U-Boot] [PATCH v3 09/18] efi_selftest: efi_st_memcmp should return 0 Heinrich Schuchardt
@ 2017-10-17 22:02 ` Heinrich Schuchardt
  2017-10-22 14:35   ` Simon Glass
  2017-10-17 22:02 ` [U-Boot] [PATCH v3 11/18] efi_selftest: allow to select a single test for exexution Heinrich Schuchardt
                   ` (7 subsequent siblings)
  17 siblings, 1 reply; 33+ messages in thread
From: Heinrich Schuchardt @ 2017-10-17 22:02 UTC (permalink / raw)
  To: u-boot

Move duplicate code to the new function efi_st_do_tests.

Suggested-by: Alexander Graf <agraf@suse.de>
Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
---
v3
	new patch
---
 lib/efi_selftest/efi_selftest.c | 71 ++++++++++++++++++++++++-----------------
 1 file changed, 42 insertions(+), 29 deletions(-)

diff --git a/lib/efi_selftest/efi_selftest.c b/lib/efi_selftest/efi_selftest.c
index c2c339a7be..73f074d9e1 100644
--- a/lib/efi_selftest/efi_selftest.c
+++ b/lib/efi_selftest/efi_selftest.c
@@ -9,6 +9,13 @@
 #include <efi_selftest.h>
 #include <vsprintf.h>
 
+/*
+ * Constants for test step bitmap
+ */
+#define EFI_ST_SETUP	1
+#define EFI_ST_EXECUTE	2
+#define EFI_ST_TEARDOWN	4
+
 static const struct efi_system_table *systable;
 static const struct efi_boot_services *boottime;
 static const struct efi_runtime_services *runtime;
@@ -133,6 +140,31 @@ static int teardown(struct efi_unit_test *test, unsigned int *failures)
 	return ret;
 }
 
+/*
+ * Execute test steps of one phase.
+ *
+ * @phase	test phase
+ * @steps	steps to execute
+ * failures	returns EFI_ST_SUCCESS if all test steps succeeded
+ */
+void efi_st_do_tests(unsigned int phase, unsigned int steps,
+		     unsigned int *failures)
+{
+	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 (test->phase != phase)
+			continue;
+		if (steps & EFI_ST_SETUP)
+			setup(test, failures);
+		if (steps & EFI_ST_EXECUTE)
+			execute(test, failures);
+		if (steps & EFI_ST_TEARDOWN)
+			teardown(test, failures);
+	}
+}
+
 /*
  * Execute selftest of the EFI API
  *
@@ -153,7 +185,6 @@ static int teardown(struct efi_unit_test *test, unsigned int *failures)
 efi_status_t EFIAPI efi_selftest(efi_handle_t image_handle,
 				 struct efi_system_table *systab)
 {
-	struct efi_unit_test *test;
 	unsigned int failures = 0;
 
 	systable = systab;
@@ -169,41 +200,23 @@ efi_status_t EFIAPI efi_selftest(efi_handle_t image_handle,
 		      ll_entry_count(struct efi_unit_test, efi_unit_test));
 
 	/* Execute boottime tests */
-	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 (test->phase == EFI_EXECUTE_BEFORE_BOOTTIME_EXIT) {
-			setup(test, &failures);
-			execute(test, &failures);
-			teardown(test, &failures);
-		}
-	}
+	efi_st_do_tests(EFI_EXECUTE_BEFORE_BOOTTIME_EXIT,
+			EFI_ST_SETUP | EFI_ST_EXECUTE | EFI_ST_TEARDOWN,
+			&failures);
 
 	/* Execute mixed tests */
-	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 (test->phase == EFI_SETUP_BEFORE_BOOTTIME_EXIT)
-			setup(test, &failures);
-	}
+	efi_st_do_tests(EFI_SETUP_BEFORE_BOOTTIME_EXIT,
+			EFI_ST_SETUP, &failures);
 
 	efi_st_exit_boot_services();
 
-	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 (test->phase == EFI_SETUP_BEFORE_BOOTTIME_EXIT) {
-			execute(test, &failures);
-			teardown(test, &failures);
-		}
-	}
+	efi_st_do_tests(EFI_SETUP_BEFORE_BOOTTIME_EXIT,
+			EFI_ST_EXECUTE | EFI_ST_TEARDOWN, &failures);
 
 	/* Execute runtime tests */
-	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 (test->phase == EFI_SETUP_AFTER_BOOTTIME_EXIT) {
-			setup(test, &failures);
-			execute(test, &failures);
-			teardown(test, &failures);
-		}
-	}
+	efi_st_do_tests(EFI_SETUP_AFTER_BOOTTIME_EXIT,
+			EFI_ST_SETUP | EFI_ST_EXECUTE | EFI_ST_TEARDOWN,
+			&failures);
 
 	/* Give feedback */
 	efi_st_printf("\nSummary: %u failures\n\n", failures);
-- 
2.14.2

^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [U-Boot] [PATCH v3 11/18] efi_selftest: allow to select a single test for exexution
  2017-10-17 22:02 [U-Boot] [PATCH v3 00/18] efi_loader: implement SetWatchdogTimer Heinrich Schuchardt
                   ` (9 preceding siblings ...)
  2017-10-17 22:02 ` [U-Boot] [PATCH v3 10/18] efi_selftest: deduplicate code Heinrich Schuchardt
@ 2017-10-17 22:02 ` Heinrich Schuchardt
  2017-10-17 22:02 ` [U-Boot] [PATCH v3 12/18] efi_selftest: correctly cleanup after selftest Heinrich Schuchardt
                   ` (6 subsequent siblings)
  17 siblings, 0 replies; 33+ messages in thread
From: Heinrich Schuchardt @ 2017-10-17 22:02 UTC (permalink / raw)
  To: u-boot

Environment variable efi_selftest is passed as load options
to the selftest application. It is used to select a single
test to be executed.

The load options are an UTF8 string. Yet I decided to keep
the name propertiy of the tests as char[] to reduce code
size.

Special value 'list' displays a list of all available tests.

Tests get an on_request property. If this property is set
the tests are only executed if explicitly requested.

The invocation of efi_selftest is changed to reflect that
bootefi selftest with efi_selftest = 'list' will call the
Exit bootservice.

Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
---
v3
	split off unrelated changes to separate patches
v2
	use an environment variable to choose a test
---
 cmd/bootefi.c                           | 37 +++++++++++++-
 include/efi_selftest.h                  | 18 +++++++
 lib/efi_selftest/efi_selftest.c         | 90 ++++++++++++++++++++++++++++++---
 lib/efi_selftest/efi_selftest_console.c | 10 ++++
 lib/efi_selftest/efi_selftest_util.c    |  9 ++++
 5 files changed, 155 insertions(+), 9 deletions(-)

diff --git a/cmd/bootefi.c b/cmd/bootefi.c
index d497381ac3..18331536dd 100644
--- a/cmd/bootefi.c
+++ b/cmd/bootefi.c
@@ -6,10 +6,12 @@
  *  SPDX-License-Identifier:     GPL-2.0+
  */
 
+#include <charset.h>
 #include <common.h>
 #include <command.h>
 #include <dm.h>
 #include <efi_loader.h>
+#include <efi_selftest.h>
 #include <errno.h>
 #include <libfdt.h>
 #include <libfdt_env.h>
@@ -50,6 +52,32 @@ static void efi_init_obj_list(void)
 	efi_get_time_init();
 }
 
+/*
+ * Set the load options of an image from an environment variable.
+ *
+ * @loaded_image_info:	the image
+ * @env_var:		name of the environment variable
+ */
+static void set_load_options(struct efi_loaded_image *loaded_image_info,
+			     const char *env_var)
+{
+	size_t size;
+	const char *env = env_get(env_var);
+
+	loaded_image_info->load_options = NULL;
+	loaded_image_info->load_options_size = 0;
+	if (!env)
+		return;
+	size = strlen(env) + 1;
+	loaded_image_info->load_options = calloc(size, sizeof(u16));
+	if (!loaded_image_info->load_options) {
+		printf("ERROR: Out of memory\n");
+		return;
+	}
+	utf8_to_utf16(loaded_image_info->load_options, (u8 *)env, size);
+	loaded_image_info->load_options_size = size * 2;
+}
+
 static void *copy_fdt(void *fdt)
 {
 	u64 fdt_size = fdt_totalsize(fdt);
@@ -317,7 +345,12 @@ static int do_bootefi(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 		/* Initialize and populate EFI object list */
 		if (!efi_obj_list_initalized)
 			efi_init_obj_list();
-		return efi_selftest(&loaded_image_info, &systab);
+		/* Transfer environment variable efi_selftest as load options */
+		set_load_options(&loaded_image_info, "efi_selftest");
+		/* Execute the test */
+		r = efi_selftest(&loaded_image_info, &systab);
+		free(loaded_image_info.load_options);
+		return r;
 	} else
 #endif
 	if (!strcmp(argv[1], "bootmgr")) {
@@ -363,6 +396,8 @@ static char bootefi_help_text[] =
 #ifdef CONFIG_CMD_BOOTEFI_SELFTEST
 	"bootefi selftest\n"
 	"  - boot an EFI selftest application stored within U-Boot\n"
+	"    Use environment variable efi_selftest to select a single test.\n"
+	"    Use 'setenv efi_selftest list' to enumerate all tests.\n"
 #endif
 	"bootmgr [fdt addr]\n"
 	"  - load and boot EFI payload based on BootOrder/BootXXXX variables.\n"
diff --git a/include/efi_selftest.h b/include/efi_selftest.h
index 7ec42a0406..978ca2a7ea 100644
--- a/include/efi_selftest.h
+++ b/include/efi_selftest.h
@@ -12,6 +12,7 @@
 #include <common.h>
 #include <efi.h>
 #include <efi_api.h>
+#include <efi_loader.h>
 #include <linker_lists.h>
 
 #define EFI_ST_SUCCESS 0
@@ -71,6 +72,15 @@ void efi_st_printf(const char *fmt, ...)
  */
 int efi_st_memcmp(const void *buf1, const void *buf2, size_t length);
 
+/*
+ * Compare an u16 string to a char string.
+ *
+ * @buf1:	u16 string
+ * @buf2:	char string
+ * @return:	0 if both buffers contain the same bytes
+ */
+int efi_st_strcmp_16_8(const u16 *buf1, const char *buf2);
+
 /*
  * Reads an Unicode character from the input device.
  *
@@ -88,6 +98,7 @@ u16 efi_st_get_key(void);
  * @setup:	set up the unit test
  * @teardown:	tear down the unit test
  * @execute:	execute the unit test
+ * @on_request:	test is only executed on request
  */
 struct efi_unit_test {
 	const char *name;
@@ -96,10 +107,17 @@ struct efi_unit_test {
 		     const struct efi_system_table *systable);
 	int (*execute)(void);
 	int (*teardown)(void);
+	bool on_request;
 };
 
 /* Declare a new EFI unit test */
 #define EFI_UNIT_TEST(__name)						\
 	ll_entry_declare(struct efi_unit_test, __name, efi_unit_test)
 
+#define EFI_SELFTEST_TABLE_GUID \
+	EFI_GUID(0xbc3ebe57, 0x09e5, 0xa59d, 0xdb, 0x87, \
+		 0xf5, 0x79, 0x61, 0x62, 0x06, 0xde)
+
+extern const efi_guid_t efi_selftest_table_guid;
+
 #endif /* _EFI_SELFTEST_H */
diff --git a/lib/efi_selftest/efi_selftest.c b/lib/efi_selftest/efi_selftest.c
index 73f074d9e1..5d8bb54d53 100644
--- a/lib/efi_selftest/efi_selftest.c
+++ b/lib/efi_selftest/efi_selftest.c
@@ -22,6 +22,8 @@ static const struct efi_runtime_services *runtime;
 static efi_handle_t handle;
 static u16 reset_message[] = L"Selftest completed";
 
+const efi_guid_t efi_selftest_table_guid = EFI_SELFTEST_TABLE_GUID;
+
 /*
  * Exit the boot services.
  *
@@ -140,20 +142,59 @@ static int teardown(struct efi_unit_test *test, unsigned int *failures)
 	return ret;
 }
 
+/*
+ * Check that a test exists.
+ *
+ * @testname:	name of the test
+ * @return:	test
+ */
+static struct efi_unit_test *find_test(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 (!efi_st_strcmp_16_8(testname, test->name))
+			return test;
+	}
+	efi_st_printf("\nTest '%ps' not found\n", testname);
+	return NULL;
+}
+
+/*
+ * List all available tests.
+ */
+static void list_all_tests(void)
+{
+	struct efi_unit_test *test;
+
+	/* List all tests */
+	efi_st_printf("\nAvailable tests:\n");
+	for (test = ll_entry_start(struct efi_unit_test, efi_unit_test);
+	     test < ll_entry_end(struct efi_unit_test, efi_unit_test); ++test) {
+		efi_st_printf("'%s'%s\n", test->name,
+			      test->on_request ? " - on request" : "");
+	}
+}
+
 /*
  * Execute test steps of one phase.
  *
+ * @testname	name of a single selected test or NULL
  * @phase	test phase
  * @steps	steps to execute
  * failures	returns EFI_ST_SUCCESS if all test steps succeeded
  */
-void efi_st_do_tests(unsigned int phase, unsigned int steps,
-		     unsigned int *failures)
+void efi_st_do_tests(const u16 *testname, unsigned int phase,
+		     unsigned int steps, unsigned int *failures)
 {
 	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) : test->on_request)
+			continue;
 		if (test->phase != phase)
 			continue;
 		if (steps & EFI_ST_SETUP)
@@ -186,6 +227,9 @@ efi_status_t EFIAPI efi_selftest(efi_handle_t image_handle,
 				 struct efi_system_table *systab)
 {
 	unsigned int failures = 0;
+	const u16 *testname = NULL;
+	struct efi_loaded_image *loaded_image;
+	efi_status_t ret;
 
 	systable = systab;
 	boottime = systable->boottime;
@@ -194,27 +238,57 @@ efi_status_t EFIAPI efi_selftest(efi_handle_t image_handle,
 	con_out = systable->con_out;
 	con_in = systable->con_in;
 
+	ret = boottime->handle_protocol(image_handle, &efi_guid_loaded_image,
+					(void **)&loaded_image);
+	if (ret != EFI_SUCCESS) {
+		efi_st_error("Cannot open loaded image protocol");
+		return ret;
+	}
+
+	if (loaded_image->load_options)
+		testname = (u16 *)loaded_image->load_options;
+
+	if (testname) {
+		if (!efi_st_strcmp_16_8(testname, "list") ||
+		    !find_test(testname)) {
+			list_all_tests();
+			/*
+			 * TODO:
+			 * Once the Exit boottime service is correctly
+			 * implemented we should call
+			 *   boottime->exit(image_handle, EFI_SUCCESS, 0, NULL);
+			 * here, cf.
+			 * https://lists.denx.de/pipermail/u-boot/2017-October/308720.html
+			 */
+			return EFI_SUCCESS;
+		}
+	}
+
 	efi_st_printf("\nTesting EFI API implementation\n");
 
-	efi_st_printf("\nNumber of tests to execute: %u\n",
-		      ll_entry_count(struct efi_unit_test, efi_unit_test));
+	if (testname)
+		efi_st_printf("\nSelected test: '%ps'\n", testname);
+	else
+		efi_st_printf("\nNumber of tests to execute: %u\n",
+			      ll_entry_count(struct efi_unit_test,
+					     efi_unit_test));
 
 	/* Execute boottime tests */
-	efi_st_do_tests(EFI_EXECUTE_BEFORE_BOOTTIME_EXIT,
+	efi_st_do_tests(testname, EFI_EXECUTE_BEFORE_BOOTTIME_EXIT,
 			EFI_ST_SETUP | EFI_ST_EXECUTE | EFI_ST_TEARDOWN,
 			&failures);
 
 	/* Execute mixed tests */
-	efi_st_do_tests(EFI_SETUP_BEFORE_BOOTTIME_EXIT,
+	efi_st_do_tests(testname, EFI_SETUP_BEFORE_BOOTTIME_EXIT,
 			EFI_ST_SETUP, &failures);
 
 	efi_st_exit_boot_services();
 
-	efi_st_do_tests(EFI_SETUP_BEFORE_BOOTTIME_EXIT,
+	efi_st_do_tests(testname, EFI_SETUP_BEFORE_BOOTTIME_EXIT,
 			EFI_ST_EXECUTE | EFI_ST_TEARDOWN, &failures);
 
 	/* Execute runtime tests */
-	efi_st_do_tests(EFI_SETUP_AFTER_BOOTTIME_EXIT,
+	efi_st_do_tests(testname, EFI_SETUP_AFTER_BOOTTIME_EXIT,
 			EFI_ST_SETUP | EFI_ST_EXECUTE | EFI_ST_TEARDOWN,
 			&failures);
 
diff --git a/lib/efi_selftest/efi_selftest_console.c b/lib/efi_selftest/efi_selftest_console.c
index 840e2290c6..6a7fd20da5 100644
--- a/lib/efi_selftest/efi_selftest_console.c
+++ b/lib/efi_selftest/efi_selftest_console.c
@@ -142,6 +142,7 @@ void efi_st_printf(const char *fmt, ...)
 	const char *c;
 	u16 *pos = buf;
 	const char *s;
+	const u16 *u;
 
 	va_start(args, fmt);
 
@@ -179,9 +180,18 @@ void efi_st_printf(const char *fmt, ...)
 			case 'p':
 				++c;
 				switch (*c) {
+				/* MAC address */
 				case 'm':
 					mac(va_arg(args, void*), &pos);
 					break;
+
+				/* u16 string */
+				case 's':
+					u = va_arg(args, u16*);
+					/* Ensure string fits into buffer */
+					for (; *u && pos < buf + 120; ++u)
+						*pos++ = *u;
+					break;
 				default:
 					--c;
 					pointer(va_arg(args, void*), &pos);
diff --git a/lib/efi_selftest/efi_selftest_util.c b/lib/efi_selftest/efi_selftest_util.c
index 5f81f251c4..1b17bf4d4b 100644
--- a/lib/efi_selftest/efi_selftest_util.c
+++ b/lib/efi_selftest/efi_selftest_util.c
@@ -23,3 +23,12 @@ int efi_st_memcmp(const void *buf1, const void *buf2, size_t length)
 	}
 	return 0;
 }
+
+int efi_st_strcmp_16_8(const u16 *buf1, const char *buf2)
+{
+	for (; *buf1 || *buf2; ++buf1, ++buf2) {
+		if (*buf1 != *buf2)
+			return *buf1 - *buf2;
+	}
+	return 0;
+}
-- 
2.14.2

^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [U-Boot] [PATCH v3 12/18] efi_selftest: correctly cleanup after selftest
  2017-10-17 22:02 [U-Boot] [PATCH v3 00/18] efi_loader: implement SetWatchdogTimer Heinrich Schuchardt
                   ` (10 preceding siblings ...)
  2017-10-17 22:02 ` [U-Boot] [PATCH v3 11/18] efi_selftest: allow to select a single test for exexution Heinrich Schuchardt
@ 2017-10-17 22:02 ` Heinrich Schuchardt
  2017-10-22 14:35   ` Simon Glass
  2017-10-17 22:02 ` [U-Boot] [PATCH v3 13/18] efi_loader: use bootargs as load options Heinrich Schuchardt
                   ` (5 subsequent siblings)
  17 siblings, 1 reply; 33+ messages in thread
From: Heinrich Schuchardt @ 2017-10-17 22:02 UTC (permalink / raw)
  To: u-boot

After executing bootefi selftest
* restore GD
* unlink the load image handle
* return 0 or 1 and not a truncated efi_status_t.

Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
---
v3
	new patch split off
---
 cmd/bootefi.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/cmd/bootefi.c b/cmd/bootefi.c
index 18331536dd..40834f3899 100644
--- a/cmd/bootefi.c
+++ b/cmd/bootefi.c
@@ -349,8 +349,10 @@ static int do_bootefi(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 		set_load_options(&loaded_image_info, "efi_selftest");
 		/* Execute the test */
 		r = efi_selftest(&loaded_image_info, &systab);
+		efi_restore_gd();
 		free(loaded_image_info.load_options);
-		return r;
+		list_del(&loaded_image_info_obj.link);
+		return r != EFI_SUCCESS;
 	} else
 #endif
 	if (!strcmp(argv[1], "bootmgr")) {
-- 
2.14.2

^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [U-Boot] [PATCH v3 13/18] efi_loader: use bootargs as load options
  2017-10-17 22:02 [U-Boot] [PATCH v3 00/18] efi_loader: implement SetWatchdogTimer Heinrich Schuchardt
                   ` (11 preceding siblings ...)
  2017-10-17 22:02 ` [U-Boot] [PATCH v3 12/18] efi_selftest: correctly cleanup after selftest Heinrich Schuchardt
@ 2017-10-17 22:02 ` Heinrich Schuchardt
  2017-10-22 14:35   ` Simon Glass
  2017-10-17 22:02 ` [U-Boot] [PATCH v3 14/18] efi_selftest: test reboot by watchdog Heinrich Schuchardt
                   ` (4 subsequent siblings)
  17 siblings, 1 reply; 33+ messages in thread
From: Heinrich Schuchardt @ 2017-10-17 22:02 UTC (permalink / raw)
  To: u-boot

Use environment variable bootargs used as load options
for bootefi payloads.

Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
---
v3
	new patch split off
---
 cmd/bootefi.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/cmd/bootefi.c b/cmd/bootefi.c
index 40834f3899..ff659fc02f 100644
--- a/cmd/bootefi.c
+++ b/cmd/bootefi.c
@@ -218,6 +218,8 @@ static efi_status_t do_bootefi_exec(void *efi, void *fdt,
 		efi_install_configuration_table(&fdt_guid, NULL);
 	}
 
+	/* Transfer environment variable bootargs as load options */
+	set_load_options(&loaded_image_info, "bootargs");
 	/* Load the EFI payload */
 	entry = efi_load_pe(efi, &loaded_image_info);
 	if (!entry) {
-- 
2.14.2

^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [U-Boot] [PATCH v3 14/18] efi_selftest: test reboot by watchdog
  2017-10-17 22:02 [U-Boot] [PATCH v3 00/18] efi_loader: implement SetWatchdogTimer Heinrich Schuchardt
                   ` (12 preceding siblings ...)
  2017-10-17 22:02 ` [U-Boot] [PATCH v3 13/18] efi_loader: use bootargs as load options Heinrich Schuchardt
@ 2017-10-17 22:02 ` Heinrich Schuchardt
  2017-10-22 14:35   ` Simon Glass
  2017-10-17 22:02 ` [U-Boot] [PATCH v3 15/18] test/py: test reboot by EFI watchdog Heinrich Schuchardt
                   ` (3 subsequent siblings)
  17 siblings, 1 reply; 33+ messages in thread
From: Heinrich Schuchardt @ 2017-10-17 22:02 UTC (permalink / raw)
  To: u-boot

A test is added that verifies that the watchdog timer actually
causes a reboot upon timeout. The test is only executed on
request using

    setenv efi_selftest watchdog reboot
    bootefi selftest

Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
---
v3
	correct comments
v2
	no change
---
 lib/efi_selftest/efi_selftest_watchdog.c | 68 ++++++++++++++++++++++++++------
 1 file changed, 57 insertions(+), 11 deletions(-)

diff --git a/lib/efi_selftest/efi_selftest_watchdog.c b/lib/efi_selftest/efi_selftest_watchdog.c
index f8c5404000..e4af38407f 100644
--- a/lib/efi_selftest/efi_selftest_watchdog.c
+++ b/lib/efi_selftest/efi_selftest_watchdog.c
@@ -5,11 +5,16 @@
  *
  * SPDX-License-Identifier:     GPL-2.0+
  *
- * This unit test checks that the watchdog timer will not cause
- * a system restart during the timeout period after a timer reset.
+ * The 'watchdog timer' unit test checks that the watchdog timer
+ * will not cause a system restart during the timeout period after
+ * a timer reset.
  *
- * Testing that the watchdog timer actually will reset the system
- * after a timeout is not possible within the used framework.
+ * The 'watchdog reboot' unit test checks that the watchdog timer
+ * actually reboots the system after a timeout. The test is only
+ * executed on explicit request. Use the following commands:
+ *
+ *	setenv efi_selftest watchdog reboot
+ *	bootefi selftest
  */
 
 #include <efi_selftest.h>
@@ -28,6 +33,7 @@ static struct efi_event *event_notify;
 static struct efi_event *event_wait;
 static struct efi_boot_services *boottime;
 static struct notify_context notification_context;
+static bool watchdog_reset;
 
 /*
  * Notification function, increments the notfication count if parameter
@@ -88,6 +94,34 @@ static int setup(const efi_handle_t handle,
 	return EFI_ST_SUCCESS;
 }
 
+/*
+ * Execute the test resetting the watchdog in a timely manner. No reboot occurs.
+ *
+ * @handle:	handle of the loaded image
+ * @systable:	system table
+ * @return:	EFI_ST_SUCCESS for success
+ */
+static int setup_timer(const efi_handle_t handle,
+		       const struct efi_system_table *systable)
+{
+	watchdog_reset = true;
+	return setup(handle, systable);
+}
+
+/*
+ * Execute the test without resetting the watchdog. A system reboot occurs.
+ *
+ * @handle:	handle of the loaded image
+ * @systable:	system table
+ * @return:	EFI_ST_SUCCESS for success
+ */
+static int setup_reboot(const efi_handle_t handle,
+			const struct efi_system_table *systable)
+{
+	watchdog_reset = false;
+	return setup(handle, systable);
+}
+
 /*
  * Tear down unit test.
  *
@@ -146,11 +180,14 @@ static int execute(void)
 		efi_st_error("Setting watchdog timer failed\n");
 		return EFI_ST_FAILURE;
 	}
-	/* Set 600 ms timer */
-	ret = boottime->set_timer(event_notify, EFI_TIMER_PERIODIC, 6000000);
-	if (ret != EFI_SUCCESS) {
-		efi_st_error("Could not set timer\n");
-		return EFI_ST_FAILURE;
+	if (watchdog_reset) {
+		/* Set 600 ms timer */
+		ret = boottime->set_timer(event_notify, EFI_TIMER_PERIODIC,
+					  6000000);
+		if (ret != EFI_SUCCESS) {
+			efi_st_error("Could not set timer\n");
+			return EFI_ST_FAILURE;
+		}
 	}
 	/* Set 1350 ms timer */
 	ret = boottime->set_timer(event_wait, EFI_TIMER_RELATIVE, 13500000);
@@ -176,10 +213,19 @@ static int execute(void)
 	return EFI_ST_SUCCESS;
 }
 
-EFI_UNIT_TEST(watchdog) = {
+EFI_UNIT_TEST(watchdog1) = {
 	.name = "watchdog timer",
 	.phase = EFI_EXECUTE_BEFORE_BOOTTIME_EXIT,
-	.setup = setup,
+	.setup = setup_timer,
+	.execute = execute,
+	.teardown = teardown,
+};
+
+EFI_UNIT_TEST(watchdog2) = {
+	.name = "watchdog reboot",
+	.phase = EFI_EXECUTE_BEFORE_BOOTTIME_EXIT,
+	.setup = setup_reboot,
 	.execute = execute,
 	.teardown = teardown,
+	.on_request = true,
 };
-- 
2.14.2

^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [U-Boot] [PATCH v3 15/18] test/py: test reboot by EFI watchdog
  2017-10-17 22:02 [U-Boot] [PATCH v3 00/18] efi_loader: implement SetWatchdogTimer Heinrich Schuchardt
                   ` (13 preceding siblings ...)
  2017-10-17 22:02 ` [U-Boot] [PATCH v3 14/18] efi_selftest: test reboot by watchdog Heinrich Schuchardt
@ 2017-10-17 22:02 ` Heinrich Schuchardt
  2017-10-22 14:36   ` Simon Glass
  2017-10-17 22:02 ` [U-Boot] [PATCH v3 16/18] test/py: fix typo in test_efi_loader.py Heinrich Schuchardt
                   ` (2 subsequent siblings)
  17 siblings, 1 reply; 33+ messages in thread
From: Heinrich Schuchardt @ 2017-10-17 22:02 UTC (permalink / raw)
  To: u-boot

Clear environment variable efi_selftest before executing the
default tests.

Provide a test verifying that the EFI watchdog
reboots the system upon timeout.

The test depends on CONFIG_CMD_EFI_SELFTEST=y.

Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
---
v3
	no change
v2
	choose test via environment variable
---
 test/py/tests/test_efi_selftest.py | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/test/py/tests/test_efi_selftest.py b/test/py/tests/test_efi_selftest.py
index 76e282a6c7..66b799bed6 100644
--- a/test/py/tests/test_efi_selftest.py
+++ b/test/py/tests/test_efi_selftest.py
@@ -1,4 +1,3 @@
-# Copyright (c) 2016, NVIDIA CORPORATION. All rights reserved.
 # Copyright (c) 2017, Heinrich Schuchardt <xypron.glpk@gmx.de>
 #
 # SPDX-License-Identifier: GPL-2.0
@@ -14,6 +13,7 @@ def test_efi_selftest(u_boot_console):
 	Run bootefi selftest
 	"""
 
+	u_boot_console.run_command(cmd='setenv efi_selftest')
 	u_boot_console.run_command(cmd='bootefi selftest', wait_for_prompt=False)
 	m = u_boot_console.p.expect(['Summary: 0 failures', 'Press any key'])
 	if m != 0:
@@ -23,3 +23,15 @@ def test_efi_selftest(u_boot_console):
 	if m != 0:
 		raise Exception('Reset failed during the EFI selftest')
 	u_boot_console.restart_uboot();
+
+ at pytest.mark.buildconfigspec('cmd_bootefi_selftest')
+def test_efi_selftest_watchdog_reboot(u_boot_console):
+	u_boot_console.run_command(cmd='setenv efi_selftest list')
+	output = u_boot_console.run_command('bootefi selftest')
+	assert '\'watchdog reboot\'' in output
+	u_boot_console.run_command(cmd='setenv efi_selftest watchdog reboot')
+	u_boot_console.run_command(cmd='bootefi selftest', wait_for_prompt=False)
+	m = u_boot_console.p.expect(['resetting', 'U-Boot'])
+	if m != 0:
+		raise Exception('Reset failed in \'watchdog reboot\' test')
+	u_boot_console.restart_uboot();
-- 
2.14.2

^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [U-Boot] [PATCH v3 16/18] test/py: fix typo in test_efi_loader.py
  2017-10-17 22:02 [U-Boot] [PATCH v3 00/18] efi_loader: implement SetWatchdogTimer Heinrich Schuchardt
                   ` (14 preceding siblings ...)
  2017-10-17 22:02 ` [U-Boot] [PATCH v3 15/18] test/py: test reboot by EFI watchdog Heinrich Schuchardt
@ 2017-10-17 22:02 ` Heinrich Schuchardt
  2017-10-22 14:35   ` Simon Glass
  2017-10-17 22:02 ` [U-Boot] [PATCH v3 17/18] efi_selftest: provide test for EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL Heinrich Schuchardt
  2017-10-17 22:02 ` [U-Boot] [PATCH v3 18/18] efi_loader: set parent handle in efi_load_image Heinrich Schuchardt
  17 siblings, 1 reply; 33+ messages in thread
From: Heinrich Schuchardt @ 2017-10-17 22:02 UTC (permalink / raw)
  To: u-boot

Make a comment line easier to read.

Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
---
v3
	no change
v2
	no change
---
 test/py/tests/test_efi_loader.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/test/py/tests/test_efi_loader.py b/test/py/tests/test_efi_loader.py
index 5d7f5dbfb2..4d391e13ef 100644
--- a/test/py/tests/test_efi_loader.py
+++ b/test/py/tests/test_efi_loader.py
@@ -12,7 +12,7 @@ import u_boot_utils
 
 """
 Note: This test relies on boardenv_* containing configuration values to define
-which the network environment available for testing. Without this, the parts
+which network environment is available for testing. Without this, the parts
 that rely on network will be automatically skipped.
 
 For example:
-- 
2.14.2

^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [U-Boot] [PATCH v3 17/18] efi_selftest: provide test for EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
  2017-10-17 22:02 [U-Boot] [PATCH v3 00/18] efi_loader: implement SetWatchdogTimer Heinrich Schuchardt
                   ` (15 preceding siblings ...)
  2017-10-17 22:02 ` [U-Boot] [PATCH v3 16/18] test/py: fix typo in test_efi_loader.py Heinrich Schuchardt
@ 2017-10-17 22:02 ` Heinrich Schuchardt
  2017-10-22 14:36   ` Simon Glass
  2017-10-17 22:02 ` [U-Boot] [PATCH v3 18/18] efi_loader: set parent handle in efi_load_image Heinrich Schuchardt
  17 siblings, 1 reply; 33+ messages in thread
From: Heinrich Schuchardt @ 2017-10-17 22:02 UTC (permalink / raw)
  To: u-boot

The following services are tested:
OutputString, TestString, SetAttribute.

Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
---
v3
	new patch
---
 lib/efi_selftest/Makefile                  |  5 ++-
 lib/efi_selftest/efi_selftest_textoutput.c | 53 ++++++++++++++++++++++++++++++
 2 files changed, 57 insertions(+), 1 deletion(-)
 create mode 100644 lib/efi_selftest/efi_selftest_textoutput.c

diff --git a/lib/efi_selftest/Makefile b/lib/efi_selftest/Makefile
index 3e5c9a6d16..b1385383ed 100644
--- a/lib/efi_selftest/Makefile
+++ b/lib/efi_selftest/Makefile
@@ -17,7 +17,9 @@ CFLAGS_efi_selftest_exitbootservices.o := $(CFLAGS_EFI)
 CFLAGS_REMOVE_efi_selftest_exitbootservices.o := $(CFLAGS_NON_EFI)
 CFLAGS_efi_selftest_snp.o := $(CFLAGS_EFI)
 CFLAGS_REMOVE_efi_selftest_snp.o := $(CFLAGS_NON_EFI)
-CFLAGS_efi_selftest_tpl.o := $(CFLAGS_EFI)
+CFLAGS_efi_selftest_text_output.o := $(CFLAGS_EFI)
+CFLAGS_REMOVE_efi_selftest_tpl.o := $(CFLAGS_NON_EFI)
+CFLAGS_efi_selftest_text_output.o := $(CFLAGS_EFI)
 CFLAGS_REMOVE_efi_selftest_tpl.o := $(CFLAGS_NON_EFI)
 CFLAGS_efi_selftest_util.o := $(CFLAGS_EFI)
 CFLAGS_REMOVE_efi_selftest_util.o := $(CFLAGS_NON_EFI)
@@ -30,6 +32,7 @@ efi_selftest_console.o \
 efi_selftest_events.o \
 efi_selftest_exitbootservices.o \
 efi_selftest_snp.o \
+efi_selftest_textoutput.o \
 efi_selftest_tpl.o \
 efi_selftest_util.o \
 efi_selftest_watchdog.o
diff --git a/lib/efi_selftest/efi_selftest_textoutput.c b/lib/efi_selftest/efi_selftest_textoutput.c
new file mode 100644
index 0000000000..7bc4d2f446
--- /dev/null
+++ b/lib/efi_selftest/efi_selftest_textoutput.c
@@ -0,0 +1,53 @@
+/*
+ * efi_selftest_textoutput
+ *
+ * Copyright (c) 2017 Heinrich Schuchardt <xypron.glpk@gmx.de>
+ *
+ * SPDX-License-Identifier:     GPL-2.0+
+ *
+ * Test the EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.
+ *
+ * The following services are tested:
+ * OutputString, TestString, SetAttribute.
+ */
+
+#include <efi_selftest.h>
+
+/*
+ * Execute unit test.
+ *
+ * @return:	EFI_ST_SUCCESS for success
+ */
+static int execute(void)
+{
+	size_t foreground;
+	size_t background;
+	size_t attrib;
+	efi_status_t ret;
+
+	/* SetAttribute */
+	efi_st_printf("\nColor palette\n");
+	for (foreground = 0; foreground < 0x10; ++foreground) {
+		for (background = 0; background < 0x80; background += 0x10) {
+			attrib = foreground | background;
+			con_out->set_attribute(con_out, attrib);
+			efi_st_printf("%p", (void *)attrib);
+		}
+		con_out->set_attribute(con_out, 0);
+		efi_st_printf("\n");
+	}
+	/* TestString */
+	ret = con_out->test_string(con_out,
+			L" !\"#$%&'()*+,-./0-9:;<=>?@A-Z[\\]^_`a-z{|}~\n");
+	if (ret != EFI_ST_SUCCESS) {
+		efi_st_error("TestString failed for ANSI characters\n");
+		return EFI_ST_FAILURE;
+	}
+	return EFI_ST_SUCCESS;
+}
+
+EFI_UNIT_TEST(textoutput) = {
+	.name = "text output",
+	.phase = EFI_EXECUTE_BEFORE_BOOTTIME_EXIT,
+	.execute = execute,
+};
-- 
2.14.2

^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [U-Boot] [PATCH v3 18/18] efi_loader: set parent handle in efi_load_image
  2017-10-17 22:02 [U-Boot] [PATCH v3 00/18] efi_loader: implement SetWatchdogTimer Heinrich Schuchardt
                   ` (16 preceding siblings ...)
  2017-10-17 22:02 ` [U-Boot] [PATCH v3 17/18] efi_selftest: provide test for EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL Heinrich Schuchardt
@ 2017-10-17 22:02 ` Heinrich Schuchardt
  2017-10-22 14:36   ` Simon Glass
  17 siblings, 1 reply; 33+ messages in thread
From: Heinrich Schuchardt @ 2017-10-17 22:02 UTC (permalink / raw)
  To: u-boot

The parent_handle of the loaded image must be set.
Set the system table.

Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
---
v3
	new patch
---
 lib/efi_loader/efi_boottime.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/lib/efi_loader/efi_boottime.c b/lib/efi_loader/efi_boottime.c
index fd8d15655b..f70d8658ab 100644
--- a/lib/efi_loader/efi_boottime.c
+++ b/lib/efi_loader/efi_boottime.c
@@ -1282,6 +1282,8 @@ static efi_status_t EFIAPI efi_load_image(bool boot_policy,
 		return EFI_EXIT(EFI_UNSUPPORTED);
 	}
 
+	info->system_table = &systab;
+	info->parent_handle = parent_image;
 	*image_handle = info;
 
 	return EFI_EXIT(EFI_SUCCESS);
-- 
2.14.2

^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [U-Boot] [PATCH v3 08/18] efi_selftest: reformat code
  2017-10-17 22:02 ` [U-Boot] [PATCH v3 08/18] efi_selftest: reformat code Heinrich Schuchardt
@ 2017-10-22 14:35   ` Simon Glass
  0 siblings, 0 replies; 33+ messages in thread
From: Simon Glass @ 2017-10-22 14:35 UTC (permalink / raw)
  To: u-boot

On 18 October 2017 at 00:02, Heinrich Schuchardt <xypron.glpk@gmx.de> wrote:
> Remove superfluous spaces.
>
> Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
> ---
> v3
>         new patch split off
> ---
>  lib/efi_selftest/efi_selftest.c | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)

Reviewed-by: Simon Glass <sjg@chromium.org>

^ permalink raw reply	[flat|nested] 33+ messages in thread

* [U-Boot] [PATCH v3 04/18] efi_loader: new function utf8_to_utf16
  2017-10-17 22:02 ` [U-Boot] [PATCH v3 04/18] efi_loader: new function utf8_to_utf16 Heinrich Schuchardt
@ 2017-10-22 14:35   ` Simon Glass
  0 siblings, 0 replies; 33+ messages in thread
From: Simon Glass @ 2017-10-22 14:35 UTC (permalink / raw)
  To: u-boot

On 18 October 2017 at 00:02, Heinrich Schuchardt <xypron.glpk@gmx.de> wrote:
> Provide a conversion function from utf8 to utf16.
>
> Add missing #include <linux/types.h> in include/charset.h.
> Remove superfluous #include <common.h> in lib/charset.c.
>
> Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
> ---
> v3
>         no change
> v2
>         new patch
> ---
>  include/charset.h | 15 +++++++++++++++
>  lib/charset.c     | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-
>  2 files changed, 71 insertions(+), 1 deletion(-)

Reviewed-by: Simon Glass <sjg@chromium.org>

^ permalink raw reply	[flat|nested] 33+ messages in thread

* [U-Boot] [PATCH v3 10/18] efi_selftest: deduplicate code
  2017-10-17 22:02 ` [U-Boot] [PATCH v3 10/18] efi_selftest: deduplicate code Heinrich Schuchardt
@ 2017-10-22 14:35   ` Simon Glass
  0 siblings, 0 replies; 33+ messages in thread
From: Simon Glass @ 2017-10-22 14:35 UTC (permalink / raw)
  To: u-boot

On 18 October 2017 at 00:02, Heinrich Schuchardt <xypron.glpk@gmx.de> wrote:
> Move duplicate code to the new function efi_st_do_tests.
>
> Suggested-by: Alexander Graf <agraf@suse.de>
> Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
> ---
> v3
>         new patch
> ---
>  lib/efi_selftest/efi_selftest.c | 71 ++++++++++++++++++++++++-----------------
>  1 file changed, 42 insertions(+), 29 deletions(-)

Reviewed-by: Simon Glass <sjg@chromium.org>

^ permalink raw reply	[flat|nested] 33+ messages in thread

* [U-Boot] [PATCH v3 06/18] efi_loader: consistently use efi_status_t in bootefi
  2017-10-17 22:02 ` [U-Boot] [PATCH v3 06/18] efi_loader: consistently use efi_status_t in bootefi Heinrich Schuchardt
@ 2017-10-22 14:35   ` Simon Glass
  0 siblings, 0 replies; 33+ messages in thread
From: Simon Glass @ 2017-10-22 14:35 UTC (permalink / raw)
  To: u-boot

On 18 October 2017 at 00:02, Heinrich Schuchardt <xypron.glpk@gmx.de> wrote:
> Where ulong or unsigned long are used to hold an EFI status
> code we should consistenly use efi_status_t.

nit: konsisstinley

>
> Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
> ---
> v3
>         new patch
> ---
>  cmd/bootefi.c | 18 +++++++++---------
>  1 file changed, 9 insertions(+), 9 deletions(-)

Reviewed-by: Simon Glass <sjg@chromium.org>

^ permalink raw reply	[flat|nested] 33+ messages in thread

* [U-Boot] [PATCH v3 07/18] efi_selftest: provide a dummy device path
  2017-10-17 22:02 ` [U-Boot] [PATCH v3 07/18] efi_selftest: provide a dummy device path Heinrich Schuchardt
@ 2017-10-22 14:35   ` Simon Glass
  0 siblings, 0 replies; 33+ messages in thread
From: Simon Glass @ 2017-10-22 14:35 UTC (permalink / raw)
  To: u-boot

On 18 October 2017 at 00:02, Heinrich Schuchardt <xypron.glpk@gmx.de> wrote:
> Currently we pass bootefi_device_path and bootefi_image_path as
> device and image path without initializing them. They may carry
> values from previous calls to bootefi.
>
> With the patch the variables are initialized valid dummy values.

*to* valid

>
> Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
> ---
> v3
>         new patch split off
> ---
>  cmd/bootefi.c | 6 ++++++
>  1 file changed, 6 insertions(+)

Reviewed-by: Simon Glass <sjg@chromium.org>

^ permalink raw reply	[flat|nested] 33+ messages in thread

* [U-Boot] [PATCH v3 05/18] efi_loader: guard against double inclusion of efi_loader.h
  2017-10-17 22:02 ` [U-Boot] [PATCH v3 05/18] efi_loader: guard against double inclusion of efi_loader.h Heinrich Schuchardt
@ 2017-10-22 14:35   ` Simon Glass
  0 siblings, 0 replies; 33+ messages in thread
From: Simon Glass @ 2017-10-22 14:35 UTC (permalink / raw)
  To: u-boot

On 18 October 2017 at 00:02, Heinrich Schuchardt <xypron.glpk@gmx.de> wrote:
> Use a define to detect double inclusion of efi_loader.h.
>
> Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
> ---
> v3
>         no change
> v2
>         new patch
> ---
>  include/efi_loader.h | 7 ++++++-
>  1 file changed, 6 insertions(+), 1 deletion(-)

Reviewed-by: Simon Glass <sjg@chromium.org>

^ permalink raw reply	[flat|nested] 33+ messages in thread

* [U-Boot] [PATCH v3 09/18] efi_selftest: efi_st_memcmp should return 0
  2017-10-17 22:02 ` [U-Boot] [PATCH v3 09/18] efi_selftest: efi_st_memcmp should return 0 Heinrich Schuchardt
@ 2017-10-22 14:35   ` Simon Glass
  0 siblings, 0 replies; 33+ messages in thread
From: Simon Glass @ 2017-10-22 14:35 UTC (permalink / raw)
  To: u-boot

On 18 October 2017 at 00:02, Heinrich Schuchardt <xypron.glpk@gmx.de> wrote:
> If the compared memory areas match the return value should be 0.
> We should not use the unrelated constant EFI_ST_SUCCESS.
>
> Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
> ---
> v3
>         new patch split off
> ---
>  lib/efi_selftest/efi_selftest_util.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)

Reviewed-by: Simon Glass <sjg@chromium.org>

^ permalink raw reply	[flat|nested] 33+ messages in thread

* [U-Boot] [PATCH v3 12/18] efi_selftest: correctly cleanup after selftest
  2017-10-17 22:02 ` [U-Boot] [PATCH v3 12/18] efi_selftest: correctly cleanup after selftest Heinrich Schuchardt
@ 2017-10-22 14:35   ` Simon Glass
  0 siblings, 0 replies; 33+ messages in thread
From: Simon Glass @ 2017-10-22 14:35 UTC (permalink / raw)
  To: u-boot

On 18 October 2017 at 00:02, Heinrich Schuchardt <xypron.glpk@gmx.de> wrote:
> After executing bootefi selftest
> * restore GD
> * unlink the load image handle
> * return 0 or 1 and not a truncated efi_status_t.
>
> Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
> ---
> v3
>         new patch split off
> ---
>  cmd/bootefi.c | 4 +++-
>  1 file changed, 3 insertions(+), 1 deletion(-)
>
Reviewed-by: Simon Glass <sjg@chromium.org>

^ permalink raw reply	[flat|nested] 33+ messages in thread

* [U-Boot] [PATCH v3 13/18] efi_loader: use bootargs as load options
  2017-10-17 22:02 ` [U-Boot] [PATCH v3 13/18] efi_loader: use bootargs as load options Heinrich Schuchardt
@ 2017-10-22 14:35   ` Simon Glass
  0 siblings, 0 replies; 33+ messages in thread
From: Simon Glass @ 2017-10-22 14:35 UTC (permalink / raw)
  To: u-boot

On 18 October 2017 at 00:02, Heinrich Schuchardt <xypron.glpk@gmx.de> wrote:
> Use environment variable bootargs used as load options
> for bootefi payloads.
>
> Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
> ---
> v3
>         new patch split off
> ---
>  cmd/bootefi.c | 2 ++
>  1 file changed, 2 insertions(+)

Reviewed-by: Simon Glass <sjg@chromium.org>

^ permalink raw reply	[flat|nested] 33+ messages in thread

* [U-Boot] [PATCH v3 14/18] efi_selftest: test reboot by watchdog
  2017-10-17 22:02 ` [U-Boot] [PATCH v3 14/18] efi_selftest: test reboot by watchdog Heinrich Schuchardt
@ 2017-10-22 14:35   ` Simon Glass
  0 siblings, 0 replies; 33+ messages in thread
From: Simon Glass @ 2017-10-22 14:35 UTC (permalink / raw)
  To: u-boot

On 18 October 2017 at 00:02, Heinrich Schuchardt <xypron.glpk@gmx.de> wrote:
> A test is added that verifies that the watchdog timer actually
> causes a reboot upon timeout. The test is only executed on
> request using
>
>     setenv efi_selftest watchdog reboot
>     bootefi selftest
>
> Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
> ---
> v3
>         correct comments
> v2
>         no change
> ---
>  lib/efi_selftest/efi_selftest_watchdog.c | 68 ++++++++++++++++++++++++++------
>  1 file changed, 57 insertions(+), 11 deletions(-)

Reviewed-by: Simon Glass <sjg@chromium.org>

^ permalink raw reply	[flat|nested] 33+ messages in thread

* [U-Boot] [PATCH v3 16/18] test/py: fix typo in test_efi_loader.py
  2017-10-17 22:02 ` [U-Boot] [PATCH v3 16/18] test/py: fix typo in test_efi_loader.py Heinrich Schuchardt
@ 2017-10-22 14:35   ` Simon Glass
  0 siblings, 0 replies; 33+ messages in thread
From: Simon Glass @ 2017-10-22 14:35 UTC (permalink / raw)
  To: u-boot

On 18 October 2017 at 00:02, Heinrich Schuchardt <xypron.glpk@gmx.de> wrote:
> Make a comment line easier to read.
>
> Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
> ---
> v3
>         no change
> v2
>         no change
> ---
>  test/py/tests/test_efi_loader.py | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)

Reviewed-by: Simon Glass <sjg@chromium.org>

^ permalink raw reply	[flat|nested] 33+ messages in thread

* [U-Boot] [PATCH v3 15/18] test/py: test reboot by EFI watchdog
  2017-10-17 22:02 ` [U-Boot] [PATCH v3 15/18] test/py: test reboot by EFI watchdog Heinrich Schuchardt
@ 2017-10-22 14:36   ` Simon Glass
  0 siblings, 0 replies; 33+ messages in thread
From: Simon Glass @ 2017-10-22 14:36 UTC (permalink / raw)
  To: u-boot

On 18 October 2017 at 00:02, Heinrich Schuchardt <xypron.glpk@gmx.de> wrote:
> Clear environment variable efi_selftest before executing the
> default tests.
>
> Provide a test verifying that the EFI watchdog
> reboots the system upon timeout.
>
> The test depends on CONFIG_CMD_EFI_SELFTEST=y.
>
> Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
> ---
> v3
>         no change
> v2
>         choose test via environment variable
> ---
>  test/py/tests/test_efi_selftest.py | 14 +++++++++++++-
>  1 file changed, 13 insertions(+), 1 deletion(-)

Reviewed-by: Simon Glass <sjg@chromium.org>

^ permalink raw reply	[flat|nested] 33+ messages in thread

* [U-Boot] [PATCH v3 17/18] efi_selftest: provide test for EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
  2017-10-17 22:02 ` [U-Boot] [PATCH v3 17/18] efi_selftest: provide test for EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL Heinrich Schuchardt
@ 2017-10-22 14:36   ` Simon Glass
  0 siblings, 0 replies; 33+ messages in thread
From: Simon Glass @ 2017-10-22 14:36 UTC (permalink / raw)
  To: u-boot

On 18 October 2017 at 00:02, Heinrich Schuchardt <xypron.glpk@gmx.de> wrote:
> The following services are tested:
> OutputString, TestString, SetAttribute.
>
> Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
> ---
> v3
>         new patch
> ---
>  lib/efi_selftest/Makefile                  |  5 ++-
>  lib/efi_selftest/efi_selftest_textoutput.c | 53 ++++++++++++++++++++++++++++++
>  2 files changed, 57 insertions(+), 1 deletion(-)
>  create mode 100644 lib/efi_selftest/efi_selftest_textoutput.c

Great! Tests!

Reviewed-by: Simon Glass <sjg@chromium.org>

^ permalink raw reply	[flat|nested] 33+ messages in thread

* [U-Boot] [PATCH v3 18/18] efi_loader: set parent handle in efi_load_image
  2017-10-17 22:02 ` [U-Boot] [PATCH v3 18/18] efi_loader: set parent handle in efi_load_image Heinrich Schuchardt
@ 2017-10-22 14:36   ` Simon Glass
  0 siblings, 0 replies; 33+ messages in thread
From: Simon Glass @ 2017-10-22 14:36 UTC (permalink / raw)
  To: u-boot

On 18 October 2017 at 00:02, Heinrich Schuchardt <xypron.glpk@gmx.de> wrote:
> The parent_handle of the loaded image must be set.
> Set the system table.
>
> Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
> ---
> v3
>         new patch
> ---
>  lib/efi_loader/efi_boottime.c | 2 ++
>  1 file changed, 2 insertions(+)

Reviewed-by: Simon Glass <sjg@chromium.org>

^ permalink raw reply	[flat|nested] 33+ messages in thread

end of thread, other threads:[~2017-10-22 14:36 UTC | newest]

Thread overview: 33+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-10-17 22:02 [U-Boot] [PATCH v3 00/18] efi_loader: implement SetWatchdogTimer Heinrich Schuchardt
2017-10-17 22:02 ` [U-Boot] [PATCH v3 01/18] efi_loader: move efi_search_obj up in code Heinrich Schuchardt
2017-10-17 22:02 ` [U-Boot] [PATCH v3 02/18] efi_loader: implement SetWatchdogTimer Heinrich Schuchardt
2017-10-17 22:02 ` [U-Boot] [PATCH v3 03/18] efi_selftest: provide test for watchdog timer Heinrich Schuchardt
2017-10-17 22:02 ` [U-Boot] [PATCH v3 04/18] efi_loader: new function utf8_to_utf16 Heinrich Schuchardt
2017-10-22 14:35   ` Simon Glass
2017-10-17 22:02 ` [U-Boot] [PATCH v3 05/18] efi_loader: guard against double inclusion of efi_loader.h Heinrich Schuchardt
2017-10-22 14:35   ` Simon Glass
2017-10-17 22:02 ` [U-Boot] [PATCH v3 06/18] efi_loader: consistently use efi_status_t in bootefi Heinrich Schuchardt
2017-10-22 14:35   ` Simon Glass
2017-10-17 22:02 ` [U-Boot] [PATCH v3 07/18] efi_selftest: provide a dummy device path Heinrich Schuchardt
2017-10-22 14:35   ` Simon Glass
2017-10-17 22:02 ` [U-Boot] [PATCH v3 08/18] efi_selftest: reformat code Heinrich Schuchardt
2017-10-22 14:35   ` Simon Glass
2017-10-17 22:02 ` [U-Boot] [PATCH v3 09/18] efi_selftest: efi_st_memcmp should return 0 Heinrich Schuchardt
2017-10-22 14:35   ` Simon Glass
2017-10-17 22:02 ` [U-Boot] [PATCH v3 10/18] efi_selftest: deduplicate code Heinrich Schuchardt
2017-10-22 14:35   ` Simon Glass
2017-10-17 22:02 ` [U-Boot] [PATCH v3 11/18] efi_selftest: allow to select a single test for exexution Heinrich Schuchardt
2017-10-17 22:02 ` [U-Boot] [PATCH v3 12/18] efi_selftest: correctly cleanup after selftest Heinrich Schuchardt
2017-10-22 14:35   ` Simon Glass
2017-10-17 22:02 ` [U-Boot] [PATCH v3 13/18] efi_loader: use bootargs as load options Heinrich Schuchardt
2017-10-22 14:35   ` Simon Glass
2017-10-17 22:02 ` [U-Boot] [PATCH v3 14/18] efi_selftest: test reboot by watchdog Heinrich Schuchardt
2017-10-22 14:35   ` Simon Glass
2017-10-17 22:02 ` [U-Boot] [PATCH v3 15/18] test/py: test reboot by EFI watchdog Heinrich Schuchardt
2017-10-22 14:36   ` Simon Glass
2017-10-17 22:02 ` [U-Boot] [PATCH v3 16/18] test/py: fix typo in test_efi_loader.py Heinrich Schuchardt
2017-10-22 14:35   ` Simon Glass
2017-10-17 22:02 ` [U-Boot] [PATCH v3 17/18] efi_selftest: provide test for EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL Heinrich Schuchardt
2017-10-22 14:36   ` Simon Glass
2017-10-17 22:02 ` [U-Boot] [PATCH v3 18/18] efi_loader: set parent handle in efi_load_image Heinrich Schuchardt
2017-10-22 14:36   ` Simon Glass

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.