Test the initjmp() function when HAVE_INITJMP is set.

Signed-off-by: Jerome Forissier <jerome.foriss...@linaro.org>
---
 test/lib/Makefile  |  1 +
 test/lib/initjmp.c | 72 ++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 73 insertions(+)
 create mode 100644 test/lib/initjmp.c

diff --git a/test/lib/Makefile b/test/lib/Makefile
index 0e4cb8e3dfd..bf04685dae1 100644
--- a/test/lib/Makefile
+++ b/test/lib/Makefile
@@ -14,6 +14,7 @@ obj-y += hexdump.o
 obj-$(CONFIG_SANDBOX) += kconfig.o
 obj-y += lmb.o
 obj-$(CONFIG_HAVE_SETJMP) += longjmp.o
+obj-$(CONFIG_HAVE_INITJMP) += initjmp.o
 obj-$(CONFIG_CONSOLE_RECORD) += test_print.o
 obj-$(CONFIG_SSCANF) += sscanf.o
 obj-$(CONFIG_$(PHASE_)STRTO) += str.o
diff --git a/test/lib/initjmp.c b/test/lib/initjmp.c
new file mode 100644
index 00000000000..52bbda8cc60
--- /dev/null
+++ b/test/lib/initjmp.c
@@ -0,0 +1,72 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright 2025 Linaro Limited
+ *
+ * Unit test for initjmp()
+ */
+
+#include <compiler.h>
+#include <asm/setjmp.h>
+#include <stdbool.h>
+#include <test/lib.h>
+#include <test/ut.h>
+#include <vsprintf.h>
+
+static bool ep_entered;
+static jmp_buf return_buf;
+
+static void __noreturn entrypoint(void)
+{
+       ep_entered = true;
+
+       /* Jump back to the main routine */
+       longjmp(return_buf, 1);
+
+       /* Not reached */
+       panic("longjmp failed\n");
+}
+
+static int lib_initjmp(struct unit_test_state *uts)
+{
+       int ret;
+       void *stack;
+       jmp_buf buf;
+       int stack_sz = 1024;
+
+       ep_entered = false;
+
+       stack = malloc(stack_sz);
+       ut_assertnonnull(stack);
+
+       ut_assert(!ep_entered);
+
+       /*
+        * Prepare return_buf so that entrypoint may jump back just after the
+        * if()
+        */
+       if (!setjmp(return_buf)) {
+               /* return_buf initialized, entrypoint not yet called */
+
+               /*
+                * Prepare another jump buffer to jump into entrypoint with the
+                * given stack
+                */
+               ret = initjmp(buf, entrypoint, stack + stack_sz);
+               ut_assertok(ret);
+
+               /* Jump into entrypoint */
+               longjmp(buf, 1);
+               /*
+                * Not reached since entrypoint is expected to branch after
+                * the if()
+                */
+               ut_assert(false);
+       }
+
+       ut_assert(ep_entered);
+
+       free(stack);
+
+       return 0;
+}
+LIB_TEST(lib_initjmp, 0);
-- 
2.43.0

Reply via email to